summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--cmake/Modules/GrVersion.cmake21
-rw-r--r--docs/sphinx/source/blocks_blocks.rst1
-rw-r--r--docs/sphinx/source/index.rst1
-rw-r--r--gnuradio-runtime/lib/prefs.cc3
-rw-r--r--gr-blocks/grc/blocks_block_tree.xml1
-rw-r--r--gr-blocks/grc/blocks_tcp_server_sink.xml77
-rw-r--r--gr-blocks/include/gnuradio/blocks/CMakeLists.txt1
-rw-r--r--gr-blocks/include/gnuradio/blocks/tcp_server_sink.h66
-rw-r--r--gr-blocks/lib/CMakeLists.txt1
-rw-r--r--gr-blocks/lib/tcp_server_sink_impl.cc161
-rw-r--r--gr-blocks/lib/tcp_server_sink_impl.h73
-rw-r--r--gr-blocks/python/blocks/qa_tcp_server_sink.py87
-rw-r--r--gr-blocks/swig/blocks_swig5.i3
-rw-r--r--gr-dtv/examples/README.atsc7
-rw-r--r--gr-dtv/examples/file_atsc_tx.grc991
-rw-r--r--gr-dtv/examples/uhd_atsc_tx.grc3166
-rw-r--r--gr-dtv/grc/dtv_dvbs2_modulator_bc.xml29
-rw-r--r--gr-dtv/include/gnuradio/dtv/dvb_config.h1
-rw-r--r--gr-dtv/lib/CMakeLists.txt18
-rw-r--r--gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc2
-rw-r--r--gr-dtv/lib/atsc/atsc_viterbi_mux.h2539
-rw-r--r--gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc11
-rw-r--r--gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc5
-rw-r--r--gr-uhd/apps/uhd_app.py35
-rwxr-xr-xgr-uhd/apps/uhd_fft58
-rw-r--r--gr-uhd/apps/uhd_siggen_base.py94
-rwxr-xr-xgr-uhd/apps/uhd_siggen_gui33
-rw-r--r--gr-uhd/lib/usrp_source_impl.cc1
29 files changed, 7020 insertions, 470 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5fc01f27f4..4bcd58ff48 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -72,9 +72,9 @@ ELSE()
ENDIF()
IF(CMAKE_C_COMPILER_ID STREQUAL "GNU")
- SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "Clang")
- SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
ELSE()
diff --git a/cmake/Modules/GrVersion.cmake b/cmake/Modules/GrVersion.cmake
index dceac67bab..414c34d64f 100644
--- a/cmake/Modules/GrVersion.cmake
+++ b/cmake/Modules/GrVersion.cmake
@@ -33,6 +33,16 @@ set(MAINT_VERSION ${VERSION_INFO_MAINT_VERSION})
########################################################################
find_package(Git)
+MACRO(create_manual_git_describe)
+ if(NOT GR_GIT_COUNT)
+ set(GR_GIT_COUNT "compat-xxx")
+ endif()
+ if(NOT GR_GIT_HASH)
+ set(GR_GIT_HASH "xunknown")
+ endif()
+ set(GIT_DESCRIBE "v${MAJOR_VERSION}.${API_COMPAT}-${GR_GIT_COUNT}-${GR_GIT_HASH}")
+ENDMACRO()
+
if(GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git)
message(STATUS "Extracting version information from git describe...")
execute_process(
@@ -40,14 +50,11 @@ if(GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git)
OUTPUT_VARIABLE GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
-else()
- if(NOT GR_GIT_COUNT)
- set(GR_GIT_COUNT "compat-xxx")
- endif()
- if(NOT GR_GIT_HASH)
- set(GR_GIT_HASH "xunknown")
+ if(GIT_DESCRIBE STREQUAL "")
+ create_manual_git_describe()
endif()
- set(GIT_DESCRIBE "v${MAJOR_VERSION}.${API_COMPAT}-${GR_GIT_COUNT}-${GR_GIT_HASH}")
+else()
+ create_manual_git_describe()
endif()
########################################################################
diff --git a/docs/sphinx/source/blocks_blocks.rst b/docs/sphinx/source/blocks_blocks.rst
index 056e9efe9a..f214e01c47 100644
--- a/docs/sphinx/source/blocks_blocks.rst
+++ b/docs/sphinx/source/blocks_blocks.rst
@@ -185,6 +185,7 @@ gnuradio.blocks
.. autoblock:: gnuradio.blocks.tagged_stream_mux
.. autoblock:: gnuradio.blocks.tagged_stream_to_pdu
.. autoblock:: gnuradio.blocks.tags_strobe
+.. autoblock:: gnuradio.blocks.tcp_server_sink
.. autoblock:: gnuradio.blocks.threshold_ff
.. autoblock:: gnuradio.blocks.throttle
.. autoblock:: gnuradio.blocks.transcendental
diff --git a/docs/sphinx/source/index.rst b/docs/sphinx/source/index.rst
index 7bba2f8e32..5c14d22cce 100644
--- a/docs/sphinx/source/index.rst
+++ b/docs/sphinx/source/index.rst
@@ -854,6 +854,7 @@ Networking Tools Blocks
:nosignatures:
gnuradio.blocks.socket_pdu
+ gnuradio.blocks.tcp_server_sink
gnuradio.blocks.udp_sink
gnuradio.blocks.udp_source
diff --git a/gnuradio-runtime/lib/prefs.cc b/gnuradio-runtime/lib/prefs.cc
index 341028eba8..18acae0124 100644
--- a/gnuradio-runtime/lib/prefs.cc
+++ b/gnuradio-runtime/lib/prefs.cc
@@ -30,6 +30,7 @@
#include <algorithm>
#include <fstream>
+#include <iostream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
@@ -113,7 +114,7 @@ namespace gr {
std::string value = o.value[0];
d_config_map[section][key] = value;
}
- } catch(const boost::program_options::invalid_config_file_syntax & e) {
+ } catch(std::exception e) {
std::cerr << "WARNING: Config file '" << fname << "' failed to parse:" << std::endl;
std::cerr << e.what() << std::endl;
std::cerr << "Skipping it" << std::endl;
diff --git a/gr-blocks/grc/blocks_block_tree.xml b/gr-blocks/grc/blocks_block_tree.xml
index c4857f3b3a..644773f686 100644
--- a/gr-blocks/grc/blocks_block_tree.xml
+++ b/gr-blocks/grc/blocks_block_tree.xml
@@ -158,6 +158,7 @@
<name>Networking Tools</name>
<block>blocks_tuntap_pdu</block>
<block>blocks_socket_pdu</block>
+ <block>blocks_tcp_server_sink</block>
<block>blocks_udp_source</block>
<block>blocks_udp_sink</block>
</cat>
diff --git a/gr-blocks/grc/blocks_tcp_server_sink.xml b/gr-blocks/grc/blocks_tcp_server_sink.xml
new file mode 100644
index 0000000000..644027da65
--- /dev/null
+++ b/gr-blocks/grc/blocks_tcp_server_sink.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##TCP Server Sink
+###################################################
+ -->
+<block>
+ <name>TCP Server Sink</name>
+ <key>blocks_tcp_server_sink</key>
+ <import>from gnuradio import blocks</import>
+ <make>blocks.tcp_server_sink($type.size*$vlen, $ipaddr, $port, $noblock)</make>
+ <param>
+ <name>Input Type</name>
+ <key>type</key>
+ <type>enum</type>
+ <option>
+ <name>Complex</name>
+ <key>complex</key>
+ <opt>size:gr.sizeof_gr_complex</opt>
+ </option>
+ <option>
+ <name>Float</name>
+ <key>float</key>
+ <opt>size:gr.sizeof_float</opt>
+ </option>
+ <option>
+ <name>Int</name>
+ <key>int</key>
+ <opt>size:gr.sizeof_int</opt>
+ </option>
+ <option>
+ <name>Short</name>
+ <key>short</key>
+ <opt>size:gr.sizeof_short</opt>
+ </option>
+ <option>
+ <name>Byte</name>
+ <key>byte</key>
+ <opt>size:gr.sizeof_char</opt>
+ </option>
+ </param>
+ <param>
+ <name>Destination IP Address</name>
+ <key>ipaddr</key>
+ <type>string</type>
+ </param>
+ <param>
+ <name>Destination Port</name>
+ <key>port</key>
+ <type>int</type>
+ </param>
+ <param>
+ <name>Nonblocking Mode</name>
+ <key>noblock</key>
+ <type>enum</type>
+ <option>
+ <name>On</name>
+ <key>True</key>
+ </option>
+ <option>
+ <name>Off</name>
+ <key>False</key>
+ </option>
+ </param>
+ <param>
+ <name>Vec Length</name>
+ <key>vlen</key>
+ <value>1</value>
+ <type>int</type>
+ </param>
+ <check>$vlen &gt; 0</check>
+ <sink>
+ <name>in</name>
+ <type>$type</type>
+ <vlen>$vlen</vlen>
+ </sink>
+</block>
diff --git a/gr-blocks/include/gnuradio/blocks/CMakeLists.txt b/gr-blocks/include/gnuradio/blocks/CMakeLists.txt
index 38c79d60f3..6b3eca69d3 100644
--- a/gr-blocks/include/gnuradio/blocks/CMakeLists.txt
+++ b/gr-blocks/include/gnuradio/blocks/CMakeLists.txt
@@ -174,6 +174,7 @@ install(FILES
tagged_stream_multiply_length.h
tagged_stream_to_pdu.h
tags_strobe.h
+ tcp_server_sink.h
test_tag_variable_rate_ff.h
threshold_ff.h
throttle.h
diff --git a/gr-blocks/include/gnuradio/blocks/tcp_server_sink.h b/gr-blocks/include/gnuradio/blocks/tcp_server_sink.h
new file mode 100644
index 0000000000..6d951a8e67
--- /dev/null
+++ b/gr-blocks/include/gnuradio/blocks/tcp_server_sink.h
@@ -0,0 +1,66 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2014 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_BLOCKS_TCP_SERVER_SINK_H
+#define INCLUDED_BLOCKS_TCP_SERVER_SINK_H
+
+#include <gnuradio/blocks/api.h>
+#include <gnuradio/sync_block.h>
+
+namespace gr {
+ namespace blocks {
+
+ /*!
+ * \brief Send stream trought an TCP socket.
+ * \ingroup networking_tools_blk
+ *
+ * \details
+ * Listen for incomming TCP connection(s). Duplicate data for each
+ * opened connection. Optionaly can wait until first client connects
+ * before streaming starts.
+ */
+ class BLOCKS_API tcp_server_sink : virtual public gr::sync_block
+ {
+ public:
+ // gr::blocks::tcp_server_sink::sptr
+ typedef boost::shared_ptr<tcp_server_sink> sptr;
+
+ /*!
+ * \brief TCP Server Sink Constructor
+ *
+ * \param itemsize The size (in bytes) of the item datatype
+ * \param host The name or IP address of interface to bind to.
+ * \param port Port where to listen.
+ * \param noblock If false, wait until first client connects before
+ * streaming starts. In non blocking mode
+ * (noblock=true), drop data onto floor if no client
+ * is connected.
+ */
+ static sptr make(size_t itemsize,
+ const std::string &host, int port,
+ bool noblock = false);
+ };
+
+ } /* namespace blocks */
+} /* namespace gr */
+
+#endif /* INCLUDED_BLOCKS_TCP_SERVER_SINK_H */
diff --git a/gr-blocks/lib/CMakeLists.txt b/gr-blocks/lib/CMakeLists.txt
index 643190c2ee..1d69f27a1d 100644
--- a/gr-blocks/lib/CMakeLists.txt
+++ b/gr-blocks/lib/CMakeLists.txt
@@ -199,6 +199,7 @@ list(APPEND gr_blocks_sources
throttle_impl.cc
transcendental_impl.cc
tcp_connection.cc
+ tcp_server_sink_impl.cc
tuntap_pdu_impl.cc
tag_gate_impl.cc
tagged_stream_align_impl.cc
diff --git a/gr-blocks/lib/tcp_server_sink_impl.cc b/gr-blocks/lib/tcp_server_sink_impl.cc
new file mode 100644
index 0000000000..329e798ca8
--- /dev/null
+++ b/gr-blocks/lib/tcp_server_sink_impl.cc
@@ -0,0 +1,161 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007-2010,2013 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "tcp_server_sink_impl.h"
+#include <gnuradio/io_signature.h>
+#include <algorithm>
+#include <boost/array.hpp>
+#include <boost/asio.hpp>
+#include <boost/format.hpp>
+#include <gnuradio/thread/thread.h>
+#include <stdexcept>
+#include <stdio.h>
+#include <string.h>
+
+namespace gr {
+ namespace blocks {
+
+ tcp_server_sink::sptr
+ tcp_server_sink::make(size_t itemsize,
+ const std::string &host, int port,
+ bool noblock)
+ {
+ return gnuradio::get_initial_sptr
+ (new tcp_server_sink_impl(itemsize, host, port, noblock));
+ }
+
+ tcp_server_sink_impl::tcp_server_sink_impl(size_t itemsize,
+ const std::string &host, int port,
+ bool noblock)
+ : sync_block("tcp_server_sink",
+ io_signature::make(1, 1, itemsize),
+ io_signature::make(0, 0, 0)),
+ d_itemsize(itemsize),
+ d_acceptor(d_io_service),
+ d_buf(new uint8_t[BUF_SIZE]),
+ d_writing(0)
+ {
+ std::string s_port = (boost::format("%d") % port).str();
+ std::string s_host = host.empty() ? std::string("localhost") : host;
+ boost::asio::ip::tcp::resolver resolver(d_io_service);
+ boost::asio::ip::tcp::resolver::query query(s_host, s_port,
+ boost::asio::ip::resolver_query_base::passive);
+ d_endpoint = *resolver.resolve(query);
+
+ d_acceptor.open(d_endpoint.protocol());
+ d_acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+ d_acceptor.bind(d_endpoint);
+ d_acceptor.listen();
+
+ if (!noblock) {
+ d_socket.reset(new boost::asio::ip::tcp::socket(d_io_service));
+ d_acceptor.accept(*d_socket, d_endpoint);
+ d_sockets.insert(d_socket.release());
+ }
+
+ d_socket.reset(new boost::asio::ip::tcp::socket(d_io_service));
+ d_acceptor.async_accept(*d_socket, boost::bind(&tcp_server_sink_impl::do_accept,
+ this, boost::asio::placeholders::error));
+ d_io_serv_thread = boost::thread(
+ boost::bind(&boost::asio::io_service::run, &d_io_service));
+ }
+
+ void
+ tcp_server_sink_impl::do_accept(const boost::system::error_code& error)
+ {
+ if (!error) {
+ gr::thread::scoped_lock guard(d_writing_mut);
+ d_sockets.insert(d_socket.release());
+ d_socket.reset(new boost::asio::ip::tcp::socket(d_io_service));
+ d_acceptor.async_accept(*d_socket, boost::bind(&tcp_server_sink_impl::do_accept,
+ this, boost::asio::placeholders::error));
+ }
+ }
+
+ void
+ tcp_server_sink_impl::do_write(const boost::system::error_code& error,
+ size_t len, std::set<boost::asio::ip::tcp::socket *>::iterator i)
+ {
+ {
+ gr::thread::scoped_lock guard(d_writing_mut);
+ --d_writing;
+ if (error) {
+ delete *i;
+ d_sockets.erase(i);
+ }
+ }
+ d_writing_cond.notify_one();
+ }
+
+ tcp_server_sink_impl::~tcp_server_sink_impl()
+ {
+ gr::thread::scoped_lock guard(d_writing_mut);
+ while (d_writing) {
+ d_writing_cond.wait(guard);
+ }
+
+ for (std::set<boost::asio::ip::tcp::socket *>::iterator i = d_sockets.begin();
+ i != d_sockets.end(); ++i ) {
+ delete *i;
+ }
+ d_sockets.clear();
+
+ d_io_service.reset();
+ d_io_service.stop();
+ d_io_serv_thread.join();
+ }
+
+ int
+ tcp_server_sink_impl::work (int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const char *in = (const char *) input_items[0];
+
+ gr::thread::scoped_lock guard(d_writing_mut);
+ while (d_writing) {
+ d_writing_cond.wait(guard);
+ }
+
+ size_t data_len = std::min(size_t(BUF_SIZE), noutput_items * d_itemsize);
+ data_len -= data_len % d_itemsize;
+ memcpy(d_buf.get(), in, data_len);
+ for (std::set<boost::asio::ip::tcp::socket *>::iterator i = d_sockets.begin();
+ i != d_sockets.end(); ++i ) {
+ boost::asio::async_write(**i, boost::asio::buffer(d_buf.get(), data_len),
+ boost::bind(&tcp_server_sink_impl::do_write, this,
+ boost::asio::placeholders::error,
+ boost::asio::placeholders::bytes_transferred,
+ i));
+ }
+ d_writing = d_sockets.size();
+
+ return data_len / d_itemsize;
+ }
+
+ } /* namespace blocks */
+} /* namespace gr */
+
diff --git a/gr-blocks/lib/tcp_server_sink_impl.h b/gr-blocks/lib/tcp_server_sink_impl.h
new file mode 100644
index 0000000000..d10f3b95b8
--- /dev/null
+++ b/gr-blocks/lib/tcp_server_sink_impl.h
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2014 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_GR_TCP_SERVER_SINK_IMPL_H
+#define INCLUDED_GR_TCP_SERVER_SINK_IMPL_H
+
+#include <gnuradio/blocks/tcp_server_sink.h>
+#include <boost/asio.hpp>
+#include <set>
+#include <boost/ptr_container/ptr_vector.hpp>
+
+namespace gr {
+ namespace blocks {
+
+ class tcp_server_sink_impl : public tcp_server_sink
+ {
+ private:
+ size_t d_itemsize;
+
+ boost::asio::io_service d_io_service;
+ gr::thread::thread d_io_serv_thread;
+ boost::asio::ip::tcp::endpoint d_endpoint;
+ std::auto_ptr<boost::asio::ip::tcp::socket> d_socket;
+ std::set<boost::asio::ip::tcp::socket *> d_sockets;
+ boost::asio::ip::tcp::acceptor d_acceptor;
+
+ boost::shared_ptr<uint8_t> d_buf;
+ enum {
+ BUF_SIZE = 256 * 1024,
+ };
+
+ int d_writing;
+ boost::condition_variable d_writing_cond;
+ boost::mutex d_writing_mut;
+
+ void do_accept(const boost::system::error_code& error);
+ void do_write(const boost::system::error_code& error, std::size_t len,
+ std::set<boost::asio::ip::tcp::socket *>::iterator);
+
+ public:
+ tcp_server_sink_impl(size_t itemsize,
+ const std::string &host, int port,
+ bool noblock);
+ ~tcp_server_sink_impl();
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace blocks */
+} /* namespace gr */
+
+#endif /* INCLUDED_GR_TCP_SERVER_SINK_IMPL_H */
diff --git a/gr-blocks/python/blocks/qa_tcp_server_sink.py b/gr-blocks/python/blocks/qa_tcp_server_sink.py
new file mode 100644
index 0000000000..f7d3a0af92
--- /dev/null
+++ b/gr-blocks/python/blocks/qa_tcp_server_sink.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+#
+# Copyright 2014 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+from gnuradio import gr, gr_unittest, blocks
+import os
+import socket
+from time import sleep
+
+from threading import Timer
+from multiprocessing import Process
+
+class test_tcp_sink(gr_unittest.TestCase):
+
+ def setUp(self):
+ os.environ['GR_CONF_CONTROLPORT_ON'] = 'False'
+ self.tb_snd = gr.top_block()
+ self.tb_rcv = gr.top_block()
+
+ def tearDown(self):
+ self.tb_rcv = None
+ self.tb_snd = None
+
+ def _tcp_client(self):
+ dst = blocks.vector_sink_s()
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ for t in (0, 0.2):
+# wait until server listens
+ sleep(t)
+ try:
+ sock.connect((self.addr, self.port))
+ except socket.error as e:
+ if e.errno != 111:
+ raise
+ continue
+ break
+ fd = os.dup(sock.fileno())
+ self.tb_rcv.connect(blocks.file_descriptor_source(self.itemsize, fd), dst)
+ self.tb_rcv.run()
+ self.assertEqual(self.data, dst.data())
+
+ def test_001(self):
+ self.addr = '127.0.0.1'
+ self.port = 65510
+ self.itemsize = gr.sizeof_short
+ n_data = 16
+ self.data = tuple([x for x in range(n_data)])
+
+# tcp_server_sink blocks until client does not connect, start client process first
+ p = Process(target=self._tcp_client)
+ p.start()
+
+ src = blocks.vector_source_s(self.data, False)
+ tcp_snd = blocks.tcp_server_sink(self.itemsize, self.addr, self.port, False)
+ self.tb_snd.connect(src, tcp_snd)
+
+ self.tb_snd.run()
+ del tcp_snd
+ self.tb_snd = None
+ p.join()
+
+ def stop_rcv(self):
+ self.timeout = True
+ self.tb_rcv.stop()
+ #print "tb_rcv stopped by Timer"
+
+if __name__ == '__main__':
+ gr_unittest.run(test_tcp_sink, "test_tcp_server_sink.xml")
+
diff --git a/gr-blocks/swig/blocks_swig5.i b/gr-blocks/swig/blocks_swig5.i
index 51601a8c30..761b0a855a 100644
--- a/gr-blocks/swig/blocks_swig5.i
+++ b/gr-blocks/swig/blocks_swig5.i
@@ -56,6 +56,7 @@
#include "gnuradio/blocks/tagged_stream_multiply_length.h"
#include "gnuradio/blocks/tagged_stream_to_pdu.h"
#include "gnuradio/blocks/tags_strobe.h"
+#include "gnuradio/blocks/tcp_server_sink.h"
#include "gnuradio/blocks/test_tag_variable_rate_ff.h"
#include "gnuradio/blocks/threshold_ff.h"
#include "gnuradio/blocks/transcendental.h"
@@ -100,6 +101,7 @@
%include "gnuradio/blocks/tagged_stream_multiply_length.h"
%include "gnuradio/blocks/tagged_stream_to_pdu.h"
%include "gnuradio/blocks/tags_strobe.h"
+%include "gnuradio/blocks/tcp_server_sink.h"
%include "gnuradio/blocks/test_tag_variable_rate_ff.h"
%include "gnuradio/blocks/threshold_ff.h"
%include "gnuradio/blocks/transcendental.h"
@@ -143,6 +145,7 @@ GR_SWIG_BLOCK_MAGIC2(blocks, tagged_stream_mux);
GR_SWIG_BLOCK_MAGIC2(blocks, tagged_stream_multiply_length);
GR_SWIG_BLOCK_MAGIC2(blocks, tagged_stream_to_pdu);
GR_SWIG_BLOCK_MAGIC2(blocks, tags_strobe);
+GR_SWIG_BLOCK_MAGIC2(blocks, tcp_server_sink);
GR_SWIG_BLOCK_MAGIC2(blocks, test_tag_variable_rate_ff);
GR_SWIG_BLOCK_MAGIC2(blocks, threshold_ff);
GR_SWIG_BLOCK_MAGIC2(blocks, transcendental);
diff --git a/gr-dtv/examples/README.atsc b/gr-dtv/examples/README.atsc
new file mode 100644
index 0000000000..29f5abeccb
--- /dev/null
+++ b/gr-dtv/examples/README.atsc
@@ -0,0 +1,7 @@
+A test Transport Stream (19.392658 Mbps) for the example transmit
+flow graphs is available here:
+
+http://www.w6rz.net/advatsc.ts
+
+It is 256,952,572 bytes.
+
diff --git a/gr-dtv/examples/file_atsc_tx.grc b/gr-dtv/examples/file_atsc_tx.grc
index f212ab35c6..3a7124127b 100644
--- a/gr-dtv/examples/file_atsc_tx.grc
+++ b/gr-dtv/examples/file_atsc_tx.grc
@@ -1,23 +1,23 @@
-<?xml version='1.0' encoding='ASCII'?>
-<?grc format='1' created='3.7.7'?>
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.11'?>
<flow_graph>
- <timestamp>Sat Jan 17 12:37:25 2015</timestamp>
+ <timestamp>Sat Dec 20 12:18:33 2014</timestamp>
<block>
<key>options</key>
<param>
- <key>id</key>
- <value>file_atsc_tx</value>
+ <key>author</key>
+ <value></value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>window_size</key>
+ <value>1280, 1024</value>
</param>
<param>
- <key>title</key>
- <value></value>
+ <key>category</key>
+ <value>Custom</value>
</param>
<param>
- <key>author</key>
+ <key>comment</key>
<value></value>
</param>
<param>
@@ -25,16 +25,44 @@
<value></value>
</param>
<param>
- <key>window_size</key>
- <value>1280, 1024</value>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(368, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
</param>
<param>
<key>generate_options</key>
- <value>wx_gui</value>
+ <value>qt_gui</value>
</param>
<param>
- <key>category</key>
- <value>Custom</value>
+ <key>hier_block_src_path</key>
+ <value>.:</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>file_atsc_tx</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>qt_qss_theme</key>
+ <value></value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>run_command</key>
+ <value>{python} -u {filename}</value>
</param>
<param>
<key>run_options</key>
@@ -45,92 +73,107 @@
<value>True</value>
</param>
<param>
- <key>max_nouts</key>
- <value>0</value>
+ <key>thread_safe_setters</key>
+ <value></value>
</param>
<param>
- <key>realtime_scheduling</key>
+ <key>title</key>
<value></value>
</param>
+ </block>
+ <block>
+ <key>variable</key>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(584, 19)</value>
+ <value>(808, 20)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
+ <param>
+ <key>id</key>
+ <value>center_freq</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>429e6</value>
+ </param>
</block>
<block>
<key>variable</key>
<param>
- <key>id</key>
- <value>symbol_rate</value>
+ <key>comment</key>
+ <value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>value</key>
- <value>4500000.0 / 286 * 684</value>
+ <key>_coordinate</key>
+ <value>(680, 20)</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(360, 19)</value>
+ <key>id</key>
+ <value>pilot_freq</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>value</key>
+ <value>(6000000.0 - (symbol_rate / 2)) / 2</value>
</param>
</block>
<block>
<key>variable</key>
<param>
- <key>id</key>
- <value>pilot_freq</value>
+ <key>comment</key>
+ <value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>value</key>
- <value>309441</value>
+ <key>_coordinate</key>
+ <value>(552, 19)</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(472, 19)</value>
+ <key>id</key>
+ <value>symbol_rate</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>value</key>
+ <value>4500000.0 / 286 * 684</value>
</param>
</block>
<block>
- <key>dtv_atsc_pad</key>
+ <key>blocks_file_sink</key>
<param>
- <key>id</key>
- <value>dtv_atsc_pad_0</value>
+ <key>append</key>
+ <value>False</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
@@ -138,804 +181,1028 @@
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>1</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>file</key>
+ <value>atsc.cfile</value>
</param>
<param>
<key>_coordinate</key>
- <value>(96, 112)</value>
+ <value>(1048, 236)</value>
</param>
<param>
<key>_rotation</key>
- <value>180</value>
+ <value>0</value>
</param>
- </block>
- <block>
- <key>dtv_atsc_randomizer</key>
<param>
<key>id</key>
- <value>dtv_atsc_randomizer_0</value>
+ <value>blocks_file_sink_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>type</key>
+ <value>complex</value>
</param>
<param>
+ <key>unbuffered</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_file_source</key>
+ <param>
<key>alias</key>
<value></value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>file</key>
+ <value>advatsc.ts</value>
</param>
<param>
<key>_coordinate</key>
- <value>(72, 168)</value>
+ <value>(64, 19)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>dtv_atsc_rs_encoder</key>
<param>
<key>id</key>
- <value>dtv_atsc_rs_encoder_0</value>
+ <value>blocks_file_source_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_keep_m_in_n</key>
+ <param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>comment</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
<key>_coordinate</key>
- <value>(72, 224)</value>
+ <value>(104, 451)</value>
</param>
<param>
<key>_rotation</key>
- <value>180</value>
+ <value>0</value>
</param>
- </block>
- <block>
- <key>blocks_keep_m_in_n</key>
<param>
<key>id</key>
<value>blocks_keep_m_in_n_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>m</key>
+ <value>832</value>
</param>
<param>
- <key>type</key>
- <value>byte</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>m</key>
- <value>832</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>n</key>
<value>1024</value>
</param>
<param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
<key>offset</key>
<value>4</value>
</param>
+ </block>
+ <block>
+ <key>blocks_rotator_cc</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(336, 332)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
<value>0</value>
</param>
<param>
+ <key>id</key>
+ <value>blocks_rotator_cc_0</value>
+ </param>
+ <param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>phase_inc</key>
+ <value>((-3000000.0 + pilot_freq) / symbol_rate) * (math.pi * 2)</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_throttle</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(80, 515)</value>
+ <value>(824, 332)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>digital_chunks_to_symbols_xx</key>
<param>
<key>id</key>
- <value>digital_chunks_to_symbols_xx_0</value>
+ <value>blocks_throttle_0</value>
</param>
<param>
- <key>_enabled</key>
+ <key>ignoretag</key>
<value>True</value>
</param>
<param>
- <key>in_type</key>
- <value>byte</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>out_type</key>
- <value>complex</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>symbol_table</key>
- <value>[symbol + 1.25 for symbol in [-7,-5,-3,-1,1,3,5,7]]</value>
+ <key>samples_per_second</key>
+ <value>symbol_rate</value>
</param>
<param>
- <key>dimension</key>
- <value>1</value>
+ <key>type</key>
+ <value>complex</value>
</param>
<param>
- <key>num_ports</key>
+ <key>vlen</key>
<value>1</value>
</param>
+ </block>
+ <block>
+ <key>blocks_vector_to_stream</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>comment</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
<key>_coordinate</key>
- <value>(360, 523)</value>
+ <value>(96, 387)</value>
</param>
<param>
<key>_rotation</key>
- <value>0</value>
+ <value>180</value>
</param>
- </block>
- <block>
- <key>blocks_multiply_xx</key>
<param>
<key>id</key>
- <value>blocks_multiply_xx_0</value>
+ <value>blocks_vector_to_stream_1</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>type</key>
+ <value>byte</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>num_inputs</key>
- <value>2</value>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>num_items</key>
+ <value>1024</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
+ </block>
+ <block>
+ <key>dtv_atsc_field_sync_mux</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>comment</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
<key>_coordinate</key>
- <value>(376, 296)</value>
+ <value>(80, 337)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
+ <param>
+ <key>id</key>
+ <value>dtv_atsc_field_sync_mux_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
</block>
<block>
- <key>analog_sig_source_x</key>
+ <key>dtv_atsc_interleaver</key>
<param>
- <key>id</key>
- <value>analog_sig_source_x_0</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>comment</key>
+ <value></value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>samp_rate</key>
- <value>symbol_rate</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>waveform</key>
- <value>analog.GR_COS_WAVE</value>
+ <key>_coordinate</key>
+ <value>(88, 241)</value>
</param>
<param>
- <key>freq</key>
- <value>-3000000+pilot_freq</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
<param>
- <key>amp</key>
- <value>0.9</value>
+ <key>id</key>
+ <value>dtv_atsc_interleaver_0</value>
</param>
<param>
- <key>offset</key>
+ <key>maxoutbuf</key>
<value>0</value>
</param>
<param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_atsc_pad</key>
+ <param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>comment</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
<key>_coordinate</key>
- <value>(416, 131)</value>
+ <value>(112, 97)</value>
</param>
<param>
<key>_rotation</key>
<value>180</value>
</param>
+ <param>
+ <key>id</key>
+ <value>dtv_atsc_pad_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
</block>
<block>
- <key>fft_filter_xxx</key>
+ <key>dtv_atsc_randomizer</key>
<param>
- <key>id</key>
- <value>fft_filter_xxx_0</value>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>ccc</value>
+ <key>_coordinate</key>
+ <value>(88, 145)</value>
</param>
<param>
- <key>decim</key>
- <value>1</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
<param>
- <key>taps</key>
- <value>firdes.root_raised_cosine(0.1, symbol_rate, symbol_rate/2, 0.1152, 100)</value>
+ <key>id</key>
+ <value>dtv_atsc_randomizer_0</value>
</param>
<param>
- <key>samp_delay</key>
+ <key>maxoutbuf</key>
<value>0</value>
</param>
<param>
- <key>nthreads</key>
- <value>1</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>dtv_atsc_rs_encoder</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>comment</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
<key>_coordinate</key>
- <value>(576, 291)</value>
+ <value>(88, 193)</value>
</param>
<param>
<key>_rotation</key>
+ <value>180</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_atsc_rs_encoder_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
<value>0</value>
</param>
</block>
<block>
- <key>wxgui_fftsink2</key>
+ <key>dtv_atsc_trellis_encoder</key>
<param>
- <key>id</key>
- <value>wxgui_fftsink2_0</value>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>_coordinate</key>
+ <value>(80, 289)</value>
</param>
<param>
- <key>title</key>
- <value>FFT Plot</value>
+ <key>_rotation</key>
+ <value>180</value>
</param>
<param>
- <key>samp_rate</key>
- <value>symbol_rate</value>
+ <key>id</key>
+ <value>dtv_atsc_trellis_encoder_0</value>
</param>
<param>
- <key>baseband_freq</key>
- <value>429000000</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>y_per_div</key>
- <value>10</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>dtv_dvbs2_modulator_bc</key>
<param>
- <key>y_divs</key>
- <value>10</value>
+ <key>interpolation</key>
+ <value>INTERPOLATION_OFF</value>
</param>
<param>
- <key>ref_level</key>
- <value>-10</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>ref_scale</key>
- <value>2.0</value>
+ <key>rate1</key>
+ <value>C1_4</value>
</param>
<param>
- <key>fft_size</key>
- <value>1024</value>
+ <key>rate2</key>
+ <value>C1_5_MEDIUM</value>
</param>
<param>
- <key>fft_rate</key>
- <value>15</value>
+ <key>rate3</key>
+ <value>C1_4</value>
</param>
<param>
- <key>peak_hold</key>
- <value>False</value>
+ <key>comment</key>
+ <value></value>
</param>
<param>
- <key>average</key>
+ <key>constellation</key>
+ <value>MOD_8VSB</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>avg_alpha</key>
- <value>0.1333</value>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
</param>
<param>
- <key>win</key>
- <value>None</value>
+ <key>_coordinate</key>
+ <value>(80, 556)</value>
</param>
<param>
- <key>win_size</key>
- <value>800,600</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
<param>
- <key>grid_pos</key>
- <value></value>
+ <key>id</key>
+ <value>dtv_dvbs2_modulator_bc_0</value>
</param>
<param>
- <key>notebook</key>
- <value></value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>freqvar</key>
- <value>None</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>fft_filter_xxx</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
<param>
+ <key>decim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(1048, 331)</value>
+ <value>(576, 316)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>dtv_atsc_interleaver</key>
<param>
<key>id</key>
- <value>dtv_atsc_interleaver_0</value>
+ <value>fft_filter_xxx_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>nthreads</key>
+ <value>1</value>
</param>
<param>
- <key>minoutbuf</key>
+ <key>samp_delay</key>
<value>0</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>taps</key>
+ <value>firdes.root_raised_cosine(0.11, symbol_rate, symbol_rate/2, 0.1152, 200)</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ccc</value>
+ </param>
+ </block>
+ <block>
+ <key>import</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
<key>_coordinate</key>
- <value>(72, 280)</value>
+ <value>(368, 91)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
+ <param>
+ <key>id</key>
+ <value>import_0</value>
+ </param>
+ <param>
+ <key>import</key>
+ <value>import math</value>
+ </param>
</block>
<block>
- <key>blocks_throttle</key>
+ <key>qtgui_freq_sink_x</key>
<param>
- <key>id</key>
- <value>blocks_throttle_0</value>
+ <key>autoscale</key>
+ <value>False</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>average</key>
+ <value>0.1</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>axislabels</key>
+ <value>True</value>
</param>
<param>
- <key>samples_per_second</key>
+ <key>bw</key>
<value>symbol_rate</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>ignoretag</key>
- <value>True</value>
+ <key>fc</key>
+ <value>center_freq</value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
+ <key>ctrlpanel</key>
+ <value>False</value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>fftsize</key>
+ <value>1024</value>
</param>
<param>
<key>_coordinate</key>
- <value>(808, 307)</value>
+ <value>(1048, 396)</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>blocks_file_sink</key>
+ <param>
+ <key>grid</key>
+ <value>False</value>
+ </param>
<param>
<key>id</key>
- <value>blocks_file_sink_0</value>
+ <value>qtgui_freq_sink_x_0</value>
</param>
<param>
- <key>_enabled</key>
+ <key>legend</key>
<value>True</value>
</param>
<param>
- <key>file</key>
- <value>atsc.cfile</value>
+ <key>alpha1</key>
+ <value>1.0</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>color1</key>
+ <value>"blue"</value>
</param>
<param>
- <key>vlen</key>
+ <key>label1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width1</key>
<value>1</value>
</param>
<param>
- <key>unbuffered</key>
- <value>False</value>
+ <key>alpha10</key>
+ <value>1.0</value>
</param>
<param>
- <key>append</key>
- <value>False</value>
+ <key>color10</key>
+ <value>"dark blue"</value>
</param>
<param>
- <key>alias</key>
+ <key>label10</key>
<value></value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>width10</key>
+ <value>1</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1048, 171)</value>
+ <key>alpha2</key>
+ <value>1.0</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>color2</key>
+ <value>"red"</value>
</param>
- </block>
- <block>
- <key>dtv_atsc_trellis_encoder</key>
<param>
- <key>id</key>
- <value>dtv_atsc_trellis_encoder_0</value>
+ <key>label2</key>
+ <value></value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>width2</key>
+ <value>1</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>alpha3</key>
+ <value>1.0</value>
</param>
<param>
- <key>affinity</key>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>label3</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>width3</key>
+ <value>1</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>alpha4</key>
+ <value>1.0</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(64, 336)</value>
+ <key>color4</key>
+ <value>"black"</value>
</param>
<param>
- <key>_rotation</key>
- <value>180</value>
+ <key>label4</key>
+ <value></value>
</param>
- </block>
- <block>
- <key>blocks_vector_to_stream</key>
<param>
- <key>id</key>
- <value>blocks_vector_to_stream_1</value>
+ <key>width4</key>
+ <value>1</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>alpha5</key>
+ <value>1.0</value>
</param>
<param>
- <key>type</key>
- <value>byte</value>
+ <key>color5</key>
+ <value>"cyan"</value>
</param>
<param>
- <key>num_items</key>
- <value>1024</value>
+ <key>label5</key>
+ <value></value>
</param>
<param>
- <key>vlen</key>
+ <key>width5</key>
<value>1</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>alpha6</key>
+ <value>1.0</value>
</param>
<param>
- <key>affinity</key>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>label6</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>width6</key>
+ <value>1</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>alpha7</key>
+ <value>1.0</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(72, 451)</value>
+ <key>color7</key>
+ <value>"yellow"</value>
</param>
<param>
- <key>_rotation</key>
- <value>180</value>
+ <key>label7</key>
+ <value></value>
</param>
- </block>
- <block>
- <key>dtv_atsc_field_sync_mux</key>
<param>
- <key>id</key>
- <value>dtv_atsc_field_sync_mux_0</value>
+ <key>width7</key>
+ <value>1</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>alpha8</key>
+ <value>1.0</value>
</param>
<param>
- <key>alias</key>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>label8</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>label9</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>width9</key>
+ <value>1</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(64, 392)</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>name</key>
+ <value>""</value>
</param>
- </block>
- <block>
- <key>blocks_file_source</key>
<param>
- <key>id</key>
- <value>blocks_file_source_0</value>
+ <key>nconnections</key>
+ <value>1</value>
</param>
<param>
- <key>_enabled</key>
+ <key>showports</key>
<value>True</value>
</param>
<param>
- <key>file</key>
- <value>test.ts</value>
+ <key>freqhalf</key>
+ <value>True</value>
</param>
<param>
- <key>type</key>
- <value>byte</value>
+ <key>tr_chan</key>
+ <value>0</value>
</param>
<param>
- <key>repeat</key>
- <value>False</value>
+ <key>tr_level</key>
+ <value>0.0</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_FREE</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>tr_tag</key>
+ <value>""</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>type</key>
+ <value>complex</value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>update_time</key>
+ <value>0.10</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>wintype</key>
+ <value>firdes.WIN_BLACKMAN_hARRIS</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(48, 19)</value>
+ <key>label</key>
+ <value>Relative Gain</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>ymax</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-140</value>
+ </param>
+ <param>
+ <key>units</key>
+ <value>dB</value>
</param>
</block>
<connection>
- <source_block_id>blocks_vector_to_stream_1</source_block_id>
- <sink_block_id>blocks_keep_m_in_n_0</sink_block_id>
+ <source_block_id>blocks_file_source_0</source_block_id>
+ <sink_block_id>dtv_atsc_pad_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_keep_m_in_n_0</source_block_id>
- <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id>
+ <sink_block_id>dtv_dvbs2_modulator_bc_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_multiply_xx_0</source_block_id>
+ <source_block_id>blocks_rotator_cc_0</source_block_id>
<sink_block_id>fft_filter_xxx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>analog_sig_source_x_0</source_block_id>
- <sink_block_id>blocks_multiply_xx_0</sink_block_id>
+ <source_block_id>blocks_throttle_0</source_block_id>
+ <sink_block_id>blocks_file_sink_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
- <sink_block_id>blocks_multiply_xx_0</sink_block_id>
+ <source_block_id>blocks_throttle_0</source_block_id>
+ <sink_block_id>qtgui_freq_sink_x_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>1</sink_key>
+ <sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>fft_filter_xxx_0</source_block_id>
- <sink_block_id>blocks_throttle_0</sink_block_id>
+ <source_block_id>blocks_vector_to_stream_1</source_block_id>
+ <sink_block_id>blocks_keep_m_in_n_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_throttle_0</source_block_id>
- <sink_block_id>wxgui_fftsink2_0</sink_block_id>
+ <source_block_id>dtv_atsc_field_sync_mux_0</source_block_id>
+ <sink_block_id>blocks_vector_to_stream_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_file_source_0</source_block_id>
- <sink_block_id>dtv_atsc_pad_0</sink_block_id>
+ <source_block_id>dtv_atsc_interleaver_0</source_block_id>
+ <sink_block_id>dtv_atsc_trellis_encoder_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
@@ -958,26 +1225,20 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>dtv_atsc_interleaver_0</source_block_id>
- <sink_block_id>dtv_atsc_trellis_encoder_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>blocks_throttle_0</source_block_id>
- <sink_block_id>blocks_file_sink_0</sink_block_id>
+ <source_block_id>dtv_atsc_trellis_encoder_0</source_block_id>
+ <sink_block_id>dtv_atsc_field_sync_mux_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>dtv_atsc_trellis_encoder_0</source_block_id>
- <sink_block_id>dtv_atsc_field_sync_mux_0</sink_block_id>
+ <source_block_id>dtv_dvbs2_modulator_bc_0</source_block_id>
+ <sink_block_id>blocks_rotator_cc_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>dtv_atsc_field_sync_mux_0</source_block_id>
- <sink_block_id>blocks_vector_to_stream_1</sink_block_id>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>blocks_throttle_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
diff --git a/gr-dtv/examples/uhd_atsc_tx.grc b/gr-dtv/examples/uhd_atsc_tx.grc
new file mode 100644
index 0000000000..24b451e474
--- /dev/null
+++ b/gr-dtv/examples/uhd_atsc_tx.grc
@@ -0,0 +1,3166 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.11'?>
+<flow_graph>
+ <timestamp>Sat Dec 20 12:18:33 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>1280, 1024</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(368, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>qt_gui</value>
+ </param>
+ <param>
+ <key>hier_block_src_path</key>
+ <value>.:</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>uhd_atsc_tx</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>qt_qss_theme</key>
+ <value></value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>run_command</key>
+ <value>{python} -u {filename}</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>thread_safe_setters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>title</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(808, 20)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>center_freq</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>429e6</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(680, 20)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>pilot_freq</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>(6000000.0 - (symbol_rate / 2)) / 2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(552, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>symbol_rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>4500000.0 / 286 * 684</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_qtgui_range</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>50</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(808, 88)</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>tx_gain</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value></value>
+ </param>
+ <param>
+ <key>min_len</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
+ </param>
+ <param>
+ <key>start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>step</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>stop</key>
+ <value>89</value>
+ </param>
+ <param>
+ <key>rangeType</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>widget</key>
+ <value>counter_slider</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_qtgui_range</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>-8</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(552, 88)</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>vga1_gain</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value></value>
+ </param>
+ <param>
+ <key>min_len</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
+ </param>
+ <param>
+ <key>start</key>
+ <value>-35</value>
+ </param>
+ <param>
+ <key>step</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>stop</key>
+ <value>-4</value>
+ </param>
+ <param>
+ <key>rangeType</key>
+ <value>int</value>
+ </param>
+ <param>
+ <key>widget</key>
+ <value>counter_slider</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_qtgui_range</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(680, 88)</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>vga2_gain</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value></value>
+ </param>
+ <param>
+ <key>min_len</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
+ </param>
+ <param>
+ <key>start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>step</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>stop</key>
+ <value>25</value>
+ </param>
+ <param>
+ <key>rangeType</key>
+ <value>int</value>
+ </param>
+ <param>
+ <key>widget</key>
+ <value>counter_slider</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_file_source</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>file</key>
+ <value>advatsc.ts</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(64, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_file_source_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_keep_m_in_n</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(104, 451)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_keep_m_in_n_0</value>
+ </param>
+ <param>
+ <key>m</key>
+ <value>832</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>n</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>offset</key>
+ <value>4</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_rotator_cc</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(336, 332)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_rotator_cc_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>phase_inc</key>
+ <value>((-3000000.0 + pilot_freq) / symbol_rate) * (math.pi * 2)</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_vector_to_stream</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(96, 387)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_vector_to_stream_1</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>num_items</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_atsc_field_sync_mux</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(80, 337)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_atsc_field_sync_mux_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_atsc_interleaver</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(88, 241)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_atsc_interleaver_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_atsc_pad</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(112, 97)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_atsc_pad_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_atsc_randomizer</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(88, 145)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_atsc_randomizer_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_atsc_rs_encoder</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(88, 193)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_atsc_rs_encoder_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_atsc_trellis_encoder</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(80, 289)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_atsc_trellis_encoder_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_dvbs2_modulator_bc</key>
+ <param>
+ <key>interpolation</key>
+ <value>INTERPOLATION_OFF</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>rate1</key>
+ <value>C1_4</value>
+ </param>
+ <param>
+ <key>rate2</key>
+ <value>C1_5_MEDIUM</value>
+ </param>
+ <param>
+ <key>rate3</key>
+ <value>C1_4</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>constellation</key>
+ <value>MOD_8VSB</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(80, 556)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_dvbs2_modulator_bc_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>fft_filter_xxx</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>decim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(576, 316)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>fft_filter_xxx_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>nthreads</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>samp_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>firdes.root_raised_cosine(0.11, symbol_rate, symbol_rate/2, 0.1152, 200)</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ccc</value>
+ </param>
+ </block>
+ <block>
+ <key>import</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(368, 91)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>import_0</value>
+ </param>
+ <param>
+ <key>import</key>
+ <value>import math</value>
+ </param>
+ </block>
+ <block>
+ <key>osmosdr_sink</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ant0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain0</key>
+ <value>vga1_gain</value>
+ </param>
+ <param>
+ <key>bw0</key>
+ <value>6000000</value>
+ </param>
+ <param>
+ <key>corr0</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq0</key>
+ <value>center_freq</value>
+ </param>
+ <param>
+ <key>if_gain0</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>gain0</key>
+ <value>vga2_gain</value>
+ </param>
+ <param>
+ <key>ant10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain10</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq10</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain10</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain10</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant11</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain11</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq11</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain11</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain11</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant12</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain12</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq12</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain12</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain12</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant13</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain13</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq13</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain13</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain13</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant14</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain14</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq14</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain14</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain14</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant15</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain15</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq15</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain15</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain15</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant16</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain16</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq16</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain16</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain16</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant17</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain17</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq17</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain17</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain17</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant18</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain18</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq18</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain18</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain18</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant19</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain19</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq19</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain19</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain19</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain1</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq1</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain1</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain1</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant20</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain20</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq20</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain20</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain20</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant21</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain21</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq21</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain21</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain21</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant22</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain22</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq22</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain22</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain22</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant23</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain23</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq23</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain23</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain23</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant24</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain24</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq24</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain24</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain24</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant25</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain25</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq25</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain25</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain25</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant26</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain26</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq26</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain26</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain26</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant27</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain27</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq27</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain27</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain27</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant28</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain28</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq28</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain28</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain28</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant29</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain29</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq29</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain29</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain29</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain2</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq2</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain2</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain2</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant30</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain30</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq30</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain30</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain30</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant31</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain31</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq31</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain31</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain31</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain3</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq3</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain3</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain3</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain4</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq4</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain4</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain4</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain5</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq5</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain5</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain5</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain6</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq6</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain6</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain6</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain7</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq7</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain7</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain7</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain8</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq8</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain8</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain8</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain9</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq9</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain9</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain9</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>args</key>
+ <value>bladerf=0,buffers=128,buflen=32768</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(944, 468)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>osmosdr_sink_0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>fc32</value>
+ </param>
+ <param>
+ <key>clock_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>nchan</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_mboards</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>sample_rate</key>
+ <value>symbol_rate</value>
+ </param>
+ <param>
+ <key>sync</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_freq_sink_x</key>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>average</key>
+ <value>0.1</value>
+ </param>
+ <param>
+ <key>axislabels</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>bw</key>
+ <value>symbol_rate</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>fc</key>
+ <value>center_freq</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ctrlpanel</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>fftsize</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(944, 364)</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>grid</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>qtgui_freq_sink_x_0</value>
+ </param>
+ <param>
+ <key>legend</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"dark blue"</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>showports</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>freqhalf</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_FREE</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>wintype</key>
+ <value>firdes.WIN_BLACKMAN_hARRIS</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Relative Gain</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-140</value>
+ </param>
+ <param>
+ <key>units</key>
+ <value>dB</value>
+ </param>
+ </block>
+ <block>
+ <key>uhd_usrp_sink</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ant0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw0</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq0</key>
+ <value>center_freq</value>
+ </param>
+ <param>
+ <key>norm_gain0</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain0</key>
+ <value>50</value>
+ </param>
+ <param>
+ <key>ant10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain10</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant11</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain11</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant12</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain12</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant13</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain13</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant14</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain14</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant15</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain15</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant16</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain16</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant17</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain17</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant18</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain18</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant19</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain19</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain1</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant20</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain20</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant21</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain21</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant22</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain22</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant23</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain23</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant24</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain24</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant25</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain25</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant26</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain26</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant27</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain27</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant28</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain28</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant29</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain29</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain2</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant30</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain30</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant31</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain31</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain3</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain4</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain5</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain6</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain7</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain8</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain9</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>clock_rate</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>dev_addr</key>
+ <value>"send_frame_size=65536,num_send_frames=128,master_clock_rate=" + str(symbol_rate*4)</value>
+ </param>
+ <param>
+ <key>dev_args</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(944, 232)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>uhd_usrp_sink_0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>fc32</value>
+ </param>
+ <param>
+ <key>clock_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>nchan</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_mboards</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>symbol_rate</value>
+ </param>
+ <param>
+ <key>hide_cmd_port</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>hide_lo_controls</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>stream_args</key>
+ <value></value>
+ </param>
+ <param>
+ <key>stream_chans</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>sync</key>
+ <value></value>
+ </param>
+ <param>
+ <key>len_tag_name</key>
+ <value></value>
+ </param>
+ <param>
+ <key>otw</key>
+ <value></value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>blocks_file_source_0</source_block_id>
+ <sink_block_id>dtv_atsc_pad_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_keep_m_in_n_0</source_block_id>
+ <sink_block_id>dtv_dvbs2_modulator_bc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_rotator_cc_0</source_block_id>
+ <sink_block_id>fft_filter_xxx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_vector_to_stream_1</source_block_id>
+ <sink_block_id>blocks_keep_m_in_n_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_atsc_field_sync_mux_0</source_block_id>
+ <sink_block_id>blocks_vector_to_stream_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_atsc_interleaver_0</source_block_id>
+ <sink_block_id>dtv_atsc_trellis_encoder_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_atsc_pad_0</source_block_id>
+ <sink_block_id>dtv_atsc_randomizer_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_atsc_randomizer_0</source_block_id>
+ <sink_block_id>dtv_atsc_rs_encoder_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_atsc_rs_encoder_0</source_block_id>
+ <sink_block_id>dtv_atsc_interleaver_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_atsc_trellis_encoder_0</source_block_id>
+ <sink_block_id>dtv_atsc_field_sync_mux_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_dvbs2_modulator_bc_0</source_block_id>
+ <sink_block_id>blocks_rotator_cc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>osmosdr_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>qtgui_freq_sink_x_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>uhd_usrp_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml b/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
index 5f848ec82d..28284169fd 100644
--- a/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
+++ b/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
@@ -21,6 +21,7 @@ $constellation.val, $interpolation.val)</make>
<name>FECFRAME size</name>
<key>framesize</key>
<type>enum</type>
+ <hide>$constellation.hide_dvb</hide>
<option>
<name>Normal</name>
<key>FECFRAME_NORMAL</key>
@@ -50,7 +51,7 @@ $constellation.val, $interpolation.val)</make>
<name>Code rate</name>
<key>rate1</key>
<type>enum</type>
- <hide>$framesize.hide_normal</hide>
+ <hide>#if str($constellation) == 'MOD_8VSB' or str($constellation) == 'MOD_64QAM' then $constellation.hide_dvb else $framesize.hide_normal</hide>
<option>
<name>1/4</name>
<key>C1_4</key>
@@ -231,7 +232,7 @@ $constellation.val, $interpolation.val)</make>
<name>Code rate</name>
<key>rate2</key>
<type>enum</type>
- <hide>$framesize.hide_medium</hide>
+ <hide>#if str($constellation) == 'MOD_8VSB' or str($constellation) == 'MOD_64QAM' then $constellation.hide_dvb else $framesize.hide_medium</hide>
<option>
<name>1/5</name>
<key>C1_5_MEDIUM</key>
@@ -252,7 +253,7 @@ $constellation.val, $interpolation.val)</make>
<name>Code rate</name>
<key>rate3</key>
<type>enum</type>
- <hide>$framesize.hide_short</hide>
+ <hide>#if str($constellation) == 'MOD_8VSB' or str($constellation) == 'MOD_64QAM' then $constellation.hide_dvb else $framesize.hide_short</hide>
<option>
<name>1/4</name>
<key>C1_4</key>
@@ -372,81 +373,103 @@ $constellation.val, $interpolation.val)</make>
<name>QPSK</name>
<key>MOD_QPSK</key>
<opt>val:dtv.MOD_QPSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>8PSK</name>
<key>MOD_8PSK</key>
<opt>val:dtv.MOD_8PSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>8APSK</name>
<key>MOD_8APSK</key>
<opt>val:dtv.MOD_8APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>16APSK</name>
<key>MOD_16APSK</key>
<opt>val:dtv.MOD_16APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>8+8APSK</name>
<key>MOD_8_8APSK</key>
<opt>val:dtv.MOD_8_8APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>32APSK</name>
<key>MOD_32APSK</key>
<opt>val:dtv.MOD_32APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>4+12+16rbAPSK</name>
<key>MOD_4_12_16APSK</key>
<opt>val:dtv.MOD_4_12_16APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>4+8+4+16APSK</name>
<key>MOD_4_8_4_16APSK</key>
<opt>val:dtv.MOD_4_8_4_16APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>64APSK</name>
<key>MOD_64APSK</key>
<opt>val:dtv.MOD_64APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>8+16+20+20APSK</name>
<key>MOD_8_16_20_20APSK</key>
<opt>val:dtv.MOD_8_16_20_20APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>4+12+20+28APSK</name>
<key>MOD_4_12_20_28APSK</key>
<opt>val:dtv.MOD_4_12_20_28APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>128APSK</name>
<key>MOD_128APSK</key>
<opt>val:dtv.MOD_128APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>256APSK</name>
<key>MOD_256APSK</key>
<opt>val:dtv.MOD_256APSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>64QAM (ITU-T J.83B)</name>
<key>MOD_64QAM</key>
<opt>val:dtv.MOD_64QAM</opt>
+ <opt>hide_dvb:all</opt>
</option>
<option>
<name>PI/2 BPSK</name>
<key>MOD_BPSK</key>
<opt>val:dtv.MOD_BPSK</opt>
+ <opt>hide_dvb:</opt>
</option>
<option>
<name>PI/2 BPSK-SF2</name>
<key>MOD_BPSK_SF2</key>
<opt>val:dtv.MOD_BPSK_SF2</opt>
+ <opt>hide_dvb:</opt>
+ </option>
+ <option>
+ <name>8VSB (ATSC)</name>
+ <key>MOD_8VSB</key>
+ <opt>val:dtv.MOD_8VSB</opt>
+ <opt>hide_dvb:all</opt>
</option>
</param>
<param>
diff --git a/gr-dtv/include/gnuradio/dtv/dvb_config.h b/gr-dtv/include/gnuradio/dtv/dvb_config.h
index 601fd5c569..68010e43b6 100644
--- a/gr-dtv/include/gnuradio/dtv/dvb_config.h
+++ b/gr-dtv/include/gnuradio/dtv/dvb_config.h
@@ -107,6 +107,7 @@ namespace gr {
MOD_256APSK,
MOD_BPSK,
MOD_BPSK_SF2,
+ MOD_8VSB,
MOD_OTHER,
};
diff --git a/gr-dtv/lib/CMakeLists.txt b/gr-dtv/lib/CMakeLists.txt
index fec48990a2..67b8a0ea48 100644
--- a/gr-dtv/lib/CMakeLists.txt
+++ b/gr-dtv/lib/CMakeLists.txt
@@ -38,27 +38,9 @@ if(ENABLE_GR_CTRLPORT)
endif(ENABLE_GR_CTRLPORT)
########################################################################
-# Generate viterbi mux source
-# http://www.vtk.org/Wiki/CMake_Cross_Compiling#Using_executables_in_the_build_created_during_the_build
-########################################################################
-if(NOT CMAKE_CROSSCOMPILING)
- add_executable(atsc_viterbi_gen atsc/atsc_viterbi_gen.cc)
- export(TARGETS atsc_viterbi_gen APPEND FILE ${EXPORT_FILE})
-endif()
-
-set(atsc_viterbi_mux_cc ${CMAKE_CURRENT_BINARY_DIR}/atsc_viterbi_mux.cc)
-
-add_custom_command(
- OUTPUT ${atsc_viterbi_mux_cc}
- DEPENDS atsc_viterbi_gen
- COMMAND atsc_viterbi_gen -o ${atsc_viterbi_mux_cc}
-)
-
-########################################################################
# Setup library
########################################################################
list(APPEND dtv_sources
- ${atsc_viterbi_mux_cc}
atsc/atsc_deinterleaver_impl.cc
atsc/atsc_depad_impl.cc
atsc/atsc_derandomizer_impl.cc
diff --git a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
index 2284372dfb..bf1e86c9f8 100644
--- a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
@@ -27,7 +27,7 @@
#include <gnuradio/io_signature.h>
#include "atsc_viterbi_decoder_impl.h"
#include "atsc_types.h"
-#include <atsc_viterbi_mux.cc> // machine generated
+#include "atsc_viterbi_mux.h"
namespace gr {
namespace dtv {
diff --git a/gr-dtv/lib/atsc/atsc_viterbi_mux.h b/gr-dtv/lib/atsc/atsc_viterbi_mux.h
new file mode 100644
index 0000000000..07ec557544
--- /dev/null
+++ b/gr-dtv/lib/atsc/atsc_viterbi_mux.h
@@ -0,0 +1,2539 @@
+/*
+ * Data structures for knowing which symbols are fed to which
+ * Viterbi decoders, and then where to put the resulting output dibits.
+ *
+ * Generated by 'atsc_viterbi_gen.cc'.
+ */
+
+const unsigned int sync_symbol_indices_max = 12;
+const unsigned int sync_symbol_indices[12] = {
+ 0, 832, 1664, 2496, 3328, 4160, 4992, 5824,
+ 6656, 7488, 8320, 9152, };
+
+const unsigned int enco_which_max = 828;
+const unsigned int enco_which_syms[12][828] = {
+ /* 0 */
+ {4, 16, 28, 40, 52, 64, 76, 88,
+ 100, 112, 124, 136, 148, 160, 172, 184,
+ 196, 208, 220, 232, 244, 256, 268, 280,
+ 292, 304, 316, 328, 340, 352, 364, 376,
+ 388, 400, 412, 424, 436, 448, 460, 472,
+ 484, 496, 508, 520, 532, 544, 556, 568,
+ 580, 592, 604, 616, 628, 640, 652, 664,
+ 676, 688, 700, 712, 724, 736, 748, 760,
+ 772, 784, 796, 808, 820, 844, 856, 868,
+ 880, 892, 904, 916, 928, 940, 952, 964,
+ 976, 988, 1000, 1012, 1024, 1036, 1048, 1060,
+ 1072, 1084, 1096, 1108, 1120, 1132, 1144, 1156,
+ 1168, 1180, 1192, 1204, 1216, 1228, 1240, 1252,
+ 1264, 1276, 1288, 1300, 1312, 1324, 1336, 1348,
+ 1360, 1372, 1384, 1396, 1408, 1420, 1432, 1444,
+ 1456, 1468, 1480, 1492, 1504, 1516, 1528, 1540,
+ 1552, 1564, 1576, 1588, 1600, 1612, 1624, 1636,
+ 1648, 1660, 1672, 1684, 1696, 1708, 1720, 1732,
+ 1744, 1756, 1768, 1780, 1792, 1804, 1816, 1828,
+ 1840, 1852, 1864, 1876, 1888, 1900, 1912, 1924,
+ 1936, 1948, 1960, 1972, 1984, 1996, 2008, 2020,
+ 2032, 2044, 2056, 2068, 2080, 2092, 2104, 2116,
+ 2128, 2140, 2152, 2164, 2176, 2188, 2200, 2212,
+ 2224, 2236, 2248, 2260, 2272, 2284, 2296, 2308,
+ 2320, 2332, 2344, 2356, 2368, 2380, 2392, 2404,
+ 2416, 2428, 2440, 2452, 2464, 2476, 2488, 2500,
+ 2512, 2524, 2536, 2548, 2560, 2572, 2584, 2596,
+ 2608, 2620, 2632, 2644, 2656, 2668, 2680, 2692,
+ 2704, 2716, 2728, 2740, 2752, 2764, 2776, 2788,
+ 2800, 2812, 2824, 2836, 2848, 2860, 2872, 2884,
+ 2896, 2908, 2920, 2932, 2944, 2956, 2968, 2980,
+ 2992, 3004, 3016, 3028, 3040, 3052, 3064, 3076,
+ 3088, 3100, 3112, 3124, 3136, 3148, 3160, 3172,
+ 3184, 3196, 3208, 3220, 3232, 3244, 3256, 3268,
+ 3280, 3292, 3304, 3316, 3340, 3352, 3364, 3376,
+ 3388, 3400, 3412, 3424, 3436, 3448, 3460, 3472,
+ 3484, 3496, 3508, 3520, 3532, 3544, 3556, 3568,
+ 3580, 3592, 3604, 3616, 3628, 3640, 3652, 3664,
+ 3676, 3688, 3700, 3712, 3724, 3736, 3748, 3760,
+ 3772, 3784, 3796, 3808, 3820, 3832, 3844, 3856,
+ 3868, 3880, 3892, 3904, 3916, 3928, 3940, 3952,
+ 3964, 3976, 3988, 4000, 4012, 4024, 4036, 4048,
+ 4060, 4072, 4084, 4096, 4108, 4120, 4132, 4144,
+ 4156, 4168, 4180, 4192, 4204, 4216, 4228, 4240,
+ 4252, 4264, 4276, 4288, 4300, 4312, 4324, 4336,
+ 4348, 4360, 4372, 4384, 4396, 4408, 4420, 4432,
+ 4444, 4456, 4468, 4480, 4492, 4504, 4516, 4528,
+ 4540, 4552, 4564, 4576, 4588, 4600, 4612, 4624,
+ 4636, 4648, 4660, 4672, 4684, 4696, 4708, 4720,
+ 4732, 4744, 4756, 4768, 4780, 4792, 4804, 4816,
+ 4828, 4840, 4852, 4864, 4876, 4888, 4900, 4912,
+ 4924, 4936, 4948, 4960, 4972, 4984, 4996, 5008,
+ 5020, 5032, 5044, 5056, 5068, 5080, 5092, 5104,
+ 5116, 5128, 5140, 5152, 5164, 5176, 5188, 5200,
+ 5212, 5224, 5236, 5248, 5260, 5272, 5284, 5296,
+ 5308, 5320, 5332, 5344, 5356, 5368, 5380, 5392,
+ 5404, 5416, 5428, 5440, 5452, 5464, 5476, 5488,
+ 5500, 5512, 5524, 5536, 5548, 5560, 5572, 5584,
+ 5596, 5608, 5620, 5632, 5644, 5656, 5668, 5680,
+ 5692, 5704, 5716, 5728, 5740, 5752, 5764, 5776,
+ 5788, 5800, 5812, 5836, 5848, 5860, 5872, 5884,
+ 5896, 5908, 5920, 5932, 5944, 5956, 5968, 5980,
+ 5992, 6004, 6016, 6028, 6040, 6052, 6064, 6076,
+ 6088, 6100, 6112, 6124, 6136, 6148, 6160, 6172,
+ 6184, 6196, 6208, 6220, 6232, 6244, 6256, 6268,
+ 6280, 6292, 6304, 6316, 6328, 6340, 6352, 6364,
+ 6376, 6388, 6400, 6412, 6424, 6436, 6448, 6460,
+ 6472, 6484, 6496, 6508, 6520, 6532, 6544, 6556,
+ 6568, 6580, 6592, 6604, 6616, 6628, 6640, 6652,
+ 6664, 6676, 6688, 6700, 6712, 6724, 6736, 6748,
+ 6760, 6772, 6784, 6796, 6808, 6820, 6832, 6844,
+ 6856, 6868, 6880, 6892, 6904, 6916, 6928, 6940,
+ 6952, 6964, 6976, 6988, 7000, 7012, 7024, 7036,
+ 7048, 7060, 7072, 7084, 7096, 7108, 7120, 7132,
+ 7144, 7156, 7168, 7180, 7192, 7204, 7216, 7228,
+ 7240, 7252, 7264, 7276, 7288, 7300, 7312, 7324,
+ 7336, 7348, 7360, 7372, 7384, 7396, 7408, 7420,
+ 7432, 7444, 7456, 7468, 7480, 7492, 7504, 7516,
+ 7528, 7540, 7552, 7564, 7576, 7588, 7600, 7612,
+ 7624, 7636, 7648, 7660, 7672, 7684, 7696, 7708,
+ 7720, 7732, 7744, 7756, 7768, 7780, 7792, 7804,
+ 7816, 7828, 7840, 7852, 7864, 7876, 7888, 7900,
+ 7912, 7924, 7936, 7948, 7960, 7972, 7984, 7996,
+ 8008, 8020, 8032, 8044, 8056, 8068, 8080, 8092,
+ 8104, 8116, 8128, 8140, 8152, 8164, 8176, 8188,
+ 8200, 8212, 8224, 8236, 8248, 8260, 8272, 8284,
+ 8296, 8308, 8332, 8344, 8356, 8368, 8380, 8392,
+ 8404, 8416, 8428, 8440, 8452, 8464, 8476, 8488,
+ 8500, 8512, 8524, 8536, 8548, 8560, 8572, 8584,
+ 8596, 8608, 8620, 8632, 8644, 8656, 8668, 8680,
+ 8692, 8704, 8716, 8728, 8740, 8752, 8764, 8776,
+ 8788, 8800, 8812, 8824, 8836, 8848, 8860, 8872,
+ 8884, 8896, 8908, 8920, 8932, 8944, 8956, 8968,
+ 8980, 8992, 9004, 9016, 9028, 9040, 9052, 9064,
+ 9076, 9088, 9100, 9112, 9124, 9136, 9148, 9160,
+ 9172, 9184, 9196, 9208, 9220, 9232, 9244, 9256,
+ 9268, 9280, 9292, 9304, 9316, 9328, 9340, 9352,
+ 9364, 9376, 9388, 9400, 9412, 9424, 9436, 9448,
+ 9460, 9472, 9484, 9496, 9508, 9520, 9532, 9544,
+ 9556, 9568, 9580, 9592, 9604, 9616, 9628, 9640,
+ 9652, 9664, 9676, 9688, 9700, 9712, 9724, 9736,
+ 9748, 9760, 9772, 9784, 9796, 9808, 9820, 9832,
+ 9844, 9856, 9868, 9880, 9892, 9904, 9916, 9928,
+ 9940, 9952, 9964, 9976, },
+ /* 1 */
+ {5, 17, 29, 41, 53, 65, 77, 89,
+ 101, 113, 125, 137, 149, 161, 173, 185,
+ 197, 209, 221, 233, 245, 257, 269, 281,
+ 293, 305, 317, 329, 341, 353, 365, 377,
+ 389, 401, 413, 425, 437, 449, 461, 473,
+ 485, 497, 509, 521, 533, 545, 557, 569,
+ 581, 593, 605, 617, 629, 641, 653, 665,
+ 677, 689, 701, 713, 725, 737, 749, 761,
+ 773, 785, 797, 809, 821, 845, 857, 869,
+ 881, 893, 905, 917, 929, 941, 953, 965,
+ 977, 989, 1001, 1013, 1025, 1037, 1049, 1061,
+ 1073, 1085, 1097, 1109, 1121, 1133, 1145, 1157,
+ 1169, 1181, 1193, 1205, 1217, 1229, 1241, 1253,
+ 1265, 1277, 1289, 1301, 1313, 1325, 1337, 1349,
+ 1361, 1373, 1385, 1397, 1409, 1421, 1433, 1445,
+ 1457, 1469, 1481, 1493, 1505, 1517, 1529, 1541,
+ 1553, 1565, 1577, 1589, 1601, 1613, 1625, 1637,
+ 1649, 1661, 1673, 1685, 1697, 1709, 1721, 1733,
+ 1745, 1757, 1769, 1781, 1793, 1805, 1817, 1829,
+ 1841, 1853, 1865, 1877, 1889, 1901, 1913, 1925,
+ 1937, 1949, 1961, 1973, 1985, 1997, 2009, 2021,
+ 2033, 2045, 2057, 2069, 2081, 2093, 2105, 2117,
+ 2129, 2141, 2153, 2165, 2177, 2189, 2201, 2213,
+ 2225, 2237, 2249, 2261, 2273, 2285, 2297, 2309,
+ 2321, 2333, 2345, 2357, 2369, 2381, 2393, 2405,
+ 2417, 2429, 2441, 2453, 2465, 2477, 2489, 2501,
+ 2513, 2525, 2537, 2549, 2561, 2573, 2585, 2597,
+ 2609, 2621, 2633, 2645, 2657, 2669, 2681, 2693,
+ 2705, 2717, 2729, 2741, 2753, 2765, 2777, 2789,
+ 2801, 2813, 2825, 2837, 2849, 2861, 2873, 2885,
+ 2897, 2909, 2921, 2933, 2945, 2957, 2969, 2981,
+ 2993, 3005, 3017, 3029, 3041, 3053, 3065, 3077,
+ 3089, 3101, 3113, 3125, 3137, 3149, 3161, 3173,
+ 3185, 3197, 3209, 3221, 3233, 3245, 3257, 3269,
+ 3281, 3293, 3305, 3317, 3341, 3353, 3365, 3377,
+ 3389, 3401, 3413, 3425, 3437, 3449, 3461, 3473,
+ 3485, 3497, 3509, 3521, 3533, 3545, 3557, 3569,
+ 3581, 3593, 3605, 3617, 3629, 3641, 3653, 3665,
+ 3677, 3689, 3701, 3713, 3725, 3737, 3749, 3761,
+ 3773, 3785, 3797, 3809, 3821, 3833, 3845, 3857,
+ 3869, 3881, 3893, 3905, 3917, 3929, 3941, 3953,
+ 3965, 3977, 3989, 4001, 4013, 4025, 4037, 4049,
+ 4061, 4073, 4085, 4097, 4109, 4121, 4133, 4145,
+ 4157, 4169, 4181, 4193, 4205, 4217, 4229, 4241,
+ 4253, 4265, 4277, 4289, 4301, 4313, 4325, 4337,
+ 4349, 4361, 4373, 4385, 4397, 4409, 4421, 4433,
+ 4445, 4457, 4469, 4481, 4493, 4505, 4517, 4529,
+ 4541, 4553, 4565, 4577, 4589, 4601, 4613, 4625,
+ 4637, 4649, 4661, 4673, 4685, 4697, 4709, 4721,
+ 4733, 4745, 4757, 4769, 4781, 4793, 4805, 4817,
+ 4829, 4841, 4853, 4865, 4877, 4889, 4901, 4913,
+ 4925, 4937, 4949, 4961, 4973, 4985, 4997, 5009,
+ 5021, 5033, 5045, 5057, 5069, 5081, 5093, 5105,
+ 5117, 5129, 5141, 5153, 5165, 5177, 5189, 5201,
+ 5213, 5225, 5237, 5249, 5261, 5273, 5285, 5297,
+ 5309, 5321, 5333, 5345, 5357, 5369, 5381, 5393,
+ 5405, 5417, 5429, 5441, 5453, 5465, 5477, 5489,
+ 5501, 5513, 5525, 5537, 5549, 5561, 5573, 5585,
+ 5597, 5609, 5621, 5633, 5645, 5657, 5669, 5681,
+ 5693, 5705, 5717, 5729, 5741, 5753, 5765, 5777,
+ 5789, 5801, 5813, 5837, 5849, 5861, 5873, 5885,
+ 5897, 5909, 5921, 5933, 5945, 5957, 5969, 5981,
+ 5993, 6005, 6017, 6029, 6041, 6053, 6065, 6077,
+ 6089, 6101, 6113, 6125, 6137, 6149, 6161, 6173,
+ 6185, 6197, 6209, 6221, 6233, 6245, 6257, 6269,
+ 6281, 6293, 6305, 6317, 6329, 6341, 6353, 6365,
+ 6377, 6389, 6401, 6413, 6425, 6437, 6449, 6461,
+ 6473, 6485, 6497, 6509, 6521, 6533, 6545, 6557,
+ 6569, 6581, 6593, 6605, 6617, 6629, 6641, 6653,
+ 6665, 6677, 6689, 6701, 6713, 6725, 6737, 6749,
+ 6761, 6773, 6785, 6797, 6809, 6821, 6833, 6845,
+ 6857, 6869, 6881, 6893, 6905, 6917, 6929, 6941,
+ 6953, 6965, 6977, 6989, 7001, 7013, 7025, 7037,
+ 7049, 7061, 7073, 7085, 7097, 7109, 7121, 7133,
+ 7145, 7157, 7169, 7181, 7193, 7205, 7217, 7229,
+ 7241, 7253, 7265, 7277, 7289, 7301, 7313, 7325,
+ 7337, 7349, 7361, 7373, 7385, 7397, 7409, 7421,
+ 7433, 7445, 7457, 7469, 7481, 7493, 7505, 7517,
+ 7529, 7541, 7553, 7565, 7577, 7589, 7601, 7613,
+ 7625, 7637, 7649, 7661, 7673, 7685, 7697, 7709,
+ 7721, 7733, 7745, 7757, 7769, 7781, 7793, 7805,
+ 7817, 7829, 7841, 7853, 7865, 7877, 7889, 7901,
+ 7913, 7925, 7937, 7949, 7961, 7973, 7985, 7997,
+ 8009, 8021, 8033, 8045, 8057, 8069, 8081, 8093,
+ 8105, 8117, 8129, 8141, 8153, 8165, 8177, 8189,
+ 8201, 8213, 8225, 8237, 8249, 8261, 8273, 8285,
+ 8297, 8309, 8333, 8345, 8357, 8369, 8381, 8393,
+ 8405, 8417, 8429, 8441, 8453, 8465, 8477, 8489,
+ 8501, 8513, 8525, 8537, 8549, 8561, 8573, 8585,
+ 8597, 8609, 8621, 8633, 8645, 8657, 8669, 8681,
+ 8693, 8705, 8717, 8729, 8741, 8753, 8765, 8777,
+ 8789, 8801, 8813, 8825, 8837, 8849, 8861, 8873,
+ 8885, 8897, 8909, 8921, 8933, 8945, 8957, 8969,
+ 8981, 8993, 9005, 9017, 9029, 9041, 9053, 9065,
+ 9077, 9089, 9101, 9113, 9125, 9137, 9149, 9161,
+ 9173, 9185, 9197, 9209, 9221, 9233, 9245, 9257,
+ 9269, 9281, 9293, 9305, 9317, 9329, 9341, 9353,
+ 9365, 9377, 9389, 9401, 9413, 9425, 9437, 9449,
+ 9461, 9473, 9485, 9497, 9509, 9521, 9533, 9545,
+ 9557, 9569, 9581, 9593, 9605, 9617, 9629, 9641,
+ 9653, 9665, 9677, 9689, 9701, 9713, 9725, 9737,
+ 9749, 9761, 9773, 9785, 9797, 9809, 9821, 9833,
+ 9845, 9857, 9869, 9881, 9893, 9905, 9917, 9929,
+ 9941, 9953, 9965, 9977, },
+ /* 2 */
+ {6, 18, 30, 42, 54, 66, 78, 90,
+ 102, 114, 126, 138, 150, 162, 174, 186,
+ 198, 210, 222, 234, 246, 258, 270, 282,
+ 294, 306, 318, 330, 342, 354, 366, 378,
+ 390, 402, 414, 426, 438, 450, 462, 474,
+ 486, 498, 510, 522, 534, 546, 558, 570,
+ 582, 594, 606, 618, 630, 642, 654, 666,
+ 678, 690, 702, 714, 726, 738, 750, 762,
+ 774, 786, 798, 810, 822, 846, 858, 870,
+ 882, 894, 906, 918, 930, 942, 954, 966,
+ 978, 990, 1002, 1014, 1026, 1038, 1050, 1062,
+ 1074, 1086, 1098, 1110, 1122, 1134, 1146, 1158,
+ 1170, 1182, 1194, 1206, 1218, 1230, 1242, 1254,
+ 1266, 1278, 1290, 1302, 1314, 1326, 1338, 1350,
+ 1362, 1374, 1386, 1398, 1410, 1422, 1434, 1446,
+ 1458, 1470, 1482, 1494, 1506, 1518, 1530, 1542,
+ 1554, 1566, 1578, 1590, 1602, 1614, 1626, 1638,
+ 1650, 1662, 1674, 1686, 1698, 1710, 1722, 1734,
+ 1746, 1758, 1770, 1782, 1794, 1806, 1818, 1830,
+ 1842, 1854, 1866, 1878, 1890, 1902, 1914, 1926,
+ 1938, 1950, 1962, 1974, 1986, 1998, 2010, 2022,
+ 2034, 2046, 2058, 2070, 2082, 2094, 2106, 2118,
+ 2130, 2142, 2154, 2166, 2178, 2190, 2202, 2214,
+ 2226, 2238, 2250, 2262, 2274, 2286, 2298, 2310,
+ 2322, 2334, 2346, 2358, 2370, 2382, 2394, 2406,
+ 2418, 2430, 2442, 2454, 2466, 2478, 2490, 2502,
+ 2514, 2526, 2538, 2550, 2562, 2574, 2586, 2598,
+ 2610, 2622, 2634, 2646, 2658, 2670, 2682, 2694,
+ 2706, 2718, 2730, 2742, 2754, 2766, 2778, 2790,
+ 2802, 2814, 2826, 2838, 2850, 2862, 2874, 2886,
+ 2898, 2910, 2922, 2934, 2946, 2958, 2970, 2982,
+ 2994, 3006, 3018, 3030, 3042, 3054, 3066, 3078,
+ 3090, 3102, 3114, 3126, 3138, 3150, 3162, 3174,
+ 3186, 3198, 3210, 3222, 3234, 3246, 3258, 3270,
+ 3282, 3294, 3306, 3318, 3342, 3354, 3366, 3378,
+ 3390, 3402, 3414, 3426, 3438, 3450, 3462, 3474,
+ 3486, 3498, 3510, 3522, 3534, 3546, 3558, 3570,
+ 3582, 3594, 3606, 3618, 3630, 3642, 3654, 3666,
+ 3678, 3690, 3702, 3714, 3726, 3738, 3750, 3762,
+ 3774, 3786, 3798, 3810, 3822, 3834, 3846, 3858,
+ 3870, 3882, 3894, 3906, 3918, 3930, 3942, 3954,
+ 3966, 3978, 3990, 4002, 4014, 4026, 4038, 4050,
+ 4062, 4074, 4086, 4098, 4110, 4122, 4134, 4146,
+ 4158, 4170, 4182, 4194, 4206, 4218, 4230, 4242,
+ 4254, 4266, 4278, 4290, 4302, 4314, 4326, 4338,
+ 4350, 4362, 4374, 4386, 4398, 4410, 4422, 4434,
+ 4446, 4458, 4470, 4482, 4494, 4506, 4518, 4530,
+ 4542, 4554, 4566, 4578, 4590, 4602, 4614, 4626,
+ 4638, 4650, 4662, 4674, 4686, 4698, 4710, 4722,
+ 4734, 4746, 4758, 4770, 4782, 4794, 4806, 4818,
+ 4830, 4842, 4854, 4866, 4878, 4890, 4902, 4914,
+ 4926, 4938, 4950, 4962, 4974, 4986, 4998, 5010,
+ 5022, 5034, 5046, 5058, 5070, 5082, 5094, 5106,
+ 5118, 5130, 5142, 5154, 5166, 5178, 5190, 5202,
+ 5214, 5226, 5238, 5250, 5262, 5274, 5286, 5298,
+ 5310, 5322, 5334, 5346, 5358, 5370, 5382, 5394,
+ 5406, 5418, 5430, 5442, 5454, 5466, 5478, 5490,
+ 5502, 5514, 5526, 5538, 5550, 5562, 5574, 5586,
+ 5598, 5610, 5622, 5634, 5646, 5658, 5670, 5682,
+ 5694, 5706, 5718, 5730, 5742, 5754, 5766, 5778,
+ 5790, 5802, 5814, 5838, 5850, 5862, 5874, 5886,
+ 5898, 5910, 5922, 5934, 5946, 5958, 5970, 5982,
+ 5994, 6006, 6018, 6030, 6042, 6054, 6066, 6078,
+ 6090, 6102, 6114, 6126, 6138, 6150, 6162, 6174,
+ 6186, 6198, 6210, 6222, 6234, 6246, 6258, 6270,
+ 6282, 6294, 6306, 6318, 6330, 6342, 6354, 6366,
+ 6378, 6390, 6402, 6414, 6426, 6438, 6450, 6462,
+ 6474, 6486, 6498, 6510, 6522, 6534, 6546, 6558,
+ 6570, 6582, 6594, 6606, 6618, 6630, 6642, 6654,
+ 6666, 6678, 6690, 6702, 6714, 6726, 6738, 6750,
+ 6762, 6774, 6786, 6798, 6810, 6822, 6834, 6846,
+ 6858, 6870, 6882, 6894, 6906, 6918, 6930, 6942,
+ 6954, 6966, 6978, 6990, 7002, 7014, 7026, 7038,
+ 7050, 7062, 7074, 7086, 7098, 7110, 7122, 7134,
+ 7146, 7158, 7170, 7182, 7194, 7206, 7218, 7230,
+ 7242, 7254, 7266, 7278, 7290, 7302, 7314, 7326,
+ 7338, 7350, 7362, 7374, 7386, 7398, 7410, 7422,
+ 7434, 7446, 7458, 7470, 7482, 7494, 7506, 7518,
+ 7530, 7542, 7554, 7566, 7578, 7590, 7602, 7614,
+ 7626, 7638, 7650, 7662, 7674, 7686, 7698, 7710,
+ 7722, 7734, 7746, 7758, 7770, 7782, 7794, 7806,
+ 7818, 7830, 7842, 7854, 7866, 7878, 7890, 7902,
+ 7914, 7926, 7938, 7950, 7962, 7974, 7986, 7998,
+ 8010, 8022, 8034, 8046, 8058, 8070, 8082, 8094,
+ 8106, 8118, 8130, 8142, 8154, 8166, 8178, 8190,
+ 8202, 8214, 8226, 8238, 8250, 8262, 8274, 8286,
+ 8298, 8310, 8334, 8346, 8358, 8370, 8382, 8394,
+ 8406, 8418, 8430, 8442, 8454, 8466, 8478, 8490,
+ 8502, 8514, 8526, 8538, 8550, 8562, 8574, 8586,
+ 8598, 8610, 8622, 8634, 8646, 8658, 8670, 8682,
+ 8694, 8706, 8718, 8730, 8742, 8754, 8766, 8778,
+ 8790, 8802, 8814, 8826, 8838, 8850, 8862, 8874,
+ 8886, 8898, 8910, 8922, 8934, 8946, 8958, 8970,
+ 8982, 8994, 9006, 9018, 9030, 9042, 9054, 9066,
+ 9078, 9090, 9102, 9114, 9126, 9138, 9150, 9162,
+ 9174, 9186, 9198, 9210, 9222, 9234, 9246, 9258,
+ 9270, 9282, 9294, 9306, 9318, 9330, 9342, 9354,
+ 9366, 9378, 9390, 9402, 9414, 9426, 9438, 9450,
+ 9462, 9474, 9486, 9498, 9510, 9522, 9534, 9546,
+ 9558, 9570, 9582, 9594, 9606, 9618, 9630, 9642,
+ 9654, 9666, 9678, 9690, 9702, 9714, 9726, 9738,
+ 9750, 9762, 9774, 9786, 9798, 9810, 9822, 9834,
+ 9846, 9858, 9870, 9882, 9894, 9906, 9918, 9930,
+ 9942, 9954, 9966, 9978, },
+ /* 3 */
+ {7, 19, 31, 43, 55, 67, 79, 91,
+ 103, 115, 127, 139, 151, 163, 175, 187,
+ 199, 211, 223, 235, 247, 259, 271, 283,
+ 295, 307, 319, 331, 343, 355, 367, 379,
+ 391, 403, 415, 427, 439, 451, 463, 475,
+ 487, 499, 511, 523, 535, 547, 559, 571,
+ 583, 595, 607, 619, 631, 643, 655, 667,
+ 679, 691, 703, 715, 727, 739, 751, 763,
+ 775, 787, 799, 811, 823, 847, 859, 871,
+ 883, 895, 907, 919, 931, 943, 955, 967,
+ 979, 991, 1003, 1015, 1027, 1039, 1051, 1063,
+ 1075, 1087, 1099, 1111, 1123, 1135, 1147, 1159,
+ 1171, 1183, 1195, 1207, 1219, 1231, 1243, 1255,
+ 1267, 1279, 1291, 1303, 1315, 1327, 1339, 1351,
+ 1363, 1375, 1387, 1399, 1411, 1423, 1435, 1447,
+ 1459, 1471, 1483, 1495, 1507, 1519, 1531, 1543,
+ 1555, 1567, 1579, 1591, 1603, 1615, 1627, 1639,
+ 1651, 1663, 1675, 1687, 1699, 1711, 1723, 1735,
+ 1747, 1759, 1771, 1783, 1795, 1807, 1819, 1831,
+ 1843, 1855, 1867, 1879, 1891, 1903, 1915, 1927,
+ 1939, 1951, 1963, 1975, 1987, 1999, 2011, 2023,
+ 2035, 2047, 2059, 2071, 2083, 2095, 2107, 2119,
+ 2131, 2143, 2155, 2167, 2179, 2191, 2203, 2215,
+ 2227, 2239, 2251, 2263, 2275, 2287, 2299, 2311,
+ 2323, 2335, 2347, 2359, 2371, 2383, 2395, 2407,
+ 2419, 2431, 2443, 2455, 2467, 2479, 2491, 2503,
+ 2515, 2527, 2539, 2551, 2563, 2575, 2587, 2599,
+ 2611, 2623, 2635, 2647, 2659, 2671, 2683, 2695,
+ 2707, 2719, 2731, 2743, 2755, 2767, 2779, 2791,
+ 2803, 2815, 2827, 2839, 2851, 2863, 2875, 2887,
+ 2899, 2911, 2923, 2935, 2947, 2959, 2971, 2983,
+ 2995, 3007, 3019, 3031, 3043, 3055, 3067, 3079,
+ 3091, 3103, 3115, 3127, 3139, 3151, 3163, 3175,
+ 3187, 3199, 3211, 3223, 3235, 3247, 3259, 3271,
+ 3283, 3295, 3307, 3319, 3343, 3355, 3367, 3379,
+ 3391, 3403, 3415, 3427, 3439, 3451, 3463, 3475,
+ 3487, 3499, 3511, 3523, 3535, 3547, 3559, 3571,
+ 3583, 3595, 3607, 3619, 3631, 3643, 3655, 3667,
+ 3679, 3691, 3703, 3715, 3727, 3739, 3751, 3763,
+ 3775, 3787, 3799, 3811, 3823, 3835, 3847, 3859,
+ 3871, 3883, 3895, 3907, 3919, 3931, 3943, 3955,
+ 3967, 3979, 3991, 4003, 4015, 4027, 4039, 4051,
+ 4063, 4075, 4087, 4099, 4111, 4123, 4135, 4147,
+ 4159, 4171, 4183, 4195, 4207, 4219, 4231, 4243,
+ 4255, 4267, 4279, 4291, 4303, 4315, 4327, 4339,
+ 4351, 4363, 4375, 4387, 4399, 4411, 4423, 4435,
+ 4447, 4459, 4471, 4483, 4495, 4507, 4519, 4531,
+ 4543, 4555, 4567, 4579, 4591, 4603, 4615, 4627,
+ 4639, 4651, 4663, 4675, 4687, 4699, 4711, 4723,
+ 4735, 4747, 4759, 4771, 4783, 4795, 4807, 4819,
+ 4831, 4843, 4855, 4867, 4879, 4891, 4903, 4915,
+ 4927, 4939, 4951, 4963, 4975, 4987, 4999, 5011,
+ 5023, 5035, 5047, 5059, 5071, 5083, 5095, 5107,
+ 5119, 5131, 5143, 5155, 5167, 5179, 5191, 5203,
+ 5215, 5227, 5239, 5251, 5263, 5275, 5287, 5299,
+ 5311, 5323, 5335, 5347, 5359, 5371, 5383, 5395,
+ 5407, 5419, 5431, 5443, 5455, 5467, 5479, 5491,
+ 5503, 5515, 5527, 5539, 5551, 5563, 5575, 5587,
+ 5599, 5611, 5623, 5635, 5647, 5659, 5671, 5683,
+ 5695, 5707, 5719, 5731, 5743, 5755, 5767, 5779,
+ 5791, 5803, 5815, 5839, 5851, 5863, 5875, 5887,
+ 5899, 5911, 5923, 5935, 5947, 5959, 5971, 5983,
+ 5995, 6007, 6019, 6031, 6043, 6055, 6067, 6079,
+ 6091, 6103, 6115, 6127, 6139, 6151, 6163, 6175,
+ 6187, 6199, 6211, 6223, 6235, 6247, 6259, 6271,
+ 6283, 6295, 6307, 6319, 6331, 6343, 6355, 6367,
+ 6379, 6391, 6403, 6415, 6427, 6439, 6451, 6463,
+ 6475, 6487, 6499, 6511, 6523, 6535, 6547, 6559,
+ 6571, 6583, 6595, 6607, 6619, 6631, 6643, 6655,
+ 6667, 6679, 6691, 6703, 6715, 6727, 6739, 6751,
+ 6763, 6775, 6787, 6799, 6811, 6823, 6835, 6847,
+ 6859, 6871, 6883, 6895, 6907, 6919, 6931, 6943,
+ 6955, 6967, 6979, 6991, 7003, 7015, 7027, 7039,
+ 7051, 7063, 7075, 7087, 7099, 7111, 7123, 7135,
+ 7147, 7159, 7171, 7183, 7195, 7207, 7219, 7231,
+ 7243, 7255, 7267, 7279, 7291, 7303, 7315, 7327,
+ 7339, 7351, 7363, 7375, 7387, 7399, 7411, 7423,
+ 7435, 7447, 7459, 7471, 7483, 7495, 7507, 7519,
+ 7531, 7543, 7555, 7567, 7579, 7591, 7603, 7615,
+ 7627, 7639, 7651, 7663, 7675, 7687, 7699, 7711,
+ 7723, 7735, 7747, 7759, 7771, 7783, 7795, 7807,
+ 7819, 7831, 7843, 7855, 7867, 7879, 7891, 7903,
+ 7915, 7927, 7939, 7951, 7963, 7975, 7987, 7999,
+ 8011, 8023, 8035, 8047, 8059, 8071, 8083, 8095,
+ 8107, 8119, 8131, 8143, 8155, 8167, 8179, 8191,
+ 8203, 8215, 8227, 8239, 8251, 8263, 8275, 8287,
+ 8299, 8311, 8335, 8347, 8359, 8371, 8383, 8395,
+ 8407, 8419, 8431, 8443, 8455, 8467, 8479, 8491,
+ 8503, 8515, 8527, 8539, 8551, 8563, 8575, 8587,
+ 8599, 8611, 8623, 8635, 8647, 8659, 8671, 8683,
+ 8695, 8707, 8719, 8731, 8743, 8755, 8767, 8779,
+ 8791, 8803, 8815, 8827, 8839, 8851, 8863, 8875,
+ 8887, 8899, 8911, 8923, 8935, 8947, 8959, 8971,
+ 8983, 8995, 9007, 9019, 9031, 9043, 9055, 9067,
+ 9079, 9091, 9103, 9115, 9127, 9139, 9151, 9163,
+ 9175, 9187, 9199, 9211, 9223, 9235, 9247, 9259,
+ 9271, 9283, 9295, 9307, 9319, 9331, 9343, 9355,
+ 9367, 9379, 9391, 9403, 9415, 9427, 9439, 9451,
+ 9463, 9475, 9487, 9499, 9511, 9523, 9535, 9547,
+ 9559, 9571, 9583, 9595, 9607, 9619, 9631, 9643,
+ 9655, 9667, 9679, 9691, 9703, 9715, 9727, 9739,
+ 9751, 9763, 9775, 9787, 9799, 9811, 9823, 9835,
+ 9847, 9859, 9871, 9883, 9895, 9907, 9919, 9931,
+ 9943, 9955, 9967, 9979, },
+ /* 4 */
+ {8, 20, 32, 44, 56, 68, 80, 92,
+ 104, 116, 128, 140, 152, 164, 176, 188,
+ 200, 212, 224, 236, 248, 260, 272, 284,
+ 296, 308, 320, 332, 344, 356, 368, 380,
+ 392, 404, 416, 428, 440, 452, 464, 476,
+ 488, 500, 512, 524, 536, 548, 560, 572,
+ 584, 596, 608, 620, 632, 644, 656, 668,
+ 680, 692, 704, 716, 728, 740, 752, 764,
+ 776, 788, 800, 812, 824, 836, 848, 860,
+ 872, 884, 896, 908, 920, 932, 944, 956,
+ 968, 980, 992, 1004, 1016, 1028, 1040, 1052,
+ 1064, 1076, 1088, 1100, 1112, 1124, 1136, 1148,
+ 1160, 1172, 1184, 1196, 1208, 1220, 1232, 1244,
+ 1256, 1268, 1280, 1292, 1304, 1316, 1328, 1340,
+ 1352, 1364, 1376, 1388, 1400, 1412, 1424, 1436,
+ 1448, 1460, 1472, 1484, 1496, 1508, 1520, 1532,
+ 1544, 1556, 1568, 1580, 1592, 1604, 1616, 1628,
+ 1640, 1652, 1676, 1688, 1700, 1712, 1724, 1736,
+ 1748, 1760, 1772, 1784, 1796, 1808, 1820, 1832,
+ 1844, 1856, 1868, 1880, 1892, 1904, 1916, 1928,
+ 1940, 1952, 1964, 1976, 1988, 2000, 2012, 2024,
+ 2036, 2048, 2060, 2072, 2084, 2096, 2108, 2120,
+ 2132, 2144, 2156, 2168, 2180, 2192, 2204, 2216,
+ 2228, 2240, 2252, 2264, 2276, 2288, 2300, 2312,
+ 2324, 2336, 2348, 2360, 2372, 2384, 2396, 2408,
+ 2420, 2432, 2444, 2456, 2468, 2480, 2492, 2504,
+ 2516, 2528, 2540, 2552, 2564, 2576, 2588, 2600,
+ 2612, 2624, 2636, 2648, 2660, 2672, 2684, 2696,
+ 2708, 2720, 2732, 2744, 2756, 2768, 2780, 2792,
+ 2804, 2816, 2828, 2840, 2852, 2864, 2876, 2888,
+ 2900, 2912, 2924, 2936, 2948, 2960, 2972, 2984,
+ 2996, 3008, 3020, 3032, 3044, 3056, 3068, 3080,
+ 3092, 3104, 3116, 3128, 3140, 3152, 3164, 3176,
+ 3188, 3200, 3212, 3224, 3236, 3248, 3260, 3272,
+ 3284, 3296, 3308, 3320, 3332, 3344, 3356, 3368,
+ 3380, 3392, 3404, 3416, 3428, 3440, 3452, 3464,
+ 3476, 3488, 3500, 3512, 3524, 3536, 3548, 3560,
+ 3572, 3584, 3596, 3608, 3620, 3632, 3644, 3656,
+ 3668, 3680, 3692, 3704, 3716, 3728, 3740, 3752,
+ 3764, 3776, 3788, 3800, 3812, 3824, 3836, 3848,
+ 3860, 3872, 3884, 3896, 3908, 3920, 3932, 3944,
+ 3956, 3968, 3980, 3992, 4004, 4016, 4028, 4040,
+ 4052, 4064, 4076, 4088, 4100, 4112, 4124, 4136,
+ 4148, 4172, 4184, 4196, 4208, 4220, 4232, 4244,
+ 4256, 4268, 4280, 4292, 4304, 4316, 4328, 4340,
+ 4352, 4364, 4376, 4388, 4400, 4412, 4424, 4436,
+ 4448, 4460, 4472, 4484, 4496, 4508, 4520, 4532,
+ 4544, 4556, 4568, 4580, 4592, 4604, 4616, 4628,
+ 4640, 4652, 4664, 4676, 4688, 4700, 4712, 4724,
+ 4736, 4748, 4760, 4772, 4784, 4796, 4808, 4820,
+ 4832, 4844, 4856, 4868, 4880, 4892, 4904, 4916,
+ 4928, 4940, 4952, 4964, 4976, 4988, 5000, 5012,
+ 5024, 5036, 5048, 5060, 5072, 5084, 5096, 5108,
+ 5120, 5132, 5144, 5156, 5168, 5180, 5192, 5204,
+ 5216, 5228, 5240, 5252, 5264, 5276, 5288, 5300,
+ 5312, 5324, 5336, 5348, 5360, 5372, 5384, 5396,
+ 5408, 5420, 5432, 5444, 5456, 5468, 5480, 5492,
+ 5504, 5516, 5528, 5540, 5552, 5564, 5576, 5588,
+ 5600, 5612, 5624, 5636, 5648, 5660, 5672, 5684,
+ 5696, 5708, 5720, 5732, 5744, 5756, 5768, 5780,
+ 5792, 5804, 5816, 5828, 5840, 5852, 5864, 5876,
+ 5888, 5900, 5912, 5924, 5936, 5948, 5960, 5972,
+ 5984, 5996, 6008, 6020, 6032, 6044, 6056, 6068,
+ 6080, 6092, 6104, 6116, 6128, 6140, 6152, 6164,
+ 6176, 6188, 6200, 6212, 6224, 6236, 6248, 6260,
+ 6272, 6284, 6296, 6308, 6320, 6332, 6344, 6356,
+ 6368, 6380, 6392, 6404, 6416, 6428, 6440, 6452,
+ 6464, 6476, 6488, 6500, 6512, 6524, 6536, 6548,
+ 6560, 6572, 6584, 6596, 6608, 6620, 6632, 6644,
+ 6668, 6680, 6692, 6704, 6716, 6728, 6740, 6752,
+ 6764, 6776, 6788, 6800, 6812, 6824, 6836, 6848,
+ 6860, 6872, 6884, 6896, 6908, 6920, 6932, 6944,
+ 6956, 6968, 6980, 6992, 7004, 7016, 7028, 7040,
+ 7052, 7064, 7076, 7088, 7100, 7112, 7124, 7136,
+ 7148, 7160, 7172, 7184, 7196, 7208, 7220, 7232,
+ 7244, 7256, 7268, 7280, 7292, 7304, 7316, 7328,
+ 7340, 7352, 7364, 7376, 7388, 7400, 7412, 7424,
+ 7436, 7448, 7460, 7472, 7484, 7496, 7508, 7520,
+ 7532, 7544, 7556, 7568, 7580, 7592, 7604, 7616,
+ 7628, 7640, 7652, 7664, 7676, 7688, 7700, 7712,
+ 7724, 7736, 7748, 7760, 7772, 7784, 7796, 7808,
+ 7820, 7832, 7844, 7856, 7868, 7880, 7892, 7904,
+ 7916, 7928, 7940, 7952, 7964, 7976, 7988, 8000,
+ 8012, 8024, 8036, 8048, 8060, 8072, 8084, 8096,
+ 8108, 8120, 8132, 8144, 8156, 8168, 8180, 8192,
+ 8204, 8216, 8228, 8240, 8252, 8264, 8276, 8288,
+ 8300, 8312, 8324, 8336, 8348, 8360, 8372, 8384,
+ 8396, 8408, 8420, 8432, 8444, 8456, 8468, 8480,
+ 8492, 8504, 8516, 8528, 8540, 8552, 8564, 8576,
+ 8588, 8600, 8612, 8624, 8636, 8648, 8660, 8672,
+ 8684, 8696, 8708, 8720, 8732, 8744, 8756, 8768,
+ 8780, 8792, 8804, 8816, 8828, 8840, 8852, 8864,
+ 8876, 8888, 8900, 8912, 8924, 8936, 8948, 8960,
+ 8972, 8984, 8996, 9008, 9020, 9032, 9044, 9056,
+ 9068, 9080, 9092, 9104, 9116, 9128, 9140, 9164,
+ 9176, 9188, 9200, 9212, 9224, 9236, 9248, 9260,
+ 9272, 9284, 9296, 9308, 9320, 9332, 9344, 9356,
+ 9368, 9380, 9392, 9404, 9416, 9428, 9440, 9452,
+ 9464, 9476, 9488, 9500, 9512, 9524, 9536, 9548,
+ 9560, 9572, 9584, 9596, 9608, 9620, 9632, 9644,
+ 9656, 9668, 9680, 9692, 9704, 9716, 9728, 9740,
+ 9752, 9764, 9776, 9788, 9800, 9812, 9824, 9836,
+ 9848, 9860, 9872, 9884, 9896, 9908, 9920, 9932,
+ 9944, 9956, 9968, 9980, },
+ /* 5 */
+ {9, 21, 33, 45, 57, 69, 81, 93,
+ 105, 117, 129, 141, 153, 165, 177, 189,
+ 201, 213, 225, 237, 249, 261, 273, 285,
+ 297, 309, 321, 333, 345, 357, 369, 381,
+ 393, 405, 417, 429, 441, 453, 465, 477,
+ 489, 501, 513, 525, 537, 549, 561, 573,
+ 585, 597, 609, 621, 633, 645, 657, 669,
+ 681, 693, 705, 717, 729, 741, 753, 765,
+ 777, 789, 801, 813, 825, 837, 849, 861,
+ 873, 885, 897, 909, 921, 933, 945, 957,
+ 969, 981, 993, 1005, 1017, 1029, 1041, 1053,
+ 1065, 1077, 1089, 1101, 1113, 1125, 1137, 1149,
+ 1161, 1173, 1185, 1197, 1209, 1221, 1233, 1245,
+ 1257, 1269, 1281, 1293, 1305, 1317, 1329, 1341,
+ 1353, 1365, 1377, 1389, 1401, 1413, 1425, 1437,
+ 1449, 1461, 1473, 1485, 1497, 1509, 1521, 1533,
+ 1545, 1557, 1569, 1581, 1593, 1605, 1617, 1629,
+ 1641, 1653, 1677, 1689, 1701, 1713, 1725, 1737,
+ 1749, 1761, 1773, 1785, 1797, 1809, 1821, 1833,
+ 1845, 1857, 1869, 1881, 1893, 1905, 1917, 1929,
+ 1941, 1953, 1965, 1977, 1989, 2001, 2013, 2025,
+ 2037, 2049, 2061, 2073, 2085, 2097, 2109, 2121,
+ 2133, 2145, 2157, 2169, 2181, 2193, 2205, 2217,
+ 2229, 2241, 2253, 2265, 2277, 2289, 2301, 2313,
+ 2325, 2337, 2349, 2361, 2373, 2385, 2397, 2409,
+ 2421, 2433, 2445, 2457, 2469, 2481, 2493, 2505,
+ 2517, 2529, 2541, 2553, 2565, 2577, 2589, 2601,
+ 2613, 2625, 2637, 2649, 2661, 2673, 2685, 2697,
+ 2709, 2721, 2733, 2745, 2757, 2769, 2781, 2793,
+ 2805, 2817, 2829, 2841, 2853, 2865, 2877, 2889,
+ 2901, 2913, 2925, 2937, 2949, 2961, 2973, 2985,
+ 2997, 3009, 3021, 3033, 3045, 3057, 3069, 3081,
+ 3093, 3105, 3117, 3129, 3141, 3153, 3165, 3177,
+ 3189, 3201, 3213, 3225, 3237, 3249, 3261, 3273,
+ 3285, 3297, 3309, 3321, 3333, 3345, 3357, 3369,
+ 3381, 3393, 3405, 3417, 3429, 3441, 3453, 3465,
+ 3477, 3489, 3501, 3513, 3525, 3537, 3549, 3561,
+ 3573, 3585, 3597, 3609, 3621, 3633, 3645, 3657,
+ 3669, 3681, 3693, 3705, 3717, 3729, 3741, 3753,
+ 3765, 3777, 3789, 3801, 3813, 3825, 3837, 3849,
+ 3861, 3873, 3885, 3897, 3909, 3921, 3933, 3945,
+ 3957, 3969, 3981, 3993, 4005, 4017, 4029, 4041,
+ 4053, 4065, 4077, 4089, 4101, 4113, 4125, 4137,
+ 4149, 4173, 4185, 4197, 4209, 4221, 4233, 4245,
+ 4257, 4269, 4281, 4293, 4305, 4317, 4329, 4341,
+ 4353, 4365, 4377, 4389, 4401, 4413, 4425, 4437,
+ 4449, 4461, 4473, 4485, 4497, 4509, 4521, 4533,
+ 4545, 4557, 4569, 4581, 4593, 4605, 4617, 4629,
+ 4641, 4653, 4665, 4677, 4689, 4701, 4713, 4725,
+ 4737, 4749, 4761, 4773, 4785, 4797, 4809, 4821,
+ 4833, 4845, 4857, 4869, 4881, 4893, 4905, 4917,
+ 4929, 4941, 4953, 4965, 4977, 4989, 5001, 5013,
+ 5025, 5037, 5049, 5061, 5073, 5085, 5097, 5109,
+ 5121, 5133, 5145, 5157, 5169, 5181, 5193, 5205,
+ 5217, 5229, 5241, 5253, 5265, 5277, 5289, 5301,
+ 5313, 5325, 5337, 5349, 5361, 5373, 5385, 5397,
+ 5409, 5421, 5433, 5445, 5457, 5469, 5481, 5493,
+ 5505, 5517, 5529, 5541, 5553, 5565, 5577, 5589,
+ 5601, 5613, 5625, 5637, 5649, 5661, 5673, 5685,
+ 5697, 5709, 5721, 5733, 5745, 5757, 5769, 5781,
+ 5793, 5805, 5817, 5829, 5841, 5853, 5865, 5877,
+ 5889, 5901, 5913, 5925, 5937, 5949, 5961, 5973,
+ 5985, 5997, 6009, 6021, 6033, 6045, 6057, 6069,
+ 6081, 6093, 6105, 6117, 6129, 6141, 6153, 6165,
+ 6177, 6189, 6201, 6213, 6225, 6237, 6249, 6261,
+ 6273, 6285, 6297, 6309, 6321, 6333, 6345, 6357,
+ 6369, 6381, 6393, 6405, 6417, 6429, 6441, 6453,
+ 6465, 6477, 6489, 6501, 6513, 6525, 6537, 6549,
+ 6561, 6573, 6585, 6597, 6609, 6621, 6633, 6645,
+ 6669, 6681, 6693, 6705, 6717, 6729, 6741, 6753,
+ 6765, 6777, 6789, 6801, 6813, 6825, 6837, 6849,
+ 6861, 6873, 6885, 6897, 6909, 6921, 6933, 6945,
+ 6957, 6969, 6981, 6993, 7005, 7017, 7029, 7041,
+ 7053, 7065, 7077, 7089, 7101, 7113, 7125, 7137,
+ 7149, 7161, 7173, 7185, 7197, 7209, 7221, 7233,
+ 7245, 7257, 7269, 7281, 7293, 7305, 7317, 7329,
+ 7341, 7353, 7365, 7377, 7389, 7401, 7413, 7425,
+ 7437, 7449, 7461, 7473, 7485, 7497, 7509, 7521,
+ 7533, 7545, 7557, 7569, 7581, 7593, 7605, 7617,
+ 7629, 7641, 7653, 7665, 7677, 7689, 7701, 7713,
+ 7725, 7737, 7749, 7761, 7773, 7785, 7797, 7809,
+ 7821, 7833, 7845, 7857, 7869, 7881, 7893, 7905,
+ 7917, 7929, 7941, 7953, 7965, 7977, 7989, 8001,
+ 8013, 8025, 8037, 8049, 8061, 8073, 8085, 8097,
+ 8109, 8121, 8133, 8145, 8157, 8169, 8181, 8193,
+ 8205, 8217, 8229, 8241, 8253, 8265, 8277, 8289,
+ 8301, 8313, 8325, 8337, 8349, 8361, 8373, 8385,
+ 8397, 8409, 8421, 8433, 8445, 8457, 8469, 8481,
+ 8493, 8505, 8517, 8529, 8541, 8553, 8565, 8577,
+ 8589, 8601, 8613, 8625, 8637, 8649, 8661, 8673,
+ 8685, 8697, 8709, 8721, 8733, 8745, 8757, 8769,
+ 8781, 8793, 8805, 8817, 8829, 8841, 8853, 8865,
+ 8877, 8889, 8901, 8913, 8925, 8937, 8949, 8961,
+ 8973, 8985, 8997, 9009, 9021, 9033, 9045, 9057,
+ 9069, 9081, 9093, 9105, 9117, 9129, 9141, 9165,
+ 9177, 9189, 9201, 9213, 9225, 9237, 9249, 9261,
+ 9273, 9285, 9297, 9309, 9321, 9333, 9345, 9357,
+ 9369, 9381, 9393, 9405, 9417, 9429, 9441, 9453,
+ 9465, 9477, 9489, 9501, 9513, 9525, 9537, 9549,
+ 9561, 9573, 9585, 9597, 9609, 9621, 9633, 9645,
+ 9657, 9669, 9681, 9693, 9705, 9717, 9729, 9741,
+ 9753, 9765, 9777, 9789, 9801, 9813, 9825, 9837,
+ 9849, 9861, 9873, 9885, 9897, 9909, 9921, 9933,
+ 9945, 9957, 9969, 9981, },
+ /* 6 */
+ {10, 22, 34, 46, 58, 70, 82, 94,
+ 106, 118, 130, 142, 154, 166, 178, 190,
+ 202, 214, 226, 238, 250, 262, 274, 286,
+ 298, 310, 322, 334, 346, 358, 370, 382,
+ 394, 406, 418, 430, 442, 454, 466, 478,
+ 490, 502, 514, 526, 538, 550, 562, 574,
+ 586, 598, 610, 622, 634, 646, 658, 670,
+ 682, 694, 706, 718, 730, 742, 754, 766,
+ 778, 790, 802, 814, 826, 838, 850, 862,
+ 874, 886, 898, 910, 922, 934, 946, 958,
+ 970, 982, 994, 1006, 1018, 1030, 1042, 1054,
+ 1066, 1078, 1090, 1102, 1114, 1126, 1138, 1150,
+ 1162, 1174, 1186, 1198, 1210, 1222, 1234, 1246,
+ 1258, 1270, 1282, 1294, 1306, 1318, 1330, 1342,
+ 1354, 1366, 1378, 1390, 1402, 1414, 1426, 1438,
+ 1450, 1462, 1474, 1486, 1498, 1510, 1522, 1534,
+ 1546, 1558, 1570, 1582, 1594, 1606, 1618, 1630,
+ 1642, 1654, 1678, 1690, 1702, 1714, 1726, 1738,
+ 1750, 1762, 1774, 1786, 1798, 1810, 1822, 1834,
+ 1846, 1858, 1870, 1882, 1894, 1906, 1918, 1930,
+ 1942, 1954, 1966, 1978, 1990, 2002, 2014, 2026,
+ 2038, 2050, 2062, 2074, 2086, 2098, 2110, 2122,
+ 2134, 2146, 2158, 2170, 2182, 2194, 2206, 2218,
+ 2230, 2242, 2254, 2266, 2278, 2290, 2302, 2314,
+ 2326, 2338, 2350, 2362, 2374, 2386, 2398, 2410,
+ 2422, 2434, 2446, 2458, 2470, 2482, 2494, 2506,
+ 2518, 2530, 2542, 2554, 2566, 2578, 2590, 2602,
+ 2614, 2626, 2638, 2650, 2662, 2674, 2686, 2698,
+ 2710, 2722, 2734, 2746, 2758, 2770, 2782, 2794,
+ 2806, 2818, 2830, 2842, 2854, 2866, 2878, 2890,
+ 2902, 2914, 2926, 2938, 2950, 2962, 2974, 2986,
+ 2998, 3010, 3022, 3034, 3046, 3058, 3070, 3082,
+ 3094, 3106, 3118, 3130, 3142, 3154, 3166, 3178,
+ 3190, 3202, 3214, 3226, 3238, 3250, 3262, 3274,
+ 3286, 3298, 3310, 3322, 3334, 3346, 3358, 3370,
+ 3382, 3394, 3406, 3418, 3430, 3442, 3454, 3466,
+ 3478, 3490, 3502, 3514, 3526, 3538, 3550, 3562,
+ 3574, 3586, 3598, 3610, 3622, 3634, 3646, 3658,
+ 3670, 3682, 3694, 3706, 3718, 3730, 3742, 3754,
+ 3766, 3778, 3790, 3802, 3814, 3826, 3838, 3850,
+ 3862, 3874, 3886, 3898, 3910, 3922, 3934, 3946,
+ 3958, 3970, 3982, 3994, 4006, 4018, 4030, 4042,
+ 4054, 4066, 4078, 4090, 4102, 4114, 4126, 4138,
+ 4150, 4174, 4186, 4198, 4210, 4222, 4234, 4246,
+ 4258, 4270, 4282, 4294, 4306, 4318, 4330, 4342,
+ 4354, 4366, 4378, 4390, 4402, 4414, 4426, 4438,
+ 4450, 4462, 4474, 4486, 4498, 4510, 4522, 4534,
+ 4546, 4558, 4570, 4582, 4594, 4606, 4618, 4630,
+ 4642, 4654, 4666, 4678, 4690, 4702, 4714, 4726,
+ 4738, 4750, 4762, 4774, 4786, 4798, 4810, 4822,
+ 4834, 4846, 4858, 4870, 4882, 4894, 4906, 4918,
+ 4930, 4942, 4954, 4966, 4978, 4990, 5002, 5014,
+ 5026, 5038, 5050, 5062, 5074, 5086, 5098, 5110,
+ 5122, 5134, 5146, 5158, 5170, 5182, 5194, 5206,
+ 5218, 5230, 5242, 5254, 5266, 5278, 5290, 5302,
+ 5314, 5326, 5338, 5350, 5362, 5374, 5386, 5398,
+ 5410, 5422, 5434, 5446, 5458, 5470, 5482, 5494,
+ 5506, 5518, 5530, 5542, 5554, 5566, 5578, 5590,
+ 5602, 5614, 5626, 5638, 5650, 5662, 5674, 5686,
+ 5698, 5710, 5722, 5734, 5746, 5758, 5770, 5782,
+ 5794, 5806, 5818, 5830, 5842, 5854, 5866, 5878,
+ 5890, 5902, 5914, 5926, 5938, 5950, 5962, 5974,
+ 5986, 5998, 6010, 6022, 6034, 6046, 6058, 6070,
+ 6082, 6094, 6106, 6118, 6130, 6142, 6154, 6166,
+ 6178, 6190, 6202, 6214, 6226, 6238, 6250, 6262,
+ 6274, 6286, 6298, 6310, 6322, 6334, 6346, 6358,
+ 6370, 6382, 6394, 6406, 6418, 6430, 6442, 6454,
+ 6466, 6478, 6490, 6502, 6514, 6526, 6538, 6550,
+ 6562, 6574, 6586, 6598, 6610, 6622, 6634, 6646,
+ 6670, 6682, 6694, 6706, 6718, 6730, 6742, 6754,
+ 6766, 6778, 6790, 6802, 6814, 6826, 6838, 6850,
+ 6862, 6874, 6886, 6898, 6910, 6922, 6934, 6946,
+ 6958, 6970, 6982, 6994, 7006, 7018, 7030, 7042,
+ 7054, 7066, 7078, 7090, 7102, 7114, 7126, 7138,
+ 7150, 7162, 7174, 7186, 7198, 7210, 7222, 7234,
+ 7246, 7258, 7270, 7282, 7294, 7306, 7318, 7330,
+ 7342, 7354, 7366, 7378, 7390, 7402, 7414, 7426,
+ 7438, 7450, 7462, 7474, 7486, 7498, 7510, 7522,
+ 7534, 7546, 7558, 7570, 7582, 7594, 7606, 7618,
+ 7630, 7642, 7654, 7666, 7678, 7690, 7702, 7714,
+ 7726, 7738, 7750, 7762, 7774, 7786, 7798, 7810,
+ 7822, 7834, 7846, 7858, 7870, 7882, 7894, 7906,
+ 7918, 7930, 7942, 7954, 7966, 7978, 7990, 8002,
+ 8014, 8026, 8038, 8050, 8062, 8074, 8086, 8098,
+ 8110, 8122, 8134, 8146, 8158, 8170, 8182, 8194,
+ 8206, 8218, 8230, 8242, 8254, 8266, 8278, 8290,
+ 8302, 8314, 8326, 8338, 8350, 8362, 8374, 8386,
+ 8398, 8410, 8422, 8434, 8446, 8458, 8470, 8482,
+ 8494, 8506, 8518, 8530, 8542, 8554, 8566, 8578,
+ 8590, 8602, 8614, 8626, 8638, 8650, 8662, 8674,
+ 8686, 8698, 8710, 8722, 8734, 8746, 8758, 8770,
+ 8782, 8794, 8806, 8818, 8830, 8842, 8854, 8866,
+ 8878, 8890, 8902, 8914, 8926, 8938, 8950, 8962,
+ 8974, 8986, 8998, 9010, 9022, 9034, 9046, 9058,
+ 9070, 9082, 9094, 9106, 9118, 9130, 9142, 9166,
+ 9178, 9190, 9202, 9214, 9226, 9238, 9250, 9262,
+ 9274, 9286, 9298, 9310, 9322, 9334, 9346, 9358,
+ 9370, 9382, 9394, 9406, 9418, 9430, 9442, 9454,
+ 9466, 9478, 9490, 9502, 9514, 9526, 9538, 9550,
+ 9562, 9574, 9586, 9598, 9610, 9622, 9634, 9646,
+ 9658, 9670, 9682, 9694, 9706, 9718, 9730, 9742,
+ 9754, 9766, 9778, 9790, 9802, 9814, 9826, 9838,
+ 9850, 9862, 9874, 9886, 9898, 9910, 9922, 9934,
+ 9946, 9958, 9970, 9982, },
+ /* 7 */
+ {11, 23, 35, 47, 59, 71, 83, 95,
+ 107, 119, 131, 143, 155, 167, 179, 191,
+ 203, 215, 227, 239, 251, 263, 275, 287,
+ 299, 311, 323, 335, 347, 359, 371, 383,
+ 395, 407, 419, 431, 443, 455, 467, 479,
+ 491, 503, 515, 527, 539, 551, 563, 575,
+ 587, 599, 611, 623, 635, 647, 659, 671,
+ 683, 695, 707, 719, 731, 743, 755, 767,
+ 779, 791, 803, 815, 827, 839, 851, 863,
+ 875, 887, 899, 911, 923, 935, 947, 959,
+ 971, 983, 995, 1007, 1019, 1031, 1043, 1055,
+ 1067, 1079, 1091, 1103, 1115, 1127, 1139, 1151,
+ 1163, 1175, 1187, 1199, 1211, 1223, 1235, 1247,
+ 1259, 1271, 1283, 1295, 1307, 1319, 1331, 1343,
+ 1355, 1367, 1379, 1391, 1403, 1415, 1427, 1439,
+ 1451, 1463, 1475, 1487, 1499, 1511, 1523, 1535,
+ 1547, 1559, 1571, 1583, 1595, 1607, 1619, 1631,
+ 1643, 1655, 1679, 1691, 1703, 1715, 1727, 1739,
+ 1751, 1763, 1775, 1787, 1799, 1811, 1823, 1835,
+ 1847, 1859, 1871, 1883, 1895, 1907, 1919, 1931,
+ 1943, 1955, 1967, 1979, 1991, 2003, 2015, 2027,
+ 2039, 2051, 2063, 2075, 2087, 2099, 2111, 2123,
+ 2135, 2147, 2159, 2171, 2183, 2195, 2207, 2219,
+ 2231, 2243, 2255, 2267, 2279, 2291, 2303, 2315,
+ 2327, 2339, 2351, 2363, 2375, 2387, 2399, 2411,
+ 2423, 2435, 2447, 2459, 2471, 2483, 2495, 2507,
+ 2519, 2531, 2543, 2555, 2567, 2579, 2591, 2603,
+ 2615, 2627, 2639, 2651, 2663, 2675, 2687, 2699,
+ 2711, 2723, 2735, 2747, 2759, 2771, 2783, 2795,
+ 2807, 2819, 2831, 2843, 2855, 2867, 2879, 2891,
+ 2903, 2915, 2927, 2939, 2951, 2963, 2975, 2987,
+ 2999, 3011, 3023, 3035, 3047, 3059, 3071, 3083,
+ 3095, 3107, 3119, 3131, 3143, 3155, 3167, 3179,
+ 3191, 3203, 3215, 3227, 3239, 3251, 3263, 3275,
+ 3287, 3299, 3311, 3323, 3335, 3347, 3359, 3371,
+ 3383, 3395, 3407, 3419, 3431, 3443, 3455, 3467,
+ 3479, 3491, 3503, 3515, 3527, 3539, 3551, 3563,
+ 3575, 3587, 3599, 3611, 3623, 3635, 3647, 3659,
+ 3671, 3683, 3695, 3707, 3719, 3731, 3743, 3755,
+ 3767, 3779, 3791, 3803, 3815, 3827, 3839, 3851,
+ 3863, 3875, 3887, 3899, 3911, 3923, 3935, 3947,
+ 3959, 3971, 3983, 3995, 4007, 4019, 4031, 4043,
+ 4055, 4067, 4079, 4091, 4103, 4115, 4127, 4139,
+ 4151, 4175, 4187, 4199, 4211, 4223, 4235, 4247,
+ 4259, 4271, 4283, 4295, 4307, 4319, 4331, 4343,
+ 4355, 4367, 4379, 4391, 4403, 4415, 4427, 4439,
+ 4451, 4463, 4475, 4487, 4499, 4511, 4523, 4535,
+ 4547, 4559, 4571, 4583, 4595, 4607, 4619, 4631,
+ 4643, 4655, 4667, 4679, 4691, 4703, 4715, 4727,
+ 4739, 4751, 4763, 4775, 4787, 4799, 4811, 4823,
+ 4835, 4847, 4859, 4871, 4883, 4895, 4907, 4919,
+ 4931, 4943, 4955, 4967, 4979, 4991, 5003, 5015,
+ 5027, 5039, 5051, 5063, 5075, 5087, 5099, 5111,
+ 5123, 5135, 5147, 5159, 5171, 5183, 5195, 5207,
+ 5219, 5231, 5243, 5255, 5267, 5279, 5291, 5303,
+ 5315, 5327, 5339, 5351, 5363, 5375, 5387, 5399,
+ 5411, 5423, 5435, 5447, 5459, 5471, 5483, 5495,
+ 5507, 5519, 5531, 5543, 5555, 5567, 5579, 5591,
+ 5603, 5615, 5627, 5639, 5651, 5663, 5675, 5687,
+ 5699, 5711, 5723, 5735, 5747, 5759, 5771, 5783,
+ 5795, 5807, 5819, 5831, 5843, 5855, 5867, 5879,
+ 5891, 5903, 5915, 5927, 5939, 5951, 5963, 5975,
+ 5987, 5999, 6011, 6023, 6035, 6047, 6059, 6071,
+ 6083, 6095, 6107, 6119, 6131, 6143, 6155, 6167,
+ 6179, 6191, 6203, 6215, 6227, 6239, 6251, 6263,
+ 6275, 6287, 6299, 6311, 6323, 6335, 6347, 6359,
+ 6371, 6383, 6395, 6407, 6419, 6431, 6443, 6455,
+ 6467, 6479, 6491, 6503, 6515, 6527, 6539, 6551,
+ 6563, 6575, 6587, 6599, 6611, 6623, 6635, 6647,
+ 6671, 6683, 6695, 6707, 6719, 6731, 6743, 6755,
+ 6767, 6779, 6791, 6803, 6815, 6827, 6839, 6851,
+ 6863, 6875, 6887, 6899, 6911, 6923, 6935, 6947,
+ 6959, 6971, 6983, 6995, 7007, 7019, 7031, 7043,
+ 7055, 7067, 7079, 7091, 7103, 7115, 7127, 7139,
+ 7151, 7163, 7175, 7187, 7199, 7211, 7223, 7235,
+ 7247, 7259, 7271, 7283, 7295, 7307, 7319, 7331,
+ 7343, 7355, 7367, 7379, 7391, 7403, 7415, 7427,
+ 7439, 7451, 7463, 7475, 7487, 7499, 7511, 7523,
+ 7535, 7547, 7559, 7571, 7583, 7595, 7607, 7619,
+ 7631, 7643, 7655, 7667, 7679, 7691, 7703, 7715,
+ 7727, 7739, 7751, 7763, 7775, 7787, 7799, 7811,
+ 7823, 7835, 7847, 7859, 7871, 7883, 7895, 7907,
+ 7919, 7931, 7943, 7955, 7967, 7979, 7991, 8003,
+ 8015, 8027, 8039, 8051, 8063, 8075, 8087, 8099,
+ 8111, 8123, 8135, 8147, 8159, 8171, 8183, 8195,
+ 8207, 8219, 8231, 8243, 8255, 8267, 8279, 8291,
+ 8303, 8315, 8327, 8339, 8351, 8363, 8375, 8387,
+ 8399, 8411, 8423, 8435, 8447, 8459, 8471, 8483,
+ 8495, 8507, 8519, 8531, 8543, 8555, 8567, 8579,
+ 8591, 8603, 8615, 8627, 8639, 8651, 8663, 8675,
+ 8687, 8699, 8711, 8723, 8735, 8747, 8759, 8771,
+ 8783, 8795, 8807, 8819, 8831, 8843, 8855, 8867,
+ 8879, 8891, 8903, 8915, 8927, 8939, 8951, 8963,
+ 8975, 8987, 8999, 9011, 9023, 9035, 9047, 9059,
+ 9071, 9083, 9095, 9107, 9119, 9131, 9143, 9167,
+ 9179, 9191, 9203, 9215, 9227, 9239, 9251, 9263,
+ 9275, 9287, 9299, 9311, 9323, 9335, 9347, 9359,
+ 9371, 9383, 9395, 9407, 9419, 9431, 9443, 9455,
+ 9467, 9479, 9491, 9503, 9515, 9527, 9539, 9551,
+ 9563, 9575, 9587, 9599, 9611, 9623, 9635, 9647,
+ 9659, 9671, 9683, 9695, 9707, 9719, 9731, 9743,
+ 9755, 9767, 9779, 9791, 9803, 9815, 9827, 9839,
+ 9851, 9863, 9875, 9887, 9899, 9911, 9923, 9935,
+ 9947, 9959, 9971, 9983, },
+ /* 8 */
+ {12, 24, 36, 48, 60, 72, 84, 96,
+ 108, 120, 132, 144, 156, 168, 180, 192,
+ 204, 216, 228, 240, 252, 264, 276, 288,
+ 300, 312, 324, 336, 348, 360, 372, 384,
+ 396, 408, 420, 432, 444, 456, 468, 480,
+ 492, 504, 516, 528, 540, 552, 564, 576,
+ 588, 600, 612, 624, 636, 648, 660, 672,
+ 684, 696, 708, 720, 732, 744, 756, 768,
+ 780, 792, 804, 816, 828, 840, 852, 864,
+ 876, 888, 900, 912, 924, 936, 948, 960,
+ 972, 984, 996, 1008, 1020, 1032, 1044, 1056,
+ 1068, 1080, 1092, 1104, 1116, 1128, 1140, 1152,
+ 1164, 1176, 1188, 1200, 1212, 1224, 1236, 1248,
+ 1260, 1272, 1284, 1296, 1308, 1320, 1332, 1344,
+ 1356, 1368, 1380, 1392, 1404, 1416, 1428, 1440,
+ 1452, 1464, 1476, 1488, 1500, 1512, 1524, 1536,
+ 1548, 1560, 1572, 1584, 1596, 1608, 1620, 1632,
+ 1644, 1656, 1668, 1680, 1692, 1704, 1716, 1728,
+ 1740, 1752, 1764, 1776, 1788, 1800, 1812, 1824,
+ 1836, 1848, 1860, 1872, 1884, 1896, 1908, 1920,
+ 1932, 1944, 1956, 1968, 1980, 1992, 2004, 2016,
+ 2028, 2040, 2052, 2064, 2076, 2088, 2100, 2112,
+ 2124, 2136, 2148, 2160, 2172, 2184, 2196, 2208,
+ 2220, 2232, 2244, 2256, 2268, 2280, 2292, 2304,
+ 2316, 2328, 2340, 2352, 2364, 2376, 2388, 2400,
+ 2412, 2424, 2436, 2448, 2460, 2472, 2484, 2508,
+ 2520, 2532, 2544, 2556, 2568, 2580, 2592, 2604,
+ 2616, 2628, 2640, 2652, 2664, 2676, 2688, 2700,
+ 2712, 2724, 2736, 2748, 2760, 2772, 2784, 2796,
+ 2808, 2820, 2832, 2844, 2856, 2868, 2880, 2892,
+ 2904, 2916, 2928, 2940, 2952, 2964, 2976, 2988,
+ 3000, 3012, 3024, 3036, 3048, 3060, 3072, 3084,
+ 3096, 3108, 3120, 3132, 3144, 3156, 3168, 3180,
+ 3192, 3204, 3216, 3228, 3240, 3252, 3264, 3276,
+ 3288, 3300, 3312, 3324, 3336, 3348, 3360, 3372,
+ 3384, 3396, 3408, 3420, 3432, 3444, 3456, 3468,
+ 3480, 3492, 3504, 3516, 3528, 3540, 3552, 3564,
+ 3576, 3588, 3600, 3612, 3624, 3636, 3648, 3660,
+ 3672, 3684, 3696, 3708, 3720, 3732, 3744, 3756,
+ 3768, 3780, 3792, 3804, 3816, 3828, 3840, 3852,
+ 3864, 3876, 3888, 3900, 3912, 3924, 3936, 3948,
+ 3960, 3972, 3984, 3996, 4008, 4020, 4032, 4044,
+ 4056, 4068, 4080, 4092, 4104, 4116, 4128, 4140,
+ 4152, 4164, 4176, 4188, 4200, 4212, 4224, 4236,
+ 4248, 4260, 4272, 4284, 4296, 4308, 4320, 4332,
+ 4344, 4356, 4368, 4380, 4392, 4404, 4416, 4428,
+ 4440, 4452, 4464, 4476, 4488, 4500, 4512, 4524,
+ 4536, 4548, 4560, 4572, 4584, 4596, 4608, 4620,
+ 4632, 4644, 4656, 4668, 4680, 4692, 4704, 4716,
+ 4728, 4740, 4752, 4764, 4776, 4788, 4800, 4812,
+ 4824, 4836, 4848, 4860, 4872, 4884, 4896, 4908,
+ 4920, 4932, 4944, 4956, 4968, 4980, 5004, 5016,
+ 5028, 5040, 5052, 5064, 5076, 5088, 5100, 5112,
+ 5124, 5136, 5148, 5160, 5172, 5184, 5196, 5208,
+ 5220, 5232, 5244, 5256, 5268, 5280, 5292, 5304,
+ 5316, 5328, 5340, 5352, 5364, 5376, 5388, 5400,
+ 5412, 5424, 5436, 5448, 5460, 5472, 5484, 5496,
+ 5508, 5520, 5532, 5544, 5556, 5568, 5580, 5592,
+ 5604, 5616, 5628, 5640, 5652, 5664, 5676, 5688,
+ 5700, 5712, 5724, 5736, 5748, 5760, 5772, 5784,
+ 5796, 5808, 5820, 5832, 5844, 5856, 5868, 5880,
+ 5892, 5904, 5916, 5928, 5940, 5952, 5964, 5976,
+ 5988, 6000, 6012, 6024, 6036, 6048, 6060, 6072,
+ 6084, 6096, 6108, 6120, 6132, 6144, 6156, 6168,
+ 6180, 6192, 6204, 6216, 6228, 6240, 6252, 6264,
+ 6276, 6288, 6300, 6312, 6324, 6336, 6348, 6360,
+ 6372, 6384, 6396, 6408, 6420, 6432, 6444, 6456,
+ 6468, 6480, 6492, 6504, 6516, 6528, 6540, 6552,
+ 6564, 6576, 6588, 6600, 6612, 6624, 6636, 6648,
+ 6660, 6672, 6684, 6696, 6708, 6720, 6732, 6744,
+ 6756, 6768, 6780, 6792, 6804, 6816, 6828, 6840,
+ 6852, 6864, 6876, 6888, 6900, 6912, 6924, 6936,
+ 6948, 6960, 6972, 6984, 6996, 7008, 7020, 7032,
+ 7044, 7056, 7068, 7080, 7092, 7104, 7116, 7128,
+ 7140, 7152, 7164, 7176, 7188, 7200, 7212, 7224,
+ 7236, 7248, 7260, 7272, 7284, 7296, 7308, 7320,
+ 7332, 7344, 7356, 7368, 7380, 7392, 7404, 7416,
+ 7428, 7440, 7452, 7464, 7476, 7500, 7512, 7524,
+ 7536, 7548, 7560, 7572, 7584, 7596, 7608, 7620,
+ 7632, 7644, 7656, 7668, 7680, 7692, 7704, 7716,
+ 7728, 7740, 7752, 7764, 7776, 7788, 7800, 7812,
+ 7824, 7836, 7848, 7860, 7872, 7884, 7896, 7908,
+ 7920, 7932, 7944, 7956, 7968, 7980, 7992, 8004,
+ 8016, 8028, 8040, 8052, 8064, 8076, 8088, 8100,
+ 8112, 8124, 8136, 8148, 8160, 8172, 8184, 8196,
+ 8208, 8220, 8232, 8244, 8256, 8268, 8280, 8292,
+ 8304, 8316, 8328, 8340, 8352, 8364, 8376, 8388,
+ 8400, 8412, 8424, 8436, 8448, 8460, 8472, 8484,
+ 8496, 8508, 8520, 8532, 8544, 8556, 8568, 8580,
+ 8592, 8604, 8616, 8628, 8640, 8652, 8664, 8676,
+ 8688, 8700, 8712, 8724, 8736, 8748, 8760, 8772,
+ 8784, 8796, 8808, 8820, 8832, 8844, 8856, 8868,
+ 8880, 8892, 8904, 8916, 8928, 8940, 8952, 8964,
+ 8976, 8988, 9000, 9012, 9024, 9036, 9048, 9060,
+ 9072, 9084, 9096, 9108, 9120, 9132, 9144, 9156,
+ 9168, 9180, 9192, 9204, 9216, 9228, 9240, 9252,
+ 9264, 9276, 9288, 9300, 9312, 9324, 9336, 9348,
+ 9360, 9372, 9384, 9396, 9408, 9420, 9432, 9444,
+ 9456, 9468, 9480, 9492, 9504, 9516, 9528, 9540,
+ 9552, 9564, 9576, 9588, 9600, 9612, 9624, 9636,
+ 9648, 9660, 9672, 9684, 9696, 9708, 9720, 9732,
+ 9744, 9756, 9768, 9780, 9792, 9804, 9816, 9828,
+ 9840, 9852, 9864, 9876, 9888, 9900, 9912, 9924,
+ 9936, 9948, 9960, 9972, },
+ /* 9 */
+ {13, 25, 37, 49, 61, 73, 85, 97,
+ 109, 121, 133, 145, 157, 169, 181, 193,
+ 205, 217, 229, 241, 253, 265, 277, 289,
+ 301, 313, 325, 337, 349, 361, 373, 385,
+ 397, 409, 421, 433, 445, 457, 469, 481,
+ 493, 505, 517, 529, 541, 553, 565, 577,
+ 589, 601, 613, 625, 637, 649, 661, 673,
+ 685, 697, 709, 721, 733, 745, 757, 769,
+ 781, 793, 805, 817, 829, 841, 853, 865,
+ 877, 889, 901, 913, 925, 937, 949, 961,
+ 973, 985, 997, 1009, 1021, 1033, 1045, 1057,
+ 1069, 1081, 1093, 1105, 1117, 1129, 1141, 1153,
+ 1165, 1177, 1189, 1201, 1213, 1225, 1237, 1249,
+ 1261, 1273, 1285, 1297, 1309, 1321, 1333, 1345,
+ 1357, 1369, 1381, 1393, 1405, 1417, 1429, 1441,
+ 1453, 1465, 1477, 1489, 1501, 1513, 1525, 1537,
+ 1549, 1561, 1573, 1585, 1597, 1609, 1621, 1633,
+ 1645, 1657, 1669, 1681, 1693, 1705, 1717, 1729,
+ 1741, 1753, 1765, 1777, 1789, 1801, 1813, 1825,
+ 1837, 1849, 1861, 1873, 1885, 1897, 1909, 1921,
+ 1933, 1945, 1957, 1969, 1981, 1993, 2005, 2017,
+ 2029, 2041, 2053, 2065, 2077, 2089, 2101, 2113,
+ 2125, 2137, 2149, 2161, 2173, 2185, 2197, 2209,
+ 2221, 2233, 2245, 2257, 2269, 2281, 2293, 2305,
+ 2317, 2329, 2341, 2353, 2365, 2377, 2389, 2401,
+ 2413, 2425, 2437, 2449, 2461, 2473, 2485, 2509,
+ 2521, 2533, 2545, 2557, 2569, 2581, 2593, 2605,
+ 2617, 2629, 2641, 2653, 2665, 2677, 2689, 2701,
+ 2713, 2725, 2737, 2749, 2761, 2773, 2785, 2797,
+ 2809, 2821, 2833, 2845, 2857, 2869, 2881, 2893,
+ 2905, 2917, 2929, 2941, 2953, 2965, 2977, 2989,
+ 3001, 3013, 3025, 3037, 3049, 3061, 3073, 3085,
+ 3097, 3109, 3121, 3133, 3145, 3157, 3169, 3181,
+ 3193, 3205, 3217, 3229, 3241, 3253, 3265, 3277,
+ 3289, 3301, 3313, 3325, 3337, 3349, 3361, 3373,
+ 3385, 3397, 3409, 3421, 3433, 3445, 3457, 3469,
+ 3481, 3493, 3505, 3517, 3529, 3541, 3553, 3565,
+ 3577, 3589, 3601, 3613, 3625, 3637, 3649, 3661,
+ 3673, 3685, 3697, 3709, 3721, 3733, 3745, 3757,
+ 3769, 3781, 3793, 3805, 3817, 3829, 3841, 3853,
+ 3865, 3877, 3889, 3901, 3913, 3925, 3937, 3949,
+ 3961, 3973, 3985, 3997, 4009, 4021, 4033, 4045,
+ 4057, 4069, 4081, 4093, 4105, 4117, 4129, 4141,
+ 4153, 4165, 4177, 4189, 4201, 4213, 4225, 4237,
+ 4249, 4261, 4273, 4285, 4297, 4309, 4321, 4333,
+ 4345, 4357, 4369, 4381, 4393, 4405, 4417, 4429,
+ 4441, 4453, 4465, 4477, 4489, 4501, 4513, 4525,
+ 4537, 4549, 4561, 4573, 4585, 4597, 4609, 4621,
+ 4633, 4645, 4657, 4669, 4681, 4693, 4705, 4717,
+ 4729, 4741, 4753, 4765, 4777, 4789, 4801, 4813,
+ 4825, 4837, 4849, 4861, 4873, 4885, 4897, 4909,
+ 4921, 4933, 4945, 4957, 4969, 4981, 5005, 5017,
+ 5029, 5041, 5053, 5065, 5077, 5089, 5101, 5113,
+ 5125, 5137, 5149, 5161, 5173, 5185, 5197, 5209,
+ 5221, 5233, 5245, 5257, 5269, 5281, 5293, 5305,
+ 5317, 5329, 5341, 5353, 5365, 5377, 5389, 5401,
+ 5413, 5425, 5437, 5449, 5461, 5473, 5485, 5497,
+ 5509, 5521, 5533, 5545, 5557, 5569, 5581, 5593,
+ 5605, 5617, 5629, 5641, 5653, 5665, 5677, 5689,
+ 5701, 5713, 5725, 5737, 5749, 5761, 5773, 5785,
+ 5797, 5809, 5821, 5833, 5845, 5857, 5869, 5881,
+ 5893, 5905, 5917, 5929, 5941, 5953, 5965, 5977,
+ 5989, 6001, 6013, 6025, 6037, 6049, 6061, 6073,
+ 6085, 6097, 6109, 6121, 6133, 6145, 6157, 6169,
+ 6181, 6193, 6205, 6217, 6229, 6241, 6253, 6265,
+ 6277, 6289, 6301, 6313, 6325, 6337, 6349, 6361,
+ 6373, 6385, 6397, 6409, 6421, 6433, 6445, 6457,
+ 6469, 6481, 6493, 6505, 6517, 6529, 6541, 6553,
+ 6565, 6577, 6589, 6601, 6613, 6625, 6637, 6649,
+ 6661, 6673, 6685, 6697, 6709, 6721, 6733, 6745,
+ 6757, 6769, 6781, 6793, 6805, 6817, 6829, 6841,
+ 6853, 6865, 6877, 6889, 6901, 6913, 6925, 6937,
+ 6949, 6961, 6973, 6985, 6997, 7009, 7021, 7033,
+ 7045, 7057, 7069, 7081, 7093, 7105, 7117, 7129,
+ 7141, 7153, 7165, 7177, 7189, 7201, 7213, 7225,
+ 7237, 7249, 7261, 7273, 7285, 7297, 7309, 7321,
+ 7333, 7345, 7357, 7369, 7381, 7393, 7405, 7417,
+ 7429, 7441, 7453, 7465, 7477, 7501, 7513, 7525,
+ 7537, 7549, 7561, 7573, 7585, 7597, 7609, 7621,
+ 7633, 7645, 7657, 7669, 7681, 7693, 7705, 7717,
+ 7729, 7741, 7753, 7765, 7777, 7789, 7801, 7813,
+ 7825, 7837, 7849, 7861, 7873, 7885, 7897, 7909,
+ 7921, 7933, 7945, 7957, 7969, 7981, 7993, 8005,
+ 8017, 8029, 8041, 8053, 8065, 8077, 8089, 8101,
+ 8113, 8125, 8137, 8149, 8161, 8173, 8185, 8197,
+ 8209, 8221, 8233, 8245, 8257, 8269, 8281, 8293,
+ 8305, 8317, 8329, 8341, 8353, 8365, 8377, 8389,
+ 8401, 8413, 8425, 8437, 8449, 8461, 8473, 8485,
+ 8497, 8509, 8521, 8533, 8545, 8557, 8569, 8581,
+ 8593, 8605, 8617, 8629, 8641, 8653, 8665, 8677,
+ 8689, 8701, 8713, 8725, 8737, 8749, 8761, 8773,
+ 8785, 8797, 8809, 8821, 8833, 8845, 8857, 8869,
+ 8881, 8893, 8905, 8917, 8929, 8941, 8953, 8965,
+ 8977, 8989, 9001, 9013, 9025, 9037, 9049, 9061,
+ 9073, 9085, 9097, 9109, 9121, 9133, 9145, 9157,
+ 9169, 9181, 9193, 9205, 9217, 9229, 9241, 9253,
+ 9265, 9277, 9289, 9301, 9313, 9325, 9337, 9349,
+ 9361, 9373, 9385, 9397, 9409, 9421, 9433, 9445,
+ 9457, 9469, 9481, 9493, 9505, 9517, 9529, 9541,
+ 9553, 9565, 9577, 9589, 9601, 9613, 9625, 9637,
+ 9649, 9661, 9673, 9685, 9697, 9709, 9721, 9733,
+ 9745, 9757, 9769, 9781, 9793, 9805, 9817, 9829,
+ 9841, 9853, 9865, 9877, 9889, 9901, 9913, 9925,
+ 9937, 9949, 9961, 9973, },
+ /* 10 */
+ {14, 26, 38, 50, 62, 74, 86, 98,
+ 110, 122, 134, 146, 158, 170, 182, 194,
+ 206, 218, 230, 242, 254, 266, 278, 290,
+ 302, 314, 326, 338, 350, 362, 374, 386,
+ 398, 410, 422, 434, 446, 458, 470, 482,
+ 494, 506, 518, 530, 542, 554, 566, 578,
+ 590, 602, 614, 626, 638, 650, 662, 674,
+ 686, 698, 710, 722, 734, 746, 758, 770,
+ 782, 794, 806, 818, 830, 842, 854, 866,
+ 878, 890, 902, 914, 926, 938, 950, 962,
+ 974, 986, 998, 1010, 1022, 1034, 1046, 1058,
+ 1070, 1082, 1094, 1106, 1118, 1130, 1142, 1154,
+ 1166, 1178, 1190, 1202, 1214, 1226, 1238, 1250,
+ 1262, 1274, 1286, 1298, 1310, 1322, 1334, 1346,
+ 1358, 1370, 1382, 1394, 1406, 1418, 1430, 1442,
+ 1454, 1466, 1478, 1490, 1502, 1514, 1526, 1538,
+ 1550, 1562, 1574, 1586, 1598, 1610, 1622, 1634,
+ 1646, 1658, 1670, 1682, 1694, 1706, 1718, 1730,
+ 1742, 1754, 1766, 1778, 1790, 1802, 1814, 1826,
+ 1838, 1850, 1862, 1874, 1886, 1898, 1910, 1922,
+ 1934, 1946, 1958, 1970, 1982, 1994, 2006, 2018,
+ 2030, 2042, 2054, 2066, 2078, 2090, 2102, 2114,
+ 2126, 2138, 2150, 2162, 2174, 2186, 2198, 2210,
+ 2222, 2234, 2246, 2258, 2270, 2282, 2294, 2306,
+ 2318, 2330, 2342, 2354, 2366, 2378, 2390, 2402,
+ 2414, 2426, 2438, 2450, 2462, 2474, 2486, 2510,
+ 2522, 2534, 2546, 2558, 2570, 2582, 2594, 2606,
+ 2618, 2630, 2642, 2654, 2666, 2678, 2690, 2702,
+ 2714, 2726, 2738, 2750, 2762, 2774, 2786, 2798,
+ 2810, 2822, 2834, 2846, 2858, 2870, 2882, 2894,
+ 2906, 2918, 2930, 2942, 2954, 2966, 2978, 2990,
+ 3002, 3014, 3026, 3038, 3050, 3062, 3074, 3086,
+ 3098, 3110, 3122, 3134, 3146, 3158, 3170, 3182,
+ 3194, 3206, 3218, 3230, 3242, 3254, 3266, 3278,
+ 3290, 3302, 3314, 3326, 3338, 3350, 3362, 3374,
+ 3386, 3398, 3410, 3422, 3434, 3446, 3458, 3470,
+ 3482, 3494, 3506, 3518, 3530, 3542, 3554, 3566,
+ 3578, 3590, 3602, 3614, 3626, 3638, 3650, 3662,
+ 3674, 3686, 3698, 3710, 3722, 3734, 3746, 3758,
+ 3770, 3782, 3794, 3806, 3818, 3830, 3842, 3854,
+ 3866, 3878, 3890, 3902, 3914, 3926, 3938, 3950,
+ 3962, 3974, 3986, 3998, 4010, 4022, 4034, 4046,
+ 4058, 4070, 4082, 4094, 4106, 4118, 4130, 4142,
+ 4154, 4166, 4178, 4190, 4202, 4214, 4226, 4238,
+ 4250, 4262, 4274, 4286, 4298, 4310, 4322, 4334,
+ 4346, 4358, 4370, 4382, 4394, 4406, 4418, 4430,
+ 4442, 4454, 4466, 4478, 4490, 4502, 4514, 4526,
+ 4538, 4550, 4562, 4574, 4586, 4598, 4610, 4622,
+ 4634, 4646, 4658, 4670, 4682, 4694, 4706, 4718,
+ 4730, 4742, 4754, 4766, 4778, 4790, 4802, 4814,
+ 4826, 4838, 4850, 4862, 4874, 4886, 4898, 4910,
+ 4922, 4934, 4946, 4958, 4970, 4982, 5006, 5018,
+ 5030, 5042, 5054, 5066, 5078, 5090, 5102, 5114,
+ 5126, 5138, 5150, 5162, 5174, 5186, 5198, 5210,
+ 5222, 5234, 5246, 5258, 5270, 5282, 5294, 5306,
+ 5318, 5330, 5342, 5354, 5366, 5378, 5390, 5402,
+ 5414, 5426, 5438, 5450, 5462, 5474, 5486, 5498,
+ 5510, 5522, 5534, 5546, 5558, 5570, 5582, 5594,
+ 5606, 5618, 5630, 5642, 5654, 5666, 5678, 5690,
+ 5702, 5714, 5726, 5738, 5750, 5762, 5774, 5786,
+ 5798, 5810, 5822, 5834, 5846, 5858, 5870, 5882,
+ 5894, 5906, 5918, 5930, 5942, 5954, 5966, 5978,
+ 5990, 6002, 6014, 6026, 6038, 6050, 6062, 6074,
+ 6086, 6098, 6110, 6122, 6134, 6146, 6158, 6170,
+ 6182, 6194, 6206, 6218, 6230, 6242, 6254, 6266,
+ 6278, 6290, 6302, 6314, 6326, 6338, 6350, 6362,
+ 6374, 6386, 6398, 6410, 6422, 6434, 6446, 6458,
+ 6470, 6482, 6494, 6506, 6518, 6530, 6542, 6554,
+ 6566, 6578, 6590, 6602, 6614, 6626, 6638, 6650,
+ 6662, 6674, 6686, 6698, 6710, 6722, 6734, 6746,
+ 6758, 6770, 6782, 6794, 6806, 6818, 6830, 6842,
+ 6854, 6866, 6878, 6890, 6902, 6914, 6926, 6938,
+ 6950, 6962, 6974, 6986, 6998, 7010, 7022, 7034,
+ 7046, 7058, 7070, 7082, 7094, 7106, 7118, 7130,
+ 7142, 7154, 7166, 7178, 7190, 7202, 7214, 7226,
+ 7238, 7250, 7262, 7274, 7286, 7298, 7310, 7322,
+ 7334, 7346, 7358, 7370, 7382, 7394, 7406, 7418,
+ 7430, 7442, 7454, 7466, 7478, 7502, 7514, 7526,
+ 7538, 7550, 7562, 7574, 7586, 7598, 7610, 7622,
+ 7634, 7646, 7658, 7670, 7682, 7694, 7706, 7718,
+ 7730, 7742, 7754, 7766, 7778, 7790, 7802, 7814,
+ 7826, 7838, 7850, 7862, 7874, 7886, 7898, 7910,
+ 7922, 7934, 7946, 7958, 7970, 7982, 7994, 8006,
+ 8018, 8030, 8042, 8054, 8066, 8078, 8090, 8102,
+ 8114, 8126, 8138, 8150, 8162, 8174, 8186, 8198,
+ 8210, 8222, 8234, 8246, 8258, 8270, 8282, 8294,
+ 8306, 8318, 8330, 8342, 8354, 8366, 8378, 8390,
+ 8402, 8414, 8426, 8438, 8450, 8462, 8474, 8486,
+ 8498, 8510, 8522, 8534, 8546, 8558, 8570, 8582,
+ 8594, 8606, 8618, 8630, 8642, 8654, 8666, 8678,
+ 8690, 8702, 8714, 8726, 8738, 8750, 8762, 8774,
+ 8786, 8798, 8810, 8822, 8834, 8846, 8858, 8870,
+ 8882, 8894, 8906, 8918, 8930, 8942, 8954, 8966,
+ 8978, 8990, 9002, 9014, 9026, 9038, 9050, 9062,
+ 9074, 9086, 9098, 9110, 9122, 9134, 9146, 9158,
+ 9170, 9182, 9194, 9206, 9218, 9230, 9242, 9254,
+ 9266, 9278, 9290, 9302, 9314, 9326, 9338, 9350,
+ 9362, 9374, 9386, 9398, 9410, 9422, 9434, 9446,
+ 9458, 9470, 9482, 9494, 9506, 9518, 9530, 9542,
+ 9554, 9566, 9578, 9590, 9602, 9614, 9626, 9638,
+ 9650, 9662, 9674, 9686, 9698, 9710, 9722, 9734,
+ 9746, 9758, 9770, 9782, 9794, 9806, 9818, 9830,
+ 9842, 9854, 9866, 9878, 9890, 9902, 9914, 9926,
+ 9938, 9950, 9962, 9974, },
+ /* 11 */
+ {15, 27, 39, 51, 63, 75, 87, 99,
+ 111, 123, 135, 147, 159, 171, 183, 195,
+ 207, 219, 231, 243, 255, 267, 279, 291,
+ 303, 315, 327, 339, 351, 363, 375, 387,
+ 399, 411, 423, 435, 447, 459, 471, 483,
+ 495, 507, 519, 531, 543, 555, 567, 579,
+ 591, 603, 615, 627, 639, 651, 663, 675,
+ 687, 699, 711, 723, 735, 747, 759, 771,
+ 783, 795, 807, 819, 831, 843, 855, 867,
+ 879, 891, 903, 915, 927, 939, 951, 963,
+ 975, 987, 999, 1011, 1023, 1035, 1047, 1059,
+ 1071, 1083, 1095, 1107, 1119, 1131, 1143, 1155,
+ 1167, 1179, 1191, 1203, 1215, 1227, 1239, 1251,
+ 1263, 1275, 1287, 1299, 1311, 1323, 1335, 1347,
+ 1359, 1371, 1383, 1395, 1407, 1419, 1431, 1443,
+ 1455, 1467, 1479, 1491, 1503, 1515, 1527, 1539,
+ 1551, 1563, 1575, 1587, 1599, 1611, 1623, 1635,
+ 1647, 1659, 1671, 1683, 1695, 1707, 1719, 1731,
+ 1743, 1755, 1767, 1779, 1791, 1803, 1815, 1827,
+ 1839, 1851, 1863, 1875, 1887, 1899, 1911, 1923,
+ 1935, 1947, 1959, 1971, 1983, 1995, 2007, 2019,
+ 2031, 2043, 2055, 2067, 2079, 2091, 2103, 2115,
+ 2127, 2139, 2151, 2163, 2175, 2187, 2199, 2211,
+ 2223, 2235, 2247, 2259, 2271, 2283, 2295, 2307,
+ 2319, 2331, 2343, 2355, 2367, 2379, 2391, 2403,
+ 2415, 2427, 2439, 2451, 2463, 2475, 2487, 2511,
+ 2523, 2535, 2547, 2559, 2571, 2583, 2595, 2607,
+ 2619, 2631, 2643, 2655, 2667, 2679, 2691, 2703,
+ 2715, 2727, 2739, 2751, 2763, 2775, 2787, 2799,
+ 2811, 2823, 2835, 2847, 2859, 2871, 2883, 2895,
+ 2907, 2919, 2931, 2943, 2955, 2967, 2979, 2991,
+ 3003, 3015, 3027, 3039, 3051, 3063, 3075, 3087,
+ 3099, 3111, 3123, 3135, 3147, 3159, 3171, 3183,
+ 3195, 3207, 3219, 3231, 3243, 3255, 3267, 3279,
+ 3291, 3303, 3315, 3327, 3339, 3351, 3363, 3375,
+ 3387, 3399, 3411, 3423, 3435, 3447, 3459, 3471,
+ 3483, 3495, 3507, 3519, 3531, 3543, 3555, 3567,
+ 3579, 3591, 3603, 3615, 3627, 3639, 3651, 3663,
+ 3675, 3687, 3699, 3711, 3723, 3735, 3747, 3759,
+ 3771, 3783, 3795, 3807, 3819, 3831, 3843, 3855,
+ 3867, 3879, 3891, 3903, 3915, 3927, 3939, 3951,
+ 3963, 3975, 3987, 3999, 4011, 4023, 4035, 4047,
+ 4059, 4071, 4083, 4095, 4107, 4119, 4131, 4143,
+ 4155, 4167, 4179, 4191, 4203, 4215, 4227, 4239,
+ 4251, 4263, 4275, 4287, 4299, 4311, 4323, 4335,
+ 4347, 4359, 4371, 4383, 4395, 4407, 4419, 4431,
+ 4443, 4455, 4467, 4479, 4491, 4503, 4515, 4527,
+ 4539, 4551, 4563, 4575, 4587, 4599, 4611, 4623,
+ 4635, 4647, 4659, 4671, 4683, 4695, 4707, 4719,
+ 4731, 4743, 4755, 4767, 4779, 4791, 4803, 4815,
+ 4827, 4839, 4851, 4863, 4875, 4887, 4899, 4911,
+ 4923, 4935, 4947, 4959, 4971, 4983, 5007, 5019,
+ 5031, 5043, 5055, 5067, 5079, 5091, 5103, 5115,
+ 5127, 5139, 5151, 5163, 5175, 5187, 5199, 5211,
+ 5223, 5235, 5247, 5259, 5271, 5283, 5295, 5307,
+ 5319, 5331, 5343, 5355, 5367, 5379, 5391, 5403,
+ 5415, 5427, 5439, 5451, 5463, 5475, 5487, 5499,
+ 5511, 5523, 5535, 5547, 5559, 5571, 5583, 5595,
+ 5607, 5619, 5631, 5643, 5655, 5667, 5679, 5691,
+ 5703, 5715, 5727, 5739, 5751, 5763, 5775, 5787,
+ 5799, 5811, 5823, 5835, 5847, 5859, 5871, 5883,
+ 5895, 5907, 5919, 5931, 5943, 5955, 5967, 5979,
+ 5991, 6003, 6015, 6027, 6039, 6051, 6063, 6075,
+ 6087, 6099, 6111, 6123, 6135, 6147, 6159, 6171,
+ 6183, 6195, 6207, 6219, 6231, 6243, 6255, 6267,
+ 6279, 6291, 6303, 6315, 6327, 6339, 6351, 6363,
+ 6375, 6387, 6399, 6411, 6423, 6435, 6447, 6459,
+ 6471, 6483, 6495, 6507, 6519, 6531, 6543, 6555,
+ 6567, 6579, 6591, 6603, 6615, 6627, 6639, 6651,
+ 6663, 6675, 6687, 6699, 6711, 6723, 6735, 6747,
+ 6759, 6771, 6783, 6795, 6807, 6819, 6831, 6843,
+ 6855, 6867, 6879, 6891, 6903, 6915, 6927, 6939,
+ 6951, 6963, 6975, 6987, 6999, 7011, 7023, 7035,
+ 7047, 7059, 7071, 7083, 7095, 7107, 7119, 7131,
+ 7143, 7155, 7167, 7179, 7191, 7203, 7215, 7227,
+ 7239, 7251, 7263, 7275, 7287, 7299, 7311, 7323,
+ 7335, 7347, 7359, 7371, 7383, 7395, 7407, 7419,
+ 7431, 7443, 7455, 7467, 7479, 7503, 7515, 7527,
+ 7539, 7551, 7563, 7575, 7587, 7599, 7611, 7623,
+ 7635, 7647, 7659, 7671, 7683, 7695, 7707, 7719,
+ 7731, 7743, 7755, 7767, 7779, 7791, 7803, 7815,
+ 7827, 7839, 7851, 7863, 7875, 7887, 7899, 7911,
+ 7923, 7935, 7947, 7959, 7971, 7983, 7995, 8007,
+ 8019, 8031, 8043, 8055, 8067, 8079, 8091, 8103,
+ 8115, 8127, 8139, 8151, 8163, 8175, 8187, 8199,
+ 8211, 8223, 8235, 8247, 8259, 8271, 8283, 8295,
+ 8307, 8319, 8331, 8343, 8355, 8367, 8379, 8391,
+ 8403, 8415, 8427, 8439, 8451, 8463, 8475, 8487,
+ 8499, 8511, 8523, 8535, 8547, 8559, 8571, 8583,
+ 8595, 8607, 8619, 8631, 8643, 8655, 8667, 8679,
+ 8691, 8703, 8715, 8727, 8739, 8751, 8763, 8775,
+ 8787, 8799, 8811, 8823, 8835, 8847, 8859, 8871,
+ 8883, 8895, 8907, 8919, 8931, 8943, 8955, 8967,
+ 8979, 8991, 9003, 9015, 9027, 9039, 9051, 9063,
+ 9075, 9087, 9099, 9111, 9123, 9135, 9147, 9159,
+ 9171, 9183, 9195, 9207, 9219, 9231, 9243, 9255,
+ 9267, 9279, 9291, 9303, 9315, 9327, 9339, 9351,
+ 9363, 9375, 9387, 9399, 9411, 9423, 9435, 9447,
+ 9459, 9471, 9483, 9495, 9507, 9519, 9531, 9543,
+ 9555, 9567, 9579, 9591, 9603, 9615, 9627, 9639,
+ 9651, 9663, 9675, 9687, 9699, 9711, 9723, 9735,
+ 9747, 9759, 9771, 9783, 9795, 9807, 9819, 9831,
+ 9843, 9855, 9867, 9879, 9891, 9903, 9915, 9927,
+ 9939, 9951, 9963, 9975, },
+};
+
+const unsigned int enco_which_dibits[12][828] = {
+ /* 0 */
+ {6, 4, 2, 0, 102, 100, 98, 96,
+ 198, 196, 194, 192, 294, 292, 290, 288,
+ 390, 388, 386, 384, 486, 484, 482, 480,
+ 582, 580, 578, 576, 678, 676, 674, 672,
+ 774, 772, 770, 768, 870, 868, 866, 864,
+ 966, 964, 962, 960, 1062, 1060, 1058, 1056,
+ 1158, 1156, 1154, 1152, 1254, 1252, 1250, 1248,
+ 1350, 1348, 1346, 1344, 1446, 1444, 1442, 1440,
+ 1542, 1540, 1538, 1536, 1638, 1636, 1634, 1632,
+ 1798, 1796, 1794, 1792, 1894, 1892, 1890, 1888,
+ 1990, 1988, 1986, 1984, 2086, 2084, 2082, 2080,
+ 2182, 2180, 2178, 2176, 2278, 2276, 2274, 2272,
+ 2374, 2372, 2370, 2368, 2470, 2468, 2466, 2464,
+ 2566, 2564, 2562, 2560, 2662, 2660, 2658, 2656,
+ 2758, 2756, 2754, 2752, 2854, 2852, 2850, 2848,
+ 2950, 2948, 2946, 2944, 3046, 3044, 3042, 3040,
+ 3142, 3140, 3138, 3136, 3238, 3236, 3234, 3232,
+ 3334, 3332, 3330, 3328, 3398, 3396, 3394, 3392,
+ 3494, 3492, 3490, 3488, 3590, 3588, 3586, 3584,
+ 3686, 3684, 3682, 3680, 3782, 3780, 3778, 3776,
+ 3878, 3876, 3874, 3872, 3974, 3972, 3970, 3968,
+ 4070, 4068, 4066, 4064, 4166, 4164, 4162, 4160,
+ 4262, 4260, 4258, 4256, 4358, 4356, 4354, 4352,
+ 4454, 4452, 4450, 4448, 4550, 4548, 4546, 4544,
+ 4646, 4644, 4642, 4640, 4742, 4740, 4738, 4736,
+ 4838, 4836, 4834, 4832, 4934, 4932, 4930, 4928,
+ 4998, 4996, 4994, 4992, 5094, 5092, 5090, 5088,
+ 5190, 5188, 5186, 5184, 5286, 5284, 5282, 5280,
+ 5382, 5380, 5378, 5376, 5478, 5476, 5474, 5472,
+ 5574, 5572, 5570, 5568, 5670, 5668, 5666, 5664,
+ 5766, 5764, 5762, 5760, 5862, 5860, 5858, 5856,
+ 5958, 5956, 5954, 5952, 6054, 6052, 6050, 6048,
+ 6150, 6148, 6146, 6144, 6246, 6244, 6242, 6240,
+ 6342, 6340, 6338, 6336, 6438, 6436, 6434, 6432,
+ 6534, 6532, 6530, 6528, 6694, 6692, 6690, 6688,
+ 6790, 6788, 6786, 6784, 6886, 6884, 6882, 6880,
+ 6982, 6980, 6978, 6976, 7078, 7076, 7074, 7072,
+ 7174, 7172, 7170, 7168, 7270, 7268, 7266, 7264,
+ 7366, 7364, 7362, 7360, 7462, 7460, 7458, 7456,
+ 7558, 7556, 7554, 7552, 7654, 7652, 7650, 7648,
+ 7750, 7748, 7746, 7744, 7846, 7844, 7842, 7840,
+ 7942, 7940, 7938, 7936, 8038, 8036, 8034, 8032,
+ 8134, 8132, 8130, 8128, 8230, 8228, 8226, 8224,
+ 8326, 8324, 8322, 8320, 8390, 8388, 8386, 8384,
+ 8486, 8484, 8482, 8480, 8582, 8580, 8578, 8576,
+ 8678, 8676, 8674, 8672, 8774, 8772, 8770, 8768,
+ 8870, 8868, 8866, 8864, 8966, 8964, 8962, 8960,
+ 9062, 9060, 9058, 9056, 9158, 9156, 9154, 9152,
+ 9254, 9252, 9250, 9248, 9350, 9348, 9346, 9344,
+ 9446, 9444, 9442, 9440, 9542, 9540, 9538, 9536,
+ 9638, 9636, 9634, 9632, 9734, 9732, 9730, 9728,
+ 9830, 9828, 9826, 9824, 9926, 9924, 9922, 9920,
+ 9990, 9988, 9986, 9984, 10086, 10084, 10082, 10080,
+ 10182, 10180, 10178, 10176, 10278, 10276, 10274, 10272,
+ 10374, 10372, 10370, 10368, 10470, 10468, 10466, 10464,
+ 10566, 10564, 10562, 10560, 10662, 10660, 10658, 10656,
+ 10758, 10756, 10754, 10752, 10854, 10852, 10850, 10848,
+ 10950, 10948, 10946, 10944, 11046, 11044, 11042, 11040,
+ 11142, 11140, 11138, 11136, 11238, 11236, 11234, 11232,
+ 11334, 11332, 11330, 11328, 11430, 11428, 11426, 11424,
+ 11526, 11524, 11522, 11520, 11686, 11684, 11682, 11680,
+ 11782, 11780, 11778, 11776, 11878, 11876, 11874, 11872,
+ 11974, 11972, 11970, 11968, 12070, 12068, 12066, 12064,
+ 12166, 12164, 12162, 12160, 12262, 12260, 12258, 12256,
+ 12358, 12356, 12354, 12352, 12454, 12452, 12450, 12448,
+ 12550, 12548, 12546, 12544, 12646, 12644, 12642, 12640,
+ 12742, 12740, 12738, 12736, 12838, 12836, 12834, 12832,
+ 12934, 12932, 12930, 12928, 13030, 13028, 13026, 13024,
+ 13126, 13124, 13122, 13120, 13222, 13220, 13218, 13216,
+ 13286, 13284, 13282, 13280, 13382, 13380, 13378, 13376,
+ 13478, 13476, 13474, 13472, 13574, 13572, 13570, 13568,
+ 13670, 13668, 13666, 13664, 13766, 13764, 13762, 13760,
+ 13862, 13860, 13858, 13856, 13958, 13956, 13954, 13952,
+ 14054, 14052, 14050, 14048, 14150, 14148, 14146, 14144,
+ 14246, 14244, 14242, 14240, 14342, 14340, 14338, 14336,
+ 14438, 14436, 14434, 14432, 14534, 14532, 14530, 14528,
+ 14630, 14628, 14626, 14624, 14726, 14724, 14722, 14720,
+ 14822, 14820, 14818, 14816, 14918, 14916, 14914, 14912,
+ 14982, 14980, 14978, 14976, 15078, 15076, 15074, 15072,
+ 15174, 15172, 15170, 15168, 15270, 15268, 15266, 15264,
+ 15366, 15364, 15362, 15360, 15462, 15460, 15458, 15456,
+ 15558, 15556, 15554, 15552, 15654, 15652, 15650, 15648,
+ 15750, 15748, 15746, 15744, 15846, 15844, 15842, 15840,
+ 15942, 15940, 15938, 15936, 16038, 16036, 16034, 16032,
+ 16134, 16132, 16130, 16128, 16230, 16228, 16226, 16224,
+ 16326, 16324, 16322, 16320, 16422, 16420, 16418, 16416,
+ 16518, 16516, 16514, 16512, 16678, 16676, 16674, 16672,
+ 16774, 16772, 16770, 16768, 16870, 16868, 16866, 16864,
+ 16966, 16964, 16962, 16960, 17062, 17060, 17058, 17056,
+ 17158, 17156, 17154, 17152, 17254, 17252, 17250, 17248,
+ 17350, 17348, 17346, 17344, 17446, 17444, 17442, 17440,
+ 17542, 17540, 17538, 17536, 17638, 17636, 17634, 17632,
+ 17734, 17732, 17730, 17728, 17830, 17828, 17826, 17824,
+ 17926, 17924, 17922, 17920, 18022, 18020, 18018, 18016,
+ 18118, 18116, 18114, 18112, 18214, 18212, 18210, 18208,
+ 18278, 18276, 18274, 18272, 18374, 18372, 18370, 18368,
+ 18470, 18468, 18466, 18464, 18566, 18564, 18562, 18560,
+ 18662, 18660, 18658, 18656, 18758, 18756, 18754, 18752,
+ 18854, 18852, 18850, 18848, 18950, 18948, 18946, 18944,
+ 19046, 19044, 19042, 19040, 19142, 19140, 19138, 19136,
+ 19238, 19236, 19234, 19232, 19334, 19332, 19330, 19328,
+ 19430, 19428, 19426, 19424, 19526, 19524, 19522, 19520,
+ 19622, 19620, 19618, 19616, 19718, 19716, 19714, 19712,
+ 19814, 19812, 19810, 19808, },
+ /* 1 */
+ {14, 12, 10, 8, 110, 108, 106, 104,
+ 206, 204, 202, 200, 302, 300, 298, 296,
+ 398, 396, 394, 392, 494, 492, 490, 488,
+ 590, 588, 586, 584, 686, 684, 682, 680,
+ 782, 780, 778, 776, 878, 876, 874, 872,
+ 974, 972, 970, 968, 1070, 1068, 1066, 1064,
+ 1166, 1164, 1162, 1160, 1262, 1260, 1258, 1256,
+ 1358, 1356, 1354, 1352, 1454, 1452, 1450, 1448,
+ 1550, 1548, 1546, 1544, 1646, 1644, 1642, 1640,
+ 1806, 1804, 1802, 1800, 1902, 1900, 1898, 1896,
+ 1998, 1996, 1994, 1992, 2094, 2092, 2090, 2088,
+ 2190, 2188, 2186, 2184, 2286, 2284, 2282, 2280,
+ 2382, 2380, 2378, 2376, 2478, 2476, 2474, 2472,
+ 2574, 2572, 2570, 2568, 2670, 2668, 2666, 2664,
+ 2766, 2764, 2762, 2760, 2862, 2860, 2858, 2856,
+ 2958, 2956, 2954, 2952, 3054, 3052, 3050, 3048,
+ 3150, 3148, 3146, 3144, 3246, 3244, 3242, 3240,
+ 3342, 3340, 3338, 3336, 3406, 3404, 3402, 3400,
+ 3502, 3500, 3498, 3496, 3598, 3596, 3594, 3592,
+ 3694, 3692, 3690, 3688, 3790, 3788, 3786, 3784,
+ 3886, 3884, 3882, 3880, 3982, 3980, 3978, 3976,
+ 4078, 4076, 4074, 4072, 4174, 4172, 4170, 4168,
+ 4270, 4268, 4266, 4264, 4366, 4364, 4362, 4360,
+ 4462, 4460, 4458, 4456, 4558, 4556, 4554, 4552,
+ 4654, 4652, 4650, 4648, 4750, 4748, 4746, 4744,
+ 4846, 4844, 4842, 4840, 4942, 4940, 4938, 4936,
+ 5006, 5004, 5002, 5000, 5102, 5100, 5098, 5096,
+ 5198, 5196, 5194, 5192, 5294, 5292, 5290, 5288,
+ 5390, 5388, 5386, 5384, 5486, 5484, 5482, 5480,
+ 5582, 5580, 5578, 5576, 5678, 5676, 5674, 5672,
+ 5774, 5772, 5770, 5768, 5870, 5868, 5866, 5864,
+ 5966, 5964, 5962, 5960, 6062, 6060, 6058, 6056,
+ 6158, 6156, 6154, 6152, 6254, 6252, 6250, 6248,
+ 6350, 6348, 6346, 6344, 6446, 6444, 6442, 6440,
+ 6542, 6540, 6538, 6536, 6702, 6700, 6698, 6696,
+ 6798, 6796, 6794, 6792, 6894, 6892, 6890, 6888,
+ 6990, 6988, 6986, 6984, 7086, 7084, 7082, 7080,
+ 7182, 7180, 7178, 7176, 7278, 7276, 7274, 7272,
+ 7374, 7372, 7370, 7368, 7470, 7468, 7466, 7464,
+ 7566, 7564, 7562, 7560, 7662, 7660, 7658, 7656,
+ 7758, 7756, 7754, 7752, 7854, 7852, 7850, 7848,
+ 7950, 7948, 7946, 7944, 8046, 8044, 8042, 8040,
+ 8142, 8140, 8138, 8136, 8238, 8236, 8234, 8232,
+ 8334, 8332, 8330, 8328, 8398, 8396, 8394, 8392,
+ 8494, 8492, 8490, 8488, 8590, 8588, 8586, 8584,
+ 8686, 8684, 8682, 8680, 8782, 8780, 8778, 8776,
+ 8878, 8876, 8874, 8872, 8974, 8972, 8970, 8968,
+ 9070, 9068, 9066, 9064, 9166, 9164, 9162, 9160,
+ 9262, 9260, 9258, 9256, 9358, 9356, 9354, 9352,
+ 9454, 9452, 9450, 9448, 9550, 9548, 9546, 9544,
+ 9646, 9644, 9642, 9640, 9742, 9740, 9738, 9736,
+ 9838, 9836, 9834, 9832, 9934, 9932, 9930, 9928,
+ 9998, 9996, 9994, 9992, 10094, 10092, 10090, 10088,
+ 10190, 10188, 10186, 10184, 10286, 10284, 10282, 10280,
+ 10382, 10380, 10378, 10376, 10478, 10476, 10474, 10472,
+ 10574, 10572, 10570, 10568, 10670, 10668, 10666, 10664,
+ 10766, 10764, 10762, 10760, 10862, 10860, 10858, 10856,
+ 10958, 10956, 10954, 10952, 11054, 11052, 11050, 11048,
+ 11150, 11148, 11146, 11144, 11246, 11244, 11242, 11240,
+ 11342, 11340, 11338, 11336, 11438, 11436, 11434, 11432,
+ 11534, 11532, 11530, 11528, 11694, 11692, 11690, 11688,
+ 11790, 11788, 11786, 11784, 11886, 11884, 11882, 11880,
+ 11982, 11980, 11978, 11976, 12078, 12076, 12074, 12072,
+ 12174, 12172, 12170, 12168, 12270, 12268, 12266, 12264,
+ 12366, 12364, 12362, 12360, 12462, 12460, 12458, 12456,
+ 12558, 12556, 12554, 12552, 12654, 12652, 12650, 12648,
+ 12750, 12748, 12746, 12744, 12846, 12844, 12842, 12840,
+ 12942, 12940, 12938, 12936, 13038, 13036, 13034, 13032,
+ 13134, 13132, 13130, 13128, 13230, 13228, 13226, 13224,
+ 13294, 13292, 13290, 13288, 13390, 13388, 13386, 13384,
+ 13486, 13484, 13482, 13480, 13582, 13580, 13578, 13576,
+ 13678, 13676, 13674, 13672, 13774, 13772, 13770, 13768,
+ 13870, 13868, 13866, 13864, 13966, 13964, 13962, 13960,
+ 14062, 14060, 14058, 14056, 14158, 14156, 14154, 14152,
+ 14254, 14252, 14250, 14248, 14350, 14348, 14346, 14344,
+ 14446, 14444, 14442, 14440, 14542, 14540, 14538, 14536,
+ 14638, 14636, 14634, 14632, 14734, 14732, 14730, 14728,
+ 14830, 14828, 14826, 14824, 14926, 14924, 14922, 14920,
+ 14990, 14988, 14986, 14984, 15086, 15084, 15082, 15080,
+ 15182, 15180, 15178, 15176, 15278, 15276, 15274, 15272,
+ 15374, 15372, 15370, 15368, 15470, 15468, 15466, 15464,
+ 15566, 15564, 15562, 15560, 15662, 15660, 15658, 15656,
+ 15758, 15756, 15754, 15752, 15854, 15852, 15850, 15848,
+ 15950, 15948, 15946, 15944, 16046, 16044, 16042, 16040,
+ 16142, 16140, 16138, 16136, 16238, 16236, 16234, 16232,
+ 16334, 16332, 16330, 16328, 16430, 16428, 16426, 16424,
+ 16526, 16524, 16522, 16520, 16686, 16684, 16682, 16680,
+ 16782, 16780, 16778, 16776, 16878, 16876, 16874, 16872,
+ 16974, 16972, 16970, 16968, 17070, 17068, 17066, 17064,
+ 17166, 17164, 17162, 17160, 17262, 17260, 17258, 17256,
+ 17358, 17356, 17354, 17352, 17454, 17452, 17450, 17448,
+ 17550, 17548, 17546, 17544, 17646, 17644, 17642, 17640,
+ 17742, 17740, 17738, 17736, 17838, 17836, 17834, 17832,
+ 17934, 17932, 17930, 17928, 18030, 18028, 18026, 18024,
+ 18126, 18124, 18122, 18120, 18222, 18220, 18218, 18216,
+ 18286, 18284, 18282, 18280, 18382, 18380, 18378, 18376,
+ 18478, 18476, 18474, 18472, 18574, 18572, 18570, 18568,
+ 18670, 18668, 18666, 18664, 18766, 18764, 18762, 18760,
+ 18862, 18860, 18858, 18856, 18958, 18956, 18954, 18952,
+ 19054, 19052, 19050, 19048, 19150, 19148, 19146, 19144,
+ 19246, 19244, 19242, 19240, 19342, 19340, 19338, 19336,
+ 19438, 19436, 19434, 19432, 19534, 19532, 19530, 19528,
+ 19630, 19628, 19626, 19624, 19726, 19724, 19722, 19720,
+ 19822, 19820, 19818, 19816, },
+ /* 2 */
+ {22, 20, 18, 16, 118, 116, 114, 112,
+ 214, 212, 210, 208, 310, 308, 306, 304,
+ 406, 404, 402, 400, 502, 500, 498, 496,
+ 598, 596, 594, 592, 694, 692, 690, 688,
+ 790, 788, 786, 784, 886, 884, 882, 880,
+ 982, 980, 978, 976, 1078, 1076, 1074, 1072,
+ 1174, 1172, 1170, 1168, 1270, 1268, 1266, 1264,
+ 1366, 1364, 1362, 1360, 1462, 1460, 1458, 1456,
+ 1558, 1556, 1554, 1552, 1654, 1652, 1650, 1648,
+ 1814, 1812, 1810, 1808, 1910, 1908, 1906, 1904,
+ 2006, 2004, 2002, 2000, 2102, 2100, 2098, 2096,
+ 2198, 2196, 2194, 2192, 2294, 2292, 2290, 2288,
+ 2390, 2388, 2386, 2384, 2486, 2484, 2482, 2480,
+ 2582, 2580, 2578, 2576, 2678, 2676, 2674, 2672,
+ 2774, 2772, 2770, 2768, 2870, 2868, 2866, 2864,
+ 2966, 2964, 2962, 2960, 3062, 3060, 3058, 3056,
+ 3158, 3156, 3154, 3152, 3254, 3252, 3250, 3248,
+ 3350, 3348, 3346, 3344, 3414, 3412, 3410, 3408,
+ 3510, 3508, 3506, 3504, 3606, 3604, 3602, 3600,
+ 3702, 3700, 3698, 3696, 3798, 3796, 3794, 3792,
+ 3894, 3892, 3890, 3888, 3990, 3988, 3986, 3984,
+ 4086, 4084, 4082, 4080, 4182, 4180, 4178, 4176,
+ 4278, 4276, 4274, 4272, 4374, 4372, 4370, 4368,
+ 4470, 4468, 4466, 4464, 4566, 4564, 4562, 4560,
+ 4662, 4660, 4658, 4656, 4758, 4756, 4754, 4752,
+ 4854, 4852, 4850, 4848, 4950, 4948, 4946, 4944,
+ 5014, 5012, 5010, 5008, 5110, 5108, 5106, 5104,
+ 5206, 5204, 5202, 5200, 5302, 5300, 5298, 5296,
+ 5398, 5396, 5394, 5392, 5494, 5492, 5490, 5488,
+ 5590, 5588, 5586, 5584, 5686, 5684, 5682, 5680,
+ 5782, 5780, 5778, 5776, 5878, 5876, 5874, 5872,
+ 5974, 5972, 5970, 5968, 6070, 6068, 6066, 6064,
+ 6166, 6164, 6162, 6160, 6262, 6260, 6258, 6256,
+ 6358, 6356, 6354, 6352, 6454, 6452, 6450, 6448,
+ 6550, 6548, 6546, 6544, 6710, 6708, 6706, 6704,
+ 6806, 6804, 6802, 6800, 6902, 6900, 6898, 6896,
+ 6998, 6996, 6994, 6992, 7094, 7092, 7090, 7088,
+ 7190, 7188, 7186, 7184, 7286, 7284, 7282, 7280,
+ 7382, 7380, 7378, 7376, 7478, 7476, 7474, 7472,
+ 7574, 7572, 7570, 7568, 7670, 7668, 7666, 7664,
+ 7766, 7764, 7762, 7760, 7862, 7860, 7858, 7856,
+ 7958, 7956, 7954, 7952, 8054, 8052, 8050, 8048,
+ 8150, 8148, 8146, 8144, 8246, 8244, 8242, 8240,
+ 8342, 8340, 8338, 8336, 8406, 8404, 8402, 8400,
+ 8502, 8500, 8498, 8496, 8598, 8596, 8594, 8592,
+ 8694, 8692, 8690, 8688, 8790, 8788, 8786, 8784,
+ 8886, 8884, 8882, 8880, 8982, 8980, 8978, 8976,
+ 9078, 9076, 9074, 9072, 9174, 9172, 9170, 9168,
+ 9270, 9268, 9266, 9264, 9366, 9364, 9362, 9360,
+ 9462, 9460, 9458, 9456, 9558, 9556, 9554, 9552,
+ 9654, 9652, 9650, 9648, 9750, 9748, 9746, 9744,
+ 9846, 9844, 9842, 9840, 9942, 9940, 9938, 9936,
+ 10006, 10004, 10002, 10000, 10102, 10100, 10098, 10096,
+ 10198, 10196, 10194, 10192, 10294, 10292, 10290, 10288,
+ 10390, 10388, 10386, 10384, 10486, 10484, 10482, 10480,
+ 10582, 10580, 10578, 10576, 10678, 10676, 10674, 10672,
+ 10774, 10772, 10770, 10768, 10870, 10868, 10866, 10864,
+ 10966, 10964, 10962, 10960, 11062, 11060, 11058, 11056,
+ 11158, 11156, 11154, 11152, 11254, 11252, 11250, 11248,
+ 11350, 11348, 11346, 11344, 11446, 11444, 11442, 11440,
+ 11542, 11540, 11538, 11536, 11702, 11700, 11698, 11696,
+ 11798, 11796, 11794, 11792, 11894, 11892, 11890, 11888,
+ 11990, 11988, 11986, 11984, 12086, 12084, 12082, 12080,
+ 12182, 12180, 12178, 12176, 12278, 12276, 12274, 12272,
+ 12374, 12372, 12370, 12368, 12470, 12468, 12466, 12464,
+ 12566, 12564, 12562, 12560, 12662, 12660, 12658, 12656,
+ 12758, 12756, 12754, 12752, 12854, 12852, 12850, 12848,
+ 12950, 12948, 12946, 12944, 13046, 13044, 13042, 13040,
+ 13142, 13140, 13138, 13136, 13238, 13236, 13234, 13232,
+ 13302, 13300, 13298, 13296, 13398, 13396, 13394, 13392,
+ 13494, 13492, 13490, 13488, 13590, 13588, 13586, 13584,
+ 13686, 13684, 13682, 13680, 13782, 13780, 13778, 13776,
+ 13878, 13876, 13874, 13872, 13974, 13972, 13970, 13968,
+ 14070, 14068, 14066, 14064, 14166, 14164, 14162, 14160,
+ 14262, 14260, 14258, 14256, 14358, 14356, 14354, 14352,
+ 14454, 14452, 14450, 14448, 14550, 14548, 14546, 14544,
+ 14646, 14644, 14642, 14640, 14742, 14740, 14738, 14736,
+ 14838, 14836, 14834, 14832, 14934, 14932, 14930, 14928,
+ 14998, 14996, 14994, 14992, 15094, 15092, 15090, 15088,
+ 15190, 15188, 15186, 15184, 15286, 15284, 15282, 15280,
+ 15382, 15380, 15378, 15376, 15478, 15476, 15474, 15472,
+ 15574, 15572, 15570, 15568, 15670, 15668, 15666, 15664,
+ 15766, 15764, 15762, 15760, 15862, 15860, 15858, 15856,
+ 15958, 15956, 15954, 15952, 16054, 16052, 16050, 16048,
+ 16150, 16148, 16146, 16144, 16246, 16244, 16242, 16240,
+ 16342, 16340, 16338, 16336, 16438, 16436, 16434, 16432,
+ 16534, 16532, 16530, 16528, 16694, 16692, 16690, 16688,
+ 16790, 16788, 16786, 16784, 16886, 16884, 16882, 16880,
+ 16982, 16980, 16978, 16976, 17078, 17076, 17074, 17072,
+ 17174, 17172, 17170, 17168, 17270, 17268, 17266, 17264,
+ 17366, 17364, 17362, 17360, 17462, 17460, 17458, 17456,
+ 17558, 17556, 17554, 17552, 17654, 17652, 17650, 17648,
+ 17750, 17748, 17746, 17744, 17846, 17844, 17842, 17840,
+ 17942, 17940, 17938, 17936, 18038, 18036, 18034, 18032,
+ 18134, 18132, 18130, 18128, 18230, 18228, 18226, 18224,
+ 18294, 18292, 18290, 18288, 18390, 18388, 18386, 18384,
+ 18486, 18484, 18482, 18480, 18582, 18580, 18578, 18576,
+ 18678, 18676, 18674, 18672, 18774, 18772, 18770, 18768,
+ 18870, 18868, 18866, 18864, 18966, 18964, 18962, 18960,
+ 19062, 19060, 19058, 19056, 19158, 19156, 19154, 19152,
+ 19254, 19252, 19250, 19248, 19350, 19348, 19346, 19344,
+ 19446, 19444, 19442, 19440, 19542, 19540, 19538, 19536,
+ 19638, 19636, 19634, 19632, 19734, 19732, 19730, 19728,
+ 19830, 19828, 19826, 19824, },
+ /* 3 */
+ {30, 28, 26, 24, 126, 124, 122, 120,
+ 222, 220, 218, 216, 318, 316, 314, 312,
+ 414, 412, 410, 408, 510, 508, 506, 504,
+ 606, 604, 602, 600, 702, 700, 698, 696,
+ 798, 796, 794, 792, 894, 892, 890, 888,
+ 990, 988, 986, 984, 1086, 1084, 1082, 1080,
+ 1182, 1180, 1178, 1176, 1278, 1276, 1274, 1272,
+ 1374, 1372, 1370, 1368, 1470, 1468, 1466, 1464,
+ 1566, 1564, 1562, 1560, 1662, 1660, 1658, 1656,
+ 1822, 1820, 1818, 1816, 1918, 1916, 1914, 1912,
+ 2014, 2012, 2010, 2008, 2110, 2108, 2106, 2104,
+ 2206, 2204, 2202, 2200, 2302, 2300, 2298, 2296,
+ 2398, 2396, 2394, 2392, 2494, 2492, 2490, 2488,
+ 2590, 2588, 2586, 2584, 2686, 2684, 2682, 2680,
+ 2782, 2780, 2778, 2776, 2878, 2876, 2874, 2872,
+ 2974, 2972, 2970, 2968, 3070, 3068, 3066, 3064,
+ 3166, 3164, 3162, 3160, 3262, 3260, 3258, 3256,
+ 3358, 3356, 3354, 3352, 3422, 3420, 3418, 3416,
+ 3518, 3516, 3514, 3512, 3614, 3612, 3610, 3608,
+ 3710, 3708, 3706, 3704, 3806, 3804, 3802, 3800,
+ 3902, 3900, 3898, 3896, 3998, 3996, 3994, 3992,
+ 4094, 4092, 4090, 4088, 4190, 4188, 4186, 4184,
+ 4286, 4284, 4282, 4280, 4382, 4380, 4378, 4376,
+ 4478, 4476, 4474, 4472, 4574, 4572, 4570, 4568,
+ 4670, 4668, 4666, 4664, 4766, 4764, 4762, 4760,
+ 4862, 4860, 4858, 4856, 4958, 4956, 4954, 4952,
+ 5022, 5020, 5018, 5016, 5118, 5116, 5114, 5112,
+ 5214, 5212, 5210, 5208, 5310, 5308, 5306, 5304,
+ 5406, 5404, 5402, 5400, 5502, 5500, 5498, 5496,
+ 5598, 5596, 5594, 5592, 5694, 5692, 5690, 5688,
+ 5790, 5788, 5786, 5784, 5886, 5884, 5882, 5880,
+ 5982, 5980, 5978, 5976, 6078, 6076, 6074, 6072,
+ 6174, 6172, 6170, 6168, 6270, 6268, 6266, 6264,
+ 6366, 6364, 6362, 6360, 6462, 6460, 6458, 6456,
+ 6558, 6556, 6554, 6552, 6718, 6716, 6714, 6712,
+ 6814, 6812, 6810, 6808, 6910, 6908, 6906, 6904,
+ 7006, 7004, 7002, 7000, 7102, 7100, 7098, 7096,
+ 7198, 7196, 7194, 7192, 7294, 7292, 7290, 7288,
+ 7390, 7388, 7386, 7384, 7486, 7484, 7482, 7480,
+ 7582, 7580, 7578, 7576, 7678, 7676, 7674, 7672,
+ 7774, 7772, 7770, 7768, 7870, 7868, 7866, 7864,
+ 7966, 7964, 7962, 7960, 8062, 8060, 8058, 8056,
+ 8158, 8156, 8154, 8152, 8254, 8252, 8250, 8248,
+ 8350, 8348, 8346, 8344, 8414, 8412, 8410, 8408,
+ 8510, 8508, 8506, 8504, 8606, 8604, 8602, 8600,
+ 8702, 8700, 8698, 8696, 8798, 8796, 8794, 8792,
+ 8894, 8892, 8890, 8888, 8990, 8988, 8986, 8984,
+ 9086, 9084, 9082, 9080, 9182, 9180, 9178, 9176,
+ 9278, 9276, 9274, 9272, 9374, 9372, 9370, 9368,
+ 9470, 9468, 9466, 9464, 9566, 9564, 9562, 9560,
+ 9662, 9660, 9658, 9656, 9758, 9756, 9754, 9752,
+ 9854, 9852, 9850, 9848, 9950, 9948, 9946, 9944,
+ 10014, 10012, 10010, 10008, 10110, 10108, 10106, 10104,
+ 10206, 10204, 10202, 10200, 10302, 10300, 10298, 10296,
+ 10398, 10396, 10394, 10392, 10494, 10492, 10490, 10488,
+ 10590, 10588, 10586, 10584, 10686, 10684, 10682, 10680,
+ 10782, 10780, 10778, 10776, 10878, 10876, 10874, 10872,
+ 10974, 10972, 10970, 10968, 11070, 11068, 11066, 11064,
+ 11166, 11164, 11162, 11160, 11262, 11260, 11258, 11256,
+ 11358, 11356, 11354, 11352, 11454, 11452, 11450, 11448,
+ 11550, 11548, 11546, 11544, 11710, 11708, 11706, 11704,
+ 11806, 11804, 11802, 11800, 11902, 11900, 11898, 11896,
+ 11998, 11996, 11994, 11992, 12094, 12092, 12090, 12088,
+ 12190, 12188, 12186, 12184, 12286, 12284, 12282, 12280,
+ 12382, 12380, 12378, 12376, 12478, 12476, 12474, 12472,
+ 12574, 12572, 12570, 12568, 12670, 12668, 12666, 12664,
+ 12766, 12764, 12762, 12760, 12862, 12860, 12858, 12856,
+ 12958, 12956, 12954, 12952, 13054, 13052, 13050, 13048,
+ 13150, 13148, 13146, 13144, 13246, 13244, 13242, 13240,
+ 13310, 13308, 13306, 13304, 13406, 13404, 13402, 13400,
+ 13502, 13500, 13498, 13496, 13598, 13596, 13594, 13592,
+ 13694, 13692, 13690, 13688, 13790, 13788, 13786, 13784,
+ 13886, 13884, 13882, 13880, 13982, 13980, 13978, 13976,
+ 14078, 14076, 14074, 14072, 14174, 14172, 14170, 14168,
+ 14270, 14268, 14266, 14264, 14366, 14364, 14362, 14360,
+ 14462, 14460, 14458, 14456, 14558, 14556, 14554, 14552,
+ 14654, 14652, 14650, 14648, 14750, 14748, 14746, 14744,
+ 14846, 14844, 14842, 14840, 14942, 14940, 14938, 14936,
+ 15006, 15004, 15002, 15000, 15102, 15100, 15098, 15096,
+ 15198, 15196, 15194, 15192, 15294, 15292, 15290, 15288,
+ 15390, 15388, 15386, 15384, 15486, 15484, 15482, 15480,
+ 15582, 15580, 15578, 15576, 15678, 15676, 15674, 15672,
+ 15774, 15772, 15770, 15768, 15870, 15868, 15866, 15864,
+ 15966, 15964, 15962, 15960, 16062, 16060, 16058, 16056,
+ 16158, 16156, 16154, 16152, 16254, 16252, 16250, 16248,
+ 16350, 16348, 16346, 16344, 16446, 16444, 16442, 16440,
+ 16542, 16540, 16538, 16536, 16702, 16700, 16698, 16696,
+ 16798, 16796, 16794, 16792, 16894, 16892, 16890, 16888,
+ 16990, 16988, 16986, 16984, 17086, 17084, 17082, 17080,
+ 17182, 17180, 17178, 17176, 17278, 17276, 17274, 17272,
+ 17374, 17372, 17370, 17368, 17470, 17468, 17466, 17464,
+ 17566, 17564, 17562, 17560, 17662, 17660, 17658, 17656,
+ 17758, 17756, 17754, 17752, 17854, 17852, 17850, 17848,
+ 17950, 17948, 17946, 17944, 18046, 18044, 18042, 18040,
+ 18142, 18140, 18138, 18136, 18238, 18236, 18234, 18232,
+ 18302, 18300, 18298, 18296, 18398, 18396, 18394, 18392,
+ 18494, 18492, 18490, 18488, 18590, 18588, 18586, 18584,
+ 18686, 18684, 18682, 18680, 18782, 18780, 18778, 18776,
+ 18878, 18876, 18874, 18872, 18974, 18972, 18970, 18968,
+ 19070, 19068, 19066, 19064, 19166, 19164, 19162, 19160,
+ 19262, 19260, 19258, 19256, 19358, 19356, 19354, 19352,
+ 19454, 19452, 19450, 19448, 19550, 19548, 19546, 19544,
+ 19646, 19644, 19642, 19640, 19742, 19740, 19738, 19736,
+ 19838, 19836, 19834, 19832, },
+ /* 4 */
+ {38, 36, 34, 32, 134, 132, 130, 128,
+ 230, 228, 226, 224, 326, 324, 322, 320,
+ 422, 420, 418, 416, 518, 516, 514, 512,
+ 614, 612, 610, 608, 710, 708, 706, 704,
+ 806, 804, 802, 800, 902, 900, 898, 896,
+ 998, 996, 994, 992, 1094, 1092, 1090, 1088,
+ 1190, 1188, 1186, 1184, 1286, 1284, 1282, 1280,
+ 1382, 1380, 1378, 1376, 1478, 1476, 1474, 1472,
+ 1574, 1572, 1570, 1568, 1670, 1668, 1666, 1664,
+ 1734, 1732, 1730, 1728, 1830, 1828, 1826, 1824,
+ 1926, 1924, 1922, 1920, 2022, 2020, 2018, 2016,
+ 2118, 2116, 2114, 2112, 2214, 2212, 2210, 2208,
+ 2310, 2308, 2306, 2304, 2406, 2404, 2402, 2400,
+ 2502, 2500, 2498, 2496, 2598, 2596, 2594, 2592,
+ 2694, 2692, 2690, 2688, 2790, 2788, 2786, 2784,
+ 2886, 2884, 2882, 2880, 2982, 2980, 2978, 2976,
+ 3078, 3076, 3074, 3072, 3174, 3172, 3170, 3168,
+ 3270, 3268, 3266, 3264, 3430, 3428, 3426, 3424,
+ 3526, 3524, 3522, 3520, 3622, 3620, 3618, 3616,
+ 3718, 3716, 3714, 3712, 3814, 3812, 3810, 3808,
+ 3910, 3908, 3906, 3904, 4006, 4004, 4002, 4000,
+ 4102, 4100, 4098, 4096, 4198, 4196, 4194, 4192,
+ 4294, 4292, 4290, 4288, 4390, 4388, 4386, 4384,
+ 4486, 4484, 4482, 4480, 4582, 4580, 4578, 4576,
+ 4678, 4676, 4674, 4672, 4774, 4772, 4770, 4768,
+ 4870, 4868, 4866, 4864, 4966, 4964, 4962, 4960,
+ 5030, 5028, 5026, 5024, 5126, 5124, 5122, 5120,
+ 5222, 5220, 5218, 5216, 5318, 5316, 5314, 5312,
+ 5414, 5412, 5410, 5408, 5510, 5508, 5506, 5504,
+ 5606, 5604, 5602, 5600, 5702, 5700, 5698, 5696,
+ 5798, 5796, 5794, 5792, 5894, 5892, 5890, 5888,
+ 5990, 5988, 5986, 5984, 6086, 6084, 6082, 6080,
+ 6182, 6180, 6178, 6176, 6278, 6276, 6274, 6272,
+ 6374, 6372, 6370, 6368, 6470, 6468, 6466, 6464,
+ 6566, 6564, 6562, 6560, 6630, 6628, 6626, 6624,
+ 6726, 6724, 6722, 6720, 6822, 6820, 6818, 6816,
+ 6918, 6916, 6914, 6912, 7014, 7012, 7010, 7008,
+ 7110, 7108, 7106, 7104, 7206, 7204, 7202, 7200,
+ 7302, 7300, 7298, 7296, 7398, 7396, 7394, 7392,
+ 7494, 7492, 7490, 7488, 7590, 7588, 7586, 7584,
+ 7686, 7684, 7682, 7680, 7782, 7780, 7778, 7776,
+ 7878, 7876, 7874, 7872, 7974, 7972, 7970, 7968,
+ 8070, 8068, 8066, 8064, 8166, 8164, 8162, 8160,
+ 8262, 8260, 8258, 8256, 8422, 8420, 8418, 8416,
+ 8518, 8516, 8514, 8512, 8614, 8612, 8610, 8608,
+ 8710, 8708, 8706, 8704, 8806, 8804, 8802, 8800,
+ 8902, 8900, 8898, 8896, 8998, 8996, 8994, 8992,
+ 9094, 9092, 9090, 9088, 9190, 9188, 9186, 9184,
+ 9286, 9284, 9282, 9280, 9382, 9380, 9378, 9376,
+ 9478, 9476, 9474, 9472, 9574, 9572, 9570, 9568,
+ 9670, 9668, 9666, 9664, 9766, 9764, 9762, 9760,
+ 9862, 9860, 9858, 9856, 9958, 9956, 9954, 9952,
+ 10022, 10020, 10018, 10016, 10118, 10116, 10114, 10112,
+ 10214, 10212, 10210, 10208, 10310, 10308, 10306, 10304,
+ 10406, 10404, 10402, 10400, 10502, 10500, 10498, 10496,
+ 10598, 10596, 10594, 10592, 10694, 10692, 10690, 10688,
+ 10790, 10788, 10786, 10784, 10886, 10884, 10882, 10880,
+ 10982, 10980, 10978, 10976, 11078, 11076, 11074, 11072,
+ 11174, 11172, 11170, 11168, 11270, 11268, 11266, 11264,
+ 11366, 11364, 11362, 11360, 11462, 11460, 11458, 11456,
+ 11558, 11556, 11554, 11552, 11622, 11620, 11618, 11616,
+ 11718, 11716, 11714, 11712, 11814, 11812, 11810, 11808,
+ 11910, 11908, 11906, 11904, 12006, 12004, 12002, 12000,
+ 12102, 12100, 12098, 12096, 12198, 12196, 12194, 12192,
+ 12294, 12292, 12290, 12288, 12390, 12388, 12386, 12384,
+ 12486, 12484, 12482, 12480, 12582, 12580, 12578, 12576,
+ 12678, 12676, 12674, 12672, 12774, 12772, 12770, 12768,
+ 12870, 12868, 12866, 12864, 12966, 12964, 12962, 12960,
+ 13062, 13060, 13058, 13056, 13158, 13156, 13154, 13152,
+ 13318, 13316, 13314, 13312, 13414, 13412, 13410, 13408,
+ 13510, 13508, 13506, 13504, 13606, 13604, 13602, 13600,
+ 13702, 13700, 13698, 13696, 13798, 13796, 13794, 13792,
+ 13894, 13892, 13890, 13888, 13990, 13988, 13986, 13984,
+ 14086, 14084, 14082, 14080, 14182, 14180, 14178, 14176,
+ 14278, 14276, 14274, 14272, 14374, 14372, 14370, 14368,
+ 14470, 14468, 14466, 14464, 14566, 14564, 14562, 14560,
+ 14662, 14660, 14658, 14656, 14758, 14756, 14754, 14752,
+ 14854, 14852, 14850, 14848, 14950, 14948, 14946, 14944,
+ 15014, 15012, 15010, 15008, 15110, 15108, 15106, 15104,
+ 15206, 15204, 15202, 15200, 15302, 15300, 15298, 15296,
+ 15398, 15396, 15394, 15392, 15494, 15492, 15490, 15488,
+ 15590, 15588, 15586, 15584, 15686, 15684, 15682, 15680,
+ 15782, 15780, 15778, 15776, 15878, 15876, 15874, 15872,
+ 15974, 15972, 15970, 15968, 16070, 16068, 16066, 16064,
+ 16166, 16164, 16162, 16160, 16262, 16260, 16258, 16256,
+ 16358, 16356, 16354, 16352, 16454, 16452, 16450, 16448,
+ 16550, 16548, 16546, 16544, 16614, 16612, 16610, 16608,
+ 16710, 16708, 16706, 16704, 16806, 16804, 16802, 16800,
+ 16902, 16900, 16898, 16896, 16998, 16996, 16994, 16992,
+ 17094, 17092, 17090, 17088, 17190, 17188, 17186, 17184,
+ 17286, 17284, 17282, 17280, 17382, 17380, 17378, 17376,
+ 17478, 17476, 17474, 17472, 17574, 17572, 17570, 17568,
+ 17670, 17668, 17666, 17664, 17766, 17764, 17762, 17760,
+ 17862, 17860, 17858, 17856, 17958, 17956, 17954, 17952,
+ 18054, 18052, 18050, 18048, 18150, 18148, 18146, 18144,
+ 18310, 18308, 18306, 18304, 18406, 18404, 18402, 18400,
+ 18502, 18500, 18498, 18496, 18598, 18596, 18594, 18592,
+ 18694, 18692, 18690, 18688, 18790, 18788, 18786, 18784,
+ 18886, 18884, 18882, 18880, 18982, 18980, 18978, 18976,
+ 19078, 19076, 19074, 19072, 19174, 19172, 19170, 19168,
+ 19270, 19268, 19266, 19264, 19366, 19364, 19362, 19360,
+ 19462, 19460, 19458, 19456, 19558, 19556, 19554, 19552,
+ 19654, 19652, 19650, 19648, 19750, 19748, 19746, 19744,
+ 19846, 19844, 19842, 19840, },
+ /* 5 */
+ {46, 44, 42, 40, 142, 140, 138, 136,
+ 238, 236, 234, 232, 334, 332, 330, 328,
+ 430, 428, 426, 424, 526, 524, 522, 520,
+ 622, 620, 618, 616, 718, 716, 714, 712,
+ 814, 812, 810, 808, 910, 908, 906, 904,
+ 1006, 1004, 1002, 1000, 1102, 1100, 1098, 1096,
+ 1198, 1196, 1194, 1192, 1294, 1292, 1290, 1288,
+ 1390, 1388, 1386, 1384, 1486, 1484, 1482, 1480,
+ 1582, 1580, 1578, 1576, 1678, 1676, 1674, 1672,
+ 1742, 1740, 1738, 1736, 1838, 1836, 1834, 1832,
+ 1934, 1932, 1930, 1928, 2030, 2028, 2026, 2024,
+ 2126, 2124, 2122, 2120, 2222, 2220, 2218, 2216,
+ 2318, 2316, 2314, 2312, 2414, 2412, 2410, 2408,
+ 2510, 2508, 2506, 2504, 2606, 2604, 2602, 2600,
+ 2702, 2700, 2698, 2696, 2798, 2796, 2794, 2792,
+ 2894, 2892, 2890, 2888, 2990, 2988, 2986, 2984,
+ 3086, 3084, 3082, 3080, 3182, 3180, 3178, 3176,
+ 3278, 3276, 3274, 3272, 3438, 3436, 3434, 3432,
+ 3534, 3532, 3530, 3528, 3630, 3628, 3626, 3624,
+ 3726, 3724, 3722, 3720, 3822, 3820, 3818, 3816,
+ 3918, 3916, 3914, 3912, 4014, 4012, 4010, 4008,
+ 4110, 4108, 4106, 4104, 4206, 4204, 4202, 4200,
+ 4302, 4300, 4298, 4296, 4398, 4396, 4394, 4392,
+ 4494, 4492, 4490, 4488, 4590, 4588, 4586, 4584,
+ 4686, 4684, 4682, 4680, 4782, 4780, 4778, 4776,
+ 4878, 4876, 4874, 4872, 4974, 4972, 4970, 4968,
+ 5038, 5036, 5034, 5032, 5134, 5132, 5130, 5128,
+ 5230, 5228, 5226, 5224, 5326, 5324, 5322, 5320,
+ 5422, 5420, 5418, 5416, 5518, 5516, 5514, 5512,
+ 5614, 5612, 5610, 5608, 5710, 5708, 5706, 5704,
+ 5806, 5804, 5802, 5800, 5902, 5900, 5898, 5896,
+ 5998, 5996, 5994, 5992, 6094, 6092, 6090, 6088,
+ 6190, 6188, 6186, 6184, 6286, 6284, 6282, 6280,
+ 6382, 6380, 6378, 6376, 6478, 6476, 6474, 6472,
+ 6574, 6572, 6570, 6568, 6638, 6636, 6634, 6632,
+ 6734, 6732, 6730, 6728, 6830, 6828, 6826, 6824,
+ 6926, 6924, 6922, 6920, 7022, 7020, 7018, 7016,
+ 7118, 7116, 7114, 7112, 7214, 7212, 7210, 7208,
+ 7310, 7308, 7306, 7304, 7406, 7404, 7402, 7400,
+ 7502, 7500, 7498, 7496, 7598, 7596, 7594, 7592,
+ 7694, 7692, 7690, 7688, 7790, 7788, 7786, 7784,
+ 7886, 7884, 7882, 7880, 7982, 7980, 7978, 7976,
+ 8078, 8076, 8074, 8072, 8174, 8172, 8170, 8168,
+ 8270, 8268, 8266, 8264, 8430, 8428, 8426, 8424,
+ 8526, 8524, 8522, 8520, 8622, 8620, 8618, 8616,
+ 8718, 8716, 8714, 8712, 8814, 8812, 8810, 8808,
+ 8910, 8908, 8906, 8904, 9006, 9004, 9002, 9000,
+ 9102, 9100, 9098, 9096, 9198, 9196, 9194, 9192,
+ 9294, 9292, 9290, 9288, 9390, 9388, 9386, 9384,
+ 9486, 9484, 9482, 9480, 9582, 9580, 9578, 9576,
+ 9678, 9676, 9674, 9672, 9774, 9772, 9770, 9768,
+ 9870, 9868, 9866, 9864, 9966, 9964, 9962, 9960,
+ 10030, 10028, 10026, 10024, 10126, 10124, 10122, 10120,
+ 10222, 10220, 10218, 10216, 10318, 10316, 10314, 10312,
+ 10414, 10412, 10410, 10408, 10510, 10508, 10506, 10504,
+ 10606, 10604, 10602, 10600, 10702, 10700, 10698, 10696,
+ 10798, 10796, 10794, 10792, 10894, 10892, 10890, 10888,
+ 10990, 10988, 10986, 10984, 11086, 11084, 11082, 11080,
+ 11182, 11180, 11178, 11176, 11278, 11276, 11274, 11272,
+ 11374, 11372, 11370, 11368, 11470, 11468, 11466, 11464,
+ 11566, 11564, 11562, 11560, 11630, 11628, 11626, 11624,
+ 11726, 11724, 11722, 11720, 11822, 11820, 11818, 11816,
+ 11918, 11916, 11914, 11912, 12014, 12012, 12010, 12008,
+ 12110, 12108, 12106, 12104, 12206, 12204, 12202, 12200,
+ 12302, 12300, 12298, 12296, 12398, 12396, 12394, 12392,
+ 12494, 12492, 12490, 12488, 12590, 12588, 12586, 12584,
+ 12686, 12684, 12682, 12680, 12782, 12780, 12778, 12776,
+ 12878, 12876, 12874, 12872, 12974, 12972, 12970, 12968,
+ 13070, 13068, 13066, 13064, 13166, 13164, 13162, 13160,
+ 13326, 13324, 13322, 13320, 13422, 13420, 13418, 13416,
+ 13518, 13516, 13514, 13512, 13614, 13612, 13610, 13608,
+ 13710, 13708, 13706, 13704, 13806, 13804, 13802, 13800,
+ 13902, 13900, 13898, 13896, 13998, 13996, 13994, 13992,
+ 14094, 14092, 14090, 14088, 14190, 14188, 14186, 14184,
+ 14286, 14284, 14282, 14280, 14382, 14380, 14378, 14376,
+ 14478, 14476, 14474, 14472, 14574, 14572, 14570, 14568,
+ 14670, 14668, 14666, 14664, 14766, 14764, 14762, 14760,
+ 14862, 14860, 14858, 14856, 14958, 14956, 14954, 14952,
+ 15022, 15020, 15018, 15016, 15118, 15116, 15114, 15112,
+ 15214, 15212, 15210, 15208, 15310, 15308, 15306, 15304,
+ 15406, 15404, 15402, 15400, 15502, 15500, 15498, 15496,
+ 15598, 15596, 15594, 15592, 15694, 15692, 15690, 15688,
+ 15790, 15788, 15786, 15784, 15886, 15884, 15882, 15880,
+ 15982, 15980, 15978, 15976, 16078, 16076, 16074, 16072,
+ 16174, 16172, 16170, 16168, 16270, 16268, 16266, 16264,
+ 16366, 16364, 16362, 16360, 16462, 16460, 16458, 16456,
+ 16558, 16556, 16554, 16552, 16622, 16620, 16618, 16616,
+ 16718, 16716, 16714, 16712, 16814, 16812, 16810, 16808,
+ 16910, 16908, 16906, 16904, 17006, 17004, 17002, 17000,
+ 17102, 17100, 17098, 17096, 17198, 17196, 17194, 17192,
+ 17294, 17292, 17290, 17288, 17390, 17388, 17386, 17384,
+ 17486, 17484, 17482, 17480, 17582, 17580, 17578, 17576,
+ 17678, 17676, 17674, 17672, 17774, 17772, 17770, 17768,
+ 17870, 17868, 17866, 17864, 17966, 17964, 17962, 17960,
+ 18062, 18060, 18058, 18056, 18158, 18156, 18154, 18152,
+ 18318, 18316, 18314, 18312, 18414, 18412, 18410, 18408,
+ 18510, 18508, 18506, 18504, 18606, 18604, 18602, 18600,
+ 18702, 18700, 18698, 18696, 18798, 18796, 18794, 18792,
+ 18894, 18892, 18890, 18888, 18990, 18988, 18986, 18984,
+ 19086, 19084, 19082, 19080, 19182, 19180, 19178, 19176,
+ 19278, 19276, 19274, 19272, 19374, 19372, 19370, 19368,
+ 19470, 19468, 19466, 19464, 19566, 19564, 19562, 19560,
+ 19662, 19660, 19658, 19656, 19758, 19756, 19754, 19752,
+ 19854, 19852, 19850, 19848, },
+ /* 6 */
+ {54, 52, 50, 48, 150, 148, 146, 144,
+ 246, 244, 242, 240, 342, 340, 338, 336,
+ 438, 436, 434, 432, 534, 532, 530, 528,
+ 630, 628, 626, 624, 726, 724, 722, 720,
+ 822, 820, 818, 816, 918, 916, 914, 912,
+ 1014, 1012, 1010, 1008, 1110, 1108, 1106, 1104,
+ 1206, 1204, 1202, 1200, 1302, 1300, 1298, 1296,
+ 1398, 1396, 1394, 1392, 1494, 1492, 1490, 1488,
+ 1590, 1588, 1586, 1584, 1686, 1684, 1682, 1680,
+ 1750, 1748, 1746, 1744, 1846, 1844, 1842, 1840,
+ 1942, 1940, 1938, 1936, 2038, 2036, 2034, 2032,
+ 2134, 2132, 2130, 2128, 2230, 2228, 2226, 2224,
+ 2326, 2324, 2322, 2320, 2422, 2420, 2418, 2416,
+ 2518, 2516, 2514, 2512, 2614, 2612, 2610, 2608,
+ 2710, 2708, 2706, 2704, 2806, 2804, 2802, 2800,
+ 2902, 2900, 2898, 2896, 2998, 2996, 2994, 2992,
+ 3094, 3092, 3090, 3088, 3190, 3188, 3186, 3184,
+ 3286, 3284, 3282, 3280, 3446, 3444, 3442, 3440,
+ 3542, 3540, 3538, 3536, 3638, 3636, 3634, 3632,
+ 3734, 3732, 3730, 3728, 3830, 3828, 3826, 3824,
+ 3926, 3924, 3922, 3920, 4022, 4020, 4018, 4016,
+ 4118, 4116, 4114, 4112, 4214, 4212, 4210, 4208,
+ 4310, 4308, 4306, 4304, 4406, 4404, 4402, 4400,
+ 4502, 4500, 4498, 4496, 4598, 4596, 4594, 4592,
+ 4694, 4692, 4690, 4688, 4790, 4788, 4786, 4784,
+ 4886, 4884, 4882, 4880, 4982, 4980, 4978, 4976,
+ 5046, 5044, 5042, 5040, 5142, 5140, 5138, 5136,
+ 5238, 5236, 5234, 5232, 5334, 5332, 5330, 5328,
+ 5430, 5428, 5426, 5424, 5526, 5524, 5522, 5520,
+ 5622, 5620, 5618, 5616, 5718, 5716, 5714, 5712,
+ 5814, 5812, 5810, 5808, 5910, 5908, 5906, 5904,
+ 6006, 6004, 6002, 6000, 6102, 6100, 6098, 6096,
+ 6198, 6196, 6194, 6192, 6294, 6292, 6290, 6288,
+ 6390, 6388, 6386, 6384, 6486, 6484, 6482, 6480,
+ 6582, 6580, 6578, 6576, 6646, 6644, 6642, 6640,
+ 6742, 6740, 6738, 6736, 6838, 6836, 6834, 6832,
+ 6934, 6932, 6930, 6928, 7030, 7028, 7026, 7024,
+ 7126, 7124, 7122, 7120, 7222, 7220, 7218, 7216,
+ 7318, 7316, 7314, 7312, 7414, 7412, 7410, 7408,
+ 7510, 7508, 7506, 7504, 7606, 7604, 7602, 7600,
+ 7702, 7700, 7698, 7696, 7798, 7796, 7794, 7792,
+ 7894, 7892, 7890, 7888, 7990, 7988, 7986, 7984,
+ 8086, 8084, 8082, 8080, 8182, 8180, 8178, 8176,
+ 8278, 8276, 8274, 8272, 8438, 8436, 8434, 8432,
+ 8534, 8532, 8530, 8528, 8630, 8628, 8626, 8624,
+ 8726, 8724, 8722, 8720, 8822, 8820, 8818, 8816,
+ 8918, 8916, 8914, 8912, 9014, 9012, 9010, 9008,
+ 9110, 9108, 9106, 9104, 9206, 9204, 9202, 9200,
+ 9302, 9300, 9298, 9296, 9398, 9396, 9394, 9392,
+ 9494, 9492, 9490, 9488, 9590, 9588, 9586, 9584,
+ 9686, 9684, 9682, 9680, 9782, 9780, 9778, 9776,
+ 9878, 9876, 9874, 9872, 9974, 9972, 9970, 9968,
+ 10038, 10036, 10034, 10032, 10134, 10132, 10130, 10128,
+ 10230, 10228, 10226, 10224, 10326, 10324, 10322, 10320,
+ 10422, 10420, 10418, 10416, 10518, 10516, 10514, 10512,
+ 10614, 10612, 10610, 10608, 10710, 10708, 10706, 10704,
+ 10806, 10804, 10802, 10800, 10902, 10900, 10898, 10896,
+ 10998, 10996, 10994, 10992, 11094, 11092, 11090, 11088,
+ 11190, 11188, 11186, 11184, 11286, 11284, 11282, 11280,
+ 11382, 11380, 11378, 11376, 11478, 11476, 11474, 11472,
+ 11574, 11572, 11570, 11568, 11638, 11636, 11634, 11632,
+ 11734, 11732, 11730, 11728, 11830, 11828, 11826, 11824,
+ 11926, 11924, 11922, 11920, 12022, 12020, 12018, 12016,
+ 12118, 12116, 12114, 12112, 12214, 12212, 12210, 12208,
+ 12310, 12308, 12306, 12304, 12406, 12404, 12402, 12400,
+ 12502, 12500, 12498, 12496, 12598, 12596, 12594, 12592,
+ 12694, 12692, 12690, 12688, 12790, 12788, 12786, 12784,
+ 12886, 12884, 12882, 12880, 12982, 12980, 12978, 12976,
+ 13078, 13076, 13074, 13072, 13174, 13172, 13170, 13168,
+ 13334, 13332, 13330, 13328, 13430, 13428, 13426, 13424,
+ 13526, 13524, 13522, 13520, 13622, 13620, 13618, 13616,
+ 13718, 13716, 13714, 13712, 13814, 13812, 13810, 13808,
+ 13910, 13908, 13906, 13904, 14006, 14004, 14002, 14000,
+ 14102, 14100, 14098, 14096, 14198, 14196, 14194, 14192,
+ 14294, 14292, 14290, 14288, 14390, 14388, 14386, 14384,
+ 14486, 14484, 14482, 14480, 14582, 14580, 14578, 14576,
+ 14678, 14676, 14674, 14672, 14774, 14772, 14770, 14768,
+ 14870, 14868, 14866, 14864, 14966, 14964, 14962, 14960,
+ 15030, 15028, 15026, 15024, 15126, 15124, 15122, 15120,
+ 15222, 15220, 15218, 15216, 15318, 15316, 15314, 15312,
+ 15414, 15412, 15410, 15408, 15510, 15508, 15506, 15504,
+ 15606, 15604, 15602, 15600, 15702, 15700, 15698, 15696,
+ 15798, 15796, 15794, 15792, 15894, 15892, 15890, 15888,
+ 15990, 15988, 15986, 15984, 16086, 16084, 16082, 16080,
+ 16182, 16180, 16178, 16176, 16278, 16276, 16274, 16272,
+ 16374, 16372, 16370, 16368, 16470, 16468, 16466, 16464,
+ 16566, 16564, 16562, 16560, 16630, 16628, 16626, 16624,
+ 16726, 16724, 16722, 16720, 16822, 16820, 16818, 16816,
+ 16918, 16916, 16914, 16912, 17014, 17012, 17010, 17008,
+ 17110, 17108, 17106, 17104, 17206, 17204, 17202, 17200,
+ 17302, 17300, 17298, 17296, 17398, 17396, 17394, 17392,
+ 17494, 17492, 17490, 17488, 17590, 17588, 17586, 17584,
+ 17686, 17684, 17682, 17680, 17782, 17780, 17778, 17776,
+ 17878, 17876, 17874, 17872, 17974, 17972, 17970, 17968,
+ 18070, 18068, 18066, 18064, 18166, 18164, 18162, 18160,
+ 18326, 18324, 18322, 18320, 18422, 18420, 18418, 18416,
+ 18518, 18516, 18514, 18512, 18614, 18612, 18610, 18608,
+ 18710, 18708, 18706, 18704, 18806, 18804, 18802, 18800,
+ 18902, 18900, 18898, 18896, 18998, 18996, 18994, 18992,
+ 19094, 19092, 19090, 19088, 19190, 19188, 19186, 19184,
+ 19286, 19284, 19282, 19280, 19382, 19380, 19378, 19376,
+ 19478, 19476, 19474, 19472, 19574, 19572, 19570, 19568,
+ 19670, 19668, 19666, 19664, 19766, 19764, 19762, 19760,
+ 19862, 19860, 19858, 19856, },
+ /* 7 */
+ {62, 60, 58, 56, 158, 156, 154, 152,
+ 254, 252, 250, 248, 350, 348, 346, 344,
+ 446, 444, 442, 440, 542, 540, 538, 536,
+ 638, 636, 634, 632, 734, 732, 730, 728,
+ 830, 828, 826, 824, 926, 924, 922, 920,
+ 1022, 1020, 1018, 1016, 1118, 1116, 1114, 1112,
+ 1214, 1212, 1210, 1208, 1310, 1308, 1306, 1304,
+ 1406, 1404, 1402, 1400, 1502, 1500, 1498, 1496,
+ 1598, 1596, 1594, 1592, 1694, 1692, 1690, 1688,
+ 1758, 1756, 1754, 1752, 1854, 1852, 1850, 1848,
+ 1950, 1948, 1946, 1944, 2046, 2044, 2042, 2040,
+ 2142, 2140, 2138, 2136, 2238, 2236, 2234, 2232,
+ 2334, 2332, 2330, 2328, 2430, 2428, 2426, 2424,
+ 2526, 2524, 2522, 2520, 2622, 2620, 2618, 2616,
+ 2718, 2716, 2714, 2712, 2814, 2812, 2810, 2808,
+ 2910, 2908, 2906, 2904, 3006, 3004, 3002, 3000,
+ 3102, 3100, 3098, 3096, 3198, 3196, 3194, 3192,
+ 3294, 3292, 3290, 3288, 3454, 3452, 3450, 3448,
+ 3550, 3548, 3546, 3544, 3646, 3644, 3642, 3640,
+ 3742, 3740, 3738, 3736, 3838, 3836, 3834, 3832,
+ 3934, 3932, 3930, 3928, 4030, 4028, 4026, 4024,
+ 4126, 4124, 4122, 4120, 4222, 4220, 4218, 4216,
+ 4318, 4316, 4314, 4312, 4414, 4412, 4410, 4408,
+ 4510, 4508, 4506, 4504, 4606, 4604, 4602, 4600,
+ 4702, 4700, 4698, 4696, 4798, 4796, 4794, 4792,
+ 4894, 4892, 4890, 4888, 4990, 4988, 4986, 4984,
+ 5054, 5052, 5050, 5048, 5150, 5148, 5146, 5144,
+ 5246, 5244, 5242, 5240, 5342, 5340, 5338, 5336,
+ 5438, 5436, 5434, 5432, 5534, 5532, 5530, 5528,
+ 5630, 5628, 5626, 5624, 5726, 5724, 5722, 5720,
+ 5822, 5820, 5818, 5816, 5918, 5916, 5914, 5912,
+ 6014, 6012, 6010, 6008, 6110, 6108, 6106, 6104,
+ 6206, 6204, 6202, 6200, 6302, 6300, 6298, 6296,
+ 6398, 6396, 6394, 6392, 6494, 6492, 6490, 6488,
+ 6590, 6588, 6586, 6584, 6654, 6652, 6650, 6648,
+ 6750, 6748, 6746, 6744, 6846, 6844, 6842, 6840,
+ 6942, 6940, 6938, 6936, 7038, 7036, 7034, 7032,
+ 7134, 7132, 7130, 7128, 7230, 7228, 7226, 7224,
+ 7326, 7324, 7322, 7320, 7422, 7420, 7418, 7416,
+ 7518, 7516, 7514, 7512, 7614, 7612, 7610, 7608,
+ 7710, 7708, 7706, 7704, 7806, 7804, 7802, 7800,
+ 7902, 7900, 7898, 7896, 7998, 7996, 7994, 7992,
+ 8094, 8092, 8090, 8088, 8190, 8188, 8186, 8184,
+ 8286, 8284, 8282, 8280, 8446, 8444, 8442, 8440,
+ 8542, 8540, 8538, 8536, 8638, 8636, 8634, 8632,
+ 8734, 8732, 8730, 8728, 8830, 8828, 8826, 8824,
+ 8926, 8924, 8922, 8920, 9022, 9020, 9018, 9016,
+ 9118, 9116, 9114, 9112, 9214, 9212, 9210, 9208,
+ 9310, 9308, 9306, 9304, 9406, 9404, 9402, 9400,
+ 9502, 9500, 9498, 9496, 9598, 9596, 9594, 9592,
+ 9694, 9692, 9690, 9688, 9790, 9788, 9786, 9784,
+ 9886, 9884, 9882, 9880, 9982, 9980, 9978, 9976,
+ 10046, 10044, 10042, 10040, 10142, 10140, 10138, 10136,
+ 10238, 10236, 10234, 10232, 10334, 10332, 10330, 10328,
+ 10430, 10428, 10426, 10424, 10526, 10524, 10522, 10520,
+ 10622, 10620, 10618, 10616, 10718, 10716, 10714, 10712,
+ 10814, 10812, 10810, 10808, 10910, 10908, 10906, 10904,
+ 11006, 11004, 11002, 11000, 11102, 11100, 11098, 11096,
+ 11198, 11196, 11194, 11192, 11294, 11292, 11290, 11288,
+ 11390, 11388, 11386, 11384, 11486, 11484, 11482, 11480,
+ 11582, 11580, 11578, 11576, 11646, 11644, 11642, 11640,
+ 11742, 11740, 11738, 11736, 11838, 11836, 11834, 11832,
+ 11934, 11932, 11930, 11928, 12030, 12028, 12026, 12024,
+ 12126, 12124, 12122, 12120, 12222, 12220, 12218, 12216,
+ 12318, 12316, 12314, 12312, 12414, 12412, 12410, 12408,
+ 12510, 12508, 12506, 12504, 12606, 12604, 12602, 12600,
+ 12702, 12700, 12698, 12696, 12798, 12796, 12794, 12792,
+ 12894, 12892, 12890, 12888, 12990, 12988, 12986, 12984,
+ 13086, 13084, 13082, 13080, 13182, 13180, 13178, 13176,
+ 13342, 13340, 13338, 13336, 13438, 13436, 13434, 13432,
+ 13534, 13532, 13530, 13528, 13630, 13628, 13626, 13624,
+ 13726, 13724, 13722, 13720, 13822, 13820, 13818, 13816,
+ 13918, 13916, 13914, 13912, 14014, 14012, 14010, 14008,
+ 14110, 14108, 14106, 14104, 14206, 14204, 14202, 14200,
+ 14302, 14300, 14298, 14296, 14398, 14396, 14394, 14392,
+ 14494, 14492, 14490, 14488, 14590, 14588, 14586, 14584,
+ 14686, 14684, 14682, 14680, 14782, 14780, 14778, 14776,
+ 14878, 14876, 14874, 14872, 14974, 14972, 14970, 14968,
+ 15038, 15036, 15034, 15032, 15134, 15132, 15130, 15128,
+ 15230, 15228, 15226, 15224, 15326, 15324, 15322, 15320,
+ 15422, 15420, 15418, 15416, 15518, 15516, 15514, 15512,
+ 15614, 15612, 15610, 15608, 15710, 15708, 15706, 15704,
+ 15806, 15804, 15802, 15800, 15902, 15900, 15898, 15896,
+ 15998, 15996, 15994, 15992, 16094, 16092, 16090, 16088,
+ 16190, 16188, 16186, 16184, 16286, 16284, 16282, 16280,
+ 16382, 16380, 16378, 16376, 16478, 16476, 16474, 16472,
+ 16574, 16572, 16570, 16568, 16638, 16636, 16634, 16632,
+ 16734, 16732, 16730, 16728, 16830, 16828, 16826, 16824,
+ 16926, 16924, 16922, 16920, 17022, 17020, 17018, 17016,
+ 17118, 17116, 17114, 17112, 17214, 17212, 17210, 17208,
+ 17310, 17308, 17306, 17304, 17406, 17404, 17402, 17400,
+ 17502, 17500, 17498, 17496, 17598, 17596, 17594, 17592,
+ 17694, 17692, 17690, 17688, 17790, 17788, 17786, 17784,
+ 17886, 17884, 17882, 17880, 17982, 17980, 17978, 17976,
+ 18078, 18076, 18074, 18072, 18174, 18172, 18170, 18168,
+ 18334, 18332, 18330, 18328, 18430, 18428, 18426, 18424,
+ 18526, 18524, 18522, 18520, 18622, 18620, 18618, 18616,
+ 18718, 18716, 18714, 18712, 18814, 18812, 18810, 18808,
+ 18910, 18908, 18906, 18904, 19006, 19004, 19002, 19000,
+ 19102, 19100, 19098, 19096, 19198, 19196, 19194, 19192,
+ 19294, 19292, 19290, 19288, 19390, 19388, 19386, 19384,
+ 19486, 19484, 19482, 19480, 19582, 19580, 19578, 19576,
+ 19678, 19676, 19674, 19672, 19774, 19772, 19770, 19768,
+ 19870, 19868, 19866, 19864, },
+ /* 8 */
+ {70, 68, 66, 64, 166, 164, 162, 160,
+ 262, 260, 258, 256, 358, 356, 354, 352,
+ 454, 452, 450, 448, 550, 548, 546, 544,
+ 646, 644, 642, 640, 742, 740, 738, 736,
+ 838, 836, 834, 832, 934, 932, 930, 928,
+ 1030, 1028, 1026, 1024, 1126, 1124, 1122, 1120,
+ 1222, 1220, 1218, 1216, 1318, 1316, 1314, 1312,
+ 1414, 1412, 1410, 1408, 1510, 1508, 1506, 1504,
+ 1606, 1604, 1602, 1600, 1702, 1700, 1698, 1696,
+ 1766, 1764, 1762, 1760, 1862, 1860, 1858, 1856,
+ 1958, 1956, 1954, 1952, 2054, 2052, 2050, 2048,
+ 2150, 2148, 2146, 2144, 2246, 2244, 2242, 2240,
+ 2342, 2340, 2338, 2336, 2438, 2436, 2434, 2432,
+ 2534, 2532, 2530, 2528, 2630, 2628, 2626, 2624,
+ 2726, 2724, 2722, 2720, 2822, 2820, 2818, 2816,
+ 2918, 2916, 2914, 2912, 3014, 3012, 3010, 3008,
+ 3110, 3108, 3106, 3104, 3206, 3204, 3202, 3200,
+ 3302, 3300, 3298, 3296, 3366, 3364, 3362, 3360,
+ 3462, 3460, 3458, 3456, 3558, 3556, 3554, 3552,
+ 3654, 3652, 3650, 3648, 3750, 3748, 3746, 3744,
+ 3846, 3844, 3842, 3840, 3942, 3940, 3938, 3936,
+ 4038, 4036, 4034, 4032, 4134, 4132, 4130, 4128,
+ 4230, 4228, 4226, 4224, 4326, 4324, 4322, 4320,
+ 4422, 4420, 4418, 4416, 4518, 4516, 4514, 4512,
+ 4614, 4612, 4610, 4608, 4710, 4708, 4706, 4704,
+ 4806, 4804, 4802, 4800, 4902, 4900, 4898, 4896,
+ 5062, 5060, 5058, 5056, 5158, 5156, 5154, 5152,
+ 5254, 5252, 5250, 5248, 5350, 5348, 5346, 5344,
+ 5446, 5444, 5442, 5440, 5542, 5540, 5538, 5536,
+ 5638, 5636, 5634, 5632, 5734, 5732, 5730, 5728,
+ 5830, 5828, 5826, 5824, 5926, 5924, 5922, 5920,
+ 6022, 6020, 6018, 6016, 6118, 6116, 6114, 6112,
+ 6214, 6212, 6210, 6208, 6310, 6308, 6306, 6304,
+ 6406, 6404, 6402, 6400, 6502, 6500, 6498, 6496,
+ 6598, 6596, 6594, 6592, 6662, 6660, 6658, 6656,
+ 6758, 6756, 6754, 6752, 6854, 6852, 6850, 6848,
+ 6950, 6948, 6946, 6944, 7046, 7044, 7042, 7040,
+ 7142, 7140, 7138, 7136, 7238, 7236, 7234, 7232,
+ 7334, 7332, 7330, 7328, 7430, 7428, 7426, 7424,
+ 7526, 7524, 7522, 7520, 7622, 7620, 7618, 7616,
+ 7718, 7716, 7714, 7712, 7814, 7812, 7810, 7808,
+ 7910, 7908, 7906, 7904, 8006, 8004, 8002, 8000,
+ 8102, 8100, 8098, 8096, 8198, 8196, 8194, 8192,
+ 8294, 8292, 8290, 8288, 8358, 8356, 8354, 8352,
+ 8454, 8452, 8450, 8448, 8550, 8548, 8546, 8544,
+ 8646, 8644, 8642, 8640, 8742, 8740, 8738, 8736,
+ 8838, 8836, 8834, 8832, 8934, 8932, 8930, 8928,
+ 9030, 9028, 9026, 9024, 9126, 9124, 9122, 9120,
+ 9222, 9220, 9218, 9216, 9318, 9316, 9314, 9312,
+ 9414, 9412, 9410, 9408, 9510, 9508, 9506, 9504,
+ 9606, 9604, 9602, 9600, 9702, 9700, 9698, 9696,
+ 9798, 9796, 9794, 9792, 9894, 9892, 9890, 9888,
+ 10054, 10052, 10050, 10048, 10150, 10148, 10146, 10144,
+ 10246, 10244, 10242, 10240, 10342, 10340, 10338, 10336,
+ 10438, 10436, 10434, 10432, 10534, 10532, 10530, 10528,
+ 10630, 10628, 10626, 10624, 10726, 10724, 10722, 10720,
+ 10822, 10820, 10818, 10816, 10918, 10916, 10914, 10912,
+ 11014, 11012, 11010, 11008, 11110, 11108, 11106, 11104,
+ 11206, 11204, 11202, 11200, 11302, 11300, 11298, 11296,
+ 11398, 11396, 11394, 11392, 11494, 11492, 11490, 11488,
+ 11590, 11588, 11586, 11584, 11654, 11652, 11650, 11648,
+ 11750, 11748, 11746, 11744, 11846, 11844, 11842, 11840,
+ 11942, 11940, 11938, 11936, 12038, 12036, 12034, 12032,
+ 12134, 12132, 12130, 12128, 12230, 12228, 12226, 12224,
+ 12326, 12324, 12322, 12320, 12422, 12420, 12418, 12416,
+ 12518, 12516, 12514, 12512, 12614, 12612, 12610, 12608,
+ 12710, 12708, 12706, 12704, 12806, 12804, 12802, 12800,
+ 12902, 12900, 12898, 12896, 12998, 12996, 12994, 12992,
+ 13094, 13092, 13090, 13088, 13190, 13188, 13186, 13184,
+ 13254, 13252, 13250, 13248, 13350, 13348, 13346, 13344,
+ 13446, 13444, 13442, 13440, 13542, 13540, 13538, 13536,
+ 13638, 13636, 13634, 13632, 13734, 13732, 13730, 13728,
+ 13830, 13828, 13826, 13824, 13926, 13924, 13922, 13920,
+ 14022, 14020, 14018, 14016, 14118, 14116, 14114, 14112,
+ 14214, 14212, 14210, 14208, 14310, 14308, 14306, 14304,
+ 14406, 14404, 14402, 14400, 14502, 14500, 14498, 14496,
+ 14598, 14596, 14594, 14592, 14694, 14692, 14690, 14688,
+ 14790, 14788, 14786, 14784, 14886, 14884, 14882, 14880,
+ 15046, 15044, 15042, 15040, 15142, 15140, 15138, 15136,
+ 15238, 15236, 15234, 15232, 15334, 15332, 15330, 15328,
+ 15430, 15428, 15426, 15424, 15526, 15524, 15522, 15520,
+ 15622, 15620, 15618, 15616, 15718, 15716, 15714, 15712,
+ 15814, 15812, 15810, 15808, 15910, 15908, 15906, 15904,
+ 16006, 16004, 16002, 16000, 16102, 16100, 16098, 16096,
+ 16198, 16196, 16194, 16192, 16294, 16292, 16290, 16288,
+ 16390, 16388, 16386, 16384, 16486, 16484, 16482, 16480,
+ 16582, 16580, 16578, 16576, 16646, 16644, 16642, 16640,
+ 16742, 16740, 16738, 16736, 16838, 16836, 16834, 16832,
+ 16934, 16932, 16930, 16928, 17030, 17028, 17026, 17024,
+ 17126, 17124, 17122, 17120, 17222, 17220, 17218, 17216,
+ 17318, 17316, 17314, 17312, 17414, 17412, 17410, 17408,
+ 17510, 17508, 17506, 17504, 17606, 17604, 17602, 17600,
+ 17702, 17700, 17698, 17696, 17798, 17796, 17794, 17792,
+ 17894, 17892, 17890, 17888, 17990, 17988, 17986, 17984,
+ 18086, 18084, 18082, 18080, 18182, 18180, 18178, 18176,
+ 18246, 18244, 18242, 18240, 18342, 18340, 18338, 18336,
+ 18438, 18436, 18434, 18432, 18534, 18532, 18530, 18528,
+ 18630, 18628, 18626, 18624, 18726, 18724, 18722, 18720,
+ 18822, 18820, 18818, 18816, 18918, 18916, 18914, 18912,
+ 19014, 19012, 19010, 19008, 19110, 19108, 19106, 19104,
+ 19206, 19204, 19202, 19200, 19302, 19300, 19298, 19296,
+ 19398, 19396, 19394, 19392, 19494, 19492, 19490, 19488,
+ 19590, 19588, 19586, 19584, 19686, 19684, 19682, 19680,
+ 19782, 19780, 19778, 19776, },
+ /* 9 */
+ {78, 76, 74, 72, 174, 172, 170, 168,
+ 270, 268, 266, 264, 366, 364, 362, 360,
+ 462, 460, 458, 456, 558, 556, 554, 552,
+ 654, 652, 650, 648, 750, 748, 746, 744,
+ 846, 844, 842, 840, 942, 940, 938, 936,
+ 1038, 1036, 1034, 1032, 1134, 1132, 1130, 1128,
+ 1230, 1228, 1226, 1224, 1326, 1324, 1322, 1320,
+ 1422, 1420, 1418, 1416, 1518, 1516, 1514, 1512,
+ 1614, 1612, 1610, 1608, 1710, 1708, 1706, 1704,
+ 1774, 1772, 1770, 1768, 1870, 1868, 1866, 1864,
+ 1966, 1964, 1962, 1960, 2062, 2060, 2058, 2056,
+ 2158, 2156, 2154, 2152, 2254, 2252, 2250, 2248,
+ 2350, 2348, 2346, 2344, 2446, 2444, 2442, 2440,
+ 2542, 2540, 2538, 2536, 2638, 2636, 2634, 2632,
+ 2734, 2732, 2730, 2728, 2830, 2828, 2826, 2824,
+ 2926, 2924, 2922, 2920, 3022, 3020, 3018, 3016,
+ 3118, 3116, 3114, 3112, 3214, 3212, 3210, 3208,
+ 3310, 3308, 3306, 3304, 3374, 3372, 3370, 3368,
+ 3470, 3468, 3466, 3464, 3566, 3564, 3562, 3560,
+ 3662, 3660, 3658, 3656, 3758, 3756, 3754, 3752,
+ 3854, 3852, 3850, 3848, 3950, 3948, 3946, 3944,
+ 4046, 4044, 4042, 4040, 4142, 4140, 4138, 4136,
+ 4238, 4236, 4234, 4232, 4334, 4332, 4330, 4328,
+ 4430, 4428, 4426, 4424, 4526, 4524, 4522, 4520,
+ 4622, 4620, 4618, 4616, 4718, 4716, 4714, 4712,
+ 4814, 4812, 4810, 4808, 4910, 4908, 4906, 4904,
+ 5070, 5068, 5066, 5064, 5166, 5164, 5162, 5160,
+ 5262, 5260, 5258, 5256, 5358, 5356, 5354, 5352,
+ 5454, 5452, 5450, 5448, 5550, 5548, 5546, 5544,
+ 5646, 5644, 5642, 5640, 5742, 5740, 5738, 5736,
+ 5838, 5836, 5834, 5832, 5934, 5932, 5930, 5928,
+ 6030, 6028, 6026, 6024, 6126, 6124, 6122, 6120,
+ 6222, 6220, 6218, 6216, 6318, 6316, 6314, 6312,
+ 6414, 6412, 6410, 6408, 6510, 6508, 6506, 6504,
+ 6606, 6604, 6602, 6600, 6670, 6668, 6666, 6664,
+ 6766, 6764, 6762, 6760, 6862, 6860, 6858, 6856,
+ 6958, 6956, 6954, 6952, 7054, 7052, 7050, 7048,
+ 7150, 7148, 7146, 7144, 7246, 7244, 7242, 7240,
+ 7342, 7340, 7338, 7336, 7438, 7436, 7434, 7432,
+ 7534, 7532, 7530, 7528, 7630, 7628, 7626, 7624,
+ 7726, 7724, 7722, 7720, 7822, 7820, 7818, 7816,
+ 7918, 7916, 7914, 7912, 8014, 8012, 8010, 8008,
+ 8110, 8108, 8106, 8104, 8206, 8204, 8202, 8200,
+ 8302, 8300, 8298, 8296, 8366, 8364, 8362, 8360,
+ 8462, 8460, 8458, 8456, 8558, 8556, 8554, 8552,
+ 8654, 8652, 8650, 8648, 8750, 8748, 8746, 8744,
+ 8846, 8844, 8842, 8840, 8942, 8940, 8938, 8936,
+ 9038, 9036, 9034, 9032, 9134, 9132, 9130, 9128,
+ 9230, 9228, 9226, 9224, 9326, 9324, 9322, 9320,
+ 9422, 9420, 9418, 9416, 9518, 9516, 9514, 9512,
+ 9614, 9612, 9610, 9608, 9710, 9708, 9706, 9704,
+ 9806, 9804, 9802, 9800, 9902, 9900, 9898, 9896,
+ 10062, 10060, 10058, 10056, 10158, 10156, 10154, 10152,
+ 10254, 10252, 10250, 10248, 10350, 10348, 10346, 10344,
+ 10446, 10444, 10442, 10440, 10542, 10540, 10538, 10536,
+ 10638, 10636, 10634, 10632, 10734, 10732, 10730, 10728,
+ 10830, 10828, 10826, 10824, 10926, 10924, 10922, 10920,
+ 11022, 11020, 11018, 11016, 11118, 11116, 11114, 11112,
+ 11214, 11212, 11210, 11208, 11310, 11308, 11306, 11304,
+ 11406, 11404, 11402, 11400, 11502, 11500, 11498, 11496,
+ 11598, 11596, 11594, 11592, 11662, 11660, 11658, 11656,
+ 11758, 11756, 11754, 11752, 11854, 11852, 11850, 11848,
+ 11950, 11948, 11946, 11944, 12046, 12044, 12042, 12040,
+ 12142, 12140, 12138, 12136, 12238, 12236, 12234, 12232,
+ 12334, 12332, 12330, 12328, 12430, 12428, 12426, 12424,
+ 12526, 12524, 12522, 12520, 12622, 12620, 12618, 12616,
+ 12718, 12716, 12714, 12712, 12814, 12812, 12810, 12808,
+ 12910, 12908, 12906, 12904, 13006, 13004, 13002, 13000,
+ 13102, 13100, 13098, 13096, 13198, 13196, 13194, 13192,
+ 13262, 13260, 13258, 13256, 13358, 13356, 13354, 13352,
+ 13454, 13452, 13450, 13448, 13550, 13548, 13546, 13544,
+ 13646, 13644, 13642, 13640, 13742, 13740, 13738, 13736,
+ 13838, 13836, 13834, 13832, 13934, 13932, 13930, 13928,
+ 14030, 14028, 14026, 14024, 14126, 14124, 14122, 14120,
+ 14222, 14220, 14218, 14216, 14318, 14316, 14314, 14312,
+ 14414, 14412, 14410, 14408, 14510, 14508, 14506, 14504,
+ 14606, 14604, 14602, 14600, 14702, 14700, 14698, 14696,
+ 14798, 14796, 14794, 14792, 14894, 14892, 14890, 14888,
+ 15054, 15052, 15050, 15048, 15150, 15148, 15146, 15144,
+ 15246, 15244, 15242, 15240, 15342, 15340, 15338, 15336,
+ 15438, 15436, 15434, 15432, 15534, 15532, 15530, 15528,
+ 15630, 15628, 15626, 15624, 15726, 15724, 15722, 15720,
+ 15822, 15820, 15818, 15816, 15918, 15916, 15914, 15912,
+ 16014, 16012, 16010, 16008, 16110, 16108, 16106, 16104,
+ 16206, 16204, 16202, 16200, 16302, 16300, 16298, 16296,
+ 16398, 16396, 16394, 16392, 16494, 16492, 16490, 16488,
+ 16590, 16588, 16586, 16584, 16654, 16652, 16650, 16648,
+ 16750, 16748, 16746, 16744, 16846, 16844, 16842, 16840,
+ 16942, 16940, 16938, 16936, 17038, 17036, 17034, 17032,
+ 17134, 17132, 17130, 17128, 17230, 17228, 17226, 17224,
+ 17326, 17324, 17322, 17320, 17422, 17420, 17418, 17416,
+ 17518, 17516, 17514, 17512, 17614, 17612, 17610, 17608,
+ 17710, 17708, 17706, 17704, 17806, 17804, 17802, 17800,
+ 17902, 17900, 17898, 17896, 17998, 17996, 17994, 17992,
+ 18094, 18092, 18090, 18088, 18190, 18188, 18186, 18184,
+ 18254, 18252, 18250, 18248, 18350, 18348, 18346, 18344,
+ 18446, 18444, 18442, 18440, 18542, 18540, 18538, 18536,
+ 18638, 18636, 18634, 18632, 18734, 18732, 18730, 18728,
+ 18830, 18828, 18826, 18824, 18926, 18924, 18922, 18920,
+ 19022, 19020, 19018, 19016, 19118, 19116, 19114, 19112,
+ 19214, 19212, 19210, 19208, 19310, 19308, 19306, 19304,
+ 19406, 19404, 19402, 19400, 19502, 19500, 19498, 19496,
+ 19598, 19596, 19594, 19592, 19694, 19692, 19690, 19688,
+ 19790, 19788, 19786, 19784, },
+ /* 10 */
+ {86, 84, 82, 80, 182, 180, 178, 176,
+ 278, 276, 274, 272, 374, 372, 370, 368,
+ 470, 468, 466, 464, 566, 564, 562, 560,
+ 662, 660, 658, 656, 758, 756, 754, 752,
+ 854, 852, 850, 848, 950, 948, 946, 944,
+ 1046, 1044, 1042, 1040, 1142, 1140, 1138, 1136,
+ 1238, 1236, 1234, 1232, 1334, 1332, 1330, 1328,
+ 1430, 1428, 1426, 1424, 1526, 1524, 1522, 1520,
+ 1622, 1620, 1618, 1616, 1718, 1716, 1714, 1712,
+ 1782, 1780, 1778, 1776, 1878, 1876, 1874, 1872,
+ 1974, 1972, 1970, 1968, 2070, 2068, 2066, 2064,
+ 2166, 2164, 2162, 2160, 2262, 2260, 2258, 2256,
+ 2358, 2356, 2354, 2352, 2454, 2452, 2450, 2448,
+ 2550, 2548, 2546, 2544, 2646, 2644, 2642, 2640,
+ 2742, 2740, 2738, 2736, 2838, 2836, 2834, 2832,
+ 2934, 2932, 2930, 2928, 3030, 3028, 3026, 3024,
+ 3126, 3124, 3122, 3120, 3222, 3220, 3218, 3216,
+ 3318, 3316, 3314, 3312, 3382, 3380, 3378, 3376,
+ 3478, 3476, 3474, 3472, 3574, 3572, 3570, 3568,
+ 3670, 3668, 3666, 3664, 3766, 3764, 3762, 3760,
+ 3862, 3860, 3858, 3856, 3958, 3956, 3954, 3952,
+ 4054, 4052, 4050, 4048, 4150, 4148, 4146, 4144,
+ 4246, 4244, 4242, 4240, 4342, 4340, 4338, 4336,
+ 4438, 4436, 4434, 4432, 4534, 4532, 4530, 4528,
+ 4630, 4628, 4626, 4624, 4726, 4724, 4722, 4720,
+ 4822, 4820, 4818, 4816, 4918, 4916, 4914, 4912,
+ 5078, 5076, 5074, 5072, 5174, 5172, 5170, 5168,
+ 5270, 5268, 5266, 5264, 5366, 5364, 5362, 5360,
+ 5462, 5460, 5458, 5456, 5558, 5556, 5554, 5552,
+ 5654, 5652, 5650, 5648, 5750, 5748, 5746, 5744,
+ 5846, 5844, 5842, 5840, 5942, 5940, 5938, 5936,
+ 6038, 6036, 6034, 6032, 6134, 6132, 6130, 6128,
+ 6230, 6228, 6226, 6224, 6326, 6324, 6322, 6320,
+ 6422, 6420, 6418, 6416, 6518, 6516, 6514, 6512,
+ 6614, 6612, 6610, 6608, 6678, 6676, 6674, 6672,
+ 6774, 6772, 6770, 6768, 6870, 6868, 6866, 6864,
+ 6966, 6964, 6962, 6960, 7062, 7060, 7058, 7056,
+ 7158, 7156, 7154, 7152, 7254, 7252, 7250, 7248,
+ 7350, 7348, 7346, 7344, 7446, 7444, 7442, 7440,
+ 7542, 7540, 7538, 7536, 7638, 7636, 7634, 7632,
+ 7734, 7732, 7730, 7728, 7830, 7828, 7826, 7824,
+ 7926, 7924, 7922, 7920, 8022, 8020, 8018, 8016,
+ 8118, 8116, 8114, 8112, 8214, 8212, 8210, 8208,
+ 8310, 8308, 8306, 8304, 8374, 8372, 8370, 8368,
+ 8470, 8468, 8466, 8464, 8566, 8564, 8562, 8560,
+ 8662, 8660, 8658, 8656, 8758, 8756, 8754, 8752,
+ 8854, 8852, 8850, 8848, 8950, 8948, 8946, 8944,
+ 9046, 9044, 9042, 9040, 9142, 9140, 9138, 9136,
+ 9238, 9236, 9234, 9232, 9334, 9332, 9330, 9328,
+ 9430, 9428, 9426, 9424, 9526, 9524, 9522, 9520,
+ 9622, 9620, 9618, 9616, 9718, 9716, 9714, 9712,
+ 9814, 9812, 9810, 9808, 9910, 9908, 9906, 9904,
+ 10070, 10068, 10066, 10064, 10166, 10164, 10162, 10160,
+ 10262, 10260, 10258, 10256, 10358, 10356, 10354, 10352,
+ 10454, 10452, 10450, 10448, 10550, 10548, 10546, 10544,
+ 10646, 10644, 10642, 10640, 10742, 10740, 10738, 10736,
+ 10838, 10836, 10834, 10832, 10934, 10932, 10930, 10928,
+ 11030, 11028, 11026, 11024, 11126, 11124, 11122, 11120,
+ 11222, 11220, 11218, 11216, 11318, 11316, 11314, 11312,
+ 11414, 11412, 11410, 11408, 11510, 11508, 11506, 11504,
+ 11606, 11604, 11602, 11600, 11670, 11668, 11666, 11664,
+ 11766, 11764, 11762, 11760, 11862, 11860, 11858, 11856,
+ 11958, 11956, 11954, 11952, 12054, 12052, 12050, 12048,
+ 12150, 12148, 12146, 12144, 12246, 12244, 12242, 12240,
+ 12342, 12340, 12338, 12336, 12438, 12436, 12434, 12432,
+ 12534, 12532, 12530, 12528, 12630, 12628, 12626, 12624,
+ 12726, 12724, 12722, 12720, 12822, 12820, 12818, 12816,
+ 12918, 12916, 12914, 12912, 13014, 13012, 13010, 13008,
+ 13110, 13108, 13106, 13104, 13206, 13204, 13202, 13200,
+ 13270, 13268, 13266, 13264, 13366, 13364, 13362, 13360,
+ 13462, 13460, 13458, 13456, 13558, 13556, 13554, 13552,
+ 13654, 13652, 13650, 13648, 13750, 13748, 13746, 13744,
+ 13846, 13844, 13842, 13840, 13942, 13940, 13938, 13936,
+ 14038, 14036, 14034, 14032, 14134, 14132, 14130, 14128,
+ 14230, 14228, 14226, 14224, 14326, 14324, 14322, 14320,
+ 14422, 14420, 14418, 14416, 14518, 14516, 14514, 14512,
+ 14614, 14612, 14610, 14608, 14710, 14708, 14706, 14704,
+ 14806, 14804, 14802, 14800, 14902, 14900, 14898, 14896,
+ 15062, 15060, 15058, 15056, 15158, 15156, 15154, 15152,
+ 15254, 15252, 15250, 15248, 15350, 15348, 15346, 15344,
+ 15446, 15444, 15442, 15440, 15542, 15540, 15538, 15536,
+ 15638, 15636, 15634, 15632, 15734, 15732, 15730, 15728,
+ 15830, 15828, 15826, 15824, 15926, 15924, 15922, 15920,
+ 16022, 16020, 16018, 16016, 16118, 16116, 16114, 16112,
+ 16214, 16212, 16210, 16208, 16310, 16308, 16306, 16304,
+ 16406, 16404, 16402, 16400, 16502, 16500, 16498, 16496,
+ 16598, 16596, 16594, 16592, 16662, 16660, 16658, 16656,
+ 16758, 16756, 16754, 16752, 16854, 16852, 16850, 16848,
+ 16950, 16948, 16946, 16944, 17046, 17044, 17042, 17040,
+ 17142, 17140, 17138, 17136, 17238, 17236, 17234, 17232,
+ 17334, 17332, 17330, 17328, 17430, 17428, 17426, 17424,
+ 17526, 17524, 17522, 17520, 17622, 17620, 17618, 17616,
+ 17718, 17716, 17714, 17712, 17814, 17812, 17810, 17808,
+ 17910, 17908, 17906, 17904, 18006, 18004, 18002, 18000,
+ 18102, 18100, 18098, 18096, 18198, 18196, 18194, 18192,
+ 18262, 18260, 18258, 18256, 18358, 18356, 18354, 18352,
+ 18454, 18452, 18450, 18448, 18550, 18548, 18546, 18544,
+ 18646, 18644, 18642, 18640, 18742, 18740, 18738, 18736,
+ 18838, 18836, 18834, 18832, 18934, 18932, 18930, 18928,
+ 19030, 19028, 19026, 19024, 19126, 19124, 19122, 19120,
+ 19222, 19220, 19218, 19216, 19318, 19316, 19314, 19312,
+ 19414, 19412, 19410, 19408, 19510, 19508, 19506, 19504,
+ 19606, 19604, 19602, 19600, 19702, 19700, 19698, 19696,
+ 19798, 19796, 19794, 19792, },
+ /* 11 */
+ {94, 92, 90, 88, 190, 188, 186, 184,
+ 286, 284, 282, 280, 382, 380, 378, 376,
+ 478, 476, 474, 472, 574, 572, 570, 568,
+ 670, 668, 666, 664, 766, 764, 762, 760,
+ 862, 860, 858, 856, 958, 956, 954, 952,
+ 1054, 1052, 1050, 1048, 1150, 1148, 1146, 1144,
+ 1246, 1244, 1242, 1240, 1342, 1340, 1338, 1336,
+ 1438, 1436, 1434, 1432, 1534, 1532, 1530, 1528,
+ 1630, 1628, 1626, 1624, 1726, 1724, 1722, 1720,
+ 1790, 1788, 1786, 1784, 1886, 1884, 1882, 1880,
+ 1982, 1980, 1978, 1976, 2078, 2076, 2074, 2072,
+ 2174, 2172, 2170, 2168, 2270, 2268, 2266, 2264,
+ 2366, 2364, 2362, 2360, 2462, 2460, 2458, 2456,
+ 2558, 2556, 2554, 2552, 2654, 2652, 2650, 2648,
+ 2750, 2748, 2746, 2744, 2846, 2844, 2842, 2840,
+ 2942, 2940, 2938, 2936, 3038, 3036, 3034, 3032,
+ 3134, 3132, 3130, 3128, 3230, 3228, 3226, 3224,
+ 3326, 3324, 3322, 3320, 3390, 3388, 3386, 3384,
+ 3486, 3484, 3482, 3480, 3582, 3580, 3578, 3576,
+ 3678, 3676, 3674, 3672, 3774, 3772, 3770, 3768,
+ 3870, 3868, 3866, 3864, 3966, 3964, 3962, 3960,
+ 4062, 4060, 4058, 4056, 4158, 4156, 4154, 4152,
+ 4254, 4252, 4250, 4248, 4350, 4348, 4346, 4344,
+ 4446, 4444, 4442, 4440, 4542, 4540, 4538, 4536,
+ 4638, 4636, 4634, 4632, 4734, 4732, 4730, 4728,
+ 4830, 4828, 4826, 4824, 4926, 4924, 4922, 4920,
+ 5086, 5084, 5082, 5080, 5182, 5180, 5178, 5176,
+ 5278, 5276, 5274, 5272, 5374, 5372, 5370, 5368,
+ 5470, 5468, 5466, 5464, 5566, 5564, 5562, 5560,
+ 5662, 5660, 5658, 5656, 5758, 5756, 5754, 5752,
+ 5854, 5852, 5850, 5848, 5950, 5948, 5946, 5944,
+ 6046, 6044, 6042, 6040, 6142, 6140, 6138, 6136,
+ 6238, 6236, 6234, 6232, 6334, 6332, 6330, 6328,
+ 6430, 6428, 6426, 6424, 6526, 6524, 6522, 6520,
+ 6622, 6620, 6618, 6616, 6686, 6684, 6682, 6680,
+ 6782, 6780, 6778, 6776, 6878, 6876, 6874, 6872,
+ 6974, 6972, 6970, 6968, 7070, 7068, 7066, 7064,
+ 7166, 7164, 7162, 7160, 7262, 7260, 7258, 7256,
+ 7358, 7356, 7354, 7352, 7454, 7452, 7450, 7448,
+ 7550, 7548, 7546, 7544, 7646, 7644, 7642, 7640,
+ 7742, 7740, 7738, 7736, 7838, 7836, 7834, 7832,
+ 7934, 7932, 7930, 7928, 8030, 8028, 8026, 8024,
+ 8126, 8124, 8122, 8120, 8222, 8220, 8218, 8216,
+ 8318, 8316, 8314, 8312, 8382, 8380, 8378, 8376,
+ 8478, 8476, 8474, 8472, 8574, 8572, 8570, 8568,
+ 8670, 8668, 8666, 8664, 8766, 8764, 8762, 8760,
+ 8862, 8860, 8858, 8856, 8958, 8956, 8954, 8952,
+ 9054, 9052, 9050, 9048, 9150, 9148, 9146, 9144,
+ 9246, 9244, 9242, 9240, 9342, 9340, 9338, 9336,
+ 9438, 9436, 9434, 9432, 9534, 9532, 9530, 9528,
+ 9630, 9628, 9626, 9624, 9726, 9724, 9722, 9720,
+ 9822, 9820, 9818, 9816, 9918, 9916, 9914, 9912,
+ 10078, 10076, 10074, 10072, 10174, 10172, 10170, 10168,
+ 10270, 10268, 10266, 10264, 10366, 10364, 10362, 10360,
+ 10462, 10460, 10458, 10456, 10558, 10556, 10554, 10552,
+ 10654, 10652, 10650, 10648, 10750, 10748, 10746, 10744,
+ 10846, 10844, 10842, 10840, 10942, 10940, 10938, 10936,
+ 11038, 11036, 11034, 11032, 11134, 11132, 11130, 11128,
+ 11230, 11228, 11226, 11224, 11326, 11324, 11322, 11320,
+ 11422, 11420, 11418, 11416, 11518, 11516, 11514, 11512,
+ 11614, 11612, 11610, 11608, 11678, 11676, 11674, 11672,
+ 11774, 11772, 11770, 11768, 11870, 11868, 11866, 11864,
+ 11966, 11964, 11962, 11960, 12062, 12060, 12058, 12056,
+ 12158, 12156, 12154, 12152, 12254, 12252, 12250, 12248,
+ 12350, 12348, 12346, 12344, 12446, 12444, 12442, 12440,
+ 12542, 12540, 12538, 12536, 12638, 12636, 12634, 12632,
+ 12734, 12732, 12730, 12728, 12830, 12828, 12826, 12824,
+ 12926, 12924, 12922, 12920, 13022, 13020, 13018, 13016,
+ 13118, 13116, 13114, 13112, 13214, 13212, 13210, 13208,
+ 13278, 13276, 13274, 13272, 13374, 13372, 13370, 13368,
+ 13470, 13468, 13466, 13464, 13566, 13564, 13562, 13560,
+ 13662, 13660, 13658, 13656, 13758, 13756, 13754, 13752,
+ 13854, 13852, 13850, 13848, 13950, 13948, 13946, 13944,
+ 14046, 14044, 14042, 14040, 14142, 14140, 14138, 14136,
+ 14238, 14236, 14234, 14232, 14334, 14332, 14330, 14328,
+ 14430, 14428, 14426, 14424, 14526, 14524, 14522, 14520,
+ 14622, 14620, 14618, 14616, 14718, 14716, 14714, 14712,
+ 14814, 14812, 14810, 14808, 14910, 14908, 14906, 14904,
+ 15070, 15068, 15066, 15064, 15166, 15164, 15162, 15160,
+ 15262, 15260, 15258, 15256, 15358, 15356, 15354, 15352,
+ 15454, 15452, 15450, 15448, 15550, 15548, 15546, 15544,
+ 15646, 15644, 15642, 15640, 15742, 15740, 15738, 15736,
+ 15838, 15836, 15834, 15832, 15934, 15932, 15930, 15928,
+ 16030, 16028, 16026, 16024, 16126, 16124, 16122, 16120,
+ 16222, 16220, 16218, 16216, 16318, 16316, 16314, 16312,
+ 16414, 16412, 16410, 16408, 16510, 16508, 16506, 16504,
+ 16606, 16604, 16602, 16600, 16670, 16668, 16666, 16664,
+ 16766, 16764, 16762, 16760, 16862, 16860, 16858, 16856,
+ 16958, 16956, 16954, 16952, 17054, 17052, 17050, 17048,
+ 17150, 17148, 17146, 17144, 17246, 17244, 17242, 17240,
+ 17342, 17340, 17338, 17336, 17438, 17436, 17434, 17432,
+ 17534, 17532, 17530, 17528, 17630, 17628, 17626, 17624,
+ 17726, 17724, 17722, 17720, 17822, 17820, 17818, 17816,
+ 17918, 17916, 17914, 17912, 18014, 18012, 18010, 18008,
+ 18110, 18108, 18106, 18104, 18206, 18204, 18202, 18200,
+ 18270, 18268, 18266, 18264, 18366, 18364, 18362, 18360,
+ 18462, 18460, 18458, 18456, 18558, 18556, 18554, 18552,
+ 18654, 18652, 18650, 18648, 18750, 18748, 18746, 18744,
+ 18846, 18844, 18842, 18840, 18942, 18940, 18938, 18936,
+ 19038, 19036, 19034, 19032, 19134, 19132, 19130, 19128,
+ 19230, 19228, 19226, 19224, 19326, 19324, 19322, 19320,
+ 19422, 19420, 19418, 19416, 19518, 19516, 19514, 19512,
+ 19614, 19612, 19610, 19608, 19710, 19708, 19706, 19704,
+ 19806, 19804, 19802, 19800, },
+};
+
diff --git a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
index 844359333d..ca4c6a6099 100644
--- a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
+++ b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
@@ -1732,6 +1732,16 @@ namespace gr {
m_64apsk[62] = gr_complex( 7.0, -7.0);
m_64apsk[63] = gr_complex( 7.0, 7.0);
break;
+ case MOD_8VSB:
+ m_8psk[0] = gr_complex(-7.0 + 1.25, 0.0);
+ m_8psk[1] = gr_complex(-5.0 + 1.25, 0.0);
+ m_8psk[2] = gr_complex(-3.0 + 1.25, 0.0);
+ m_8psk[3] = gr_complex(-1.0 + 1.25, 0.0);
+ m_8psk[4] = gr_complex( 1.0 + 1.25, 0.0);
+ m_8psk[5] = gr_complex( 3.0 + 1.25, 0.0);
+ m_8psk[6] = gr_complex( 5.0 + 1.25, 0.0);
+ m_8psk[7] = gr_complex( 7.0 + 1.25, 0.0);
+ break;
default:
m_qpsk[0] = gr_complex((r1 * cos(M_PI / 4.0)), (r1 * sin(M_PI / 4.0)));
m_qpsk[1] = gr_complex((r1 * cos(7 * M_PI / 4.0)), (r1 * sin(7 * M_PI / 4.0)));
@@ -1791,6 +1801,7 @@ namespace gr {
}
break;
case MOD_8PSK:
+ case MOD_8VSB:
case MOD_8APSK:
for (int i = 0; i < noutput_items; i++) {
index = *in++;
diff --git a/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc b/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc
index d2bfb3d9d2..a5a9847812 100644
--- a/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc
+++ b/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc
@@ -118,8 +118,9 @@ namespace gr {
void
dvbt_bit_inner_interleaver_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
{
- ninput_items_required[0] = noutput_items;
- ninput_items_required[1] = noutput_items;
+ unsigned ninputs = ninput_items_required.size();
+ for (unsigned i = 0; i < ninputs; i++)
+ ninput_items_required[i] = noutput_items;
}
int
diff --git a/gr-uhd/apps/uhd_app.py b/gr-uhd/apps/uhd_app.py
index ff4412a140..652a9fbab6 100644
--- a/gr-uhd/apps/uhd_app.py
+++ b/gr-uhd/apps/uhd_app.py
@@ -42,12 +42,25 @@ LONG_TPL = """{prefix} Motherboard: {mb_id} ({mb_serial})
"""
class UHDApp(object):
+ " Base class for simple UHD-based applications "
def __init__(self, prefix=None, args=None):
self.prefix = prefix
self.args = args
self.verbose = args.verbose or 0
if self.args.sync == 'auto' and len(self.args.channels) > 1:
self.args.sync = 'pps'
+ self.antenna = None
+ self.gain_range = None
+ self.samp_rate = None
+ self.has_lo_sensor = None
+ self.async_msgq = None
+ self.async_src = None
+ self.async_rcv = None
+ self.tr = None
+ self.gain = None
+ self.freq = None
+ self.channels = None
+ self.cpu_format = None
def vprint(self, *args):
"""
@@ -78,7 +91,7 @@ class UHDApp(object):
if info_pp['mb_serial'] == "":
info_pp['mb_serial'] = "no serial"
info_pp['db_subdev'] = usrp_info["{xx}_subdev_name".format(xx=tx_or_rx)]
- info_pp['db_serial'] = ", " + usrp_info["{xx}_serial".format(xx=tx_or_rx)]
+ info_pp['db_serial'] = ", " + usrp_info["{xx}_serial".format(xx=tx_or_rx)]
if info_pp['db_serial'] == "":
info_pp['db_serial'] = "no serial"
info_pp['subdev'] = self.usrp.get_subdev_spec(mboard)
@@ -112,12 +125,12 @@ class UHDApp(object):
"""
Call this when USRP async metadata needs printing.
"""
- md = self.async_src.msg_to_async_metadata_t(msg)
+ metadata = self.async_src.msg_to_async_metadata_t(msg)
print("[{prefix}] Channel: {chan} Time: {t} Event: {e}".format(
prefix=self.prefix,
- chan=md.channel,
- t=md.time_spec.get_real_secs(),
- e=md.event_code,
+ chan=metadata.channel,
+ t=metadata.time_spec.get_real_secs(),
+ e=metadata.event_code,
))
def setup_usrp(self, ctor, args, cpu_format='fc32'):
@@ -141,9 +154,13 @@ class UHDApp(object):
if args.spec:
for mb_idx in xrange(self.usrp.get_num_mboards()):
self.usrp.set_subdev_spec(args.spec, mb_idx)
- # Set the clock source:
+ # Set the clock and/or time source:
if args.clock_source is not None:
- self.usrp.set_clock_source(args.clock_source)
+ for mb_idx in xrange(self.usrp.get_num_mboards()):
+ self.usrp.set_clock_source(args.clock_source, mb_idx)
+ if args.time_source is not None:
+ for mb_idx in xrange(self.usrp.get_num_mboards()):
+ self.usrp.set_time_source(args.time_source, mb_idx)
# Sampling rate:
self.usrp.set_samp_rate(args.samp_rate)
self.samp_rate = self.usrp.get_samp_rate()
@@ -153,7 +170,7 @@ class UHDApp(object):
if self.antenna is not None:
for i, chan in enumerate(self.channels):
if not self.antenna[i] in self.usrp.get_antennas(chan):
- self.vprint("[ERROR] {} is not a valid antenna name for this USRP device!".format(ant))
+ self.vprint("[ERROR] {} is not a valid antenna name for this USRP device!".format(self.antenna[i]))
exit(1)
self.usrp.set_antenna(self.antenna[i], chan)
self.vprint("[{prefix}] Channel {chan}: Using antenna {ant}.".format(
@@ -310,5 +327,7 @@ class UHDApp(object):
default='auto', help="Set to 'pps' to sync devices to PPS")
group.add_argument("--clock-source",
help="Set the clock source; typically 'internal', 'external' or 'gpsdo'")
+ group.add_argument("--time-source",
+ help="Set the time source")
return parser
diff --git a/gr-uhd/apps/uhd_fft b/gr-uhd/apps/uhd_fft
index bb557e96f0..aa10cdf900 100755
--- a/gr-uhd/apps/uhd_fft
+++ b/gr-uhd/apps/uhd_fft
@@ -1,6 +1,6 @@
#!/usr/bin/env python2
#
-# Copyright 2015 Free Software Foundation, Inc.
+# Copyright 2015-2016 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -277,7 +277,37 @@ class uhd_fft(gr.top_block, Qt.QWidget, UHDApp):
_freeze_scope_thread = threading.Thread(target=lambda: _freeze_scaling(self.qtgui_time_sink_x_0, 2.0))
_freeze_scope_thread.daemon = True
_freeze_scope_thread.start()
-
+ if args.phase_relations and len(self.channels) > 1:
+ self.display_widget_phase = Qt.QWidget()
+ self.display_layout_phase = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.display_widget_phase)
+ self.display_grid_layout_phase = Qt.QGridLayout()
+ self.display_layout_phase.addLayout(self.display_grid_layout_phase)
+ self.display.addTab(self.display_widget_phase, "Rel. Phase")
+ self.qtgui_phase_plot = qtgui.time_sink_f(
+ 1024, #size
+ self.samp_rate, #samp_rate
+ "", #name
+ len(self.channels) - 1
+ )
+ self.qtgui_phase_plot.set_update_time(self.update_rate)
+ self.qtgui_phase_plot.set_y_axis(-3.5, 3.5)
+ self.qtgui_phase_plot.set_y_label("Relative Phase", "")
+ self.qtgui_phase_plot.enable_tags(-1, True)
+ self.qtgui_phase_plot.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "")
+ self.qtgui_phase_plot.enable_autoscale(False)
+ self.qtgui_phase_plot.enable_grid(True)
+ self.qtgui_phase_plot.enable_control_panel(True)
+ self.qtgui_phase_plot.disable_legend()
+ for i in xrange(len(self.channels) - 1):
+ self.qtgui_phase_plot.set_line_label(i, "Phase Delta Channels {0}/{1}".format(i, i+1))
+ self.qtgui_phase_plot.set_line_width(i, widths[i])
+ self.qtgui_phase_plot.set_line_color(i, colors[i])
+ self.qtgui_phase_plot.set_line_style(i, styles[i])
+ self.qtgui_phase_plot.set_line_marker(i, markers[i])
+ self.qtgui_phase_plot.set_line_alpha(i, alphas[i])
+ self._qtgui_phase_plot_win = sip.wrapinstance(self.qtgui_phase_plot.pyqwidget(), Qt.QWidget)
+ self.display_grid_layout_phase.addWidget(self._qtgui_phase_plot_win, 0,0,1,4)
+ ### Other widgets ###################################################
self._lo_locked_probe_tool_bar = Qt.QToolBar(self)
self._lo_locked_probe_formatter = lambda x: {True: 'Yes', False: 'No'}[x]
if self.has_lo_sensor:
@@ -317,10 +347,24 @@ class uhd_fft(gr.top_block, Qt.QWidget, UHDApp):
##################################################
self.msg_connect((self.qtgui_freq_sink_x_0, 'freq'), (self.qtgui_freq_sink_x_0, 'freq'))
self.msg_connect((self.qtgui_freq_sink_x_0, 'freq'), (self.usrp, 'command'))
- for c in self.channels:
- self.connect((self.usrp, c), (self.qtgui_freq_sink_x_0, c))
- self.connect((self.usrp, c), (self.qtgui_time_sink_x_0, c))
- self.connect((self.usrp, c), (self.qtgui_waterfall_sink_x_0, c))
+ for c, idx in enumerate(self.channels):
+ self.connect((self.usrp, c), (self.qtgui_freq_sink_x_0, idx))
+ self.connect((self.usrp, c), (self.qtgui_time_sink_x_0, idx))
+ self.connect((self.usrp, c), (self.qtgui_waterfall_sink_x_0, idx))
+ if args.phase_relations and len(self.channels) > 1:
+ for c, idx in enumerate(self.channels[:-1]):
+ self.connect_phase_plot(
+ (self.usrp, c),
+ (self.usrp, self.channels[idx+1]),
+ (self.qtgui_phase_plot, idx)
+ )
+
+ def connect_phase_plot(self, src_port1, src_port2, dst_port):
+ " Calculate relative phase between two src ports and send it dst_port "
+ from gnuradio import blocks
+ multiplier = blocks.multiply_cc()
+ self.connect(src_port1, (multiplier, 0), blocks.complex_to_arg(), dst_port)
+ self.connect(src_port2, blocks.conjugate_cc(), (multiplier, 1))
def closeEvent(self, event):
self.settings = Qt.QSettings("GNU Radio", "uhd_fft")
@@ -417,6 +461,8 @@ def setup_argparser():
help="Specify FFT average alpha (overrides --fft-average)")
group.add_argument("--update-rate", dest="update_rate", type=eng_arg.eng_float, default=eng_notation.num_to_str(.1),
help="Set GUI widget update rate")
+ group.add_argument("--phase-relations", action="store_true",
+ help="Plot relative phases between multiple channels")
return parser
diff --git a/gr-uhd/apps/uhd_siggen_base.py b/gr-uhd/apps/uhd_siggen_base.py
index 31415dac41..cc699dd145 100644
--- a/gr-uhd/apps/uhd_siggen_base.py
+++ b/gr-uhd/apps/uhd_siggen_base.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python
#
# Copyright 2008,2009,2011,2012,2015 Free Software Foundation, Inc.
#
@@ -23,6 +23,17 @@
Provide a base flow graph for USRP signal generators.
"""
+from __future__ import print_function
+import math
+try:
+ from uhd_app import UHDApp
+except ImportError:
+ from gnuradio.uhd.uhd_app import UHDApp
+from gnuradio import gr, uhd, eng_notation, eng_arg
+from gnuradio import analog
+from gnuradio import blocks
+from gnuradio.gr.pubsub import pubsub
+
DESC_KEY = 'desc'
SAMP_RATE_KEY = 'samp_rate'
LINK_RATE_KEY = 'link_rate'
@@ -39,26 +50,9 @@ FREQ_RANGE_KEY = 'freq_range'
GAIN_RANGE_KEY = 'gain_range'
TYPE_KEY = 'type'
-# FIXME figure out if this can be deleted
-#def setter(ps, key, val): ps[key] = val
-
-import sys
-import math
-import argparse
-try:
- from uhd_app import UHDApp
-except ImportError:
- from gnuradio.uhd.uhd_app import UHDApp
-from gnuradio import gr, gru, uhd, eng_notation, eng_arg
-from gnuradio import analog
-from gnuradio import blocks
-from gnuradio.gr.pubsub import pubsub
-from gnuradio.eng_option import eng_option
-from optparse import OptionParser
-
n2s = eng_notation.num_to_str
-waveforms = {
+WAVEFORMS = {
analog.GR_CONST_WAVE : "Constant",
analog.GR_SIN_WAVE : "Complex Sinusoid",
analog.GR_GAUSSIAN : "Gaussian Noise",
@@ -78,6 +72,11 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp):
UHDApp.__init__(self, args=args, prefix="UHD-SIGGEN")
self.extra_sink = None
+ # Allocate some attributes
+ self._src1 = None
+ self._src2 = None
+ self._src = None
+
# Initialize device:
self.setup_usrp(
ctor=uhd.usrp_sink,
@@ -121,13 +120,13 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp):
self[key] = self[key]
self[TYPE_KEY] = args.type #set type last
- def set_samp_rate(self, sr):
+ def set_samp_rate(self, samp_rate):
"""
When sampling rate is updated, also update the signal sources.
"""
- self.vprint("Setting sampling rate to: {rate} Msps".format(rate=sr/1e6))
- self.usrp.set_samp_rate(sr)
- sr = self.usrp.get_samp_rate()
+ self.vprint("Setting sampling rate to: {rate} Msps".format(rate=samp_rate/1e6))
+ self.usrp.set_samp_rate(samp_rate)
+ samp_rate = self.usrp.get_samp_rate()
if self[TYPE_KEY] in (analog.GR_SIN_WAVE, analog.GR_CONST_WAVE):
self._src.set_sampling_freq(self[SAMP_RATE_KEY])
elif self[TYPE_KEY] == "2tone":
@@ -138,10 +137,11 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp):
self._src2.set_sampling_freq(self[WAVEFORM_FREQ_KEY]*2*math.pi/self[SAMP_RATE_KEY])
else:
return True # Waveform not yet set
- self.vprint("Set sample rate to: {rate} Msps".format(rate=sr/1e6))
+ self.vprint("Set sample rate to: {rate} Msps".format(rate=samp_rate/1e6))
return True
def set_waveform_freq(self, freq):
+ " Change the frequency 1 of the generated waveform "
if self[TYPE_KEY] == analog.GR_SIN_WAVE:
self._src.set_frequency(freq)
elif self[TYPE_KEY] == "2tone":
@@ -152,6 +152,10 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp):
return True
def set_waveform2_freq(self, freq):
+ """
+ Change the frequency 2 of the generated waveform. This only
+ applies to 2-tone and sweep.
+ """
if freq is None:
self[WAVEFORM2_FREQ_KEY] = -self[WAVEFORM_FREQ_KEY]
return
@@ -161,19 +165,22 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp):
self._src1.set_frequency(freq)
return True
- def set_waveform(self, type):
+ def set_waveform(self, waveform_type):
+ """
+ Select the generated waveform
+ """
self.vprint("Selecting waveform...")
self.lock()
self.disconnect_all()
- if type == analog.GR_SIN_WAVE or type == analog.GR_CONST_WAVE:
+ if waveform_type == analog.GR_SIN_WAVE or waveform_type == analog.GR_CONST_WAVE:
self._src = analog.sig_source_c(self[SAMP_RATE_KEY], # Sample rate
- type, # Waveform type
+ waveform_type, # Waveform waveform_type
self[WAVEFORM_FREQ_KEY], # Waveform frequency
self[AMPLITUDE_KEY], # Waveform amplitude
self[WAVEFORM_OFFSET_KEY]) # Waveform offset
- elif type == analog.GR_GAUSSIAN or type == analog.GR_UNIFORM:
- self._src = analog.noise_source_c(type, self[AMPLITUDE_KEY])
- elif type == "2tone":
+ elif waveform_type == analog.GR_GAUSSIAN or waveform_type == analog.GR_UNIFORM:
+ self._src = analog.noise_source_c(waveform_type, self[AMPLITUDE_KEY])
+ elif waveform_type == "2tone":
self._src1 = analog.sig_source_c(self[SAMP_RATE_KEY],
analog.GR_SIN_WAVE,
self[WAVEFORM_FREQ_KEY],
@@ -187,9 +194,9 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp):
self[AMPLITUDE_KEY]/2.0,
0)
self._src = blocks.add_cc()
- self.connect(self._src1,(self._src,0))
- self.connect(self._src2,(self._src,1))
- elif type == "sweep":
+ self.connect(self._src1, (self._src, 0))
+ self.connect(self._src2, (self._src, 1))
+ elif waveform_type == "sweep":
# rf freq is center frequency
# waveform_freq is total swept width
# waveform2_freq is sweep rate
@@ -205,21 +212,21 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp):
self._src = blocks.multiply_const_cc(self[AMPLITUDE_KEY])
self.connect(self._src1, self._src2, self._src)
else:
- raise RuntimeError("[UHD-SIGGEN] Unknown waveform type")
- for c in xrange(len(self.channels)):
- self.connect(self._src, (self.usrp, c))
+ raise RuntimeError("[UHD-SIGGEN] Unknown waveform waveform_type")
+ for chan in xrange(len(self.channels)):
+ self.connect(self._src, (self.usrp, chan))
if self.extra_sink is not None:
self.connect(self._src, self.extra_sink)
self.unlock()
- self.vprint("Set baseband modulation to:", waveforms[type])
- if type == analog.GR_SIN_WAVE:
+ self.vprint("Set baseband modulation to:", WAVEFORMS[waveform_type])
+ if waveform_type == analog.GR_SIN_WAVE:
self.vprint("Modulation frequency: %sHz" % (n2s(self[WAVEFORM_FREQ_KEY]),))
self.vprint("Initial phase:", self[WAVEFORM_OFFSET_KEY])
- elif type == "2tone":
+ elif waveform_type == "2tone":
self.vprint("Tone 1: %sHz" % (n2s(self[WAVEFORM_FREQ_KEY]),))
self.vprint("Tone 2: %sHz" % (n2s(self[WAVEFORM2_FREQ_KEY]),))
- elif type == "sweep":
- self.vprint("Sweeping across %sHz to %sHz" % (n2s(-self[WAVEFORM_FREQ_KEY]/2.0),n2s(self[WAVEFORM_FREQ_KEY]/2.0)))
+ elif waveform_type == "sweep":
+ self.vprint("Sweeping across %sHz to %sHz" % (n2s(-self[WAVEFORM_FREQ_KEY]/2.0), n2s(self[WAVEFORM_FREQ_KEY]/2.0)))
self.vprint("Sweep rate: %sHz" % (n2s(self[WAVEFORM2_FREQ_KEY]),))
self.vprint("TX amplitude:", self[AMPLITUDE_KEY])
@@ -274,6 +281,7 @@ def setup_argparser():
return parser
def main():
+ " Go, go, go! "
if gr.enable_realtime_scheduling() != gr.RT_OK:
print("Note: failed to enable realtime scheduling, continuing")
# Grab command line args and create top block
@@ -281,8 +289,8 @@ def main():
parser = setup_argparser()
args = parser.parse_args()
tb = USRPSiggen(args)
- except RuntimeError as e:
- print(e)
+ except RuntimeError as ex:
+ print(ex)
exit(1)
tb.start()
raw_input('[UHD-SIGGEN] Press Enter to quit:\n')
diff --git a/gr-uhd/apps/uhd_siggen_gui b/gr-uhd/apps/uhd_siggen_gui
index ab04ccc8e2..c5528f3777 100755
--- a/gr-uhd/apps/uhd_siggen_gui
+++ b/gr-uhd/apps/uhd_siggen_gui
@@ -1,6 +1,6 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python
#
-# Copyright 2015 Free Software Foundation, Inc.
+# Copyright 2015-2016 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -32,13 +32,14 @@ Signal Generator App
# Generated: Sun Jun 28 17:21:28 2015
##################################################
+from __future__ import print_function
import sip
import sys
import threading
import time
from distutils.version import StrictVersion
from PyQt4 import Qt
-from PyQt4.QtCore import QObject, pyqtSlot
+from PyQt4.QtCore import pyqtSlot
from gnuradio import analog
from gnuradio import eng_notation
from gnuradio import gr
@@ -69,9 +70,9 @@ class uhd_siggen_gui(Qt.QWidget):
Qt.QWidget.__init__(self)
self.setWindowTitle("UHD Signal Generator")
try:
- self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
+ self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
except:
- pass
+ pass
self.top_scroll_layout = Qt.QVBoxLayout()
self.setLayout(self.top_scroll_layout)
self.top_scroll = Qt.QScrollArea()
@@ -90,8 +91,8 @@ class uhd_siggen_gui(Qt.QWidget):
# Widgets + Controls
##################################################
### Waveform Selector
- self._waveform_options = uhd_siggen.waveforms.keys()
- self._waveform_labels = uhd_siggen.waveforms.values()
+ self._waveform_options = uhd_siggen.WAVEFORMS.keys()
+ self._waveform_labels = uhd_siggen.WAVEFORMS.values()
self._waveform_group_box = Qt.QGroupBox("Waveform")
self._waveform_box = Qt.QHBoxLayout()
class variable_chooser_button_group(Qt.QButtonGroup):
@@ -259,11 +260,12 @@ class uhd_siggen_gui(Qt.QWidget):
self._lo_locked_probe_0_tool_bar.addWidget(self._lo_locked_probe_0_label)
self.top_grid_layout.addWidget(self._lo_locked_probe_0_tool_bar, 8,0,1,1)
def _chan0_lo_locked_probe():
+ " Monitor lock status of LO on channel 0 "
while True:
- val = all([self.usrp.get_sensor('lo_locked', c).to_bool() for c in range(len(self._sg.channels))])
try:
+ val = all([self.usrp.get_sensor('lo_locked', c).to_bool() for c in range(len(self._sg.channels))])
self.set_chan0_lo_locked(val)
- except AttributeError:
+ except:
pass
time.sleep(.1)
_chan0_lo_locked_thread = threading.Thread(target=_chan0_lo_locked_probe)
@@ -366,8 +368,8 @@ class uhd_siggen_gui(Qt.QWidget):
self.freq_fine + self.freq_coarse,
self.lo_offset
)
- for idx, c in enumerate(self._sg.channels):
- tune_res = self.usrp.set_center_freq(tune_req, c)
+ for idx, chan in enumerate(self._sg.channels):
+ tune_res = self.usrp.set_center_freq(tune_req, chan)
if idx == 0:
self.set_label_dsp_freq(tune_res.actual_dsp_freq)
self.set_label_rf_freq(tune_res.actual_rf_freq)
@@ -446,7 +448,7 @@ def main():
""" Go, go, go! """
parser = setup_parser()
args = parser.parse_args()
- if(StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0")):
+ if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"):
Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui', 'style', 'raster'))
qapp = Qt.QApplication(sys.argv)
siggen_gui = uhd_siggen_gui(args)
@@ -457,14 +459,17 @@ def main():
qapp.exec_()
siggen_gui = None #to clean up Qt widgets
-if __name__ == '__main__':
+def x11_init_threads():
+ " If on X11, init threads "
import ctypes
- import sys
if sys.platform.startswith('linux'):
try:
x11 = ctypes.cdll.LoadLibrary('libX11.so')
x11.XInitThreads()
except:
print("Warning: failed to XInitThreads()")
+
+if __name__ == '__main__':
+ x11_init_threads()
main()
diff --git a/gr-uhd/lib/usrp_source_impl.cc b/gr-uhd/lib/usrp_source_impl.cc
index ed0b891770..ab1e84ba3a 100644
--- a/gr-uhd/lib/usrp_source_impl.cc
+++ b/gr-uhd/lib/usrp_source_impl.cc
@@ -480,6 +480,7 @@ namespace gr {
{
_dev->issue_stream_cmd(cmd, _stream_args.channels[i]);
}
+ _tag_now = true;
}
bool