From ec25a03fbb22c81c771d8421bea59771747060ca Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 10 Jun 2021 18:43:59 +0200 Subject: [PATCH 001/136] adding dpdk library and ldpc offload library --- cmake_targets/CMakeLists.txt | 21 + .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 260 + .../CODING/nrLDPC_decoder/nrLDPC_offload.h | 128 + openair1/PHY/CODING/nrLDPC_defs.h | 2 + openair1/PHY/CODING/nrLDPC_extern.h | 3 + openair1/PHY/CODING/nrLDPC_load.c | 10 + targets/ARCH/test-bbdev/Makefile | 30 + targets/ARCH/test-bbdev/ldpc_dec_default.data | 1 + targets/ARCH/test-bbdev/ldpc_enc_default.data | 1 + targets/ARCH/test-bbdev/main.c | 362 ++ targets/ARCH/test-bbdev/main.h | 128 + targets/ARCH/test-bbdev/meson.build | 14 + targets/ARCH/test-bbdev/test-bbdev.py | 118 + targets/ARCH/test-bbdev/test_bbdev.c | 1371 +++++ targets/ARCH/test-bbdev/test_bbdev_perf.c | 5058 +++++++++++++++++ targets/ARCH/test-bbdev/test_bbdev_vector.c | 1438 +++++ targets/ARCH/test-bbdev/test_bbdev_vector.h | 79 + .../test-bbdev/test_vectors/bbdev_null.data | 5 + .../test_vectors/demo_dec_scn_1_rv0_drv0.data | 44 + .../test_vectors/demo_dec_scn_2_rv0_drv0.data | 43 + .../test_vectors/demo_dec_scn_3_rv0_drv0.data | 44 + .../test_vectors/demo_dec_scn_4_rv0_drv0.data | 44 + .../test_vectors/demo_dec_scn_5_rv0_drv0.data | 44 + .../test_vectors/demo_dec_scn_6_rv0_drv0.data | 44 + .../test_vectors/demo_dec_scn_7_rv0_drv0.data | 45 + .../test_vectors/demo_dec_scn_8_rv0_drv0.data | 45 + .../test_vectors/demo_enc_scn_1_rv0.data | 38 + .../test_vectors/demo_enc_scn_2_rv0.data | 38 + .../test_vectors/demo_enc_scn_3_rv0.data | 38 + .../test_vectors/demo_enc_scn_4_rv0.data | 40 + .../test_vectors/demo_enc_scn_5_rv0.data | 39 + .../test_vectors/demo_enc_scn_6_rv0.data | 39 + .../test_vectors/demo_enc_scn_7_rv0.data | 38 + .../test_vectors/demo_enc_scn_8_rv0.data | 39 + .../test_vectors/ldpc_dec_HARQ_1_0.data | 353 ++ .../test_vectors/ldpc_dec_HARQ_1_1.data | 684 +++ .../test_vectors/ldpc_dec_HARQ_1_2.data | 902 +++ .../test_vectors/ldpc_dec_v11835.data | 49 + .../test_vectors/ldpc_dec_v2342_drop.data | 745 +++ .../test_vectors/ldpc_dec_v7813.data | 48 + .../test_vectors/ldpc_dec_v8480.data | 74 + .../test_vectors/ldpc_dec_v8568.data | 255 + .../test_vectors/ldpc_dec_v9503.data | 1215 ++++ .../test_vectors/ldpc_enc_v11835.data | 41 + .../test_vectors/ldpc_enc_v2342.data | 151 + .../test_vectors/ldpc_enc_v7813.data | 43 + .../test_vectors/ldpc_enc_v8568.data | 70 + .../test_vectors/ldpc_enc_v9503.data | 197 + ...turbo_dec_c1_k40_r0_e17280_sbd_negllr.data | 57 + ..._r0_e10376_crc24b_sbd_negllr_high_snr.data | 643 +++ ...4_r0_e10376_crc24b_sbd_negllr_low_snr.data | 643 +++ .../turbo_dec_c1_k6144_r0_e34560_posllr.data | 645 +++ ...rbo_dec_c1_k6144_r0_e34560_sbd_negllr.data | 1224 ++++ ...rbo_dec_c1_k6144_r0_e34560_sbd_posllr.data | 1225 ++++ ...c_c2_k3136_r0_e4920_sbd_negllr_crc24b.data | 680 +++ .../turbo_enc_c1_k40_r0_e1190_rm.data | 36 + .../turbo_enc_c1_k40_r0_e1194_rm.data | 36 + .../turbo_enc_c1_k40_r0_e1196_rm.data | 36 + .../turbo_enc_c1_k40_r0_e272_rm.data | 33 + .../turbo_enc_c1_k6144_r0_e120_rm_rvidx.data | 63 + .../turbo_enc_c1_k6144_r0_e18444.data | 156 + .../turbo_enc_c1_k6144_r0_e18448_crc24a.data | 159 + ...urbo_enc_c1_k6144_r0_e32256_crc24b_rm.data | 180 + .../turbo_enc_c3_k4800_r2_e14412_crc24b.data | 153 + .../ARCH/test-bbdev/turbo_dec_default.data | 1 + .../ARCH/test-bbdev/turbo_enc_default.data | 1 + 66 files changed, 20489 insertions(+) create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c create mode 100644 openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h create mode 100644 targets/ARCH/test-bbdev/Makefile create mode 120000 targets/ARCH/test-bbdev/ldpc_dec_default.data create mode 120000 targets/ARCH/test-bbdev/ldpc_enc_default.data create mode 100644 targets/ARCH/test-bbdev/main.c create mode 100644 targets/ARCH/test-bbdev/main.h create mode 100644 targets/ARCH/test-bbdev/meson.build create mode 100755 targets/ARCH/test-bbdev/test-bbdev.py create mode 100644 targets/ARCH/test-bbdev/test_bbdev.c create mode 100644 targets/ARCH/test-bbdev/test_bbdev_perf.c create mode 100644 targets/ARCH/test-bbdev/test_bbdev_vector.c create mode 100644 targets/ARCH/test-bbdev/test_bbdev_vector.h create mode 100644 targets/ARCH/test-bbdev/test_vectors/bbdev_null.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_1_rv0_drv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_2_rv0_drv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_3_rv0_drv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_4_rv0_drv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_5_rv0_drv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_6_rv0_drv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_7_rv0_drv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_8_rv0_drv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_1_rv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_2_rv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_3_rv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_4_rv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_5_rv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_6_rv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_7_rv0.data create mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_8_rv0.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_0.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_1.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_2.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v11835.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v2342_drop.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v7813.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8568.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v9503.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v11835.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v2342.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v7813.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v8568.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v9503.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k40_r0_e17280_sbd_negllr.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_low_snr.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_posllr.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_negllr.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_posllr.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c2_k3136_r0_e4920_sbd_negllr_crc24b.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1190_rm.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1194_rm.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1196_rm.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e272_rm.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e120_rm_rvidx.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18444.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18448_crc24a.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e32256_crc24b_rm.data create mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c3_k4800_r2_e14412_crc24b.data create mode 120000 targets/ARCH/test-bbdev/turbo_dec_default.data create mode 120000 targets/ARCH/test-bbdev/turbo_enc_default.data diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index ffc2e26dc5..636ac6006c 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -817,6 +817,27 @@ TARGET_LINK_LIBRARIES(benetel_5g pthread dl rt m numa) ########################################################## +# LDPC offload library +########################################################## + +include_directories ("/usr/local/include") + +set(HWLIB_LDPC_OFFLOAD_SOURCE + ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +# ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev.c + ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_perf.c + ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_vector.c + ) +add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) + +set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include") + +SET(T1_DPDK_LIBS "-Wl,-rpath,/home/wang/dpdk-20.05/build/include -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_atlantic -lrte_pmd_avp -lrte_pmd_axgbe -lrte_pmd_bond -lrte_pmd_bnx2x -lrte_pmd_bnxt -lrte_pmd_cxgbe -lrte_pmd_dpaa -lrte_pmd_dpaa2 -lrte_pmd_e1000 -lrte_pmd_ena -lrte_pmd_enetc -lrte_pmd_enic -lrte_pmd_failsafe -lrte_pmd_fm10k -lrte_pmd_i40e -lrte_pmd_hinic -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_turbo_sw -lrte_pmd_bbdev_fpga_lte_fec -lrte_pmd_bbdev_fpga_5gnr_fec -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") +TARGET_LINK_LIBRARIES(ldpc_offload ${T1_DPDK_LIBS}) +TARGET_LINK_LIBRARIES(ldpc_offload pthread dl rt m numa) + +########################################################## + include_directories ("${OPENAIR_TARGETS}/ARCH/COMMON") Message("DEADLINE_SCHEDULER flag is ${DEADLINE_SCHEDULER}") diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c new file mode 100644 index 0000000000..8a54e9e8ff --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -0,0 +1,260 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*!\file nrLDPC_decoder_offload.c + * \brief Defines the LDPC decoder + * \author openairinterface + * \date 12-06-2021 + * \version 1.0 + * \note + * \warning + */ + + +#include +#include +#include "nrLDPCdecoder_defs.h" +#include "nrLDPC_types.h" +#include "nrLDPC_init.h" +#include "nrLDPC_mPass.h" +#include "nrLDPC_cnProc.h" +#include "nrLDPC_bnProc.h" + +#define NR_LDPC_ENABLE_PARITY_CHECK +//#define NR_LDPC_PROFILER_DETAIL + +#ifdef NR_LDPC_DEBUG_MODE +#include "nrLDPC_tools/nrLDPC_debug.h" +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "nrLDPC_offload.h" + + +#include + +#include +#include +#include +#include +#include +#include +#include + +#define MAX_QUEUES RTE_MAX_LCORE +#define TEST_REPETITIONS 1000 +/* Switch between PMD and Interrupt for throughput TC */ +static bool intr_enabled; + +/* LLR arithmetic representation for numerical conversion */ +static int ldpc_llr_decimals; +static int ldpc_llr_size; +/* Keep track of the LDPC decoder device capability flag */ +static uint32_t ldpc_cap_flags; + +/* Represents tested active devices */ +static struct active_device { + const char *driver_name; + uint8_t dev_id; + uint16_t supported_ops; + uint16_t queue_ids[MAX_QUEUES]; + uint16_t nb_queues; + struct rte_mempool *ops_mempool; + struct rte_mempool *in_mbuf_pool; + struct rte_mempool *hard_out_mbuf_pool; + struct rte_mempool *soft_out_mbuf_pool; + struct rte_mempool *harq_in_mbuf_pool; + struct rte_mempool *harq_out_mbuf_pool; +} active_devs[RTE_BBDEV_MAX_DEVS]; + +static uint8_t nb_active_devs; + +/* Data buffers used by BBDEV ops */ +struct test_buffers { + struct rte_bbdev_op_data *inputs; + struct rte_bbdev_op_data *hard_outputs; + struct rte_bbdev_op_data *soft_outputs; + struct rte_bbdev_op_data *harq_inputs; + struct rte_bbdev_op_data *harq_outputs; +}; + +/* Operation parameters specific for given test case */ +struct test_op_params { + struct rte_mempool *mp; + struct rte_bbdev_dec_op *ref_dec_op; + struct rte_bbdev_enc_op *ref_enc_op; + uint16_t burst_sz; + uint16_t num_to_process; + uint16_t num_lcores; + int vector_mask; + rte_atomic16_t sync; + struct test_buffers q_bufs[RTE_MAX_NUMA_NODES][MAX_QUEUES]; +}; + +/* Contains per lcore params */ +struct thread_params { + uint8_t dev_id; + uint16_t queue_id; + uint32_t lcore_id; + uint64_t start_time; + double ops_per_sec; + double mbps; + uint8_t iter_count; + double iter_average; + double bler; + rte_atomic16_t nb_dequeued; + rte_atomic16_t processing_status; + rte_atomic16_t burst_sz; + struct test_op_params *op_params; + struct rte_bbdev_dec_op *dec_ops[MAX_BURST]; + struct rte_bbdev_enc_op *enc_ops[MAX_BURST]; +}; + +/* Defines how many testcases can be specified as cmdline args */ +#define MAX_CMDLINE_TESTCASES 8 + +static const char tc_sep = ','; + +/* Declare structure for command line test parameters and options */ +/*static struct test_params { + struct test_command *test_to_run[MAX_CMDLINE_TESTCASES]; + unsigned int num_tests; + unsigned int num_ops; + unsigned int burst_sz; + unsigned int num_lcores; + double snr; + unsigned int iter_max; + char test_vector_filename[PATH_MAX]; + bool init_device; +} test_params; + +static struct test_commands_list commands_list = + TAILQ_HEAD_INITIALIZER(commands_list); + +void +add_test_command(struct test_command *t) +{ + TAILQ_INSERT_TAIL(&commands_list, t, next); +} + +unsigned int +get_num_ops(void) +{ + return test_params.num_ops; +} + +unsigned int +get_burst_sz(void) +{ + return test_params.burst_sz; +} + +unsigned int +get_num_lcores(void) +{ + return test_params.num_lcores; +} + +double +get_snr(void) +{ + return test_params.snr; +} + +unsigned int +get_iter_max(void) +{ + return test_params.iter_max; +} + +bool +get_init_device(void) +{ + return test_params.init_device; +} + +static int +run_all_tests(void) +{ + int ret = TEST_SUCCESS; + struct test_command *t; + + TAILQ_FOREACH(t, &commands_list, next) + ret |= (int) t->callback(); + + return ret; +} + +static int +run_parsed_tests(struct test_params *tp) +{ + int ret = TEST_SUCCESS; + unsigned int i; + + for (i = 0; i < tp->num_tests; ++i) + ret |= (int) tp->test_to_run[i]->callback(); + + return ret; +} +*/ +int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint32_t F, int8_t* w, int8_t* p_out) +{ + uint32_t numIter = 0; + struct thread_params *t_params_tp; + uint16_t num_lcores=1; + /*uint16_t enq, deq; + const uint16_t queue_id = 1; //tp->queue_id; + const uint16_t burst_sz = 128; //tp->op_params->burst_sz; + const uint16_t num_ops = 128; //tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops_enq[num_ops]; + struct rte_bbdev_dec_op *ops_deq[num_ops]; + + struct test_buffers *bufs = NULL; + int i, j, ret; + struct rte_bbdev_info info; + uint16_t num_to_enq; + */ + bool extDdr = check_bit(ldpc_cap_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + + /* Allocate memory for thread parameters structure */ + t_params_tp = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), + RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(t_params_tp, "Failed to alloc %zuB for t_params", + RTE_ALIGN(sizeof(struct thread_params) * num_lcores, + RTE_CACHE_LINE_SIZE)); + + // throughput_pmd_lcore_ldpc_dec(&t_params_tp[0]); + + + return numIter; +} + diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h new file mode 100644 index 0000000000..fb3dec8326 --- /dev/null +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h @@ -0,0 +1,128 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation + */ + +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#include +#include + +#include +#include +#include + +#define TEST_SUCCESS 0 +#define TEST_FAILED -1 +#define TEST_SKIPPED 1 + +#define MAX_BURST 512U +#define DEFAULT_BURST 32U +#define DEFAULT_OPS 64U +#define DEFAULT_ITER 6U + + + +#define TEST_ASSERT(cond, msg, ...) do { \ + if (!(cond)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + return TEST_FAILED; \ + } \ +} while (0) + +/* Compare two buffers (length in bytes) */ +#define TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, len, msg, ...) do { \ + if (memcmp((a), (b), len)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + rte_memdump(stdout, "Buffer A", (a), len); \ + rte_memdump(stdout, "Buffer B", (b), len); \ + return TEST_FAILED; \ + } \ +} while (0) + +#define TEST_ASSERT_SUCCESS(val, msg, ...) do { \ + typeof(val) _val = (val); \ + if (!(_val == 0)) { \ + printf("TestCase %s() line %d failed (err %d): " \ + msg "\n", __func__, __LINE__, _val, \ + ##__VA_ARGS__); \ + return TEST_FAILED; \ + } \ +} while (0) + +#define TEST_ASSERT_FAIL(val, msg, ...) \ + TEST_ASSERT_SUCCESS(!(val), msg, ##__VA_ARGS__) + +#define TEST_ASSERT_NOT_NULL(val, msg, ...) do { \ + if ((val) == NULL) { \ + printf("TestCase %s() line %d failed (null): " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + return TEST_FAILED; \ + } \ +} while (0) + +struct unit_test_case { + int (*setup)(void); + void (*teardown)(void); + int (*testcase)(void); + const char *name; +}; + +#define TEST_CASE(testcase) {NULL, NULL, testcase, #testcase} + +#define TEST_CASE_ST(setup, teardown, testcase) \ + {setup, teardown, testcase, #testcase} + +#define TEST_CASES_END() {NULL, NULL, NULL, NULL} + +struct unit_test_suite { + const char *suite_name; + int (*setup)(void); + void (*teardown)(void); + struct unit_test_case unit_test_cases[]; +}; + +int unit_test_suite_runner(struct unit_test_suite *suite); + +typedef int (test_callback)(void); +TAILQ_HEAD(test_commands_list, test_command); +struct test_command { + TAILQ_ENTRY(test_command) next; + const char *command; + test_callback *callback; +}; + +void add_test_command(struct test_command *t); + +/* Register a test function */ +#define REGISTER_TEST_COMMAND(name, testsuite) \ + static int test_func_##name(void) \ + { \ + return unit_test_suite_runner(&testsuite); \ + } \ + static struct test_command test_struct_##name = { \ + .command = RTE_STR(name), \ + .callback = test_func_##name, \ + }; \ + RTE_INIT(test_register_##name) \ + { \ + add_test_command(&test_struct_##name); \ + } + +const char *get_vector_filename(void); + +unsigned int get_num_ops(void); + +unsigned int get_burst_sz(void); + +unsigned int get_num_lcores(void); + +double get_snr(void); + +unsigned int get_iter_max(void); + +bool get_init_device(void); + +#endif diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h index 0d7ff9ef9f..72bafbead9 100644 --- a/openair1/PHY/CODING/nrLDPC_defs.h +++ b/openair1/PHY/CODING/nrLDPC_defs.h @@ -72,4 +72,6 @@ typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,sho \param p_profiler LDPC profiler statistics */ typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params *, int8_t *, int8_t *, t_nrLDPC_procBuf *, t_nrLDPC_time_stats * ); +typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint32_t , int8_t*, int8_t* ); + #endif diff --git a/openair1/PHY/CODING/nrLDPC_extern.h b/openair1/PHY/CODING/nrLDPC_extern.h index b75b38fc76..4aa0ed5a2b 100644 --- a/openair1/PHY/CODING/nrLDPC_extern.h +++ b/openair1/PHY/CODING/nrLDPC_extern.h @@ -24,15 +24,18 @@ nrLDPC_decoderfunc_t nrLDPC_decoder; nrLDPC_encoderfunc_t nrLDPC_encoder; nrLDPC_initcallfunc_t nrLDPC_initcall; +nrLDPC_decoffloadfunc_t nrLDPC_decoder_offload; #else /* functions to load the LDPC shared lib, implemented in openair1/PHY/CODING/nrLDPC_load.c */ extern int load_nrLDPClib(char *version) ; +extern int load_nrLDPClib_offload(void) ; extern int load_nrLDPClib_ref(char *libversion, nrLDPC_encoderfunc_t * nrLDPC_encoder_ptr); // for ldpctest /* ldpc coder/decoder functions, as loaded by load_nrLDPClib(). */ extern nrLDPC_initcallfunc_t nrLDPC_initcall; extern nrLDPC_decoderfunc_t nrLDPC_decoder; extern nrLDPC_encoderfunc_t nrLDPC_encoder; +extern nrLDPC_decoffloadfunc_t nrLDPC_decoder_offload; // inline functions: #include "openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h" #endif diff --git a/openair1/PHY/CODING/nrLDPC_load.c b/openair1/PHY/CODING/nrLDPC_load.c index 3049070cd6..7ac8768b63 100644 --- a/openair1/PHY/CODING/nrLDPC_load.c +++ b/openair1/PHY/CODING/nrLDPC_load.c @@ -71,6 +71,16 @@ int load_nrLDPClib(char *version) { return 0; } +int load_nrLDPClib_offload(void) { + loader_shlibfunc_t shlib_decoffload_fdesc; + + shlib_decoffload_fdesc.fname = "nrLDPC_decod_offload"; + int ret=load_module_shlib("ldpc_offload",&shlib_decoffload_fdesc,1,NULL); + AssertFatal( (ret >= 0),"Error loading ldpc decoder offload"); + nrLDPC_decoder_offload = (nrLDPC_decoffloadfunc_t)shlib_decoffload_fdesc.fptr; +return 0; +} + int load_nrLDPClib_ref(char *libversion, nrLDPC_encoderfunc_t * nrLDPC_encoder_ptr) { loader_shlibfunc_t shlib_encoder_fdesc; diff --git a/targets/ARCH/test-bbdev/Makefile b/targets/ARCH/test-bbdev/Makefile new file mode 100644 index 0000000000..dc29557f37 --- /dev/null +++ b/targets/ARCH/test-bbdev/Makefile @@ -0,0 +1,30 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +APP = testbbdev + +CFLAGS += -O3 +CFLAGS += $(WERROR_FLAGS) + +# +# all sources are stored in SRCS-y +# +SRCS-$(CONFIG_RTE_TEST_BBDEV) += main.c +SRCS-$(CONFIG_RTE_TEST_BBDEV) += test_bbdev.c +SRCS-$(CONFIG_RTE_TEST_BBDEV) += test_bbdev_perf.c +SRCS-$(CONFIG_RTE_TEST_BBDEV) += test_bbdev_vector.c + +LDLIBS += -lm +ifeq ($(CONFIG_RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC),y) +LDLIBS += -lrte_pmd_bbdev_fpga_lte_fec +endif +ifeq ($(CONFIG_RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC),y) +LDLIBS += -lrte_pmd_bbdev_fpga_5gnr_fec +endif + +include $(RTE_SDK)/mk/rte.app.mk diff --git a/targets/ARCH/test-bbdev/ldpc_dec_default.data b/targets/ARCH/test-bbdev/ldpc_dec_default.data new file mode 120000 index 0000000000..e53aa1b902 --- /dev/null +++ b/targets/ARCH/test-bbdev/ldpc_dec_default.data @@ -0,0 +1 @@ +test_vectors/ldpc_dec_v2342_drop.data \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/ldpc_enc_default.data b/targets/ARCH/test-bbdev/ldpc_enc_default.data new file mode 120000 index 0000000000..371cbc692d --- /dev/null +++ b/targets/ARCH/test-bbdev/ldpc_enc_default.data @@ -0,0 +1 @@ +test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/main.c b/targets/ARCH/test-bbdev/main.c new file mode 100644 index 0000000000..ff65173fdb --- /dev/null +++ b/targets/ARCH/test-bbdev/main.c @@ -0,0 +1,362 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "main.h" + + +/* Defines how many testcases can be specified as cmdline args */ +#define MAX_CMDLINE_TESTCASES 8 + +static const char tc_sep = ','; + +/* Declare structure for command line test parameters and options */ +static struct test_params { + struct test_command *test_to_run[MAX_CMDLINE_TESTCASES]; + unsigned int num_tests; + unsigned int num_ops; + unsigned int burst_sz; + unsigned int num_lcores; + double snr; + unsigned int iter_max; + char test_vector_filename[PATH_MAX]; + bool init_device; +} test_params; + +static struct test_commands_list commands_list = + TAILQ_HEAD_INITIALIZER(commands_list); + +void +add_test_command(struct test_command *t) +{ + TAILQ_INSERT_TAIL(&commands_list, t, next); +} + +int +unit_test_suite_runner(struct unit_test_suite *suite) +{ + int test_result = TEST_SUCCESS; + unsigned int total = 0, skipped = 0, succeeded = 0, failed = 0; + uint64_t start, end; + + printf("\n===========================================================\n"); + printf("Starting Test Suite : %s\n", suite->suite_name); + + start = rte_rdtsc_precise(); + + if (suite->setup) { + test_result = suite->setup(); + if (test_result == TEST_FAILED) { + printf(" + Test suite setup %s failed!\n", + suite->suite_name); + printf(" + ------------------------------------------------------- +\n"); + return 1; + } + if (test_result == TEST_SKIPPED) { + printf(" + Test suite setup %s skipped!\n", + suite->suite_name); + printf(" + ------------------------------------------------------- +\n"); + return 0; + } + } + + while (suite->unit_test_cases[total].testcase) { + if (suite->unit_test_cases[total].setup) + test_result = suite->unit_test_cases[total].setup(); + + if (test_result == TEST_SUCCESS) + test_result = suite->unit_test_cases[total].testcase(); + + if (suite->unit_test_cases[total].teardown) + suite->unit_test_cases[total].teardown(); + + if (test_result == TEST_SUCCESS) { + succeeded++; + printf("TestCase [%2d] : %s passed\n", total, + suite->unit_test_cases[total].name); + } else if (test_result == TEST_SKIPPED) { + skipped++; + printf("TestCase [%2d] : %s skipped\n", total, + suite->unit_test_cases[total].name); + } else { + failed++; + printf("TestCase [%2d] : %s failed\n", total, + suite->unit_test_cases[total].name); + } + + total++; + } + + /* Run test suite teardown */ + if (suite->teardown) + suite->teardown(); + + end = rte_rdtsc_precise(); + + printf(" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\n"); + printf(" + Test Suite Summary : %s\n", suite->suite_name); + printf(" + Tests Total : %2d\n", total); + printf(" + Tests Skipped : %2d\n", skipped); + printf(" + Tests Passed : %2d\n", succeeded); + printf(" + Tests Failed : %2d\n", failed); + printf(" + Tests Lasted : %lg ms\n", + ((end - start) * 1000) / (double)rte_get_tsc_hz()); + printf(" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\n"); + + return (failed > 0) ? 1 : 0; +} + +const char * +get_vector_filename(void) +{ + return test_params.test_vector_filename; +} + +unsigned int +get_num_ops(void) +{ + return test_params.num_ops; +} + +unsigned int +get_burst_sz(void) +{ + return test_params.burst_sz; +} + +unsigned int +get_num_lcores(void) +{ + return test_params.num_lcores; +} + +double +get_snr(void) +{ + return test_params.snr; +} + +unsigned int +get_iter_max(void) +{ + return test_params.iter_max; +} + +bool +get_init_device(void) +{ + return test_params.init_device; +} + +static void +print_usage(const char *prog_name) +{ + struct test_command *t; + + printf("***Usage: %s [EAL params] [-- [-n/--num-ops NUM_OPS]\n" + "\t[-b/--burst-size BURST_SIZE]\n" + "\t[-v/--test-vector VECTOR_FILE]\n" + "\t[-c/--test-cases TEST_CASE[,TEST_CASE,...]]]\n", + prog_name); + + printf("Available testcases: "); + TAILQ_FOREACH(t, &commands_list, next) + printf("%s ", t->command); + printf("\n"); +} + +static int +parse_args(int argc, char **argv, struct test_params *tp) +{ + int opt, option_index; + unsigned int num_tests = 0; + bool test_cases_present = false; + bool test_vector_present = false; + struct test_command *t; + char *tokens[MAX_CMDLINE_TESTCASES]; + int tc, ret; + + static struct option lgopts[] = { + { "num-ops", 1, 0, 'n' }, + { "burst-size", 1, 0, 'b' }, + { "test-cases", 1, 0, 'c' }, + { "test-vector", 1, 0, 'v' }, + { "lcores", 1, 0, 'l' }, + { "snr", 1, 0, 's' }, + { "iter_max", 6, 0, 't' }, + { "init-device", 0, 0, 'i'}, + { "help", 0, 0, 'h' }, + { NULL, 0, 0, 0 } + }; + tp->iter_max = DEFAULT_ITER; + + while ((opt = getopt_long(argc, argv, "hin:b:c:v:l:s:t:", lgopts, + &option_index)) != EOF) + switch (opt) { + case 'n': + TEST_ASSERT(strlen(optarg) > 0, + "Num of operations is not provided"); + tp->num_ops = strtol(optarg, NULL, 10); + break; + case 'b': + TEST_ASSERT(strlen(optarg) > 0, + "Burst size is not provided"); + tp->burst_sz = strtol(optarg, NULL, 10); + TEST_ASSERT(tp->burst_sz <= MAX_BURST, + "Burst size mustn't be greater than %u", + MAX_BURST); + break; + case 'c': + TEST_ASSERT(test_cases_present == false, + "Test cases provided more than once"); + test_cases_present = true; + + ret = rte_strsplit(optarg, strlen(optarg), + tokens, MAX_CMDLINE_TESTCASES, tc_sep); + + TEST_ASSERT(ret <= MAX_CMDLINE_TESTCASES, + "Too many test cases (max=%d)", + MAX_CMDLINE_TESTCASES); + + for (tc = 0; tc < ret; ++tc) { + /* Find matching test case */ + TAILQ_FOREACH(t, &commands_list, next) + if (!strcmp(tokens[tc], t->command)) + tp->test_to_run[num_tests] = t; + + TEST_ASSERT(tp->test_to_run[num_tests] != NULL, + "Unknown test case: %s", + tokens[tc]); + ++num_tests; + } + break; + case 'v': + TEST_ASSERT(test_vector_present == false, + "Test vector provided more than once"); + test_vector_present = true; + + TEST_ASSERT(strlen(optarg) > 0, + "Config file name is null"); + + snprintf(tp->test_vector_filename, + sizeof(tp->test_vector_filename), + "%s", optarg); + break; + case 's': + TEST_ASSERT(strlen(optarg) > 0, + "SNR is not provided"); + tp->snr = strtod(optarg, NULL); + break; + case 't': + TEST_ASSERT(strlen(optarg) > 0, + "Iter_max is not provided"); + tp->iter_max = strtol(optarg, NULL, 10); + break; + case 'l': + TEST_ASSERT(strlen(optarg) > 0, + "Num of lcores is not provided"); + tp->num_lcores = strtol(optarg, NULL, 10); + TEST_ASSERT(tp->num_lcores <= RTE_MAX_LCORE, + "Num of lcores mustn't be greater than %u", + RTE_MAX_LCORE); + break; + case 'i': + /* indicate fpga fec config required */ + tp->init_device = true; + break; + case 'h': + print_usage(argv[0]); + return 0; + default: + printf("ERROR: Unknown option: -%c\n", opt); + return -1; + } + + if (tp->num_ops == 0) { + printf( + "WARNING: Num of operations was not provided or was set 0. Set to default (%u)\n", + DEFAULT_OPS); + tp->num_ops = DEFAULT_OPS; + } + if (tp->burst_sz == 0) { + printf( + "WARNING: Burst size was not provided or was set 0. Set to default (%u)\n", + DEFAULT_BURST); + tp->burst_sz = DEFAULT_BURST; + } + if (tp->num_lcores == 0) { + printf( + "WARNING: Num of lcores was not provided or was set 0. Set to value from RTE config (%u)\n", + rte_lcore_count()); + tp->num_lcores = rte_lcore_count(); + } + + TEST_ASSERT(tp->burst_sz <= tp->num_ops, + "Burst size (%u) mustn't be greater than num ops (%u)", + tp->burst_sz, tp->num_ops); + + tp->num_tests = num_tests; + return 0; +} + +static int +run_all_tests(void) +{ + int ret = TEST_SUCCESS; + struct test_command *t; + + TAILQ_FOREACH(t, &commands_list, next) + ret |= (int) t->callback(); + + return ret; +} + +static int +run_parsed_tests(struct test_params *tp) +{ + int ret = TEST_SUCCESS; + unsigned int i; + + for (i = 0; i < tp->num_tests; ++i) + ret |= (int) tp->test_to_run[i]->callback(); + + return ret; +} + +int +main(int argc, char **argv) +{ + int ret; + + /* Init EAL */ + ret = rte_eal_init(argc, argv); + if (ret < 0) + return 1; + argc -= ret; + argv += ret; + + /* Parse application arguments (after the EAL ones) */ + ret = parse_args(argc, argv, &test_params); + if (ret < 0) { + print_usage(argv[0]); + return 1; + } + + /* If no argument provided - run all tests */ + if (test_params.num_tests == 0) + return run_all_tests(); + else + return run_parsed_tests(&test_params); +} diff --git a/targets/ARCH/test-bbdev/main.h b/targets/ARCH/test-bbdev/main.h new file mode 100644 index 0000000000..fb3dec8326 --- /dev/null +++ b/targets/ARCH/test-bbdev/main.h @@ -0,0 +1,128 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation + */ + +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#include +#include + +#include +#include +#include + +#define TEST_SUCCESS 0 +#define TEST_FAILED -1 +#define TEST_SKIPPED 1 + +#define MAX_BURST 512U +#define DEFAULT_BURST 32U +#define DEFAULT_OPS 64U +#define DEFAULT_ITER 6U + + + +#define TEST_ASSERT(cond, msg, ...) do { \ + if (!(cond)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + return TEST_FAILED; \ + } \ +} while (0) + +/* Compare two buffers (length in bytes) */ +#define TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, len, msg, ...) do { \ + if (memcmp((a), (b), len)) { \ + printf("TestCase %s() line %d failed: " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + rte_memdump(stdout, "Buffer A", (a), len); \ + rte_memdump(stdout, "Buffer B", (b), len); \ + return TEST_FAILED; \ + } \ +} while (0) + +#define TEST_ASSERT_SUCCESS(val, msg, ...) do { \ + typeof(val) _val = (val); \ + if (!(_val == 0)) { \ + printf("TestCase %s() line %d failed (err %d): " \ + msg "\n", __func__, __LINE__, _val, \ + ##__VA_ARGS__); \ + return TEST_FAILED; \ + } \ +} while (0) + +#define TEST_ASSERT_FAIL(val, msg, ...) \ + TEST_ASSERT_SUCCESS(!(val), msg, ##__VA_ARGS__) + +#define TEST_ASSERT_NOT_NULL(val, msg, ...) do { \ + if ((val) == NULL) { \ + printf("TestCase %s() line %d failed (null): " \ + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ + return TEST_FAILED; \ + } \ +} while (0) + +struct unit_test_case { + int (*setup)(void); + void (*teardown)(void); + int (*testcase)(void); + const char *name; +}; + +#define TEST_CASE(testcase) {NULL, NULL, testcase, #testcase} + +#define TEST_CASE_ST(setup, teardown, testcase) \ + {setup, teardown, testcase, #testcase} + +#define TEST_CASES_END() {NULL, NULL, NULL, NULL} + +struct unit_test_suite { + const char *suite_name; + int (*setup)(void); + void (*teardown)(void); + struct unit_test_case unit_test_cases[]; +}; + +int unit_test_suite_runner(struct unit_test_suite *suite); + +typedef int (test_callback)(void); +TAILQ_HEAD(test_commands_list, test_command); +struct test_command { + TAILQ_ENTRY(test_command) next; + const char *command; + test_callback *callback; +}; + +void add_test_command(struct test_command *t); + +/* Register a test function */ +#define REGISTER_TEST_COMMAND(name, testsuite) \ + static int test_func_##name(void) \ + { \ + return unit_test_suite_runner(&testsuite); \ + } \ + static struct test_command test_struct_##name = { \ + .command = RTE_STR(name), \ + .callback = test_func_##name, \ + }; \ + RTE_INIT(test_register_##name) \ + { \ + add_test_command(&test_struct_##name); \ + } + +const char *get_vector_filename(void); + +unsigned int get_num_ops(void); + +unsigned int get_burst_sz(void); + +unsigned int get_num_lcores(void); + +double get_snr(void); + +unsigned int get_iter_max(void); + +bool get_init_device(void); + +#endif diff --git a/targets/ARCH/test-bbdev/meson.build b/targets/ARCH/test-bbdev/meson.build new file mode 100644 index 0000000000..18ab6a8c6c --- /dev/null +++ b/targets/ARCH/test-bbdev/meson.build @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2018 Intel Corporation + +sources = files('main.c', + 'test_bbdev.c', + 'test_bbdev_perf.c', + 'test_bbdev_vector.c') +deps += ['bbdev', 'bus_vdev'] +if dpdk_conf.has('RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC') + deps += ['pmd_bbdev_fpga_lte_fec'] +endif +if dpdk_conf.has('RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC') + deps += ['pmd_bbdev_fpga_5gnr_fec'] +endif diff --git a/targets/ARCH/test-bbdev/test-bbdev.py b/targets/ARCH/test-bbdev/test-bbdev.py new file mode 100755 index 0000000000..0194be0464 --- /dev/null +++ b/targets/ARCH/test-bbdev/test-bbdev.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python + +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +import sys +import os +import argparse +import subprocess +import shlex + +from threading import Timer + +def kill(process): + print "ERROR: Test app timed out" + process.kill() + +if "RTE_SDK" in os.environ: + dpdk_path = os.environ["RTE_SDK"] +else: + dpdk_path = "../.." + +if "RTE_TARGET" in os.environ: + dpdk_target = os.environ["RTE_TARGET"] +else: + dpdk_target = "x86_64-native-linux-gcc" + +parser = argparse.ArgumentParser( + description='BBdev Unit Test Application', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) +parser.add_argument("-p", "--testapp-path", + help="specifies path to the bbdev test app", + default=dpdk_path + "/" + dpdk_target + "/app/testbbdev") +parser.add_argument("-e", "--eal-params", + help="EAL arguments which are passed to the test app", + default="--vdev=baseband_null0") +parser.add_argument("-t", "--timeout", + type=int, + help="Timeout in seconds", + default=300) +parser.add_argument("-c", "--test-cases", + nargs="+", + help="Defines test cases to run. Run all if not specified") +parser.add_argument("-v", "--test-vector", + nargs="+", + help="Specifies paths to the test vector files.", + default=[dpdk_path + + "/app/test-bbdev/test_vectors/bbdev_null.data"]) +parser.add_argument("-n", "--num-ops", + type=int, + help="Number of operations to process on device.", + default=32) +parser.add_argument("-b", "--burst-size", + nargs="+", + type=int, + help="Operations enqueue/dequeue burst size.", + default=[32]) +parser.add_argument("-l", "--num-lcores", + type=int, + help="Number of lcores to run.", + default=16) +parser.add_argument("-i", "--init-device", + action='store_true', + help="Initialise PF device with default values.") + +args = parser.parse_args() + +if not os.path.exists(args.testapp_path): + print "No such file: " + args.testapp_path + sys.exit(1) + +params = [args.testapp_path] +if args.eal_params: + params.extend(shlex.split(args.eal_params)) + +params.extend(["--"]) + +if args.num_ops: + params.extend(["-n", str(args.num_ops)]) + +if args.num_lcores: + params.extend(["-l", str(args.num_lcores)]) + +if args.test_cases: + params.extend(["-c"]) + params.extend([",".join(args.test_cases)]) + +if args.init_device: + params.extend(["-i"]) + + +exit_status = 0 +for vector in args.test_vector: + for burst_size in args.burst_size: + call_params = params[:] + call_params.extend(["-v", vector]) + call_params.extend(["-b", str(burst_size)]) + params_string = " ".join(call_params) + + print("Executing: {}".format(params_string)) + app_proc = subprocess.Popen(call_params) + if args.timeout > 0: + timer = Timer(args.timeout, kill, [app_proc]) + timer.start() + + try: + app_proc.communicate() + except: + print("Error: failed to execute: {}".format(params_string)) + finally: + timer.cancel() + + if app_proc.returncode != 0: + exit_status = 1 + print("ERROR TestCase failed. Failed test for vector {}. Return code: {}".format( + vector, app_proc.returncode)) + +sys.exit(exit_status) diff --git a/targets/ARCH/test-bbdev/test_bbdev.c b/targets/ARCH/test-bbdev/test_bbdev.c new file mode 100644 index 0000000000..ac06d7320a --- /dev/null +++ b/targets/ARCH/test-bbdev/test_bbdev.c @@ -0,0 +1,1371 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "main.h" + + +#define BBDEV_NAME_NULL ("bbdev_null") + +struct bbdev_testsuite_params { + struct rte_bbdev_queue_conf qconf; +}; + +static struct bbdev_testsuite_params testsuite_params; + +static uint8_t null_dev_id; + +static int +testsuite_setup(void) +{ + uint8_t nb_devs; + int ret; + char buf[RTE_BBDEV_NAME_MAX_LEN]; + + /* Create test device */ + snprintf(buf, sizeof(buf), "%s_unittest", BBDEV_NAME_NULL); + ret = rte_vdev_init(buf, NULL); + TEST_ASSERT(ret == 0, "Failed to create instance of pmd: %s", buf); + + nb_devs = rte_bbdev_count(); + TEST_ASSERT(nb_devs != 0, "No devices found"); + + /* Most recently created device is our device */ + null_dev_id = nb_devs - 1; + + return TEST_SUCCESS; +} + +static void +testsuite_teardown(void) +{ + char buf[RTE_BBDEV_NAME_MAX_LEN]; + + snprintf(buf, sizeof(buf), "%s_unittest", BBDEV_NAME_NULL); + rte_vdev_uninit(buf); +} + +static int +ut_setup(void) +{ + struct bbdev_testsuite_params *ts_params = &testsuite_params; + uint8_t num_queues; + + /* Valid queue configuration */ + ts_params->qconf.priority = 0; + ts_params->qconf.socket = SOCKET_ID_ANY; + ts_params->qconf.deferred_start = 1; + + num_queues = 1; + TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(null_dev_id, num_queues, + SOCKET_ID_ANY), "Failed to setup queues for bbdev %u", + 0); + + /* Start the device */ + TEST_ASSERT_SUCCESS(rte_bbdev_start(null_dev_id), + "Failed to start bbdev %u", 0); + + return TEST_SUCCESS; +} + +static void +ut_teardown(void) +{ + rte_bbdev_close(null_dev_id); +} + +static int +test_bbdev_configure_invalid_dev_id(void) +{ + uint8_t dev_id; + uint8_t num_queues; + + num_queues = 1; + for (dev_id = 0; dev_id < RTE_BBDEV_MAX_DEVS; dev_id++) { + if (!rte_bbdev_is_valid(dev_id)) { + TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, + num_queues, SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "invalid dev_num %u", dev_id); + TEST_ASSERT(rte_bbdev_intr_enable(dev_id) == -ENODEV, + "Failed test for rte_bbdev_intr_enable: " + "invalid dev_num %u", dev_id); + break; + } + } + + return TEST_SUCCESS; +} + +static int +test_bbdev_configure_invalid_num_queues(void) +{ + struct rte_bbdev_info info; + uint8_t dev_id, num_devs; + uint8_t num_queues; + int return_value; + + TEST_ASSERT((num_devs = rte_bbdev_count()) >= 1, + "Need at least %d devices for test", 1); + + /* valid num_queues values */ + num_queues = 8; + + /* valid dev_id values */ + dev_id = null_dev_id; + + /* Stop the device in case it's started so it can be configured */ + rte_bbdev_stop(dev_id); + + TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 0, SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "invalid num_queues %d", 0); + + TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, num_queues, + SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "invalid dev_num %u", dev_id); + + TEST_ASSERT_FAIL(return_value = rte_bbdev_info_get(dev_id, NULL), + "Failed test for rte_bbdev_info_get: " + "returned value:%i", return_value); + + TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), + "Failed test for rte_bbdev_info_get: " + "invalid return value:%i", return_value); + + TEST_ASSERT(info.num_queues == num_queues, + "Failed test for rte_bbdev_info_get: " + "invalid num_queues:%u", info.num_queues); + + num_queues = info.drv.max_num_queues; + TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, num_queues, + SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "invalid num_queues: %u", num_queues); + + num_queues++; + TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, num_queues, + SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "invalid num_queues: %u", num_queues); + + return TEST_SUCCESS; +} + +static int +test_bbdev_configure_stop_device(void) +{ + struct rte_bbdev_info info; + uint8_t dev_id; + int return_value; + + /* valid dev_id values */ + dev_id = null_dev_id; + + /* Stop the device so it can be configured */ + rte_bbdev_stop(dev_id); + + TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), + "Failed test for rte_bbdev_info_get: " + "invalid return value from " + "rte_bbdev_info_get function: %i", return_value); + + TEST_ASSERT_SUCCESS(info.started, "Failed test for rte_bbdev_info_get: " + "started value: %u", info.started); + + TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, + info.drv.max_num_queues, SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "device should be stopped, dev_id: %u", dev_id); + + return_value = rte_bbdev_intr_enable(dev_id); + TEST_ASSERT(return_value != -EBUSY, + "Failed test for rte_bbdev_intr_enable: device should be stopped, dev_id: %u", + dev_id); + + /* Start the device so it cannot be configured */ + TEST_ASSERT_FAIL(rte_bbdev_start(RTE_BBDEV_MAX_DEVS), + "Failed to start bbdev %u", dev_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), + "Failed to start bbdev %u", dev_id); + + TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), + "Failed test for rte_bbdev_info_get: " + "invalid return value from " + "rte_bbdev_info_get function: %i", return_value); + + TEST_ASSERT_FAIL(info.started, "Failed test for rte_bbdev_info_get: " + "started value: %u", info.started); + + TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, + info.drv.max_num_queues, SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "device should be started, dev_id: %u", dev_id); + + return_value = rte_bbdev_intr_enable(dev_id); + TEST_ASSERT(return_value == -EBUSY, + "Failed test for rte_bbdev_intr_enable: device should be started, dev_id: %u", + dev_id); + + /* Stop again the device so it can be once again configured */ + TEST_ASSERT_FAIL(rte_bbdev_stop(RTE_BBDEV_MAX_DEVS), + "Failed to start bbdev %u", dev_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), "Failed to stop bbdev %u", + dev_id); + + TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), + "Failed test for rte_bbdev_info_get: " + "invalid return value from " + "rte_bbdev_info_get function: %i", return_value); + + TEST_ASSERT_SUCCESS(info.started, "Failed test for rte_bbdev_info_get: " + "started value: %u", info.started); + + TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, + info.drv.max_num_queues, SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "device should be stopped, dev_id: %u", dev_id); + + return_value = rte_bbdev_intr_enable(dev_id); + TEST_ASSERT(return_value != -EBUSY, + "Failed test for rte_bbdev_intr_enable: device should be stopped, dev_id: %u", + dev_id); + + return TEST_SUCCESS; +} + +static int +test_bbdev_configure_stop_queue(void) +{ + struct bbdev_testsuite_params *ts_params = &testsuite_params; + struct rte_bbdev_info info; + struct rte_bbdev_queue_info qinfo; + uint8_t dev_id; + uint16_t queue_id; + int return_value; + + /* Valid dev_id values */ + dev_id = null_dev_id; + + /* Valid queue_id values */ + queue_id = 0; + + rte_bbdev_stop(dev_id); + TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), + "Failed test for rte_bbdev_info_get: " + "invalid return value:%i", return_value); + + /* Valid queue configuration */ + ts_params->qconf.queue_size = info.drv.queue_size_lim; + ts_params->qconf.priority = info.drv.max_ul_queue_priority; + + /* Device - started; queue - started */ + rte_bbdev_start(dev_id); + + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed test for rte_bbdev_queue_configure: " + "queue:%u on device:%u should be stopped", + queue_id, dev_id); + + /* Device - stopped; queue - started */ + rte_bbdev_stop(dev_id); + + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed test for rte_bbdev_queue_configure: " + "queue:%u on device:%u should be stopped", + queue_id, dev_id); + + TEST_ASSERT_FAIL(rte_bbdev_queue_stop(RTE_BBDEV_MAX_DEVS, queue_id), + "Failed test for rte_bbdev_queue_stop " + "invalid dev_id "); + + TEST_ASSERT_FAIL(rte_bbdev_queue_stop(dev_id, RTE_MAX_QUEUES_PER_PORT), + "Failed test for rte_bbdev_queue_stop " + "invalid queue_id "); + + /* Device - stopped; queue - stopped */ + rte_bbdev_queue_stop(dev_id, queue_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed test for rte_bbdev_queue_configure: " + "queue:%u on device:%u should be stopped", queue_id, + dev_id); + + TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id, + queue_id, &qinfo), + "Failed test for rte_bbdev_info_get: " + "invalid return value from " + "rte_bbdev_queue_info_get function: %i", return_value); + + TEST_ASSERT(qinfo.conf.socket == ts_params->qconf.socket, + "Failed test for rte_bbdev_queue_info_get: " + "invalid queue_size:%u", qinfo.conf.socket); + + TEST_ASSERT(qinfo.conf.queue_size == ts_params->qconf.queue_size, + "Failed test for rte_bbdev_queue_info_get: " + "invalid queue_size:%u", qinfo.conf.queue_size); + + TEST_ASSERT(qinfo.conf.priority == ts_params->qconf.priority, + "Failed test for rte_bbdev_queue_info_get: " + "invalid queue_size:%u", qinfo.conf.priority); + + TEST_ASSERT(qinfo.conf.deferred_start == + ts_params->qconf.deferred_start, + "Failed test for rte_bbdev_queue_info_get: " + "invalid queue_size:%u", qinfo.conf.deferred_start); + + /* Device - started; queue - stopped */ + rte_bbdev_start(dev_id); + rte_bbdev_queue_stop(dev_id, queue_id); + + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed test for rte_bbdev_queue_configure: " + "queue:%u on device:%u should be stopped", queue_id, + dev_id); + + rte_bbdev_stop(dev_id); + + /* After rte_bbdev_start(dev_id): + * - queue should be still stopped if deferred_start == + */ + rte_bbdev_start(dev_id); + + TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id, + queue_id, &qinfo), + "Failed test for rte_bbdev_info_get: " + "invalid return value from " + "rte_bbdev_queue_info_get function: %i", return_value); + + TEST_ASSERT(qinfo.started == 0, + "Failed test for rte_bbdev_queue_info_get: " + "invalid value for qinfo.started:%u", qinfo.started); + + rte_bbdev_stop(dev_id); + + /* After rte_bbdev_start(dev_id): + * - queue should be started if deferred_start == + */ + ts_params->qconf.deferred_start = 0; + rte_bbdev_queue_configure(dev_id, queue_id, &ts_params->qconf); + rte_bbdev_start(dev_id); + + TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id, + queue_id, &qinfo), + "Failed test for rte_bbdev_info_get: " + "invalid return value from " + "rte_bbdev_queue_info_get function: %i", return_value); + + TEST_ASSERT(qinfo.started == 1, + "Failed test for rte_bbdev_queue_info_get: " + "invalid value for qinfo.started:%u", qinfo.started); + + return TEST_SUCCESS; +} + +static int +test_bbdev_configure_invalid_queue_configure(void) +{ + struct bbdev_testsuite_params *ts_params = &testsuite_params; + int return_value; + struct rte_bbdev_info info; + uint8_t dev_id; + uint16_t queue_id; + + /* Valid dev_id values */ + dev_id = null_dev_id; + + /* Valid queue_id values */ + queue_id = 0; + + rte_bbdev_stop(dev_id); + + TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), + "Failed test for rte_bbdev_info_get: " + "invalid return value:%i", return_value); + + rte_bbdev_queue_stop(dev_id, queue_id); + + ts_params->qconf.queue_size = info.drv.queue_size_lim + 1; + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed test for rte_bbdev_queue_configure: " + "invalid value qconf.queue_size: %u", + ts_params->qconf.queue_size); + + ts_params->qconf.queue_size = info.drv.queue_size_lim; + ts_params->qconf.priority = info.drv.max_ul_queue_priority; + queue_id = info.num_queues; + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed test for rte_bbdev_queue_configure: " + "invalid value queue_id: %u", queue_id); + + queue_id = 0; + TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, NULL), + "Failed test for rte_bbdev_queue_configure: " + "NULL qconf structure "); + + ts_params->qconf.socket = RTE_MAX_NUMA_NODES; + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed test for rte_bbdev_queue_configure: " + "invalid socket number "); + + ts_params->qconf.socket = SOCKET_ID_ANY; + TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed test for rte_bbdev_queue_configure: " + "invalid value qconf.queue_size: %u", + ts_params->qconf.queue_size); + + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(RTE_BBDEV_MAX_DEVS, queue_id, + &ts_params->qconf), + "Failed test for rte_bbdev_queue_configure: " + "invalid dev_id"); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, NULL), + "Failed test for rte_bbdev_queue_configure: " + "invalid value qconf.queue_size: %u", + ts_params->qconf.queue_size); + + return TEST_SUCCESS; +} + +static int +test_bbdev_op_pool(void) +{ + struct rte_mempool *mp; + + unsigned int dec_size = sizeof(struct rte_bbdev_dec_op); + unsigned int enc_size = sizeof(struct rte_bbdev_enc_op); + + const char *pool_dec = "Test_DEC"; + const char *pool_enc = "Test_ENC"; + + /* Valid pool configuration */ + uint32_t size = 256; + uint32_t cache_size = 128; + + TEST_ASSERT(rte_bbdev_op_pool_create(NULL, + RTE_BBDEV_OP_TURBO_DEC, size, cache_size, 0) == NULL, + "Failed test for rte_bbdev_op_pool_create: " + "NULL name parameter"); + + TEST_ASSERT((mp = rte_bbdev_op_pool_create(pool_dec, + RTE_BBDEV_OP_TURBO_DEC, size, cache_size, 0)) != NULL, + "Failed test for rte_bbdev_op_pool_create: " + "returned value is empty"); + + TEST_ASSERT(mp->size == size, + "Failed test for rte_bbdev_op_pool_create: " + "invalid size of the mempool, mp->size: %u", mp->size); + + TEST_ASSERT(mp->cache_size == cache_size, + "Failed test for rte_bbdev_op_pool_create: " + "invalid size of the mempool, mp->size: %u", + mp->cache_size); + + TEST_ASSERT_SUCCESS(strcmp(mp->name, pool_dec), + "Failed test for rte_bbdev_op_pool_create: " + "invalid name of mempool, mp->name: %s", mp->name); + + TEST_ASSERT(mp->elt_size == dec_size, + "Failed test for rte_bbdev_op_pool_create: " + "invalid element size for RTE_BBDEV_OP_TURBO_DEC, " + "mp->elt_size: %u", mp->elt_size); + + rte_mempool_free(mp); + + TEST_ASSERT((mp = rte_bbdev_op_pool_create(pool_enc, + RTE_BBDEV_OP_TURBO_ENC, size, cache_size, 0)) != NULL, + "Failed test for rte_bbdev_op_pool_create: " + "returned value is empty"); + + TEST_ASSERT(mp->elt_size == enc_size, + "Failed test for rte_bbdev_op_pool_create: " + "invalid element size for RTE_BBDEV_OP_TURBO_ENC, " + "mp->elt_size: %u", mp->elt_size); + + rte_mempool_free(mp); + + TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_NONE", + RTE_BBDEV_OP_NONE, size, cache_size, 0)) != NULL, + "Failed test for rte_bbdev_op_pool_create: " + "returned value is empty for RTE_BBDEV_OP_NONE"); + + TEST_ASSERT(mp->elt_size == (enc_size > dec_size ? enc_size : dec_size), + "Failed test for rte_bbdev_op_pool_create: " + "invalid size for RTE_BBDEV_OP_NONE, mp->elt_size: %u", + mp->elt_size); + + rte_mempool_free(mp); + + TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_INV", + RTE_BBDEV_OP_TYPE_COUNT, size, cache_size, 0)) == NULL, + "Failed test for rte_bbdev_op_pool_create: " + "returned value is not NULL for invalid type"); + + /* Invalid pool configuration */ + size = 128; + cache_size = 256; + + TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_InvSize", + RTE_BBDEV_OP_NONE, size, cache_size, 0)) == NULL, + "Failed test for rte_bbdev_op_pool_create: " + "returned value should be empty " + "because size of per-lcore local cache " + "is greater than size of the mempool."); + + return TEST_SUCCESS; +} + +/** + * Create pool of OP types RTE_BBDEV_OP_NONE, RTE_BBDEV_OP_TURBO_DEC and + * RTE_BBDEV_OP_TURBO_ENC and check that only ops of that type can be + * allocated + */ +static int +test_bbdev_op_type(void) +{ + struct rte_mempool *mp_dec; + + const unsigned int OPS_COUNT = 32; + struct rte_bbdev_dec_op *dec_ops_arr[OPS_COUNT]; + struct rte_bbdev_enc_op *enc_ops_arr[OPS_COUNT]; + + const char *pool_dec = "Test_op_dec"; + + /* Valid pool configuration */ + uint32_t num_elements = 256; + uint32_t cache_size = 128; + + /* mempool type : RTE_BBDEV_OP_TURBO_DEC */ + mp_dec = rte_bbdev_op_pool_create(pool_dec, + RTE_BBDEV_OP_TURBO_DEC, num_elements, cache_size, 0); + TEST_ASSERT(mp_dec != NULL, "Failed to create %s mempool", pool_dec); + + TEST_ASSERT(rte_bbdev_dec_op_alloc_bulk(mp_dec, dec_ops_arr, 1) == 0, + "Failed test for rte_bbdev_op_alloc_bulk TURBO_DEC: " + "OPs type: RTE_BBDEV_OP_TURBO_DEC"); + + TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_dec, enc_ops_arr, 1) != 0, + "Failed test for rte_bbdev_op_alloc_bulk TURBO_DEC: " + "OPs type: RTE_BBDEV_OP_TURBO_ENC"); + + rte_mempool_free(mp_dec); + + return TEST_SUCCESS; +} + +static int +test_bbdev_op_pool_size(void) +{ + struct rte_mempool *mp_none; + + const unsigned int OPS_COUNT = 128; + struct rte_bbdev_enc_op *ops_enc_arr[OPS_COUNT]; + struct rte_bbdev_enc_op *ops_ext_arr[OPS_COUNT]; + struct rte_bbdev_enc_op *ops_ext2_arr[OPS_COUNT]; + + const char *pool_none = "Test_pool_size"; + + /* Valid pool configuration */ + uint32_t num_elements = 256; + uint32_t cache_size = 0; + + /* Create mempool type : RTE_BBDEV_OP_TURBO_ENC, size : 256 */ + mp_none = rte_bbdev_op_pool_create(pool_none, RTE_BBDEV_OP_TURBO_ENC, + num_elements, cache_size, 0); + TEST_ASSERT(mp_none != NULL, "Failed to create %s mempool", pool_none); + + /* Add 128 RTE_BBDEV_OP_TURBO_ENC ops */ + rte_bbdev_enc_op_alloc_bulk(mp_none, ops_enc_arr, OPS_COUNT); + + /* Add 128 RTE_BBDEV_OP_TURBO_ENC ops */ + TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext_arr, + OPS_COUNT) == 0, + "Failed test for allocating bbdev ops: " + "Mempool size: 256, Free : 128, Attempted to add: 128"); + + /* Try adding 128 more RTE_BBDEV_OP_TURBO_ENC ops, this should fail */ + TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext2_arr, + OPS_COUNT) != 0, + "Failed test for allocating bbdev ops: " + "Mempool size: 256, Free : 0, Attempted to add: 128"); + + /* Free-up 128 RTE_BBDEV_OP_TURBO_ENC ops */ + rte_bbdev_enc_op_free_bulk(ops_enc_arr, OPS_COUNT); + + /* Try adding 128 RTE_BBDEV_OP_TURBO_DEC ops, this should succeed */ + /* Cache size > 0 causes reallocation of ops size > 127 fail */ + TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext2_arr, + OPS_COUNT) == 0, + "Failed test for allocating ops after mempool freed: " + "Mempool size: 256, Free : 128, Attempted to add: 128"); + + rte_mempool_free(mp_none); + + return TEST_SUCCESS; +} + +static int +test_bbdev_count(void) +{ + uint8_t num_devs, num_valid_devs = 0; + + for (num_devs = 0; num_devs < RTE_BBDEV_MAX_DEVS; num_devs++) { + if (rte_bbdev_is_valid(num_devs)) + num_valid_devs++; + } + + num_devs = rte_bbdev_count(); + TEST_ASSERT(num_valid_devs == num_devs, + "Failed test for rte_bbdev_is_valid: " + "invalid num_devs %u ", num_devs); + + return TEST_SUCCESS; +} + +static int +test_bbdev_stats(void) +{ + uint8_t dev_id = null_dev_id; + uint16_t queue_id = 0; + struct rte_bbdev_dec_op *dec_ops[4096] = { 0 }; + struct rte_bbdev_dec_op *dec_proc_ops[4096] = { 0 }; + struct rte_bbdev_enc_op *enc_ops[4096] = { 0 }; + struct rte_bbdev_enc_op *enc_proc_ops[4096] = { 0 }; + uint16_t num_ops = 236; + struct rte_bbdev_stats stats; + struct bbdev_testsuite_params *ts_params = &testsuite_params; + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_stop(dev_id, queue_id), + "Failed to stop queue %u on device %u ", queue_id, + dev_id); + TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), + "Failed to stop bbdev %u ", dev_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed to configure queue %u on device %u ", + queue_id, dev_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), + "Failed to start bbdev %u ", dev_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id), + "Failed to start queue %u on device %u ", queue_id, + dev_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id), + "Failed to start queue %u on device %u ", queue_id, + dev_id); + + /* Tests after enqueue operation */ + rte_bbdev_enqueue_enc_ops(dev_id, queue_id, enc_ops, num_ops); + rte_bbdev_enqueue_dec_ops(dev_id, queue_id, dec_ops, num_ops); + + TEST_ASSERT_FAIL(rte_bbdev_stats_get(RTE_BBDEV_MAX_DEVS, &stats), + "Failed test for rte_bbdev_stats_get on device %u ", + dev_id); + + TEST_ASSERT_FAIL(rte_bbdev_stats_get(dev_id, NULL), + "Failed test for rte_bbdev_stats_get on device %u ", + dev_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), + "Failed test for rte_bbdev_stats_get on device %u ", + dev_id); + + TEST_ASSERT(stats.enqueued_count == 2 * num_ops, + "Failed test for rte_bbdev_enqueue_ops: " + "invalid enqueued_count %" PRIu64 " ", + stats.enqueued_count); + + TEST_ASSERT(stats.dequeued_count == 0, + "Failed test for rte_bbdev_stats_reset: " + "invalid dequeued_count %" PRIu64 " ", + stats.dequeued_count); + + /* Tests after dequeue operation */ + rte_bbdev_dequeue_enc_ops(dev_id, queue_id, enc_proc_ops, num_ops); + rte_bbdev_dequeue_dec_ops(dev_id, queue_id, dec_proc_ops, num_ops); + + TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), + "Failed test for rte_bbdev_stats_get on device %u ", + dev_id); + + TEST_ASSERT(stats.dequeued_count == 2 * num_ops, + "Failed test for rte_bbdev_dequeue_ops: " + "invalid enqueued_count %" PRIu64 " ", + stats.dequeued_count); + + TEST_ASSERT(stats.enqueue_err_count == 0, + "Failed test for rte_bbdev_stats_reset: " + "invalid enqueue_err_count %" PRIu64 " ", + stats.enqueue_err_count); + + TEST_ASSERT(stats.dequeue_err_count == 0, + "Failed test for rte_bbdev_stats_reset: " + "invalid dequeue_err_count %" PRIu64 " ", + stats.dequeue_err_count); + + /* Tests after reset operation */ + TEST_ASSERT_FAIL(rte_bbdev_stats_reset(RTE_BBDEV_MAX_DEVS), + "Failed to reset statistic for device %u ", dev_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), + "Failed to reset statistic for device %u ", dev_id); + TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), + "Failed test for rte_bbdev_stats_get on device %u ", + dev_id); + + TEST_ASSERT(stats.enqueued_count == 0, + "Failed test for rte_bbdev_stats_reset: " + "invalid enqueued_count %" PRIu64 " ", + stats.enqueued_count); + + TEST_ASSERT(stats.dequeued_count == 0, + "Failed test for rte_bbdev_stats_reset: " + "invalid dequeued_count %" PRIu64 " ", + stats.dequeued_count); + + TEST_ASSERT(stats.enqueue_err_count == 0, + "Failed test for rte_bbdev_stats_reset: " + "invalid enqueue_err_count %" PRIu64 " ", + stats.enqueue_err_count); + + TEST_ASSERT(stats.dequeue_err_count == 0, + "Failed test for rte_bbdev_stats_reset: " + "invalid dequeue_err_count %" PRIu64 " ", + stats.dequeue_err_count); + + return TEST_SUCCESS; +} + +static int +test_bbdev_driver_init(void) +{ + struct rte_bbdev *dev1, *dev2; + const char *name = "dev_name"; + char name_tmp[32]; + int num_devs, num_devs_tmp; + + dev1 = rte_bbdev_allocate(NULL); + TEST_ASSERT(dev1 == NULL, + "Failed initialize bbdev driver with NULL name"); + + dev1 = rte_bbdev_allocate(name); + TEST_ASSERT(dev1 != NULL, "Failed to initialize bbdev driver"); + + dev2 = rte_bbdev_allocate(name); + TEST_ASSERT(dev2 == NULL, + "Failed to initialize bbdev driver: " + "driver with the same name has been initialized before"); + + num_devs = rte_bbdev_count() - 1; + num_devs_tmp = num_devs; + + /* Initialize the maximum amount of devices */ + do { + sprintf(name_tmp, "%s%i", "name_", num_devs); + dev2 = rte_bbdev_allocate(name_tmp); + TEST_ASSERT(dev2 != NULL, + "Failed to initialize bbdev driver"); + ++num_devs; + } while (num_devs < (RTE_BBDEV_MAX_DEVS - 1)); + + sprintf(name_tmp, "%s%i", "name_", num_devs); + dev2 = rte_bbdev_allocate(name_tmp); + TEST_ASSERT(dev2 == NULL, "Failed to initialize bbdev driver number %d " + "more drivers than RTE_BBDEV_MAX_DEVS: %d ", num_devs, + RTE_BBDEV_MAX_DEVS); + + num_devs--; + + while (num_devs >= num_devs_tmp) { + sprintf(name_tmp, "%s%i", "name_", num_devs); + dev2 = rte_bbdev_get_named_dev(name_tmp); + TEST_ASSERT_SUCCESS(rte_bbdev_release(dev2), + "Failed to uninitialize bbdev driver %s ", + name_tmp); + num_devs--; + } + + TEST_ASSERT(dev1->data->dev_id < RTE_BBDEV_MAX_DEVS, + "Failed test rte_bbdev_allocate: " + "invalid dev_id %" PRIu8 ", max number of devices %d ", + dev1->data->dev_id, RTE_BBDEV_MAX_DEVS); + + TEST_ASSERT(dev1->state == RTE_BBDEV_INITIALIZED, + "Failed test rte_bbdev_allocate: " + "invalid state %d (0 - RTE_BBDEV_UNUSED, 1 - RTE_BBDEV_INITIALIZED", + dev1->state); + + TEST_ASSERT_FAIL(rte_bbdev_release(NULL), + "Failed to uninitialize bbdev driver with NULL bbdev"); + + sprintf(name_tmp, "%s", "invalid_name"); + dev2 = rte_bbdev_get_named_dev(name_tmp); + TEST_ASSERT_FAIL(rte_bbdev_release(dev2), + "Failed to uninitialize bbdev driver with invalid name"); + + dev2 = rte_bbdev_get_named_dev(name); + TEST_ASSERT_SUCCESS(rte_bbdev_release(dev2), + "Failed to uninitialize bbdev driver: %s ", name); + + return TEST_SUCCESS; +} + +static void +event_callback(uint16_t dev_id, enum rte_bbdev_event_type type, void *param, + void *ret_param) +{ + RTE_SET_USED(dev_id); + RTE_SET_USED(ret_param); + + if (param == NULL) + return; + + if (type == RTE_BBDEV_EVENT_UNKNOWN || + type == RTE_BBDEV_EVENT_ERROR || + type == RTE_BBDEV_EVENT_MAX) + *(int *)param = type; +} + +static int +test_bbdev_callback(void) +{ + struct rte_bbdev *dev1, *dev2; + const char *name = "dev_name1"; + const char *name2 = "dev_name2"; + int event_status; + uint8_t invalid_dev_id = RTE_BBDEV_MAX_DEVS; + enum rte_bbdev_event_type invalid_event_type = RTE_BBDEV_EVENT_MAX; + uint8_t dev_id; + + dev1 = rte_bbdev_allocate(name); + TEST_ASSERT(dev1 != NULL, "Failed to initialize bbdev driver"); + + /* + * RTE_BBDEV_EVENT_UNKNOWN - unregistered + * RTE_BBDEV_EVENT_ERROR - unregistered + */ + event_status = -1; + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); + TEST_ASSERT(event_status == -1, + "Failed test for rte_bbdev_pmd_callback_process: " + "events were not registered "); + + TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id, + RTE_BBDEV_EVENT_MAX, event_callback, NULL), + "Failed to callback register for RTE_BBDEV_EVENT_MAX "); + + TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id, + RTE_BBDEV_EVENT_MAX, event_callback, NULL), + "Failed to unregister RTE_BBDEV_EVENT_MAX "); + + /* + * RTE_BBDEV_EVENT_UNKNOWN - registered + * RTE_BBDEV_EVENT_ERROR - unregistered + */ + TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id, + RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), + "Failed to callback rgstr for RTE_BBDEV_EVENT_UNKNOWN"); + + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); + TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, + "Failed test for rte_bbdev_pmd_callback_process " + "for RTE_BBDEV_EVENT_UNKNOWN "); + + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); + TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, + "Failed test for rte_bbdev_pmd_callback_process: " + "event RTE_BBDEV_EVENT_ERROR was not registered "); + + /* + * RTE_BBDEV_EVENT_UNKNOWN - registered + * RTE_BBDEV_EVENT_ERROR - registered + */ + TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id, + RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), + "Failed to callback rgstr for RTE_BBDEV_EVENT_ERROR "); + + TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id, + RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), + "Failed to callback register for RTE_BBDEV_EVENT_ERROR" + "(re-registration) "); + + event_status = -1; + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); + TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, + "Failed test for rte_bbdev_pmd_callback_process " + "for RTE_BBDEV_EVENT_UNKNOWN "); + + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); + TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_ERROR, + "Failed test for rte_bbdev_pmd_callback_process " + "for RTE_BBDEV_EVENT_ERROR "); + + /* + * RTE_BBDEV_EVENT_UNKNOWN - registered + * RTE_BBDEV_EVENT_ERROR - unregistered + */ + TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev1->data->dev_id, + RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), + "Failed to unregister RTE_BBDEV_EVENT_ERROR "); + + event_status = -1; + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); + TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, + "Failed test for rte_bbdev_pmd_callback_process " + "for RTE_BBDEV_EVENT_UNKNOWN "); + + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); + TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, + "Failed test for rte_bbdev_pmd_callback_process: " + "event RTE_BBDEV_EVENT_ERROR was unregistered "); + + /* rte_bbdev_callback_register with invalid inputs */ + TEST_ASSERT_FAIL(rte_bbdev_callback_register(invalid_dev_id, + RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), + "Failed test for rte_bbdev_callback_register " + "for invalid_dev_id "); + + TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id, + invalid_event_type, event_callback, &event_status), + "Failed to callback register for invalid event type "); + + TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id, + RTE_BBDEV_EVENT_ERROR, NULL, &event_status), + "Failed to callback register - no callback function "); + + /* The impact of devices on each other */ + dev2 = rte_bbdev_allocate(name2); + TEST_ASSERT(dev2 != NULL, + "Failed to initialize bbdev driver"); + + /* + * dev2: + * RTE_BBDEV_EVENT_UNKNOWN - unregistered + * RTE_BBDEV_EVENT_ERROR - unregistered + */ + event_status = -1; + rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); + rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL); + TEST_ASSERT(event_status == -1, + "Failed test for rte_bbdev_pmd_callback_process: " + "events were not registered "); + + /* + * dev1: RTE_BBDEV_EVENT_ERROR - unregistered + * dev2: RTE_BBDEV_EVENT_ERROR - registered + */ + TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev2->data->dev_id, + RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), + "Failed to callback rgstr for RTE_BBDEV_EVENT_ERROR"); + + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); + TEST_ASSERT(event_status == -1, + "Failed test for rte_bbdev_pmd_callback_process in dev1 " + "for RTE_BBDEV_EVENT_ERROR "); + + rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL); + TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_ERROR, + "Failed test for rte_bbdev_pmd_callback_process in dev2 " + "for RTE_BBDEV_EVENT_ERROR "); + + /* + * dev1: RTE_BBDEV_EVENT_UNKNOWN - registered + * dev2: RTE_BBDEV_EVENT_UNKNOWN - unregistered + */ + TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev2->data->dev_id, + RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), + "Failed to callback register for RTE_BBDEV_EVENT_UNKNOWN " + "in dev 2 "); + + rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); + TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, + "Failed test for rte_bbdev_pmd_callback_process in dev2" + " for RTE_BBDEV_EVENT_UNKNOWN "); + + TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev2->data->dev_id, + RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), + "Failed to unregister RTE_BBDEV_EVENT_UNKNOWN "); + + TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev2->data->dev_id, + RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), + "Failed to unregister RTE_BBDEV_EVENT_UNKNOWN : " + "unregister function called once again "); + + event_status = -1; + rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); + TEST_ASSERT(event_status == -1, + "Failed test for rte_bbdev_pmd_callback_process in dev2" + " for RTE_BBDEV_EVENT_UNKNOWN "); + + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); + TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, + "Failed test for rte_bbdev_pmd_callback_process in dev2 " + "for RTE_BBDEV_EVENT_UNKNOWN "); + + /* rte_bbdev_pmd_callback_process with invalid inputs */ + rte_bbdev_pmd_callback_process(NULL, RTE_BBDEV_EVENT_UNKNOWN, NULL); + + event_status = -1; + rte_bbdev_pmd_callback_process(dev1, invalid_event_type, NULL); + TEST_ASSERT(event_status == -1, + "Failed test for rte_bbdev_pmd_callback_process: " + "for invalid event type "); + + /* rte_dev_callback_unregister with invalid inputs */ + TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(invalid_dev_id, + RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), + "Failed test for rte_dev_callback_unregister " + "for invalid_dev_id "); + + TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id, + invalid_event_type, event_callback, &event_status), + "Failed rte_dev_callback_unregister " + "for invalid event type "); + + TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id, + invalid_event_type, NULL, &event_status), + "Failed rte_dev_callback_unregister " + "when no callback function "); + + dev_id = dev1->data->dev_id; + + rte_bbdev_release(dev1); + rte_bbdev_release(dev2); + + TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev_id, + RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), + "Failed test for rte_bbdev_callback_register: " + "function called after rte_bbdev_driver_uninit ."); + + TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev_id, + RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), + "Failed test for rte_dev_callback_unregister: " + "function called after rte_bbdev_driver_uninit. "); + + event_status = -1; + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); + rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); + rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); + rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL); + TEST_ASSERT(event_status == -1, + "Failed test for rte_bbdev_pmd_callback_process: " + "callback function was called after rte_bbdev_driver_uninit"); + + return TEST_SUCCESS; +} + +static int +test_bbdev_invalid_driver(void) +{ + struct rte_bbdev dev1, *dev2; + uint8_t dev_id = null_dev_id; + uint16_t queue_id = 0; + struct rte_bbdev_stats stats; + struct bbdev_testsuite_params *ts_params = &testsuite_params; + struct rte_bbdev_queue_info qinfo; + struct rte_bbdev_ops dev_ops_tmp; + + TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), "Failed to stop bbdev %u ", + dev_id); + + dev1 = rte_bbdev_devices[dev_id]; + dev2 = &rte_bbdev_devices[dev_id]; + + /* Tests for rte_bbdev_setup_queues */ + dev2->dev_ops = NULL; + TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "NULL dev_ops structure "); + dev2->dev_ops = dev1.dev_ops; + + dev_ops_tmp = *dev2->dev_ops; + dev_ops_tmp.info_get = NULL; + dev2->dev_ops = &dev_ops_tmp; + TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "NULL info_get "); + dev2->dev_ops = dev1.dev_ops; + + dev_ops_tmp = *dev2->dev_ops; + dev_ops_tmp.queue_release = NULL; + dev2->dev_ops = &dev_ops_tmp; + TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY), + "Failed test for rte_bbdev_setup_queues: " + "NULL queue_release "); + dev2->dev_ops = dev1.dev_ops; + + dev2->data->socket_id = SOCKET_ID_ANY; + TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, 1, + SOCKET_ID_ANY), "Failed to configure bbdev %u", dev_id); + + /* Test for rte_bbdev_queue_configure */ + dev2->dev_ops = NULL; + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed to configure queue %u on device %u " + "with NULL dev_ops structure ", queue_id, dev_id); + dev2->dev_ops = dev1.dev_ops; + + dev_ops_tmp = *dev2->dev_ops; + dev_ops_tmp.queue_setup = NULL; + dev2->dev_ops = &dev_ops_tmp; + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed to configure queue %u on device %u " + "with NULL queue_setup ", queue_id, dev_id); + dev2->dev_ops = dev1.dev_ops; + + dev_ops_tmp = *dev2->dev_ops; + dev_ops_tmp.info_get = NULL; + dev2->dev_ops = &dev_ops_tmp; + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed to configure queue %u on device %u " + "with NULL info_get ", queue_id, dev_id); + dev2->dev_ops = dev1.dev_ops; + + TEST_ASSERT_FAIL(rte_bbdev_queue_configure(RTE_BBDEV_MAX_DEVS, + queue_id, &ts_params->qconf), + "Failed to configure queue %u on device %u ", + queue_id, dev_id); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, + &ts_params->qconf), + "Failed to configure queue %u on device %u ", + queue_id, dev_id); + + /* Test for rte_bbdev_queue_info_get */ + dev2->dev_ops = NULL; + TEST_ASSERT_SUCCESS(rte_bbdev_queue_info_get(dev_id, queue_id, &qinfo), + "Failed test for rte_bbdev_info_get: " + "NULL dev_ops structure "); + dev2->dev_ops = dev1.dev_ops; + + TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(RTE_BBDEV_MAX_DEVS, + queue_id, &qinfo), + "Failed test for rte_bbdev_info_get: " + "invalid dev_id "); + + TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(dev_id, + RTE_MAX_QUEUES_PER_PORT, &qinfo), + "Failed test for rte_bbdev_info_get: " + "invalid queue_id "); + + TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(dev_id, queue_id, NULL), + "Failed test for rte_bbdev_info_get: " + "invalid dev_info "); + + /* Test for rte_bbdev_start */ + dev2->dev_ops = NULL; + TEST_ASSERT_FAIL(rte_bbdev_start(dev_id), + "Failed to start bbdev %u " + "with NULL dev_ops structure ", dev_id); + dev2->dev_ops = dev1.dev_ops; + + TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), + "Failed to start bbdev %u ", dev_id); + + /* Test for rte_bbdev_queue_start */ + dev2->dev_ops = NULL; + TEST_ASSERT_FAIL(rte_bbdev_queue_start(dev_id, queue_id), + "Failed to start queue %u on device %u: " + "NULL dev_ops structure", queue_id, dev_id); + dev2->dev_ops = dev1.dev_ops; + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id), + "Failed to start queue %u on device %u ", queue_id, + dev_id); + + /* Tests for rte_bbdev_stats_get */ + dev2->dev_ops = NULL; + TEST_ASSERT_FAIL(rte_bbdev_stats_get(dev_id, &stats), + "Failed test for rte_bbdev_stats_get on device %u ", + dev_id); + dev2->dev_ops = dev1.dev_ops; + + dev_ops_tmp = *dev2->dev_ops; + dev_ops_tmp.stats_reset = NULL; + dev2->dev_ops = &dev_ops_tmp; + TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), + "Failed test for rte_bbdev_stats_get: " + "NULL stats_get "); + dev2->dev_ops = dev1.dev_ops; + + TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), + "Failed test for rte_bbdev_stats_get on device %u ", + dev_id); + + /* + * Tests for: + * rte_bbdev_callback_register, + * rte_bbdev_pmd_callback_process, + * rte_dev_callback_unregister + */ + dev2->dev_ops = NULL; + TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev_id, + RTE_BBDEV_EVENT_UNKNOWN, event_callback, NULL), + "Failed to callback rgstr for RTE_BBDEV_EVENT_UNKNOWN"); + rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); + + TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev_id, + RTE_BBDEV_EVENT_UNKNOWN, event_callback, NULL), + "Failed to unregister RTE_BBDEV_EVENT_ERROR "); + dev2->dev_ops = dev1.dev_ops; + + /* Tests for rte_bbdev_stats_reset */ + dev2->dev_ops = NULL; + TEST_ASSERT_FAIL(rte_bbdev_stats_reset(dev_id), + "Failed to reset statistic for device %u ", dev_id); + dev2->dev_ops = dev1.dev_ops; + + dev_ops_tmp = *dev2->dev_ops; + dev_ops_tmp.stats_reset = NULL; + dev2->dev_ops = &dev_ops_tmp; + TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), + "Failed test for rte_bbdev_stats_reset: " + "NULL stats_reset "); + dev2->dev_ops = dev1.dev_ops; + + TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), + "Failed to reset statistic for device %u ", dev_id); + + /* Tests for rte_bbdev_queue_stop */ + dev2->dev_ops = NULL; + TEST_ASSERT_FAIL(rte_bbdev_queue_stop(dev_id, queue_id), + "Failed to stop queue %u on device %u: " + "NULL dev_ops structure", queue_id, dev_id); + dev2->dev_ops = dev1.dev_ops; + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_stop(dev_id, queue_id), + "Failed to stop queue %u on device %u ", queue_id, + dev_id); + + /* Tests for rte_bbdev_stop */ + dev2->dev_ops = NULL; + TEST_ASSERT_FAIL(rte_bbdev_stop(dev_id), + "Failed to stop bbdev %u with NULL dev_ops structure ", + dev_id); + dev2->dev_ops = dev1.dev_ops; + + TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), + "Failed to stop bbdev %u ", dev_id); + + /* Tests for rte_bbdev_close */ + TEST_ASSERT_FAIL(rte_bbdev_close(RTE_BBDEV_MAX_DEVS), + "Failed to close bbdev with invalid dev_id"); + + dev2->dev_ops = NULL; + TEST_ASSERT_FAIL(rte_bbdev_close(dev_id), + "Failed to close bbdev %u with NULL dev_ops structure ", + dev_id); + dev2->dev_ops = dev1.dev_ops; + + TEST_ASSERT_SUCCESS(rte_bbdev_close(dev_id), + "Failed to close bbdev %u ", dev_id); + + return TEST_SUCCESS; +} + +static int +test_bbdev_get_named_dev(void) +{ + struct rte_bbdev *dev, *dev_tmp; + const char *name = "name"; + + dev = rte_bbdev_allocate(name); + TEST_ASSERT(dev != NULL, "Failed to initialize bbdev driver"); + + dev_tmp = rte_bbdev_get_named_dev(NULL); + TEST_ASSERT(dev_tmp == NULL, "Failed test for rte_bbdev_get_named_dev: " + "function called with NULL parameter"); + + dev_tmp = rte_bbdev_get_named_dev(name); + + TEST_ASSERT(dev == dev_tmp, "Failed test for rte_bbdev_get_named_dev: " + "wrong device was returned "); + + TEST_ASSERT_SUCCESS(rte_bbdev_release(dev), + "Failed to uninitialize bbdev driver %s ", name); + + return TEST_SUCCESS; +} + +static struct unit_test_suite bbdev_null_testsuite = { + .suite_name = "BBDEV NULL Unit Test Suite", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + + TEST_CASE(test_bbdev_configure_invalid_dev_id), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_configure_invalid_num_queues), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_configure_stop_device), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_configure_stop_queue), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_configure_invalid_queue_configure), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_op_pool), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_op_type), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_op_pool_size), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_stats), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_driver_init), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_callback), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_invalid_driver), + + TEST_CASE_ST(ut_setup, ut_teardown, + test_bbdev_get_named_dev), + + TEST_CASE(test_bbdev_count), + + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +REGISTER_TEST_COMMAND(unittest, bbdev_null_testsuite); diff --git a/targets/ARCH/test-bbdev/test_bbdev_perf.c b/targets/ARCH/test-bbdev/test_bbdev_perf.c new file mode 100644 index 0000000000..7bf4890cc7 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_bbdev_perf.c @@ -0,0 +1,5058 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "main.h" +#include "test_bbdev_vector.h" + +#define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id)) + +#define MAX_QUEUES RTE_MAX_LCORE +#define TEST_REPETITIONS 1000 + +#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC +#include +#define FPGA_LTE_PF_DRIVER_NAME ("intel_fpga_lte_fec_pf") +#define FPGA_LTE_VF_DRIVER_NAME ("intel_fpga_lte_fec_vf") +#define VF_UL_4G_QUEUE_VALUE 4 +#define VF_DL_4G_QUEUE_VALUE 4 +#define UL_4G_BANDWIDTH 3 +#define DL_4G_BANDWIDTH 3 +#define UL_4G_LOAD_BALANCE 128 +#define DL_4G_LOAD_BALANCE 128 +#define FLR_4G_TIMEOUT 610 +#endif + +#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC +#include +#define FPGA_5GNR_PF_DRIVER_NAME ("intel_fpga_5gnr_fec_pf") +#define FPGA_5GNR_VF_DRIVER_NAME ("intel_fpga_5gnr_fec_vf") +#define VF_UL_5G_QUEUE_VALUE 4 +#define VF_DL_5G_QUEUE_VALUE 4 +#define UL_5G_BANDWIDTH 3 +#define DL_5G_BANDWIDTH 3 +#define UL_5G_LOAD_BALANCE 128 +#define DL_5G_LOAD_BALANCE 128 +#define FLR_5G_TIMEOUT 610 +#endif + +#define OPS_CACHE_SIZE 256U +#define OPS_POOL_SIZE_MIN 511U /* 0.5K per queue */ + +#define SYNC_WAIT 0 +#define SYNC_START 1 +#define INVALID_OPAQUE -1 + +#define INVALID_QUEUE_ID -1 +/* Increment for next code block in external HARQ memory */ +#define HARQ_INCR 32768 +/* Headroom for filler LLRs insertion in HARQ buffer */ +#define FILLER_HEADROOM 1024 +/* Constants from K0 computation from 3GPP 38.212 Table 5.4.2.1-2 */ +#define N_ZC_1 66 /* N = 66 Zc for BG 1 */ +#define N_ZC_2 50 /* N = 50 Zc for BG 2 */ +#define K0_1_1 17 /* K0 fraction numerator for rv 1 and BG 1 */ +#define K0_1_2 13 /* K0 fraction numerator for rv 1 and BG 2 */ +#define K0_2_1 33 /* K0 fraction numerator for rv 2 and BG 1 */ +#define K0_2_2 25 /* K0 fraction numerator for rv 2 and BG 2 */ +#define K0_3_1 56 /* K0 fraction numerator for rv 3 and BG 1 */ +#define K0_3_2 43 /* K0 fraction numerator for rv 3 and BG 2 */ + +static struct test_bbdev_vector test_vector; + +/* Switch between PMD and Interrupt for throughput TC */ +static bool intr_enabled; + +/* LLR arithmetic representation for numerical conversion */ +static int ldpc_llr_decimals; +static int ldpc_llr_size; +/* Keep track of the LDPC decoder device capability flag */ +static uint32_t ldpc_cap_flags; + +/* Represents tested active devices */ +static struct active_device { + const char *driver_name; + uint8_t dev_id; + uint16_t supported_ops; + uint16_t queue_ids[MAX_QUEUES]; + uint16_t nb_queues; + struct rte_mempool *ops_mempool; + struct rte_mempool *in_mbuf_pool; + struct rte_mempool *hard_out_mbuf_pool; + struct rte_mempool *soft_out_mbuf_pool; + struct rte_mempool *harq_in_mbuf_pool; + struct rte_mempool *harq_out_mbuf_pool; +} active_devs[RTE_BBDEV_MAX_DEVS]; + +static uint8_t nb_active_devs; + +/* Data buffers used by BBDEV ops */ +struct test_buffers { + struct rte_bbdev_op_data *inputs; + struct rte_bbdev_op_data *hard_outputs; + struct rte_bbdev_op_data *soft_outputs; + struct rte_bbdev_op_data *harq_inputs; + struct rte_bbdev_op_data *harq_outputs; +}; + +/* Operation parameters specific for given test case */ +struct test_op_params { + struct rte_mempool *mp; + struct rte_bbdev_dec_op *ref_dec_op; + struct rte_bbdev_enc_op *ref_enc_op; + uint16_t burst_sz; + uint16_t num_to_process; + uint16_t num_lcores; + int vector_mask; + rte_atomic16_t sync; + struct test_buffers q_bufs[RTE_MAX_NUMA_NODES][MAX_QUEUES]; +}; + +/* Contains per lcore params */ +struct thread_params { + uint8_t dev_id; + uint16_t queue_id; + uint32_t lcore_id; + uint64_t start_time; + double ops_per_sec; + double mbps; + uint8_t iter_count; + double iter_average; + double bler; + rte_atomic16_t nb_dequeued; + rte_atomic16_t processing_status; + rte_atomic16_t burst_sz; + struct test_op_params *op_params; + struct rte_bbdev_dec_op *dec_ops[MAX_BURST]; + struct rte_bbdev_enc_op *enc_ops[MAX_BURST]; +}; + +#ifdef RTE_BBDEV_OFFLOAD_COST +/* Stores time statistics */ +struct test_time_stats { + /* Stores software enqueue total working time */ + uint64_t enq_sw_total_time; + /* Stores minimum value of software enqueue working time */ + uint64_t enq_sw_min_time; + /* Stores maximum value of software enqueue working time */ + uint64_t enq_sw_max_time; + /* Stores turbo enqueue total working time */ + uint64_t enq_acc_total_time; + /* Stores minimum value of accelerator enqueue working time */ + uint64_t enq_acc_min_time; + /* Stores maximum value of accelerator enqueue working time */ + uint64_t enq_acc_max_time; + /* Stores dequeue total working time */ + uint64_t deq_total_time; + /* Stores minimum value of dequeue working time */ + uint64_t deq_min_time; + /* Stores maximum value of dequeue working time */ + uint64_t deq_max_time; +}; +#endif + +typedef int (test_case_function)(struct active_device *ad, + struct test_op_params *op_params); + +static inline void +mbuf_reset(struct rte_mbuf *m) +{ + m->pkt_len = 0; + + do { + m->data_len = 0; + m = m->next; + } while (m != NULL); +} + +/* Read flag value 0/1 from bitmap */ +static inline bool +check_bit(uint32_t bitmap, uint32_t bitmask) +{ + return bitmap & bitmask; +} + +static inline void +set_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) +{ + ad->supported_ops |= (1 << op_type); +} + +static inline bool +is_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) +{ + return ad->supported_ops & (1 << op_type); +} + +static inline bool +flags_match(uint32_t flags_req, uint32_t flags_present) +{ + return (flags_req & flags_present) == flags_req; +} + +static void +clear_soft_out_cap(uint32_t *op_flags) +{ + *op_flags &= ~RTE_BBDEV_TURBO_SOFT_OUTPUT; + *op_flags &= ~RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT; + *op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; +} + +static int +check_dev_cap(const struct rte_bbdev_info *dev_info) +{ + unsigned int i; + unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs, + nb_harq_inputs, nb_harq_outputs; + const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities; + + nb_inputs = test_vector.entries[DATA_INPUT].nb_segments; + nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments; + nb_hard_outputs = test_vector.entries[DATA_HARD_OUTPUT].nb_segments; + nb_harq_inputs = test_vector.entries[DATA_HARQ_INPUT].nb_segments; + nb_harq_outputs = test_vector.entries[DATA_HARQ_OUTPUT].nb_segments; + + for (i = 0; op_cap->type != RTE_BBDEV_OP_NONE; ++i, ++op_cap) { + if (op_cap->type != test_vector.op_type) + continue; + + if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) { + const struct rte_bbdev_op_cap_turbo_dec *cap = + &op_cap->cap.turbo_dec; + /* Ignore lack of soft output capability, just skip + * checking if soft output is valid. + */ + if ((test_vector.turbo_dec.op_flags & + RTE_BBDEV_TURBO_SOFT_OUTPUT) && + !(cap->capability_flags & + RTE_BBDEV_TURBO_SOFT_OUTPUT)) { + printf( + "INFO: Device \"%s\" does not support soft output - soft output flags will be ignored.\n", + dev_info->dev_name); + clear_soft_out_cap( + &test_vector.turbo_dec.op_flags); + } + + if (!flags_match(test_vector.turbo_dec.op_flags, + cap->capability_flags)) + return TEST_FAILED; + if (nb_inputs > cap->num_buffers_src) { + printf("Too many inputs defined: %u, max: %u\n", + nb_inputs, cap->num_buffers_src); + return TEST_FAILED; + } + if (nb_soft_outputs > cap->num_buffers_soft_out && + (test_vector.turbo_dec.op_flags & + RTE_BBDEV_TURBO_SOFT_OUTPUT)) { + printf( + "Too many soft outputs defined: %u, max: %u\n", + nb_soft_outputs, + cap->num_buffers_soft_out); + return TEST_FAILED; + } + if (nb_hard_outputs > cap->num_buffers_hard_out) { + printf( + "Too many hard outputs defined: %u, max: %u\n", + nb_hard_outputs, + cap->num_buffers_hard_out); + return TEST_FAILED; + } + if (intr_enabled && !(cap->capability_flags & + RTE_BBDEV_TURBO_DEC_INTERRUPTS)) { + printf( + "Dequeue interrupts are not supported!\n"); + return TEST_FAILED; + } + + return TEST_SUCCESS; + } else if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) { + const struct rte_bbdev_op_cap_turbo_enc *cap = + &op_cap->cap.turbo_enc; + + if (!flags_match(test_vector.turbo_enc.op_flags, + cap->capability_flags)) + return TEST_FAILED; + if (nb_inputs > cap->num_buffers_src) { + printf("Too many inputs defined: %u, max: %u\n", + nb_inputs, cap->num_buffers_src); + return TEST_FAILED; + } + if (nb_hard_outputs > cap->num_buffers_dst) { + printf( + "Too many hard outputs defined: %u, max: %u\n", + nb_hard_outputs, cap->num_buffers_dst); + return TEST_FAILED; + } + if (intr_enabled && !(cap->capability_flags & + RTE_BBDEV_TURBO_ENC_INTERRUPTS)) { + printf( + "Dequeue interrupts are not supported!\n"); + return TEST_FAILED; + } + + return TEST_SUCCESS; + } else if (op_cap->type == RTE_BBDEV_OP_LDPC_ENC) { + const struct rte_bbdev_op_cap_ldpc_enc *cap = + &op_cap->cap.ldpc_enc; + + if (!flags_match(test_vector.ldpc_enc.op_flags, + cap->capability_flags)){ + printf("Flag Mismatch\n"); + return TEST_FAILED; + } + if (nb_inputs > cap->num_buffers_src) { + printf("Too many inputs defined: %u, max: %u\n", + nb_inputs, cap->num_buffers_src); + return TEST_FAILED; + } + if (nb_hard_outputs > cap->num_buffers_dst) { + printf( + "Too many hard outputs defined: %u, max: %u\n", + nb_hard_outputs, cap->num_buffers_dst); + return TEST_FAILED; + } + if (intr_enabled && !(cap->capability_flags & + RTE_BBDEV_LDPC_ENC_INTERRUPTS)) { + printf( + "Dequeue interrupts are not supported!\n"); + return TEST_FAILED; + } + + return TEST_SUCCESS; + } else if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) { + const struct rte_bbdev_op_cap_ldpc_dec *cap = + &op_cap->cap.ldpc_dec; + + if (!flags_match(test_vector.ldpc_dec.op_flags, + cap->capability_flags)){ + printf("Flag Mismatch\n"); + return TEST_FAILED; + } + if (nb_inputs > cap->num_buffers_src) { + printf("Too many inputs defined: %u, max: %u\n", + nb_inputs, cap->num_buffers_src); + return TEST_FAILED; + } + if (nb_hard_outputs > cap->num_buffers_hard_out) { + printf( + "Too many hard outputs defined: %u, max: %u\n", + nb_hard_outputs, + cap->num_buffers_hard_out); + return TEST_FAILED; + } + if (nb_harq_inputs > cap->num_buffers_hard_out) { + printf( + "Too many HARQ inputs defined: %u, max: %u\n", + nb_hard_outputs, + cap->num_buffers_hard_out); + return TEST_FAILED; + } + if (nb_harq_outputs > cap->num_buffers_hard_out) { + printf( + "Too many HARQ outputs defined: %u, max: %u\n", + nb_hard_outputs, + cap->num_buffers_hard_out); + return TEST_FAILED; + } + if (intr_enabled && !(cap->capability_flags & + RTE_BBDEV_LDPC_DEC_INTERRUPTS)) { + printf( + "Dequeue interrupts are not supported!\n"); + return TEST_FAILED; + } + if (intr_enabled && (test_vector.ldpc_dec.op_flags & + (RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE | + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE | + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + ))) { + printf("Skip loop-back with interrupt\n"); + return TEST_FAILED; + } + return TEST_SUCCESS; + } + } + + if ((i == 0) && (test_vector.op_type == RTE_BBDEV_OP_NONE)) + return TEST_SUCCESS; /* Special case for NULL device */ + + return TEST_FAILED; +} + +/* calculates optimal mempool size not smaller than the val */ +static unsigned int +optimal_mempool_size(unsigned int val) +{ + return rte_align32pow2(val + 1) - 1; +} + +/* allocates mbuf mempool for inputs and outputs */ +static struct rte_mempool * +create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id, + int socket_id, unsigned int mbuf_pool_size, + const char *op_type_str) +{ + unsigned int i; + uint32_t max_seg_sz = 0; + char pool_name[RTE_MEMPOOL_NAMESIZE]; + + /* find max input segment size */ + for (i = 0; i < entries->nb_segments; ++i) + if (entries->segments[i].length > max_seg_sz) + max_seg_sz = entries->segments[i].length; + + snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, + dev_id); + return rte_pktmbuf_pool_create(pool_name, mbuf_pool_size, 0, 0, + RTE_MAX(max_seg_sz + RTE_PKTMBUF_HEADROOM + + FILLER_HEADROOM, + (unsigned int)RTE_MBUF_DEFAULT_BUF_SIZE), socket_id); +} + +static int +create_mempools(struct active_device *ad, int socket_id, + enum rte_bbdev_op_type org_op_type, uint16_t num_ops) +{ + struct rte_mempool *mp; + unsigned int ops_pool_size, mbuf_pool_size = 0; + char pool_name[RTE_MEMPOOL_NAMESIZE]; + const char *op_type_str; + enum rte_bbdev_op_type op_type = org_op_type; + + struct op_data_entries *in = &test_vector.entries[DATA_INPUT]; + struct op_data_entries *hard_out = + &test_vector.entries[DATA_HARD_OUTPUT]; + struct op_data_entries *soft_out = + &test_vector.entries[DATA_SOFT_OUTPUT]; + struct op_data_entries *harq_in = + &test_vector.entries[DATA_HARQ_INPUT]; + struct op_data_entries *harq_out = + &test_vector.entries[DATA_HARQ_OUTPUT]; + + /* allocate ops mempool */ + ops_pool_size = optimal_mempool_size(RTE_MAX( + /* Ops used plus 1 reference op */ + RTE_MAX((unsigned int)(ad->nb_queues * num_ops + 1), + /* Minimal cache size plus 1 reference op */ + (unsigned int)(1.5 * rte_lcore_count() * + OPS_CACHE_SIZE + 1)), + OPS_POOL_SIZE_MIN)); + + if (org_op_type == RTE_BBDEV_OP_NONE) + op_type = RTE_BBDEV_OP_TURBO_ENC; + + op_type_str = rte_bbdev_op_type_str(op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); + + snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, + ad->dev_id); + mp = rte_bbdev_op_pool_create(pool_name, op_type, + ops_pool_size, OPS_CACHE_SIZE, socket_id); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %u items ops pool for dev %u on socket %u.", + ops_pool_size, + ad->dev_id, + socket_id); + ad->ops_mempool = mp; + + /* Do not create inputs and outputs mbufs for BaseBand Null Device */ + if (org_op_type == RTE_BBDEV_OP_NONE) + return TEST_SUCCESS; + + /* Inputs */ + if (in->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + in->nb_segments); + mp = create_mbuf_pool(in, ad->dev_id, socket_id, + mbuf_pool_size, "in"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %u items input pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->in_mbuf_pool = mp; + } + + /* Hard outputs */ + if (hard_out->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + hard_out->nb_segments); + mp = create_mbuf_pool(hard_out, ad->dev_id, socket_id, + mbuf_pool_size, + "hard_out"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %u items hard output pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->hard_out_mbuf_pool = mp; + } + + /* Soft outputs */ + if (soft_out->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + soft_out->nb_segments); + mp = create_mbuf_pool(soft_out, ad->dev_id, socket_id, + mbuf_pool_size, + "soft_out"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %uB soft output pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->soft_out_mbuf_pool = mp; + } + + /* HARQ inputs */ + if (harq_in->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + harq_in->nb_segments); + mp = create_mbuf_pool(harq_in, ad->dev_id, socket_id, + mbuf_pool_size, + "harq_in"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %uB harq input pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->harq_in_mbuf_pool = mp; + } + + /* HARQ outputs */ + if (harq_out->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + harq_out->nb_segments); + mp = create_mbuf_pool(harq_out, ad->dev_id, socket_id, + mbuf_pool_size, + "harq_out"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %uB harq output pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->harq_out_mbuf_pool = mp; + } + + return TEST_SUCCESS; +} + +static int +add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info, + struct test_bbdev_vector *vector) +{ + int ret; + unsigned int queue_id; + struct rte_bbdev_queue_conf qconf; + struct active_device *ad = &active_devs[nb_active_devs]; + unsigned int nb_queues; + enum rte_bbdev_op_type op_type = vector->op_type; + +/* Configure fpga lte fec with PF & VF values + * if '-i' flag is set and using fpga device + */ +#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC + if ((get_init_device() == true) && + (!strcmp(info->drv.driver_name, FPGA_LTE_PF_DRIVER_NAME))) { + struct fpga_lte_fec_conf conf; + unsigned int i; + + printf("Configure FPGA LTE FEC Driver %s with default values\n", + info->drv.driver_name); + + /* clear default configuration before initialization */ + memset(&conf, 0, sizeof(struct fpga_lte_fec_conf)); + + /* Set PF mode : + * true if PF is used for data plane + * false for VFs + */ + conf.pf_mode_en = true; + + for (i = 0; i < FPGA_LTE_FEC_NUM_VFS; ++i) { + /* Number of UL queues per VF (fpga supports 8 VFs) */ + conf.vf_ul_queues_number[i] = VF_UL_4G_QUEUE_VALUE; + /* Number of DL queues per VF (fpga supports 8 VFs) */ + conf.vf_dl_queues_number[i] = VF_DL_4G_QUEUE_VALUE; + } + + /* UL bandwidth. Needed for schedule algorithm */ + conf.ul_bandwidth = UL_4G_BANDWIDTH; + /* DL bandwidth */ + conf.dl_bandwidth = DL_4G_BANDWIDTH; + + /* UL & DL load Balance Factor to 64 */ + conf.ul_load_balance = UL_4G_LOAD_BALANCE; + conf.dl_load_balance = DL_4G_LOAD_BALANCE; + + /**< FLR timeout value */ + conf.flr_time_out = FLR_4G_TIMEOUT; + + /* setup FPGA PF with configuration information */ + ret = fpga_lte_fec_configure(info->dev_name, &conf); + TEST_ASSERT_SUCCESS(ret, + "Failed to configure 4G FPGA PF for bbdev %s", + info->dev_name); + } +#endif +#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC + if ((get_init_device() == true) && + (!strcmp(info->drv.driver_name, FPGA_5GNR_PF_DRIVER_NAME))) { + struct fpga_5gnr_fec_conf conf; + unsigned int i; + + printf("Configure FPGA 5GNR FEC Driver %s with default values\n", + info->drv.driver_name); + + /* clear default configuration before initialization */ + memset(&conf, 0, sizeof(struct fpga_5gnr_fec_conf)); + + /* Set PF mode : + * true if PF is used for data plane + * false for VFs + */ + conf.pf_mode_en = true; + + for (i = 0; i < FPGA_5GNR_FEC_NUM_VFS; ++i) { + /* Number of UL queues per VF (fpga supports 8 VFs) */ + conf.vf_ul_queues_number[i] = VF_UL_5G_QUEUE_VALUE; + /* Number of DL queues per VF (fpga supports 8 VFs) */ + conf.vf_dl_queues_number[i] = VF_DL_5G_QUEUE_VALUE; + } + + /* UL bandwidth. Needed for schedule algorithm */ + conf.ul_bandwidth = UL_5G_BANDWIDTH; + /* DL bandwidth */ + conf.dl_bandwidth = DL_5G_BANDWIDTH; + + /* UL & DL load Balance Factor to 64 */ + conf.ul_load_balance = UL_5G_LOAD_BALANCE; + conf.dl_load_balance = DL_5G_LOAD_BALANCE; + + /**< FLR timeout value */ + conf.flr_time_out = FLR_5G_TIMEOUT; + + /* setup FPGA PF with configuration information */ + ret = fpga_5gnr_fec_configure(info->dev_name, &conf); + TEST_ASSERT_SUCCESS(ret, + "Failed to configure 5G FPGA PF for bbdev %s", + info->dev_name); + } +#endif + nb_queues = RTE_MIN(rte_lcore_count(), info->drv.max_num_queues); + nb_queues = RTE_MIN(nb_queues, (unsigned int) MAX_QUEUES); + + /* setup device */ + ret = rte_bbdev_setup_queues(dev_id, nb_queues, info->socket_id); + if (ret < 0) { + printf("rte_bbdev_setup_queues(%u, %u, %d) ret %i\n", + dev_id, nb_queues, info->socket_id, ret); + return TEST_FAILED; + } + + /* configure interrupts if needed */ + if (intr_enabled) { + ret = rte_bbdev_intr_enable(dev_id); + if (ret < 0) { + printf("rte_bbdev_intr_enable(%u) ret %i\n", dev_id, + ret); + return TEST_FAILED; + } + } + + /* setup device queues */ + qconf.socket = info->socket_id; + qconf.queue_size = info->drv.default_queue_conf.queue_size; + qconf.priority = 0; + qconf.deferred_start = 0; + qconf.op_type = op_type; + + for (queue_id = 0; queue_id < nb_queues; ++queue_id) { + ret = rte_bbdev_queue_configure(dev_id, queue_id, &qconf); + if (ret != 0) { + printf( + "Allocated all queues (id=%u) at prio%u on dev%u\n", + queue_id, qconf.priority, dev_id); + qconf.priority++; + ret = rte_bbdev_queue_configure(ad->dev_id, queue_id, + &qconf); + } + if (ret != 0) { + printf("All queues on dev %u allocated: %u\n", + dev_id, queue_id); + break; + } + ad->queue_ids[queue_id] = queue_id; + } + TEST_ASSERT(queue_id != 0, + "ERROR Failed to configure any queues on dev %u", + dev_id); + ad->nb_queues = queue_id; + + set_avail_op(ad, op_type); + + return TEST_SUCCESS; +} + +static int +add_active_device(uint8_t dev_id, struct rte_bbdev_info *info, + struct test_bbdev_vector *vector) +{ + int ret; + + active_devs[nb_active_devs].driver_name = info->drv.driver_name; + active_devs[nb_active_devs].dev_id = dev_id; + + ret = add_bbdev_dev(dev_id, info, vector); + if (ret == TEST_SUCCESS) + ++nb_active_devs; + return ret; +} + +static uint8_t +populate_active_devices(void) +{ + int ret; + uint8_t dev_id; + uint8_t nb_devs_added = 0; + struct rte_bbdev_info info; + + RTE_BBDEV_FOREACH(dev_id) { + rte_bbdev_info_get(dev_id, &info); + + if (check_dev_cap(&info)) { + printf( + "Device %d (%s) does not support specified capabilities\n", + dev_id, info.dev_name); + continue; + } + + ret = add_active_device(dev_id, &info, &test_vector); + if (ret != 0) { + printf("Adding active bbdev %s skipped\n", + info.dev_name); + continue; + } + nb_devs_added++; + } + + return nb_devs_added; +} + +static int +read_test_vector(void) +{ + int ret; + + memset(&test_vector, 0, sizeof(test_vector)); + printf("Test vector file = %s\n", get_vector_filename()); + ret = test_bbdev_vector_read(get_vector_filename(), &test_vector); + TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n", + get_vector_filename()); + + return TEST_SUCCESS; +} + +static int +testsuite_setup(void) +{ + TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); + + if (populate_active_devices() == 0) { + printf("No suitable devices found!\n"); + return TEST_SKIPPED; + } + + return TEST_SUCCESS; +} + +static int +interrupt_testsuite_setup(void) +{ + TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); + + /* Enable interrupts */ + intr_enabled = true; + + /* Special case for NULL device (RTE_BBDEV_OP_NONE) */ + if (populate_active_devices() == 0 || + test_vector.op_type == RTE_BBDEV_OP_NONE) { + intr_enabled = false; + printf("No suitable devices found!\n"); + return TEST_SKIPPED; + } + + return TEST_SUCCESS; +} + +static void +testsuite_teardown(void) +{ + uint8_t dev_id; + + /* Unconfigure devices */ + RTE_BBDEV_FOREACH(dev_id) + rte_bbdev_close(dev_id); + + /* Clear active devices structs. */ + memset(active_devs, 0, sizeof(active_devs)); + nb_active_devs = 0; + + /* Disable interrupts */ + intr_enabled = false; +} + +static int +ut_setup(void) +{ + uint8_t i, dev_id; + + for (i = 0; i < nb_active_devs; i++) { + dev_id = active_devs[i].dev_id; + /* reset bbdev stats */ + TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), + "Failed to reset stats of bbdev %u", dev_id); + /* start the device */ + TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), + "Failed to start bbdev %u", dev_id); + } + + return TEST_SUCCESS; +} + +static void +ut_teardown(void) +{ + uint8_t i, dev_id; + struct rte_bbdev_stats stats; + + for (i = 0; i < nb_active_devs; i++) { + dev_id = active_devs[i].dev_id; + /* read stats and print */ + rte_bbdev_stats_get(dev_id, &stats); + /* Stop the device */ + rte_bbdev_stop(dev_id); + } +} + +static int +init_op_data_objs(struct rte_bbdev_op_data *bufs, + struct op_data_entries *ref_entries, + struct rte_mempool *mbuf_pool, const uint16_t n, + enum op_data_type op_type, uint16_t min_alignment) +{ + int ret; + unsigned int i, j, lc; + bool large_input = false; +printf("init op data\n"); + for (i = 0; i < n; ++i) { + char *data; + struct op_data_buf *seg = &ref_entries->segments[0]; + struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); + TEST_ASSERT_NOT_NULL(m_head, + "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", + op_type, n * ref_entries->nb_segments, + mbuf_pool->size); + + if (seg->length > RTE_BBDEV_LDPC_E_MAX_MBUF) { + /* + * Special case when DPDK mbuf cannot handle + * the required input size + */ + printf("Warning: Larger input size than DPDK mbuf %d\n", + seg->length); + large_input = true; + } + bufs[i].data = m_head; + bufs[i].offset = 0; + bufs[i].length = 0; + +//printf("init op data len %d data %x seg len %d\n",m_head->data_len, *data,seg->length); +if (i==0) +printf("init op data seg len %d data %x\n",seg->length,*seg->addr); + if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) { + if ((op_type == DATA_INPUT) && large_input) { + /* Allocate a fake overused mbuf */ + data = rte_malloc(NULL, seg->length, 0); + memcpy(data, seg->addr, seg->length); + m_head->buf_addr = data; + m_head->buf_iova = rte_malloc_virt2iova(data); + m_head->data_off = 0; + m_head->data_len = seg->length; + +printf("init op data len %d data %x\n",m_head->data_len, *data); + + } else { +if (i==0) +printf("else ...\n"); + data = rte_pktmbuf_append(m_head, seg->length); + TEST_ASSERT_NOT_NULL(data, + "Couldn't append %u bytes to mbuf from %d data type mbuf pool", + seg->length, op_type); + + TEST_ASSERT(data == RTE_PTR_ALIGN( + data, min_alignment), + "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", + data, min_alignment); + rte_memcpy(data, seg->addr, seg->length); + } +if (i==0) +{ +printf("type input len %d nb seg %d\n",seg->length,ref_entries->nb_segments); + +//printf("mhead len %d data %x\n",m_head->data_len, *data); +//printf("mhead len %d \n",m_head->data_len ); +for (lc =0; lc<8; lc++) +{ +printf("**********mhead len %d data %x addr %d\n",m_head->data_len, *(data+lc),(data+lc)); +} +} + + + bufs[i].length += seg->length; + + for (j = 1; j < ref_entries->nb_segments; ++j) { + struct rte_mbuf *m_tail = + rte_pktmbuf_alloc(mbuf_pool); + TEST_ASSERT_NOT_NULL(m_tail, + "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", + op_type, + n * ref_entries->nb_segments, + mbuf_pool->size); + seg += 1; + + data = rte_pktmbuf_append(m_tail, seg->length); + TEST_ASSERT_NOT_NULL(data, + "Couldn't append %u bytes to mbuf from %d data type mbuf pool", + seg->length, op_type); + + TEST_ASSERT(data == RTE_PTR_ALIGN(data, + min_alignment), + "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", + data, min_alignment); + rte_memcpy(data, seg->addr, seg->length); + bufs[i].length += seg->length; + +printf("loop rte memcpy data length %d\n",seg->length); +/*if (i==0) +{ +for (lc =0; lc<8; lc++) +{ +printf("mhead len %d data %x addr %d\n",m_head->data_len, *(data+lc),(data+lc)); +} +} +*/ + ret = rte_pktmbuf_chain(m_head, m_tail); + TEST_ASSERT_SUCCESS(ret, + "Couldn't chain mbufs from %d data type mbuf pool", + op_type); + } + +if (i==0) +{ +printf("rte memcpy data length %d\n",seg->length); +if (i==0) +for (lc =0; lc<8; lc++) +{ +printf("mhead len %d data %x addr %d\n",m_head->data_len, *(data+lc),(data+lc)); +} +} + + + + } else { + + /* allocate chained-mbuf for output buffer */ + for (j = 1; j < ref_entries->nb_segments; ++j) { + struct rte_mbuf *m_tail = + rte_pktmbuf_alloc(mbuf_pool); + TEST_ASSERT_NOT_NULL(m_tail, + "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", + op_type, + n * ref_entries->nb_segments, + mbuf_pool->size); + + ret = rte_pktmbuf_chain(m_head, m_tail); + TEST_ASSERT_SUCCESS(ret, + "Couldn't chain mbufs from %d data type mbuf pool", + op_type); + } + } + } + + return 0; +} + +static int +allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len, + const int socket) +{ + int i; + + *buffers = rte_zmalloc_socket(NULL, len, 0, socket); + if (*buffers == NULL) { + printf("WARNING: Failed to allocate op_data on socket %d\n", + socket); + /* try to allocate memory on other detected sockets */ + for (i = 0; i < socket; i++) { + *buffers = rte_zmalloc_socket(NULL, len, 0, i); + if (*buffers != NULL) + break; + } + } + + return (*buffers == NULL) ? TEST_FAILED : TEST_SUCCESS; +} + +static void +limit_input_llr_val_range(struct rte_bbdev_op_data *input_ops, + const uint16_t n, const int8_t max_llr_modulus) +{ + uint16_t i, byte_idx; + + for (i = 0; i < n; ++i) { + struct rte_mbuf *m = input_ops[i].data; + while (m != NULL) { + int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, + input_ops[i].offset); + for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); + ++byte_idx) + llr[byte_idx] = round((double)max_llr_modulus * + llr[byte_idx] / INT8_MAX); + + m = m->next; + } + } +} + +/* + * We may have to insert filler bits + * when they are required by the HARQ assumption + */ +static void +ldpc_add_filler(struct rte_bbdev_op_data *input_ops, + const uint16_t n, struct test_op_params *op_params) +{ + struct rte_bbdev_op_ldpc_dec dec = op_params->ref_dec_op->ldpc_dec; + + if (input_ops == NULL) + return; + /* No need to add filler if not required by device */ + if (!(ldpc_cap_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS)) + return; + /* No need to add filler for loopback operation */ + if (dec.op_flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) + return; + + uint16_t i, j, parity_offset; + for (i = 0; i < n; ++i) { + struct rte_mbuf *m = input_ops[i].data; + int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, + input_ops[i].offset); + parity_offset = (dec.basegraph == 1 ? 20 : 8) + * dec.z_c - dec.n_filler; + uint16_t new_hin_size = input_ops[i].length + dec.n_filler; + m->data_len = new_hin_size; + input_ops[i].length = new_hin_size; + for (j = new_hin_size - 1; j >= parity_offset + dec.n_filler; + j--) + llr[j] = llr[j - dec.n_filler]; + uint16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; + for (j = 0; j < dec.n_filler; j++) + llr[parity_offset + j] = llr_max_pre_scaling; + } +} + +static void +ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops, + const uint16_t n, const int8_t llr_size, + const int8_t llr_decimals) +{ +printf("start llr scaling \n"); + + if (input_ops == NULL) + return; + + uint16_t i, byte_idx; + + int16_t llr_max, llr_min, llr_tmp; + llr_max = (1 << (llr_size - 1)) - 1; + llr_min = -llr_max; + for (i = 0; i < n; ++i) { + struct rte_mbuf *m = input_ops[i].data; +char * addrl = &(m->buf_addr); +unsigned int off=256; //m->data_off; +unsigned int ll; +if (i==0){ +for (ll=0; ll<8;ll++) +printf("llr data len %d data %x addr %d offset %d data off %d\n",m->data_len,*(addrl+ll+off),(addrl+ll+off),input_ops[i].offset,m->data_off); +} + + + while (m != NULL) { + int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, + input_ops[i].offset); +char *addrllr = llr; + +if (i==0){ +printf("addrllr %d llr %x llr orig addr %d data %x\n",addrllr, *addrllr,llr,*llr);} + + for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); + ++byte_idx) { + +if (i==0){ +if (byte_idx<16) + +printf("llr %d\n",llr[byte_idx]); +} + llr_tmp = llr[byte_idx]; + if (llr_decimals == 4) + llr_tmp *= 8; + else if (llr_decimals == 2) + llr_tmp *= 2; + else if (llr_decimals == 0) + llr_tmp /= 2; + llr_tmp = RTE_MIN(llr_max, + RTE_MAX(llr_min, llr_tmp)); + llr[byte_idx] = (int8_t) llr_tmp; + + +//if (byte_idx<16) +//printf("llr %d\n",llr[byte_idx]); +} + + m = m->next; + } + } +} + + + +static int +fill_queue_buffers(struct test_op_params *op_params, + struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp, + struct rte_mempool *soft_out_mp, + struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp, + uint16_t queue_id, + const struct rte_bbdev_op_cap *capabilities, + uint16_t min_alignment, const int socket_id) +{ + int ret; + enum op_data_type type; + const uint16_t n = op_params->num_to_process; + + struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { + in_mp, + soft_out_mp, + hard_out_mp, + harq_in_mp, + harq_out_mp, + }; +printf("fill queue buffer\n"); + struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = { + &op_params->q_bufs[socket_id][queue_id].inputs, + &op_params->q_bufs[socket_id][queue_id].soft_outputs, + &op_params->q_bufs[socket_id][queue_id].hard_outputs, + &op_params->q_bufs[socket_id][queue_id].harq_inputs, + &op_params->q_bufs[socket_id][queue_id].harq_outputs, + }; + +//struct rte_bbdev_op_data *bufs = *queue_ops[type]; +struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pools[type]); +//m_head = queue_ops[type][0]->data; + + +//printf("queue ops len %d\n",m_head->data_len); + +for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { + struct op_data_entries *ref_entries = + &test_vector.entries[type]; +unsigned int nb_ops; +nb_ops = ref_entries->nb_segments; +//printf("ref seg data %x \n", *ref_entries->segments[0].addr); + +printf("ref seg nb seg %d\n", nb_ops); + if (ref_entries->nb_segments == 0) + continue; + + ret = allocate_buffers_on_socket(queue_ops[type], + n * sizeof(struct rte_bbdev_op_data), + socket_id); + TEST_ASSERT_SUCCESS(ret, + "Couldn't allocate memory for rte_bbdev_op_data structs"); + + ret = init_op_data_objs(*queue_ops[type], ref_entries, + mbuf_pools[type], n, type, min_alignment); + TEST_ASSERT_SUCCESS(ret, + "Couldn't init rte_bbdev_op_data structs"); + } + + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) + limit_input_llr_val_range(*queue_ops[DATA_INPUT], n, + capabilities->cap.turbo_dec.max_llr_modulus); + + if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { + bool loopback = op_params->ref_dec_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; + bool llr_comp = op_params->ref_dec_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_LLR_COMPRESSION; + bool harq_comp = op_params->ref_dec_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + ldpc_llr_decimals = capabilities->cap.ldpc_dec.llr_decimals; + ldpc_llr_size = capabilities->cap.ldpc_dec.llr_size; + ldpc_cap_flags = capabilities->cap.ldpc_dec.capability_flags; + if (!loopback && !llr_comp) + ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n, + ldpc_llr_size, ldpc_llr_decimals); + if (!loopback && !harq_comp) + ldpc_input_llr_scaling(*queue_ops[DATA_HARQ_INPUT], n, + ldpc_llr_size, ldpc_llr_decimals); + if (!loopback) + ldpc_add_filler(*queue_ops[DATA_HARQ_INPUT], n, + op_params); + } +//printf("queue ops len %d\n",bufs[0].data->data_len); + +//printf("queue ops len %d\n",queue_ops[type][0]->data->data_len); + return 0; +} + +static void +free_buffers(struct active_device *ad, struct test_op_params *op_params) +{ + unsigned int i, j; + + rte_mempool_free(ad->ops_mempool); + rte_mempool_free(ad->in_mbuf_pool); + rte_mempool_free(ad->hard_out_mbuf_pool); + rte_mempool_free(ad->soft_out_mbuf_pool); + rte_mempool_free(ad->harq_in_mbuf_pool); + rte_mempool_free(ad->harq_out_mbuf_pool); + + for (i = 0; i < rte_lcore_count(); ++i) { + for (j = 0; j < RTE_MAX_NUMA_NODES; ++j) { + rte_free(op_params->q_bufs[j][i].inputs); + rte_free(op_params->q_bufs[j][i].hard_outputs); + rte_free(op_params->q_bufs[j][i].soft_outputs); + rte_free(op_params->q_bufs[j][i].harq_inputs); + rte_free(op_params->q_bufs[j][i].harq_outputs); + } + } +} + +static void +copy_reference_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, + unsigned int start_idx, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *hard_outputs, + struct rte_bbdev_op_data *soft_outputs, + struct rte_bbdev_dec_op *ref_op) +{ + unsigned int i; + struct rte_bbdev_op_turbo_dec *turbo_dec = &ref_op->turbo_dec; + + for (i = 0; i < n; ++i) { + if (turbo_dec->code_block_mode == 0) { + ops[i]->turbo_dec.tb_params.ea = + turbo_dec->tb_params.ea; + ops[i]->turbo_dec.tb_params.eb = + turbo_dec->tb_params.eb; + ops[i]->turbo_dec.tb_params.k_pos = + turbo_dec->tb_params.k_pos; + ops[i]->turbo_dec.tb_params.k_neg = + turbo_dec->tb_params.k_neg; + ops[i]->turbo_dec.tb_params.c = + turbo_dec->tb_params.c; + ops[i]->turbo_dec.tb_params.c_neg = + turbo_dec->tb_params.c_neg; + ops[i]->turbo_dec.tb_params.cab = + turbo_dec->tb_params.cab; + ops[i]->turbo_dec.tb_params.r = + turbo_dec->tb_params.r; + } else { + ops[i]->turbo_dec.cb_params.e = turbo_dec->cb_params.e; + ops[i]->turbo_dec.cb_params.k = turbo_dec->cb_params.k; + } + + ops[i]->turbo_dec.ext_scale = turbo_dec->ext_scale; + ops[i]->turbo_dec.iter_max = turbo_dec->iter_max; + ops[i]->turbo_dec.iter_min = turbo_dec->iter_min; + ops[i]->turbo_dec.op_flags = turbo_dec->op_flags; + ops[i]->turbo_dec.rv_index = turbo_dec->rv_index; + ops[i]->turbo_dec.num_maps = turbo_dec->num_maps; + ops[i]->turbo_dec.code_block_mode = turbo_dec->code_block_mode; + + ops[i]->turbo_dec.hard_output = hard_outputs[start_idx + i]; + ops[i]->turbo_dec.input = inputs[start_idx + i]; + if (soft_outputs != NULL) + ops[i]->turbo_dec.soft_output = + soft_outputs[start_idx + i]; + } +} + +static void +copy_reference_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, + unsigned int start_idx, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *outputs, + struct rte_bbdev_enc_op *ref_op) +{ + unsigned int i; + struct rte_bbdev_op_turbo_enc *turbo_enc = &ref_op->turbo_enc; + for (i = 0; i < n; ++i) { + if (turbo_enc->code_block_mode == 0) { + ops[i]->turbo_enc.tb_params.ea = + turbo_enc->tb_params.ea; + ops[i]->turbo_enc.tb_params.eb = + turbo_enc->tb_params.eb; + ops[i]->turbo_enc.tb_params.k_pos = + turbo_enc->tb_params.k_pos; + ops[i]->turbo_enc.tb_params.k_neg = + turbo_enc->tb_params.k_neg; + ops[i]->turbo_enc.tb_params.c = + turbo_enc->tb_params.c; + ops[i]->turbo_enc.tb_params.c_neg = + turbo_enc->tb_params.c_neg; + ops[i]->turbo_enc.tb_params.cab = + turbo_enc->tb_params.cab; + ops[i]->turbo_enc.tb_params.ncb_pos = + turbo_enc->tb_params.ncb_pos; + ops[i]->turbo_enc.tb_params.ncb_neg = + turbo_enc->tb_params.ncb_neg; + ops[i]->turbo_enc.tb_params.r = turbo_enc->tb_params.r; + } else { + ops[i]->turbo_enc.cb_params.e = turbo_enc->cb_params.e; + ops[i]->turbo_enc.cb_params.k = turbo_enc->cb_params.k; + ops[i]->turbo_enc.cb_params.ncb = + turbo_enc->cb_params.ncb; + } + ops[i]->turbo_enc.rv_index = turbo_enc->rv_index; + ops[i]->turbo_enc.op_flags = turbo_enc->op_flags; + ops[i]->turbo_enc.code_block_mode = turbo_enc->code_block_mode; + + ops[i]->turbo_enc.output = outputs[start_idx + i]; + ops[i]->turbo_enc.input = inputs[start_idx + i]; + } +} + + +/* Returns a random number drawn from a normal distribution + * with mean of 0 and variance of 1 + * Marsaglia algorithm + */ +static double +randn(int n) +{ + double S, Z, U1, U2, u, v, fac; + + do { + U1 = (double)rand() / RAND_MAX; + U2 = (double)rand() / RAND_MAX; + u = 2. * U1 - 1.; + v = 2. * U2 - 1.; + S = u * u + v * v; + } while (S >= 1 || S == 0); + fac = sqrt(-2. * log(S) / S); + Z = (n % 2) ? u * fac : v * fac; + return Z; +} + +static inline double +maxstar(double A, double B) +{ + if (fabs(A - B) > 5) + return RTE_MAX(A, B); + else + return RTE_MAX(A, B) + log1p(exp(-fabs(A - B))); +} + +/* + * Generate Qm LLRS for Qm==8 + * Modulation, AWGN and LLR estimation from max log development + */ +static void +gen_qm8_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) +{ + int qm = 8; + int qam = 256; + int m, k; + double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; + /* 5.1.4 of TS38.211 */ + const double symbols_I[256] = { + 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 5, + 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 11, + 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, 15, 13, 13, + 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, + 15, 13, 13, 15, 15, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, + 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, + 1, 3, 3, 1, 1, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, + 15, 15, 13, 13, 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, + 13, 13, 15, 15, 13, 13, 15, 15, -5, -5, -7, -7, -5, + -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, + -7, -7, -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, + -1, -1, -11, -11, -9, -9, -11, -11, -9, -9, -13, + -13, -15, -15, -13, -13, -15, -15, -11, -11, -9, + -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, + -13, -15, -15, -5, -5, -7, -7, -5, -5, -7, -7, -3, + -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, -5, -5, + -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -11, -11, + -9, -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, + -13, -15, -15, -11, -11, -9, -9, -11, -11, -9, -9, + -13, -13, -15, -15, -13, -13, -15, -15}; + const double symbols_Q[256] = { + 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, + 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, 13, + 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, + 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, + 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, -5, + -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, + -15, -13, -15, -11, -9, -11, -9, -13, -15, -13, + -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, -5, + -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, + -13, -15, -11, -9, -11, -9, -13, -15, -13, -15, 5, + 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, + 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, + 13, 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, + 3, 1, 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, + 13, 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, + -5, -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, + -13, -15, -13, -15, -11, -9, -11, -9, -13, -15, + -13, -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, + -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, + -13, -15, -11, -9, -11, -9, -13, -15, -13, -15}; + /* Average constellation point energy */ + N0 *= 170.0; + for (k = 0; k < qm; k++) + b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; + /* 5.1.4 of TS38.211 */ + I = (1 - 2 * b[0]) * (8 - (1 - 2 * b[2]) * + (4 - (1 - 2 * b[4]) * (2 - (1 - 2 * b[6])))); + Q = (1 - 2 * b[1]) * (8 - (1 - 2 * b[3]) * + (4 - (1 - 2 * b[5]) * (2 - (1 - 2 * b[7])))); + /* AWGN channel */ + I += sqrt(N0 / 2) * randn(0); + Q += sqrt(N0 / 2) * randn(1); + /* + * Calculate the log of the probability that each of + * the constellation points was transmitted + */ + for (m = 0; m < qam; m++) + log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) + + pow(Q - symbols_Q[m], 2.0)) / N0; + /* Calculate an LLR for each of the k_64QAM bits in the set */ + for (k = 0; k < qm; k++) { + p0 = -999999; + p1 = -999999; + /* For each constellation point */ + for (m = 0; m < qam; m++) { + if ((m >> (qm - k - 1)) & 1) + p1 = maxstar(p1, log_syml_prob[m]); + else + p0 = maxstar(p0, log_syml_prob[m]); + } + /* Calculate the LLR */ + llr_ = p0 - p1; + llr_ *= (1 << ldpc_llr_decimals); + llr_ = round(llr_); + if (llr_ > llr_max) + llr_ = llr_max; + if (llr_ < -llr_max) + llr_ = -llr_max; + llrs[qm * i + k] = (int8_t) llr_; + } +} + + +/* + * Generate Qm LLRS for Qm==6 + * Modulation, AWGN and LLR estimation from max log development + */ +static void +gen_qm6_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) +{ + int qm = 6; + int qam = 64; + int m, k; + double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; + /* 5.1.4 of TS38.211 */ + const double symbols_I[64] = { + 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, + 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, + -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, + -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, + -5, -5, -7, -7, -5, -5, -7, -7}; + const double symbols_Q[64] = { + 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, + -3, -1, -3, -1, -5, -7, -5, -7, -3, -1, -3, -1, + -5, -7, -5, -7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, + 5, 7, 5, 7, -3, -1, -3, -1, -5, -7, -5, -7, + -3, -1, -3, -1, -5, -7, -5, -7}; + /* Average constellation point energy */ + N0 *= 42.0; + for (k = 0; k < qm; k++) + b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; + /* 5.1.4 of TS38.211 */ + I = (1 - 2 * b[0])*(4 - (1 - 2 * b[2]) * (2 - (1 - 2 * b[4]))); + Q = (1 - 2 * b[1])*(4 - (1 - 2 * b[3]) * (2 - (1 - 2 * b[5]))); + /* AWGN channel */ + I += sqrt(N0 / 2) * randn(0); + Q += sqrt(N0 / 2) * randn(1); + /* + * Calculate the log of the probability that each of + * the constellation points was transmitted + */ + for (m = 0; m < qam; m++) + log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) + + pow(Q - symbols_Q[m], 2.0)) / N0; + /* Calculate an LLR for each of the k_64QAM bits in the set */ + for (k = 0; k < qm; k++) { + p0 = -999999; + p1 = -999999; + /* For each constellation point */ + for (m = 0; m < qam; m++) { + if ((m >> (qm - k - 1)) & 1) + p1 = maxstar(p1, log_syml_prob[m]); + else + p0 = maxstar(p0, log_syml_prob[m]); + } + /* Calculate the LLR */ + llr_ = p0 - p1; + llr_ *= (1 << ldpc_llr_decimals); + llr_ = round(llr_); + if (llr_ > llr_max) + llr_ = llr_max; + if (llr_ < -llr_max) + llr_ = -llr_max; + llrs[qm * i + k] = (int8_t) llr_; + } +} + +/* + * Generate Qm LLRS for Qm==4 + * Modulation, AWGN and LLR estimation from max log development + */ +static void +gen_qm4_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) +{ + int qm = 4; + int qam = 16; + int m, k; + double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; + /* 5.1.4 of TS38.211 */ + const double symbols_I[16] = {1, 1, 3, 3, 1, 1, 3, 3, + -1, -1, -3, -3, -1, -1, -3, -3}; + const double symbols_Q[16] = {1, 3, 1, 3, -1, -3, -1, -3, + 1, 3, 1, 3, -1, -3, -1, -3}; + /* Average constellation point energy */ + N0 *= 10.0; + for (k = 0; k < qm; k++) + b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; + /* 5.1.4 of TS38.211 */ + I = (1 - 2 * b[0]) * (2 - (1 - 2 * b[2])); + Q = (1 - 2 * b[1]) * (2 - (1 - 2 * b[3])); + /* AWGN channel */ + I += sqrt(N0 / 2) * randn(0); + Q += sqrt(N0 / 2) * randn(1); + /* + * Calculate the log of the probability that each of + * the constellation points was transmitted + */ + for (m = 0; m < qam; m++) + log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) + + pow(Q - symbols_Q[m], 2.0)) / N0; + /* Calculate an LLR for each of the k_64QAM bits in the set */ + for (k = 0; k < qm; k++) { + p0 = -999999; + p1 = -999999; + /* For each constellation point */ + for (m = 0; m < qam; m++) { + if ((m >> (qm - k - 1)) & 1) + p1 = maxstar(p1, log_syml_prob[m]); + else + p0 = maxstar(p0, log_syml_prob[m]); + } + /* Calculate the LLR */ + llr_ = p0 - p1; + llr_ *= (1 << ldpc_llr_decimals); + llr_ = round(llr_); + if (llr_ > llr_max) + llr_ = llr_max; + if (llr_ < -llr_max) + llr_ = -llr_max; + llrs[qm * i + k] = (int8_t) llr_; + } +} + +static void +gen_qm2_llr(int8_t *llrs, uint32_t j, double N0, double llr_max) +{ + double b, b1, n; + double coeff = 2.0 * sqrt(N0); + + /* Ignore in vectors rare quasi null LLRs not to be saturated */ + if (llrs[j] < 8 && llrs[j] > -8) + return; + + /* Note don't change sign here */ + n = randn(j % 2); + b1 = ((llrs[j] > 0 ? 2.0 : -2.0) + + coeff * n) / N0; + b = b1 * (1 << ldpc_llr_decimals); + b = round(b); + if (b > llr_max) + b = llr_max; + if (b < -llr_max) + b = -llr_max; + llrs[j] = (int8_t) b; +} + +/* Generate LLR for a given SNR */ +static void +generate_llr_input(uint16_t n, struct rte_bbdev_op_data *inputs, + struct rte_bbdev_dec_op *ref_op) +{ + struct rte_mbuf *m; + uint16_t qm; + uint32_t i, j, e, range; + double N0, llr_max; + + e = ref_op->ldpc_dec.cb_params.e; + qm = ref_op->ldpc_dec.q_m; + llr_max = (1 << (ldpc_llr_size - 1)) - 1; + range = e / qm; + N0 = 1.0 / pow(10.0, get_snr() / 10.0); + + for (i = 0; i < n; ++i) { + m = inputs[i].data; + int8_t *llrs = rte_pktmbuf_mtod_offset(m, int8_t *, 0); + if (qm == 8) { + for (j = 0; j < range; ++j) + gen_qm8_llr(llrs, j, N0, llr_max); + } else if (qm == 6) { + for (j = 0; j < range; ++j) + gen_qm6_llr(llrs, j, N0, llr_max); + } else if (qm == 4) { + for (j = 0; j < range; ++j) + gen_qm4_llr(llrs, j, N0, llr_max); + } else { + for (j = 0; j < e; ++j) + gen_qm2_llr(llrs, j, N0, llr_max); + } + } +} + +static void +copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, + unsigned int start_idx, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *hard_outputs, + struct rte_bbdev_op_data *soft_outputs, + struct rte_bbdev_op_data *harq_inputs, + struct rte_bbdev_op_data *harq_outputs, + struct rte_bbdev_dec_op *ref_op) +{ + unsigned int i; + struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; +printf("num ops %d\n",n); + +struct rte_mbuf *m = inputs[0].data; +char *addr = m->buf_addr; +printf("input data ad %d data %x len %d\n",(m->buf_addr),*addr,m->data_len); + for (i = 0; i < n; ++i) { + if (ldpc_dec->code_block_mode == 0) { + ops[i]->ldpc_dec.tb_params.ea = + ldpc_dec->tb_params.ea; + ops[i]->ldpc_dec.tb_params.eb = + ldpc_dec->tb_params.eb; + ops[i]->ldpc_dec.tb_params.c = + ldpc_dec->tb_params.c; + ops[i]->ldpc_dec.tb_params.cab = + ldpc_dec->tb_params.cab; + ops[i]->ldpc_dec.tb_params.r = + ldpc_dec->tb_params.r; + +printf("code block ea %d eb %d c %d cab %d r %d\n",ldpc_dec->tb_params.ea,ldpc_dec->tb_params.eb,ldpc_dec->tb_params.c, ldpc_dec->tb_params.cab, ldpc_dec->tb_params.r); + + } else { + ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; +if (i==0) +printf("cb param e %d\n",ldpc_dec->cb_params.e); + } + + ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; + ops[i]->ldpc_dec.z_c = 72;//ldpc_dec->z_c; + ops[i]->ldpc_dec.q_m = 2; //ldpc_dec->q_m; + ops[i]->ldpc_dec.n_filler = 0; //ldpc_dec->n_filler; + ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; + ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; + ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; + ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags; + ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; +if (i==0) +printf("reference bg %d zc %d qm %d n_filler %d, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); +//if (i<10) +//printf("input %x\n",inputs[start_idx+i]->data); + if (hard_outputs != NULL) + ops[i]->ldpc_dec.hard_output = + hard_outputs[start_idx + i]; + if (inputs != NULL) + ops[i]->ldpc_dec.input = + inputs[start_idx + i]; + if (soft_outputs != NULL) + ops[i]->ldpc_dec.soft_output = + soft_outputs[start_idx + i]; + if (harq_inputs != NULL) + ops[i]->ldpc_dec.harq_combined_input = + harq_inputs[start_idx + i]; + if (harq_outputs != NULL) + ops[i]->ldpc_dec.harq_combined_output = + harq_outputs[start_idx + i]; +//if (i<10) +//printf("ldpc_dec input %x\n",*ops[i]->ldpc_dec.input[0]->data->buf_addr); + + } +} + + +static void +copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, + unsigned int start_idx, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *outputs, + struct rte_bbdev_enc_op *ref_op) +{ + unsigned int i; + struct rte_bbdev_op_ldpc_enc *ldpc_enc = &ref_op->ldpc_enc; + for (i = 0; i < n; ++i) { + if (ldpc_enc->code_block_mode == 0) { + ops[i]->ldpc_enc.tb_params.ea = ldpc_enc->tb_params.ea; + ops[i]->ldpc_enc.tb_params.eb = ldpc_enc->tb_params.eb; + ops[i]->ldpc_enc.tb_params.cab = + ldpc_enc->tb_params.cab; + ops[i]->ldpc_enc.tb_params.c = ldpc_enc->tb_params.c; + ops[i]->ldpc_enc.tb_params.r = ldpc_enc->tb_params.r; + } else { + ops[i]->ldpc_enc.cb_params.e = ldpc_enc->cb_params.e; + } + ops[i]->ldpc_enc.basegraph = ldpc_enc->basegraph; + ops[i]->ldpc_enc.z_c = ldpc_enc->z_c; + ops[i]->ldpc_enc.q_m = ldpc_enc->q_m; + ops[i]->ldpc_enc.n_filler = ldpc_enc->n_filler; + ops[i]->ldpc_enc.n_cb = ldpc_enc->n_cb; + ops[i]->ldpc_enc.rv_index = ldpc_enc->rv_index; + ops[i]->ldpc_enc.op_flags = ldpc_enc->op_flags; + ops[i]->ldpc_enc.code_block_mode = ldpc_enc->code_block_mode; + ops[i]->ldpc_enc.output = outputs[start_idx + i]; + ops[i]->ldpc_enc.input = inputs[start_idx + i]; + } +} + +static int +check_dec_status_and_ordering(struct rte_bbdev_dec_op *op, + unsigned int order_idx, const int expected_status) +{ + int status = op->status; + /* ignore parity mismatch false alarms for long iterations */ + if (get_iter_max() >= 10) { + if (!(expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) && + (status & (1 << RTE_BBDEV_SYNDROME_ERROR))) { + printf("WARNING: Ignore Syndrome Check mismatch\n"); + status -= (1 << RTE_BBDEV_SYNDROME_ERROR); + } + if ((expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) && + !(status & (1 << RTE_BBDEV_SYNDROME_ERROR))) { + printf("WARNING: Ignore Syndrome Check mismatch\n"); + status += (1 << RTE_BBDEV_SYNDROME_ERROR); + } + } + + TEST_ASSERT(status == expected_status, + "op_status (%d) != expected_status (%d)", + op->status, expected_status); + + TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, + "Ordering error, expected %p, got %p", + (void *)(uintptr_t)order_idx, op->opaque_data); + + return TEST_SUCCESS; +} + +static int +check_enc_status_and_ordering(struct rte_bbdev_enc_op *op, + unsigned int order_idx, const int expected_status) +{ + TEST_ASSERT(op->status == expected_status, + "op_status (%d) != expected_status (%d)", + op->status, expected_status); + + if (op->opaque_data != (void *)(uintptr_t)INVALID_OPAQUE) + TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, + "Ordering error, expected %p, got %p", + (void *)(uintptr_t)order_idx, op->opaque_data); + + return TEST_SUCCESS; +} + +static inline int +validate_op_chain(struct rte_bbdev_op_data *op, + struct op_data_entries *orig_op) +{ + uint8_t i; + struct rte_mbuf *m = op->data; + uint8_t nb_dst_segments = orig_op->nb_segments; + uint32_t total_data_size = 0; + + TEST_ASSERT(nb_dst_segments == m->nb_segs, + "Number of segments differ in original (%u) and filled (%u) op", + nb_dst_segments, m->nb_segs); + + /* Validate each mbuf segment length */ + for (i = 0; i < nb_dst_segments; ++i) { + /* Apply offset to the first mbuf segment */ + uint16_t offset = (i == 0) ? op->offset : 0; + uint16_t data_len = rte_pktmbuf_data_len(m) - offset; + total_data_size += orig_op->segments[i].length; + + TEST_ASSERT(orig_op->segments[i].length == data_len, + "Length of segment differ in original (%u) and filled (%u) op", + orig_op->segments[i].length, data_len); + TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, + rte_pktmbuf_mtod_offset(m, uint32_t *, offset), + data_len, + "Output buffers (CB=%u) are not equal", i); + m = m->next; + } + + /* Validate total mbuf pkt length */ + uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; + TEST_ASSERT(total_data_size == pkt_len, + "Length of data differ in original (%u) and filled (%u) op", + total_data_size, pkt_len); + + return TEST_SUCCESS; +} + +/* + * Compute K0 for a given configuration for HARQ output length computation + * As per definition in 3GPP 38.212 Table 5.4.2.1-2 + */ +static inline uint16_t +get_k0(uint16_t n_cb, uint16_t z_c, uint8_t bg, uint8_t rv_index) +{ + if (rv_index == 0) + return 0; + uint16_t n = (bg == 1 ? N_ZC_1 : N_ZC_2) * z_c; + if (n_cb == n) { + if (rv_index == 1) + return (bg == 1 ? K0_1_1 : K0_1_2) * z_c; + else if (rv_index == 2) + return (bg == 1 ? K0_2_1 : K0_2_2) * z_c; + else + return (bg == 1 ? K0_3_1 : K0_3_2) * z_c; + } + /* LBRM case - includes a division by N */ + if (rv_index == 1) + return (((bg == 1 ? K0_1_1 : K0_1_2) * n_cb) + / n) * z_c; + else if (rv_index == 2) + return (((bg == 1 ? K0_2_1 : K0_2_2) * n_cb) + / n) * z_c; + else + return (((bg == 1 ? K0_3_1 : K0_3_2) * n_cb) + / n) * z_c; +} + +/* HARQ output length including the Filler bits */ +static inline uint16_t +compute_harq_len(struct rte_bbdev_op_ldpc_dec *ops_ld) +{ + uint16_t k0 = 0; + uint8_t max_rv = (ops_ld->rv_index == 1) ? 3 : ops_ld->rv_index; + k0 = get_k0(ops_ld->n_cb, ops_ld->z_c, ops_ld->basegraph, max_rv); + /* Compute RM out size and number of rows */ + uint16_t parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) + * ops_ld->z_c - ops_ld->n_filler; + uint16_t deRmOutSize = RTE_MIN( + k0 + ops_ld->cb_params.e + + ((k0 > parity_offset) ? + 0 : ops_ld->n_filler), + ops_ld->n_cb); + uint16_t numRows = ((deRmOutSize + ops_ld->z_c - 1) + / ops_ld->z_c); + uint16_t harq_output_len = numRows * ops_ld->z_c; + return harq_output_len; +} + +static inline int +validate_op_harq_chain(struct rte_bbdev_op_data *op, + struct op_data_entries *orig_op, + struct rte_bbdev_op_ldpc_dec *ops_ld) +{ + uint8_t i; + uint32_t j, jj, k; + struct rte_mbuf *m = op->data; + uint8_t nb_dst_segments = orig_op->nb_segments; + uint32_t total_data_size = 0; + int8_t *harq_orig, *harq_out, abs_harq_origin; + uint32_t byte_error = 0, cum_error = 0, error; + int16_t llr_max = (1 << (ldpc_llr_size - ldpc_llr_decimals)) - 1; + int16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; + uint16_t parity_offset; + + TEST_ASSERT(nb_dst_segments == m->nb_segs, + "Number of segments differ in original (%u) and filled (%u) op", + nb_dst_segments, m->nb_segs); + + /* Validate each mbuf segment length */ + for (i = 0; i < nb_dst_segments; ++i) { + /* Apply offset to the first mbuf segment */ + uint16_t offset = (i == 0) ? op->offset : 0; + uint16_t data_len = rte_pktmbuf_data_len(m) - offset; + total_data_size += orig_op->segments[i].length; + + TEST_ASSERT(orig_op->segments[i].length < + (uint32_t)(data_len + 64), + "Length of segment differ in original (%u) and filled (%u) op", + orig_op->segments[i].length, data_len); + harq_orig = (int8_t *) orig_op->segments[i].addr; + harq_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset); + + if (!(ldpc_cap_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS + ) || (ops_ld->op_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { + data_len -= ops_ld->z_c; + parity_offset = data_len; + } else { + /* Compute RM out size and number of rows */ + parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) + * ops_ld->z_c - ops_ld->n_filler; + uint16_t deRmOutSize = compute_harq_len(ops_ld) - + ops_ld->n_filler; + if (data_len > deRmOutSize) + data_len = deRmOutSize; + if (data_len > orig_op->segments[i].length) + data_len = orig_op->segments[i].length; + } + /* + * HARQ output can have minor differences + * due to integer representation and related scaling + */ + for (j = 0, jj = 0; j < data_len; j++, jj++) { + if (j == parity_offset) { + /* Special Handling of the filler bits */ + for (k = 0; k < ops_ld->n_filler; k++) { + if (harq_out[jj] != + llr_max_pre_scaling) { + printf("HARQ Filler issue %d: %d %d\n", + jj, harq_out[jj], + llr_max); + byte_error++; + } + jj++; + } + } + if (!(ops_ld->op_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { + if (ldpc_llr_decimals > 1) + harq_out[jj] = (harq_out[jj] + 1) + >> (ldpc_llr_decimals - 1); + /* Saturated to S7 */ + if (harq_orig[j] > llr_max) + harq_orig[j] = llr_max; + if (harq_orig[j] < -llr_max) + harq_orig[j] = -llr_max; + } + if (harq_orig[j] != harq_out[jj]) { + error = (harq_orig[j] > harq_out[jj]) ? + harq_orig[j] - harq_out[jj] : + harq_out[jj] - harq_orig[j]; + abs_harq_origin = harq_orig[j] > 0 ? + harq_orig[j] : + -harq_orig[j]; + /* Residual quantization error */ + if ((error > 8 && (abs_harq_origin < + (llr_max - 16))) || + (error > 16)) { + printf("HARQ mismatch %d: exp %d act %d => %d\n", + j, harq_orig[j], + harq_out[jj], error); + byte_error++; + cum_error += error; + } + } + } + m = m->next; + } + + if (byte_error) + TEST_ASSERT(byte_error <= 1, + "HARQ output mismatch (%d) %d", + byte_error, cum_error); + + /* Validate total mbuf pkt length */ + uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; + TEST_ASSERT(total_data_size < pkt_len + 64, + "Length of data differ in original (%u) and filled (%u) op", + total_data_size, pkt_len); + + return TEST_SUCCESS; +} + +static int +validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, + struct rte_bbdev_dec_op *ref_op, const int vector_mask) +{ + unsigned int i; + int ret; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + struct op_data_entries *soft_data_orig = + &test_vector.entries[DATA_SOFT_OUTPUT]; + struct rte_bbdev_op_turbo_dec *ops_td; + struct rte_bbdev_op_data *hard_output; + struct rte_bbdev_op_data *soft_output; + struct rte_bbdev_op_turbo_dec *ref_td = &ref_op->turbo_dec; + + for (i = 0; i < n; ++i) { + ops_td = &ops[i]->turbo_dec; + hard_output = &ops_td->hard_output; + soft_output = &ops_td->soft_output; + + if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) + TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, + "Returned iter_count (%d) > expected iter_count (%d)", + ops_td->iter_count, ref_td->iter_count); + ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); + TEST_ASSERT_SUCCESS(ret, + "Checking status and ordering for decoder failed"); + + TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, + hard_data_orig), + "Hard output buffers (CB=%u) are not equal", + i); + + if (ref_op->turbo_dec.op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) + TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, + soft_data_orig), + "Soft output buffers (CB=%u) are not equal", + i); + } + + return TEST_SUCCESS; +} + +/* Check Number of code blocks errors */ +static int +validate_ldpc_bler(struct rte_bbdev_dec_op **ops, const uint16_t n) +{ + unsigned int i; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + struct rte_bbdev_op_ldpc_dec *ops_td; + struct rte_bbdev_op_data *hard_output; + int errors = 0; + struct rte_mbuf *m; + + for (i = 0; i < n; ++i) { + ops_td = &ops[i]->ldpc_dec; + hard_output = &ops_td->hard_output; + m = hard_output->data; + if (memcmp(rte_pktmbuf_mtod_offset(m, uint32_t *, 0), + hard_data_orig->segments[0].addr, + hard_data_orig->segments[0].length)) + errors++; + } + return errors; +} + +static int +validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, + struct rte_bbdev_dec_op *ref_op, const int vector_mask) +{ + unsigned int i; + int ret; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + struct op_data_entries *soft_data_orig = + &test_vector.entries[DATA_SOFT_OUTPUT]; + struct op_data_entries *harq_data_orig = + &test_vector.entries[DATA_HARQ_OUTPUT]; + struct rte_bbdev_op_ldpc_dec *ops_td; + struct rte_bbdev_op_data *hard_output; + struct rte_bbdev_op_data *harq_output; + struct rte_bbdev_op_data *soft_output; + struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec; + + for (i = 0; i < n; ++i) { + ops_td = &ops[i]->ldpc_dec; + hard_output = &ops_td->hard_output; + harq_output = &ops_td->harq_combined_output; + soft_output = &ops_td->soft_output; + + ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); + TEST_ASSERT_SUCCESS(ret, + "Checking status and ordering for decoder failed"); + if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) + TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, + "Returned iter_count (%d) > expected iter_count (%d)", + ops_td->iter_count, ref_td->iter_count); + /* + * We can ignore output data when the decoding failed to + * converge or for loop-back cases + */ + if (!check_bit(ops[i]->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + ) && ( + ops[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR + )) == 0) + TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, + hard_data_orig), + "Hard output buffers (CB=%u) are not equal", + i); + + if (ref_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) + TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, + soft_data_orig), + "Soft output buffers (CB=%u) are not equal", + i); + if (ref_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) { + TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, + harq_data_orig, ops_td), + "HARQ output buffers (CB=%u) are not equal", + i); + } + if (ref_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) + TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, + harq_data_orig, ops_td), + "HARQ output buffers (CB=%u) are not equal", + i); + + } + + return TEST_SUCCESS; +} + + +static int +validate_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, + struct rte_bbdev_enc_op *ref_op) +{ + unsigned int i; + int ret; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + + for (i = 0; i < n; ++i) { + ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); + TEST_ASSERT_SUCCESS(ret, + "Checking status and ordering for encoder failed"); + TEST_ASSERT_SUCCESS(validate_op_chain( + &ops[i]->turbo_enc.output, + hard_data_orig), + "Output buffers (CB=%u) are not equal", + i); + } + + return TEST_SUCCESS; +} + +static int +validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, + struct rte_bbdev_enc_op *ref_op) +{ + unsigned int i; + int ret; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + + for (i = 0; i < n; ++i) { + ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); + TEST_ASSERT_SUCCESS(ret, + "Checking status and ordering for encoder failed"); + TEST_ASSERT_SUCCESS(validate_op_chain( + &ops[i]->ldpc_enc.output, + hard_data_orig), + "Output buffers (CB=%u) are not equal", + i); + } + + return TEST_SUCCESS; +} + +static void +create_reference_dec_op(struct rte_bbdev_dec_op *op) +{ + unsigned int i; + struct op_data_entries *entry; + + op->turbo_dec = test_vector.turbo_dec; + entry = &test_vector.entries[DATA_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->turbo_dec.input.length += + entry->segments[i].length; +} + +static void +create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op) +{ + unsigned int i; + struct op_data_entries *entry; + + op->ldpc_dec = test_vector.ldpc_dec; + entry = &test_vector.entries[DATA_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->ldpc_dec.input.length += + entry->segments[i].length; +printf("data %x length %d\n",*entry->segments[0].addr,entry->segments[0].length); + + + if (test_vector.ldpc_dec.op_flags & + RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) { + entry = &test_vector.entries[DATA_HARQ_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->ldpc_dec.harq_combined_input.length += + entry->segments[i].length; + } +} + + +static void +create_reference_enc_op(struct rte_bbdev_enc_op *op) +{ + unsigned int i; + struct op_data_entries *entry; + + op->turbo_enc = test_vector.turbo_enc; + entry = &test_vector.entries[DATA_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->turbo_enc.input.length += + entry->segments[i].length; +} + +static void +create_reference_ldpc_enc_op(struct rte_bbdev_enc_op *op) +{ + unsigned int i; + struct op_data_entries *entry; + + op->ldpc_enc = test_vector.ldpc_enc; + entry = &test_vector.entries[DATA_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->ldpc_enc.input.length += + entry->segments[i].length; +} + +static uint32_t +calc_dec_TB_size(struct rte_bbdev_dec_op *op) +{ + uint8_t i; + uint32_t c, r, tb_size = 0; + + if (op->turbo_dec.code_block_mode) { + tb_size = op->turbo_dec.tb_params.k_neg; + } else { + c = op->turbo_dec.tb_params.c; + r = op->turbo_dec.tb_params.r; + for (i = 0; i < c-r; i++) + tb_size += (r < op->turbo_dec.tb_params.c_neg) ? + op->turbo_dec.tb_params.k_neg : + op->turbo_dec.tb_params.k_pos; + } + return tb_size; +} + +static uint32_t +calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) +{ + uint8_t i; + uint32_t c, r, tb_size = 0; + uint16_t sys_cols = (op->ldpc_dec.basegraph == 1) ? 22 : 10; + + if (op->ldpc_dec.code_block_mode) { + tb_size = sys_cols * op->ldpc_dec.z_c - op->ldpc_dec.n_filler; +printf("calc tb c %d r %d sys cols %d tb_size %d\n",op->ldpc_dec.tb_params.c, op->ldpc_dec.tb_params.r,sys_cols,tb_size); + } else { + c = op->ldpc_dec.tb_params.c; + r = op->ldpc_dec.tb_params.r; + for (i = 0; i < c-r; i++) + tb_size += sys_cols * op->ldpc_dec.z_c + - op->ldpc_dec.n_filler; + +printf("calc tb c %d r %d sys cols %d tb_size %d\n",c,r,sys_cols,tb_size); + + } + return tb_size; +} + +static uint32_t +calc_enc_TB_size(struct rte_bbdev_enc_op *op) +{ + uint8_t i; + uint32_t c, r, tb_size = 0; + + if (op->turbo_enc.code_block_mode) { + tb_size = op->turbo_enc.tb_params.k_neg; + } else { + c = op->turbo_enc.tb_params.c; + r = op->turbo_enc.tb_params.r; + for (i = 0; i < c-r; i++) + tb_size += (r < op->turbo_enc.tb_params.c_neg) ? + op->turbo_enc.tb_params.k_neg : + op->turbo_enc.tb_params.k_pos; + } + return tb_size; +} + +static uint32_t +calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op *op) +{ + uint8_t i; + uint32_t c, r, tb_size = 0; + uint16_t sys_cols = (op->ldpc_enc.basegraph == 1) ? 22 : 10; + + if (op->turbo_enc.code_block_mode) { + tb_size = sys_cols * op->ldpc_enc.z_c - op->ldpc_enc.n_filler; + } else { + c = op->turbo_enc.tb_params.c; + r = op->turbo_enc.tb_params.r; + for (i = 0; i < c-r; i++) + tb_size += sys_cols * op->ldpc_enc.z_c + - op->ldpc_enc.n_filler; + } + return tb_size; +} + + +static int +init_test_op_params(struct test_op_params *op_params, + enum rte_bbdev_op_type op_type, const int expected_status, + const int vector_mask, struct rte_mempool *ops_mp, + uint16_t burst_sz, uint16_t num_to_process, uint16_t num_lcores) +{ + int ret = 0; + if (op_type == RTE_BBDEV_OP_TURBO_DEC || + op_type == RTE_BBDEV_OP_LDPC_DEC) + ret = rte_bbdev_dec_op_alloc_bulk(ops_mp, + &op_params->ref_dec_op, 1); + else + ret = rte_bbdev_enc_op_alloc_bulk(ops_mp, + &op_params->ref_enc_op, 1); + + TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed"); + + op_params->mp = ops_mp; + op_params->burst_sz = burst_sz; + op_params->num_to_process = num_to_process; + op_params->num_lcores = num_lcores; + op_params->vector_mask = vector_mask; + if (op_type == RTE_BBDEV_OP_TURBO_DEC || + op_type == RTE_BBDEV_OP_LDPC_DEC) + op_params->ref_dec_op->status = expected_status; + else if (op_type == RTE_BBDEV_OP_TURBO_ENC + || op_type == RTE_BBDEV_OP_LDPC_ENC) + op_params->ref_enc_op->status = expected_status; + return 0; +} + +static int +run_test_case_on_device(test_case_function *test_case_func, uint8_t dev_id, + struct test_op_params *op_params) +{ + int t_ret, f_ret, socket_id = SOCKET_ID_ANY; + unsigned int i; + struct active_device *ad; + unsigned int burst_sz = get_burst_sz(); + enum rte_bbdev_op_type op_type = test_vector.op_type; + const struct rte_bbdev_op_cap *capabilities = NULL; + + ad = &active_devs[dev_id]; + + /* Check if device supports op_type */ + if (!is_avail_op(ad, test_vector.op_type)) + return TEST_SUCCESS; + + struct rte_bbdev_info info; + rte_bbdev_info_get(ad->dev_id, &info); + socket_id = GET_SOCKET(info.socket_id); + + f_ret = create_mempools(ad, socket_id, op_type, + get_num_ops()); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't create mempools"); + goto fail; + } + if (op_type == RTE_BBDEV_OP_NONE) + op_type = RTE_BBDEV_OP_TURBO_ENC; + + f_ret = init_test_op_params(op_params, test_vector.op_type, + test_vector.expected_status, + test_vector.mask, + ad->ops_mempool, + burst_sz, + get_num_ops(), + get_num_lcores()); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't init test op params"); + goto fail; + } + + + /* Find capabilities */ + const struct rte_bbdev_op_cap *cap = info.drv.capabilities; + for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { + if (cap->type == test_vector.op_type) { + capabilities = cap; + break; + } + cap++; + } + TEST_ASSERT_NOT_NULL(capabilities, + "Couldn't find capabilities"); + + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { + create_reference_dec_op(op_params->ref_dec_op); + } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) + create_reference_enc_op(op_params->ref_enc_op); + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + create_reference_ldpc_enc_op(op_params->ref_enc_op); + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + create_reference_ldpc_dec_op(op_params->ref_dec_op); + + for (i = 0; i < ad->nb_queues; ++i) { + f_ret = fill_queue_buffers(op_params, + ad->in_mbuf_pool, + ad->hard_out_mbuf_pool, + ad->soft_out_mbuf_pool, + ad->harq_in_mbuf_pool, + ad->harq_out_mbuf_pool, + ad->queue_ids[i], + capabilities, + info.drv.min_alignment, + socket_id); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't init queue buffers"); + goto fail; + } + } + + /* Run test case function */ + t_ret = test_case_func(ad, op_params); + + /* Free active device resources and return */ + free_buffers(ad, op_params); + return t_ret; + +fail: + free_buffers(ad, op_params); + return TEST_FAILED; +} + +/* Run given test function per active device per supported op type + * per burst size. + */ +static int +run_test_case(test_case_function *test_case_func) +{ + int ret = 0; + uint8_t dev; + + /* Alloc op_params */ + struct test_op_params *op_params = rte_zmalloc(NULL, + sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", + RTE_ALIGN(sizeof(struct test_op_params), + RTE_CACHE_LINE_SIZE)); + + /* For each device run test case function */ + for (dev = 0; dev < nb_active_devs; ++dev) + ret |= run_test_case_on_device(test_case_func, dev, op_params); + + rte_free(op_params); + + return ret; +} + + +/* Push back the HARQ output from DDR to host */ +static void +retrieve_harq_ddr(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_dec_op **ops, + const uint16_t n) +{ + uint16_t j; + int save_status, ret; + uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * 1024; + struct rte_bbdev_dec_op *ops_deq[MAX_BURST]; + uint32_t flags = ops[0]->ldpc_dec.op_flags; + bool loopback = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; + bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; + bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + for (j = 0; j < n; ++j) { + if ((loopback && mem_out) || hc_out) { + save_status = ops[j]->status; + ops[j]->ldpc_dec.op_flags = + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; + if (h_comp) + ops[j]->ldpc_dec.op_flags += + RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + ops[j]->ldpc_dec.harq_combined_input.offset = + harq_offset; + ops[j]->ldpc_dec.harq_combined_output.offset = 0; + harq_offset += HARQ_INCR; + if (!loopback) + ops[j]->ldpc_dec.harq_combined_input.length = + ops[j]->ldpc_dec.harq_combined_output.length; + rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, + &ops[j], 1); + ret = 0; + while (ret == 0) + ret = rte_bbdev_dequeue_ldpc_dec_ops( + dev_id, queue_id, + &ops_deq[j], 1); + ops[j]->ldpc_dec.op_flags = flags; + ops[j]->status = save_status; + } + } +} + +/* + * Push back the HARQ output from HW DDR to Host + * Preload HARQ memory input and adjust HARQ offset + */ +static void +preload_harq_ddr(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_dec_op **ops, const uint16_t n, + bool preload) +{ + uint16_t j; + int ret; + uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * 1024; + struct rte_bbdev_op_data save_hc_in, save_hc_out; + struct rte_bbdev_dec_op *ops_deq[MAX_BURST]; + uint32_t flags = ops[0]->ldpc_dec.op_flags; + bool mem_in = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; + bool hc_in = flags & RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE; + bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; + bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + for (j = 0; j < n; ++j) { + if ((mem_in || hc_in) && preload) { + save_hc_in = ops[j]->ldpc_dec.harq_combined_input; + save_hc_out = ops[j]->ldpc_dec.harq_combined_output; + ops[j]->ldpc_dec.op_flags = + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + if (h_comp) + ops[j]->ldpc_dec.op_flags += + RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + ops[j]->ldpc_dec.harq_combined_output.offset = + harq_offset; + ops[j]->ldpc_dec.harq_combined_input.offset = 0; + rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, + &ops[j], 1); + ret = 0; + while (ret == 0) + ret = rte_bbdev_dequeue_ldpc_dec_ops( + dev_id, queue_id, &ops_deq[j], 1); + ops[j]->ldpc_dec.op_flags = flags; + ops[j]->ldpc_dec.harq_combined_input = save_hc_in; + ops[j]->ldpc_dec.harq_combined_output = save_hc_out; + } + /* Adjust HARQ offset when we reach external DDR */ + if (mem_in || hc_in) + ops[j]->ldpc_dec.harq_combined_input.offset + = harq_offset; + if (mem_out || hc_out) + ops[j]->ldpc_dec.harq_combined_output.offset + = harq_offset; + harq_offset += HARQ_INCR; + } +} + +static void +dequeue_event_callback(uint16_t dev_id, + enum rte_bbdev_event_type event, void *cb_arg, + void *ret_param) +{ + int ret; + uint16_t i; + uint64_t total_time; + uint16_t deq, burst_sz, num_ops; + uint16_t queue_id = *(uint16_t *) ret_param; + struct rte_bbdev_info info; + double tb_len_bits; + struct thread_params *tp = cb_arg; + + /* Find matching thread params using queue_id */ + for (i = 0; i < MAX_QUEUES; ++i, ++tp) + if (tp->queue_id == queue_id) + break; + + if (i == MAX_QUEUES) { + printf("%s: Queue_id from interrupt details was not found!\n", + __func__); + return; + } + + if (unlikely(event != RTE_BBDEV_EVENT_DEQUEUE)) { + rte_atomic16_set(&tp->processing_status, TEST_FAILED); + printf( + "Dequeue interrupt handler called for incorrect event!\n"); + return; + } + + burst_sz = rte_atomic16_read(&tp->burst_sz); + num_ops = tp->op_params->num_to_process; + + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) + deq = rte_bbdev_dequeue_dec_ops(dev_id, queue_id, + &tp->dec_ops[ + rte_atomic16_read(&tp->nb_dequeued)], + burst_sz); + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + deq = rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, + &tp->dec_ops[ + rte_atomic16_read(&tp->nb_dequeued)], + burst_sz); + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + deq = rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, + &tp->enc_ops[ + rte_atomic16_read(&tp->nb_dequeued)], + burst_sz); + else /*RTE_BBDEV_OP_TURBO_ENC*/ + deq = rte_bbdev_dequeue_enc_ops(dev_id, queue_id, + &tp->enc_ops[ + rte_atomic16_read(&tp->nb_dequeued)], + burst_sz); + + if (deq < burst_sz) { + printf( + "After receiving the interrupt all operations should be dequeued. Expected: %u, got: %u\n", + burst_sz, deq); + rte_atomic16_set(&tp->processing_status, TEST_FAILED); + return; + } + + if (rte_atomic16_read(&tp->nb_dequeued) + deq < num_ops) { + rte_atomic16_add(&tp->nb_dequeued, deq); + return; + } + + total_time = rte_rdtsc_precise() - tp->start_time; + + rte_bbdev_info_get(dev_id, &info); + + ret = TEST_SUCCESS; + + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + ret = validate_dec_op(tp->dec_ops, num_ops, ref_op, + tp->op_params->vector_mask); + /* get the max of iter_count for all dequeued ops */ + for (i = 0; i < num_ops; ++i) + tp->iter_count = RTE_MAX( + tp->dec_ops[i]->turbo_dec.iter_count, + tp->iter_count); + rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); + } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) { + struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; + ret = validate_enc_op(tp->enc_ops, num_ops, ref_op); + rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); + } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) { + struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; + ret = validate_ldpc_enc_op(tp->enc_ops, num_ops, ref_op); + rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); + } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + ret = validate_ldpc_dec_op(tp->dec_ops, num_ops, ref_op, + tp->op_params->vector_mask); + rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); + } + + if (ret) { + printf("Buffers validation failed\n"); + rte_atomic16_set(&tp->processing_status, TEST_FAILED); + } + + switch (test_vector.op_type) { + case RTE_BBDEV_OP_TURBO_DEC: + tb_len_bits = calc_dec_TB_size(tp->op_params->ref_dec_op); + break; + case RTE_BBDEV_OP_TURBO_ENC: + tb_len_bits = calc_enc_TB_size(tp->op_params->ref_enc_op); + break; + case RTE_BBDEV_OP_LDPC_DEC: + tb_len_bits = calc_ldpc_dec_TB_size(tp->op_params->ref_dec_op); + break; + case RTE_BBDEV_OP_LDPC_ENC: + tb_len_bits = calc_ldpc_enc_TB_size(tp->op_params->ref_enc_op); + break; + case RTE_BBDEV_OP_NONE: + tb_len_bits = 0.0; + break; + default: + printf("Unknown op type: %d\n", test_vector.op_type); + rte_atomic16_set(&tp->processing_status, TEST_FAILED); + return; + } + + tp->ops_per_sec += ((double)num_ops) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps += (((double)(num_ops * tb_len_bits)) / 1000000.0) / + ((double)total_time / (double)rte_get_tsc_hz()); + + rte_atomic16_add(&tp->nb_dequeued, deq); +} + +static int +throughput_intr_lcore_ldpc_dec(void *arg) +{ + struct thread_params *tp = arg; + unsigned int enqueued; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_to_process = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops[num_to_process]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + int ret, i, j; + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + uint16_t num_to_enq, enq; + + bool loopback = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); + bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), + "Failed to enable interrupts for dev: %u, queue_id: %u", + tp->dev_id, queue_id); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + +printf("start tp intr lcore ldpc dec\n"); + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + rte_atomic16_clear(&tp->processing_status); + rte_atomic16_clear(&tp->nb_dequeued); + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, + num_to_process); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_to_process); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops, num_to_process, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, + bufs->harq_inputs, bufs->harq_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_to_process; ++j) + ops[j]->opaque_data = (void *)(uintptr_t)j; + + for (j = 0; j < TEST_REPETITIONS; ++j) { + for (i = 0; i < num_to_process; ++i) { + if (!loopback) + rte_pktmbuf_reset( + ops[i]->ldpc_dec.hard_output.data); + if (hc_out || loopback) + mbuf_reset( + ops[i]->ldpc_dec.harq_combined_output.data); + } + + tp->start_time = rte_rdtsc_precise(); + for (enqueued = 0; enqueued < num_to_process;) { + num_to_enq = burst_sz; + + if (unlikely(num_to_process - enqueued < num_to_enq)) + num_to_enq = num_to_process - enqueued; + + enq = 0; + do { + + printf("do enqueue ldpc dec ops\n"); + enq += rte_bbdev_enqueue_ldpc_dec_ops( + tp->dev_id, + queue_id, &ops[enqueued], + num_to_enq); + } while (unlikely(num_to_enq != enq)); + enqueued += enq; + + /* Write to thread burst_sz current number of enqueued + * descriptors. It ensures that proper number of + * descriptors will be dequeued in callback + * function - needed for last batch in case where + * the number of operations is not a multiple of + * burst size. + */ + rte_atomic16_set(&tp->burst_sz, num_to_enq); + + /* Wait until processing of previous batch is + * completed + */ + while (rte_atomic16_read(&tp->nb_dequeued) != + (int16_t) enqueued) + rte_pause(); + } + if (j != TEST_REPETITIONS - 1) + rte_atomic16_clear(&tp->nb_dequeued); + } + + return TEST_SUCCESS; +} + +static int +throughput_intr_lcore_dec(void *arg) +{ + struct thread_params *tp = arg; + unsigned int enqueued; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_to_process = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops[num_to_process]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + int ret, i, j; + uint16_t num_to_enq, enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), + "Failed to enable interrupts for dev: %u, queue_id: %u", + tp->dev_id, queue_id); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + rte_atomic16_clear(&tp->processing_status); + rte_atomic16_clear(&tp->nb_dequeued); + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, + num_to_process); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_to_process); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_dec_op(ops, num_to_process, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, + tp->op_params->ref_dec_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_to_process; ++j) + ops[j]->opaque_data = (void *)(uintptr_t)j; + + for (j = 0; j < TEST_REPETITIONS; ++j) { + for (i = 0; i < num_to_process; ++i) + rte_pktmbuf_reset(ops[i]->turbo_dec.hard_output.data); + + tp->start_time = rte_rdtsc_precise(); + for (enqueued = 0; enqueued < num_to_process;) { + num_to_enq = burst_sz; + + if (unlikely(num_to_process - enqueued < num_to_enq)) + num_to_enq = num_to_process - enqueued; + + enq = 0; + do { + enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, + queue_id, &ops[enqueued], + num_to_enq); + } while (unlikely(num_to_enq != enq)); + enqueued += enq; + + /* Write to thread burst_sz current number of enqueued + * descriptors. It ensures that proper number of + * descriptors will be dequeued in callback + * function - needed for last batch in case where + * the number of operations is not a multiple of + * burst size. + */ + rte_atomic16_set(&tp->burst_sz, num_to_enq); + + /* Wait until processing of previous batch is + * completed + */ + while (rte_atomic16_read(&tp->nb_dequeued) != + (int16_t) enqueued) + rte_pause(); + } + if (j != TEST_REPETITIONS - 1) + rte_atomic16_clear(&tp->nb_dequeued); + } + + return TEST_SUCCESS; +} + +static int +throughput_intr_lcore_enc(void *arg) +{ + struct thread_params *tp = arg; + unsigned int enqueued; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_to_process = tp->op_params->num_to_process; + struct rte_bbdev_enc_op *ops[num_to_process]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + int ret, i, j; + uint16_t num_to_enq, enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), + "Failed to enable interrupts for dev: %u, queue_id: %u", + tp->dev_id, queue_id); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + rte_atomic16_clear(&tp->processing_status); + rte_atomic16_clear(&tp->nb_dequeued); + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, + num_to_process); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_to_process); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_enc_op(ops, num_to_process, 0, bufs->inputs, + bufs->hard_outputs, tp->op_params->ref_enc_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_to_process; ++j) + ops[j]->opaque_data = (void *)(uintptr_t)j; + + for (j = 0; j < TEST_REPETITIONS; ++j) { + for (i = 0; i < num_to_process; ++i) + rte_pktmbuf_reset(ops[i]->turbo_enc.output.data); + + tp->start_time = rte_rdtsc_precise(); + for (enqueued = 0; enqueued < num_to_process;) { + num_to_enq = burst_sz; + + if (unlikely(num_to_process - enqueued < num_to_enq)) + num_to_enq = num_to_process - enqueued; + + enq = 0; + do { + enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, + queue_id, &ops[enqueued], + num_to_enq); + } while (unlikely(enq != num_to_enq)); + enqueued += enq; + + /* Write to thread burst_sz current number of enqueued + * descriptors. It ensures that proper number of + * descriptors will be dequeued in callback + * function - needed for last batch in case where + * the number of operations is not a multiple of + * burst size. + */ + rte_atomic16_set(&tp->burst_sz, num_to_enq); + + /* Wait until processing of previous batch is + * completed + */ + while (rte_atomic16_read(&tp->nb_dequeued) != + (int16_t) enqueued) + rte_pause(); + } + if (j != TEST_REPETITIONS - 1) + rte_atomic16_clear(&tp->nb_dequeued); + } + + return TEST_SUCCESS; +} + + +static int +throughput_intr_lcore_ldpc_enc(void *arg) +{ + struct thread_params *tp = arg; + unsigned int enqueued; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_to_process = tp->op_params->num_to_process; + struct rte_bbdev_enc_op *ops[num_to_process]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + int ret, i, j; + uint16_t num_to_enq, enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), + "Failed to enable interrupts for dev: %u, queue_id: %u", + tp->dev_id, queue_id); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + rte_atomic16_clear(&tp->processing_status); + rte_atomic16_clear(&tp->nb_dequeued); + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, + num_to_process); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_to_process); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_enc_op(ops, num_to_process, 0, + bufs->inputs, bufs->hard_outputs, + tp->op_params->ref_enc_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_to_process; ++j) + ops[j]->opaque_data = (void *)(uintptr_t)j; + + for (j = 0; j < TEST_REPETITIONS; ++j) { + for (i = 0; i < num_to_process; ++i) + rte_pktmbuf_reset(ops[i]->turbo_enc.output.data); + + tp->start_time = rte_rdtsc_precise(); + for (enqueued = 0; enqueued < num_to_process;) { + num_to_enq = burst_sz; + + if (unlikely(num_to_process - enqueued < num_to_enq)) + num_to_enq = num_to_process - enqueued; + + enq = 0; + do { + enq += rte_bbdev_enqueue_ldpc_enc_ops( + tp->dev_id, + queue_id, &ops[enqueued], + num_to_enq); + } while (unlikely(enq != num_to_enq)); + enqueued += enq; + + /* Write to thread burst_sz current number of enqueued + * descriptors. It ensures that proper number of + * descriptors will be dequeued in callback + * function - needed for last batch in case where + * the number of operations is not a multiple of + * burst size. + */ + rte_atomic16_set(&tp->burst_sz, num_to_enq); + + /* Wait until processing of previous batch is + * completed + */ + while (rte_atomic16_read(&tp->nb_dequeued) != + (int16_t) enqueued) + rte_pause(); + } + if (j != TEST_REPETITIONS - 1) + rte_atomic16_clear(&tp->nb_dequeued); + } + + return TEST_SUCCESS; +} + +static int +throughput_pmd_lcore_dec(void *arg) +{ + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops_enq[num_ops]; + struct rte_bbdev_dec_op *ops_deq[num_ops]; + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + struct rte_bbdev_info info; + uint16_t num_to_enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(tp->dev_id, &info); +printf("lcore pmd dec\n"); + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < TEST_REPETITIONS; ++i) { + + for (j = 0; j < num_ops; ++j) + mbuf_reset(ops_enq[j]->turbo_dec.hard_output.data); + + start_time = rte_rdtsc_precise(); + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + tp->iter_count = 0; + /* get the max of iter_count for all dequeued ops */ + for (i = 0; i < num_ops; ++i) { + tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count, + tp->iter_count); + } + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_dec_op(ops_deq, num_ops, ref_op, + tp->op_params->vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_dec_TB_size(ref_op); +printf("tb len bits %d\n",tb_len_bits); + + tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / + 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static int +bler_pmd_lcore_ldpc_dec(void *arg) +{ + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops_enq[num_ops]; + struct rte_bbdev_dec_op *ops_deq[num_ops]; + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + float parity_bler = 0; + struct rte_bbdev_info info; + uint16_t num_to_enq; + bool extDdr = check_bit(ldpc_cap_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + bool loopback = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); + bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(tp->dev_id, &info); +printf("++++++++++++++++++pmd ldpc dec\n"); + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); + + /* For BLER tests we need to enable early termination */ + if (!check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) + ref_op->ldpc_dec.op_flags += + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ref_op->ldpc_dec.iter_max = get_iter_max(); + ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, + bufs->harq_inputs, bufs->harq_outputs, ref_op); + generate_llr_input(num_ops, bufs->inputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < 1; ++i) { /* Could add more iterations */ + for (j = 0; j < num_ops; ++j) { + if (!loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.hard_output.data); + if (hc_out || loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.harq_combined_output.data); + } + if (extDdr) { + bool preload = i == (TEST_REPETITIONS - 1); + preload_harq_ddr(tp->dev_id, queue_id, ops_enq, + num_ops, preload); + } + start_time = rte_rdtsc_precise(); + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + tp->iter_count = 0; + tp->iter_average = 0; + /* get the max of iter_count for all dequeued ops */ + for (i = 0; i < num_ops; ++i) { + tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, + tp->iter_count); + tp->iter_average += (double) ops_enq[i]->ldpc_dec.iter_count; + if (ops_enq[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR)) + parity_bler += 1.0; + } + + parity_bler /= num_ops; /* This one is based on SYND */ + tp->iter_average /= num_ops; + tp->bler = (double) validate_ldpc_bler(ops_deq, num_ops) / num_ops; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE + && tp->bler == 0 + && parity_bler == 0 + && !hc_out) { + ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, + tp->op_params->vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); +printf("tb len bits %d\n",tb_len_bits); + +tp->ops_per_sec = ((double)num_ops * 1) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * 1 * tb_len_bits)) / + 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static int +throughput_pmd_lcore_ldpc_dec(void *arg) +{ + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops_enq[num_ops]; + struct rte_bbdev_dec_op *ops_deq[num_ops]; + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + struct rte_bbdev_info info; + uint16_t num_to_enq; + bool extDdr = check_bit(ldpc_cap_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + bool loopback = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); + bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); +printf("pmd ldpc dec\n"); + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + +char *addrb = &bufs->inputs[0].data->buf_addr; + +unsigned int lm; +for (lm=0; lm<16;lm++ ){ +printf("bufs len %d data %x addr %d\n",bufs->inputs[0].data->data_len,*(addrb+lm),(addrb+lm)); +} + +//printf("bufs len %d data %x\n",bufs->inputs[0].data->data_len,*bufs->inputs[0].data->buf_addr); + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); + + /* For throughput tests we need to disable early termination */ + if (check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) + ref_op->ldpc_dec.op_flags -= + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ref_op->ldpc_dec.iter_max = get_iter_max(); + ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, + bufs->harq_inputs, bufs->harq_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < TEST_REPETITIONS; ++i) { + for (j = 0; j < num_ops; ++j) { + if (!loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.hard_output.data); + if (hc_out || loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.harq_combined_output.data); + } + if (extDdr) { + bool preload = i == (TEST_REPETITIONS - 1); + preload_harq_ddr(tp->dev_id, queue_id, ops_enq, + num_ops, preload); + } + start_time = rte_rdtsc_precise(); +//printf("num ops %d burst sz %d enq %d\n",num_ops,burst_sz,enq); + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; +//if (enq==0) +//printf("pmd lcore ldpc dec length %d data %x\n", ops_enq[enq]->ldpc_dec.input.length,ops_enq[enq]->ldpc_dec.input); + + enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + tp->iter_count = 0; + /* get the max of iter_count for all dequeued ops */ + for (i = 0; i < num_ops; ++i) { + tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, + tp->iter_count); + } + if (extDdr) { + /* Read loopback is not thread safe */ + retrieve_harq_ddr(tp->dev_id, queue_id, ops_enq, num_ops); + } + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, + tp->op_params->vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); +printf("tb len bits %f \n",tb_len_bits); + tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / + 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static int +throughput_pmd_lcore_enc(void *arg) +{ + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_enc_op *ops_enq[num_ops]; + struct rte_bbdev_enc_op *ops_deq[num_ops]; + struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + struct rte_bbdev_info info; + uint16_t num_to_enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, + num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_ops); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_enc_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < TEST_REPETITIONS; ++i) { + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + for (j = 0; j < num_ops; ++j) + mbuf_reset(ops_enq[j]->turbo_enc.output.data); + + start_time = rte_rdtsc_precise(); + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_enc_op(ops_deq, num_ops, ref_op); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_enc_TB_size(ref_op); + + tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) + / 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static int +throughput_pmd_lcore_ldpc_enc(void *arg) +{ +printf("start tp lcore ldpc enc\n"); + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id+3; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_enc_op *ops_enq[num_ops]; + struct rte_bbdev_enc_op *ops_deq[num_ops]; + struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + struct rte_bbdev_info info; + uint16_t num_to_enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, + num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_ops); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_enc_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < TEST_REPETITIONS; ++i) { + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + for (j = 0; j < num_ops; ++j) + mbuf_reset(ops_enq[j]->turbo_enc.output.data); + + start_time = rte_rdtsc_precise(); + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_ldpc_enc_op(ops_deq, num_ops, ref_op); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_ldpc_enc_TB_size(ref_op); + + tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) + / 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static void +print_enc_throughput(struct thread_params *t_params, unsigned int used_cores) +{ + unsigned int iter = 0; + double total_mops = 0, total_mbps = 0; + + for (iter = 0; iter < used_cores; iter++) { + printf( + "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps\n", + t_params[iter].lcore_id, t_params[iter].ops_per_sec, + t_params[iter].mbps); + total_mops += t_params[iter].ops_per_sec; + total_mbps += t_params[iter].mbps; + } + printf( + "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps\n", + used_cores, total_mops, total_mbps); +} + +/* Aggregate the performance results over the number of cores used */ +static void +print_dec_throughput(struct thread_params *t_params, unsigned int used_cores) +{ + unsigned int core_idx = 0; + double total_mops = 0, total_mbps = 0; + uint8_t iter_count = 0; + + for (core_idx = 0; core_idx < used_cores; core_idx++) { + printf( + "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps @ max %u iterations\n", + t_params[core_idx].lcore_id, + t_params[core_idx].ops_per_sec, + t_params[core_idx].mbps, + t_params[core_idx].iter_count); + total_mops += t_params[core_idx].ops_per_sec; + total_mbps += t_params[core_idx].mbps; + iter_count = RTE_MAX(iter_count, + t_params[core_idx].iter_count); + } + printf( + "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps @ max %u iterations\n", + used_cores, total_mops, total_mbps, iter_count); +} + +/* Aggregate the performance results over the number of cores used */ +static void +print_dec_bler(struct thread_params *t_params, unsigned int used_cores) +{ + unsigned int core_idx = 0; + double total_mbps = 0, total_bler = 0, total_iter = 0; + double snr = get_snr(); + + for (core_idx = 0; core_idx < used_cores; core_idx++) { + printf("Core%u BLER %.1f %% - Iters %.1f - Tp %.1f Mbps %s\n", + t_params[core_idx].lcore_id, + t_params[core_idx].bler * 100, + t_params[core_idx].iter_average, + t_params[core_idx].mbps, + get_vector_filename()); + total_mbps += t_params[core_idx].mbps; + total_bler += t_params[core_idx].bler; + total_iter += t_params[core_idx].iter_average; + } + total_bler /= used_cores; + total_iter /= used_cores; + + printf("SNR %.2f BLER %.1f %% - Iterations %.1f %d - Tp %.1f Mbps %s\n", + snr, total_bler * 100, total_iter, get_iter_max(), + total_mbps, get_vector_filename()); +} + +/* + * Test function that determines BLER wireless performance + */ +static int +bler_test(struct active_device *ad, + struct test_op_params *op_params) +{ + int ret; + unsigned int lcore_id, used_cores = 0; + struct thread_params *t_params; + struct rte_bbdev_info info; + lcore_function_t *bler_function; + uint16_t num_lcores; + const char *op_type_str; + + rte_bbdev_info_get(ad->dev_id, &info); + + op_type_str = rte_bbdev_op_type_str(test_vector.op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", + test_vector.op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== test: bler\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", + info.dev_name, ad->nb_queues, op_params->burst_sz, + op_params->num_to_process, op_params->num_lcores, + op_type_str, + intr_enabled ? "Interrupt mode" : "PMD mode", + (double)rte_get_tsc_hz() / 1000000000.0); + + /* Set number of lcores */ + num_lcores = (ad->nb_queues < (op_params->num_lcores)) + ? ad->nb_queues + : op_params->num_lcores; + + /* Allocate memory for thread parameters structure */ + t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), + RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", + RTE_ALIGN(sizeof(struct thread_params) * num_lcores, + RTE_CACHE_LINE_SIZE)); + + if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + bler_function = bler_pmd_lcore_ldpc_dec; + else + return TEST_SKIPPED; + + rte_atomic16_set(&op_params->sync, SYNC_WAIT); + + /* Master core is set at first entry */ + t_params[0].dev_id = ad->dev_id; + t_params[0].lcore_id = rte_lcore_id(); + t_params[0].op_params = op_params; + t_params[0].queue_id = ad->queue_ids[used_cores++]; + t_params[0].iter_count = 0; + + RTE_LCORE_FOREACH_SLAVE(lcore_id) { + if (used_cores >= num_lcores) + break; + + t_params[used_cores].dev_id = ad->dev_id; + t_params[used_cores].lcore_id = lcore_id; + t_params[used_cores].op_params = op_params; + t_params[used_cores].queue_id = ad->queue_ids[used_cores]; + t_params[used_cores].iter_count = 0; + + rte_eal_remote_launch(bler_function, + &t_params[used_cores++], lcore_id); + } + + rte_atomic16_set(&op_params->sync, SYNC_START); + ret = bler_function(&t_params[0]); + + /* Master core is always used */ + for (used_cores = 1; used_cores < num_lcores; used_cores++) + ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); + + print_dec_bler(t_params, num_lcores); + + /* Return if test failed */ + if (ret) { + rte_free(t_params); + return ret; + } + + /* Function to print something here*/ + rte_free(t_params); + return ret; +} + +/* + * Test function that determines how long an enqueue + dequeue of a burst + * takes on available lcores. + */ +static int +throughput_test(struct active_device *ad, + struct test_op_params *op_params) +{ + int ret; + unsigned int lcore_id, used_cores = 0; + struct thread_params *t_params, *tp; + struct rte_bbdev_info info; + lcore_function_t *throughput_function; + uint16_t num_lcores; + const char *op_type_str; + + rte_bbdev_info_get(ad->dev_id, &info); + + op_type_str = rte_bbdev_op_type_str(test_vector.op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", + test_vector.op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== new test with library: throughput\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", + info.dev_name, ad->nb_queues, op_params->burst_sz, + op_params->num_to_process, op_params->num_lcores, + op_type_str, + intr_enabled ? "Interrupt mode" : "PMD mode", + (double)rte_get_tsc_hz() / 1000000000.0); + + /* Set number of lcores */ + num_lcores = (ad->nb_queues < (op_params->num_lcores)) + ? ad->nb_queues + : op_params->num_lcores; + + /* Allocate memory for thread parameters structure */ + t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), + RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", + RTE_ALIGN(sizeof(struct thread_params) * num_lcores, + RTE_CACHE_LINE_SIZE)); + + if (intr_enabled) { + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) + throughput_function = throughput_intr_lcore_dec; + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + throughput_function = throughput_intr_lcore_ldpc_dec; + else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) + throughput_function = throughput_intr_lcore_enc; + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + throughput_function = throughput_intr_lcore_ldpc_enc; + else + throughput_function = throughput_intr_lcore_enc; + + /* Dequeue interrupt callback registration */ + ret = rte_bbdev_callback_register(ad->dev_id, + RTE_BBDEV_EVENT_DEQUEUE, dequeue_event_callback, + t_params); + if (ret < 0) { + rte_free(t_params); + return ret; + } + } else { +printf("pmd enabled \n"); + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) + throughput_function = throughput_pmd_lcore_dec; + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + { + throughput_function = throughput_pmd_lcore_ldpc_dec; + printf("ldpc dec\n"); +} + else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) + throughput_function = throughput_pmd_lcore_enc; + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + throughput_function = throughput_pmd_lcore_ldpc_enc; + else + throughput_function = throughput_pmd_lcore_enc; + } + + rte_atomic16_set(&op_params->sync, SYNC_WAIT); + + /* Master core is set at first entry */ + t_params[0].dev_id = ad->dev_id; + t_params[0].lcore_id = rte_lcore_id(); + t_params[0].op_params = op_params; + t_params[0].queue_id = ad->queue_ids[used_cores++]; + t_params[0].iter_count = 0; + + RTE_LCORE_FOREACH_SLAVE(lcore_id) { + if (used_cores >= num_lcores) + break; + + t_params[used_cores].dev_id = ad->dev_id; + t_params[used_cores].lcore_id = lcore_id; + t_params[used_cores].op_params = op_params; + t_params[used_cores].queue_id = ad->queue_ids[used_cores]; + t_params[used_cores].iter_count = 0; + + rte_eal_remote_launch(throughput_function, + &t_params[used_cores++], lcore_id); + } + + rte_atomic16_set(&op_params->sync, SYNC_START); + ret = throughput_function(&t_params[0]); + + /* Master core is always used */ + for (used_cores = 1; used_cores < num_lcores; used_cores++) + ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); + + /* Return if test failed */ + if (ret) { + rte_free(t_params); + return ret; + } + + /* Print throughput if interrupts are disabled and test passed */ + if (!intr_enabled) { + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || + test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + print_dec_throughput(t_params, num_lcores); + else + print_enc_throughput(t_params, num_lcores); + rte_free(t_params); + return ret; + } + + /* In interrupt TC we need to wait for the interrupt callback to deqeue + * all pending operations. Skip waiting for queues which reported an + * error using processing_status variable. + * Wait for master lcore operations. + */ + tp = &t_params[0]; + while ((rte_atomic16_read(&tp->nb_dequeued) < + op_params->num_to_process) && + (rte_atomic16_read(&tp->processing_status) != + TEST_FAILED)) + rte_pause(); + + tp->ops_per_sec /= TEST_REPETITIONS; + tp->mbps /= TEST_REPETITIONS; + ret |= (int)rte_atomic16_read(&tp->processing_status); + + /* Wait for slave lcores operations */ + for (used_cores = 1; used_cores < num_lcores; used_cores++) { + tp = &t_params[used_cores]; + + while ((rte_atomic16_read(&tp->nb_dequeued) < + op_params->num_to_process) && + (rte_atomic16_read(&tp->processing_status) != + TEST_FAILED)) + rte_pause(); + + tp->ops_per_sec /= TEST_REPETITIONS; + tp->mbps /= TEST_REPETITIONS; + ret |= (int)rte_atomic16_read(&tp->processing_status); + } + + /* Print throughput if test passed */ + if (!ret) { + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || + test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + print_dec_throughput(t_params, num_lcores); + else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC || + test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + print_enc_throughput(t_params, num_lcores); + } + + rte_free(t_params); + return ret; +} + +static int +latency_test_dec(struct rte_mempool *mempool, + struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, + int vector_mask, uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) +{ + int ret = TEST_SUCCESS; + uint16_t i, j, dequeued; + struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t start_time = 0, last_time = 0; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + bool first_time = true; + last_time = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_dec_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_dec_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + bufs->soft_outputs, + ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < burst_sz; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + start_time = rte_rdtsc_precise(); + + enq = rte_bbdev_enqueue_dec_ops(dev_id, queue_id, &ops_enq[enq], + burst_sz); + TEST_ASSERT(enq == burst_sz, + "Error enqueueing burst, expected %u, got %u", + burst_sz, enq); + + /* Dequeue */ + do { + deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + if (likely(first_time && (deq > 0))) { + last_time = rte_rdtsc_precise() - start_time; + first_time = false; + } + } while (unlikely(burst_sz != deq)); + + *max_time = RTE_MAX(*max_time, last_time); + *min_time = RTE_MIN(*min_time, last_time); + *total_time += last_time; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_dec_op(ops_deq, burst_sz, ref_op, + vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +latency_test_ldpc_dec(struct rte_mempool *mempool, + struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, + int vector_mask, uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) +{ + int ret = TEST_SUCCESS; + uint16_t i, j, dequeued; + struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t start_time = 0, last_time = 0; + bool extDdr = ldpc_cap_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + bool first_time = true; + last_time = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_dec_op_alloc_bulk() failed"); + + /* For latency tests we need to disable early termination */ + if (check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) + ref_op->ldpc_dec.op_flags -= + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ref_op->ldpc_dec.iter_max = get_iter_max(); + ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + bufs->soft_outputs, + bufs->harq_inputs, + bufs->harq_outputs, + ref_op); + + if (extDdr) + preload_harq_ddr(dev_id, queue_id, ops_enq, + burst_sz, true); + + /* Set counter to validate the ordering */ + for (j = 0; j < burst_sz; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + start_time = rte_rdtsc_precise(); + + enq = rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz); + TEST_ASSERT(enq == burst_sz, + "Error enqueueing burst, expected %u, got %u", + burst_sz, enq); + + /* Dequeue */ + do { + deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + if (likely(first_time && (deq > 0))) { + last_time = rte_rdtsc_precise() - start_time; + first_time = false; + } + } while (unlikely(burst_sz != deq)); + + *max_time = RTE_MAX(*max_time, last_time); + *min_time = RTE_MIN(*min_time, last_time); + *total_time += last_time; + + if (extDdr) + retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_ldpc_dec_op(ops_deq, burst_sz, ref_op, + vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + return i; +} + +static int +latency_test_enc(struct rte_mempool *mempool, + struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, + uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) +{ + int ret = TEST_SUCCESS; + uint16_t i, j, dequeued; + struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t start_time = 0, last_time = 0; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + bool first_time = true; + last_time = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_enc_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_enc_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < burst_sz; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + start_time = rte_rdtsc_precise(); + + enq = rte_bbdev_enqueue_enc_ops(dev_id, queue_id, &ops_enq[enq], + burst_sz); + TEST_ASSERT(enq == burst_sz, + "Error enqueueing burst, expected %u, got %u", + burst_sz, enq); + + /* Dequeue */ + do { + deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + if (likely(first_time && (deq > 0))) { + last_time += rte_rdtsc_precise() - start_time; + first_time = false; + } + } while (unlikely(burst_sz != deq)); + + *max_time = RTE_MAX(*max_time, last_time); + *min_time = RTE_MIN(*min_time, last_time); + *total_time += last_time; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_enc_op(ops_deq, burst_sz, ref_op); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_enc_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +latency_test_ldpc_enc(struct rte_mempool *mempool, + struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, + uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) +{ + int ret = TEST_SUCCESS; + uint16_t i, j, dequeued; + struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t start_time = 0, last_time = 0; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + bool first_time = true; + last_time = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_enc_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < burst_sz; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + start_time = rte_rdtsc_precise(); + + enq = rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz); + TEST_ASSERT(enq == burst_sz, + "Error enqueueing burst, expected %u, got %u", + burst_sz, enq); + + /* Dequeue */ + do { + deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + if (likely(first_time && (deq > 0))) { + last_time += rte_rdtsc_precise() - start_time; + first_time = false; + } + } while (unlikely(burst_sz != deq)); + + *max_time = RTE_MAX(*max_time, last_time); + *min_time = RTE_MIN(*min_time, last_time); + *total_time += last_time; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_enc_op(ops_deq, burst_sz, ref_op); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_enc_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +latency_test(struct active_device *ad, + struct test_op_params *op_params) +{ + int iter; + uint16_t burst_sz = op_params->burst_sz; + const uint16_t num_to_process = op_params->num_to_process; + const enum rte_bbdev_op_type op_type = test_vector.op_type; + const uint16_t queue_id = ad->queue_ids[0]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + uint64_t total_time, min_time, max_time; + const char *op_type_str; + + total_time = max_time = 0; + min_time = UINT64_MAX; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(ad->dev_id, &info); + bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + op_type_str = rte_bbdev_op_type_str(op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== test: validation/latency\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", + info.dev_name, burst_sz, num_to_process, op_type_str); + + if (op_type == RTE_BBDEV_OP_TURBO_DEC) + iter = latency_test_dec(op_params->mp, bufs, + op_params->ref_dec_op, op_params->vector_mask, + ad->dev_id, queue_id, num_to_process, + burst_sz, &total_time, &min_time, &max_time); + else if (op_type == RTE_BBDEV_OP_TURBO_ENC) + iter = latency_test_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &total_time, + &min_time, &max_time); + else if (op_type == RTE_BBDEV_OP_LDPC_ENC) + iter = latency_test_ldpc_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &total_time, + &min_time, &max_time); + else if (op_type == RTE_BBDEV_OP_LDPC_DEC) + iter = latency_test_ldpc_dec(op_params->mp, bufs, + op_params->ref_dec_op, op_params->vector_mask, + ad->dev_id, queue_id, num_to_process, + burst_sz, &total_time, &min_time, &max_time); + else + iter = latency_test_enc(op_params->mp, bufs, + op_params->ref_enc_op, + ad->dev_id, queue_id, + num_to_process, burst_sz, &total_time, + &min_time, &max_time); + + if (iter <= 0) + return TEST_FAILED; + + printf("Operation latency:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n", + (double)total_time / (double)iter, + (double)(total_time * 1000000) / (double)iter / + (double)rte_get_tsc_hz(), (double)min_time, + (double)(min_time * 1000000) / (double)rte_get_tsc_hz(), + (double)max_time, (double)(max_time * 1000000) / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +#ifdef RTE_BBDEV_OFFLOAD_COST +static int +get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_stats *stats) +{ + struct rte_bbdev *dev = &rte_bbdev_devices[dev_id]; + struct rte_bbdev_stats *q_stats; + + if (queue_id >= dev->data->num_queues) + return -1; + + q_stats = &dev->data->queues[queue_id].queue_stats; + + stats->enqueued_count = q_stats->enqueued_count; + stats->dequeued_count = q_stats->dequeued_count; + stats->enqueue_err_count = q_stats->enqueue_err_count; + stats->dequeue_err_count = q_stats->dequeue_err_count; + stats->acc_offload_cycles = q_stats->acc_offload_cycles; + + return 0; +} + +static int +offload_latency_test_dec(struct rte_mempool *mempool, struct test_buffers *bufs, + struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, + uint16_t queue_id, const uint16_t num_to_process, + uint16_t burst_sz, struct test_time_stats *time_st) +{ + int i, dequeued, ret; + struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t enq_start_time, deq_start_time; + uint64_t enq_sw_last_time, deq_last_time; + struct rte_bbdev_stats stats; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_dec_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + bufs->soft_outputs, + ref_op); + + /* Start time meas for enqueue function offload latency */ + enq_start_time = rte_rdtsc_precise(); + do { + enq += rte_bbdev_enqueue_dec_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz - enq); + } while (unlikely(burst_sz != enq)); + + ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); + TEST_ASSERT_SUCCESS(ret, + "Failed to get stats for queue (%u) of device (%u)", + queue_id, dev_id); + + enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - + stats.acc_offload_cycles; + time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, + enq_sw_last_time); + time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, + enq_sw_last_time); + time_st->enq_sw_total_time += enq_sw_last_time; + + time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, + stats.acc_offload_cycles); + time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, + stats.acc_offload_cycles); + time_st->enq_acc_total_time += stats.acc_offload_cycles; + + /* give time for device to process ops */ + rte_delay_us(200); + + /* Start time meas for dequeue function offload latency */ + deq_start_time = rte_rdtsc_precise(); + /* Dequeue one operation */ + do { + deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, + &ops_deq[deq], 1); + } while (unlikely(deq != 1)); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, + deq_last_time); + time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, + deq_last_time); + time_st->deq_total_time += deq_last_time; + + /* Dequeue remaining operations if needed*/ + while (burst_sz != deq) + deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + + rte_bbdev_dec_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +offload_latency_test_ldpc_dec(struct rte_mempool *mempool, + struct test_buffers *bufs, + struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, + uint16_t queue_id, const uint16_t num_to_process, + uint16_t burst_sz, struct test_time_stats *time_st) +{ + int i, dequeued, ret; + struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t enq_start_time, deq_start_time; + uint64_t enq_sw_last_time, deq_last_time; + struct rte_bbdev_stats stats; + bool extDdr = ldpc_cap_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + bufs->soft_outputs, + bufs->harq_inputs, + bufs->harq_outputs, + ref_op); + + if (extDdr) + preload_harq_ddr(dev_id, queue_id, ops_enq, + burst_sz, true); + + /* Start time meas for enqueue function offload latency */ + enq_start_time = rte_rdtsc_precise(); + do { + enq += rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz - enq); + } while (unlikely(burst_sz != enq)); + + enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; + ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); + TEST_ASSERT_SUCCESS(ret, + "Failed to get stats for queue (%u) of device (%u)", + queue_id, dev_id); + + enq_sw_last_time -= stats.acc_offload_cycles; + time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, + enq_sw_last_time); + time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, + enq_sw_last_time); + time_st->enq_sw_total_time += enq_sw_last_time; + + time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, + stats.acc_offload_cycles); + time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, + stats.acc_offload_cycles); + time_st->enq_acc_total_time += stats.acc_offload_cycles; + + /* give time for device to process ops */ + rte_delay_us(200); + + /* Start time meas for dequeue function offload latency */ + deq_start_time = rte_rdtsc_precise(); + /* Dequeue one operation */ + do { + deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, + &ops_deq[deq], 1); + } while (unlikely(deq != 1)); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, + deq_last_time); + time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, + deq_last_time); + time_st->deq_total_time += deq_last_time; + + /* Dequeue remaining operations if needed*/ + while (burst_sz != deq) + deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + + if (extDdr) { + /* Read loopback is not thread safe */ + retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +offload_latency_test_enc(struct rte_mempool *mempool, struct test_buffers *bufs, + struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, + uint16_t queue_id, const uint16_t num_to_process, + uint16_t burst_sz, struct test_time_stats *time_st) +{ + int i, dequeued, ret; + struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t enq_start_time, deq_start_time; + uint64_t enq_sw_last_time, deq_last_time; + struct rte_bbdev_stats stats; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_enc_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_enc_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + ref_op); + + /* Start time meas for enqueue function offload latency */ + enq_start_time = rte_rdtsc_precise(); + do { + enq += rte_bbdev_enqueue_enc_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz - enq); + } while (unlikely(burst_sz != enq)); + + enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; + + ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); + TEST_ASSERT_SUCCESS(ret, + "Failed to get stats for queue (%u) of device (%u)", + queue_id, dev_id); + enq_sw_last_time -= stats.acc_offload_cycles; + time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, + enq_sw_last_time); + time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, + enq_sw_last_time); + time_st->enq_sw_total_time += enq_sw_last_time; + + time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, + stats.acc_offload_cycles); + time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, + stats.acc_offload_cycles); + time_st->enq_acc_total_time += stats.acc_offload_cycles; + + /* give time for device to process ops */ + rte_delay_us(200); + + /* Start time meas for dequeue function offload latency */ + deq_start_time = rte_rdtsc_precise(); + /* Dequeue one operation */ + do { + deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, + &ops_deq[deq], 1); + } while (unlikely(deq != 1)); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, + deq_last_time); + time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, + deq_last_time); + time_st->deq_total_time += deq_last_time; + + while (burst_sz != deq) + deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + + rte_bbdev_enc_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +offload_latency_test_ldpc_enc(struct rte_mempool *mempool, + struct test_buffers *bufs, + struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, + uint16_t queue_id, const uint16_t num_to_process, + uint16_t burst_sz, struct test_time_stats *time_st) +{ + int i, dequeued, ret; + struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t enq_start_time, deq_start_time; + uint64_t enq_sw_last_time, deq_last_time; + struct rte_bbdev_stats stats; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_enc_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + ref_op); + + /* Start time meas for enqueue function offload latency */ + enq_start_time = rte_rdtsc_precise(); + do { + enq += rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz - enq); + } while (unlikely(burst_sz != enq)); + + enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; + ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); + TEST_ASSERT_SUCCESS(ret, + "Failed to get stats for queue (%u) of device (%u)", + queue_id, dev_id); + + enq_sw_last_time -= stats.acc_offload_cycles; + time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, + enq_sw_last_time); + time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, + enq_sw_last_time); + time_st->enq_sw_total_time += enq_sw_last_time; + + time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, + stats.acc_offload_cycles); + time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, + stats.acc_offload_cycles); + time_st->enq_acc_total_time += stats.acc_offload_cycles; + + /* give time for device to process ops */ + rte_delay_us(200); + + /* Start time meas for dequeue function offload latency */ + deq_start_time = rte_rdtsc_precise(); + /* Dequeue one operation */ + do { + deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, + &ops_deq[deq], 1); + } while (unlikely(deq != 1)); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, + deq_last_time); + time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, + deq_last_time); + time_st->deq_total_time += deq_last_time; + + while (burst_sz != deq) + deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + + rte_bbdev_enc_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} +#endif + +static int +offload_cost_test(struct active_device *ad, + struct test_op_params *op_params) +{ +#ifndef RTE_BBDEV_OFFLOAD_COST + RTE_SET_USED(ad); + RTE_SET_USED(op_params); + printf("Offload latency test is disabled.\n"); + printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); + return TEST_SKIPPED; +#else + int iter; + uint16_t burst_sz = op_params->burst_sz; + const uint16_t num_to_process = op_params->num_to_process; + const enum rte_bbdev_op_type op_type = test_vector.op_type; + const uint16_t queue_id = ad->queue_ids[0]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + const char *op_type_str; + struct test_time_stats time_st; + + memset(&time_st, 0, sizeof(struct test_time_stats)); + time_st.enq_sw_min_time = UINT64_MAX; + time_st.enq_acc_min_time = UINT64_MAX; + time_st.deq_min_time = UINT64_MAX; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(ad->dev_id, &info); + bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + op_type_str = rte_bbdev_op_type_str(op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== test: offload latency test\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", + info.dev_name, burst_sz, num_to_process, op_type_str); + + if (op_type == RTE_BBDEV_OP_TURBO_DEC) + iter = offload_latency_test_dec(op_params->mp, bufs, + op_params->ref_dec_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + else if (op_type == RTE_BBDEV_OP_TURBO_ENC) + iter = offload_latency_test_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + else if (op_type == RTE_BBDEV_OP_LDPC_ENC) + iter = offload_latency_test_ldpc_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + else if (op_type == RTE_BBDEV_OP_LDPC_DEC) + iter = offload_latency_test_ldpc_dec(op_params->mp, bufs, + op_params->ref_dec_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + else + iter = offload_latency_test_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + + if (iter <= 0) + return TEST_FAILED; + + printf("Enqueue driver offload cost latency:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n" + "Enqueue accelerator offload cost latency:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n", + (double)time_st.enq_sw_total_time / (double)iter, + (double)(time_st.enq_sw_total_time * 1000000) / + (double)iter / (double)rte_get_tsc_hz(), + (double)time_st.enq_sw_min_time, + (double)(time_st.enq_sw_min_time * 1000000) / + rte_get_tsc_hz(), (double)time_st.enq_sw_max_time, + (double)(time_st.enq_sw_max_time * 1000000) / + rte_get_tsc_hz(), (double)time_st.enq_acc_total_time / + (double)iter, + (double)(time_st.enq_acc_total_time * 1000000) / + (double)iter / (double)rte_get_tsc_hz(), + (double)time_st.enq_acc_min_time, + (double)(time_st.enq_acc_min_time * 1000000) / + rte_get_tsc_hz(), (double)time_st.enq_acc_max_time, + (double)(time_st.enq_acc_max_time * 1000000) / + rte_get_tsc_hz()); + + printf("Dequeue offload cost latency - one op:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n", + (double)time_st.deq_total_time / (double)iter, + (double)(time_st.deq_total_time * 1000000) / + (double)iter / (double)rte_get_tsc_hz(), + (double)time_st.deq_min_time, + (double)(time_st.deq_min_time * 1000000) / + rte_get_tsc_hz(), (double)time_st.deq_max_time, + (double)(time_st.deq_max_time * 1000000) / + rte_get_tsc_hz()); + + return TEST_SUCCESS; +#endif +} + +#ifdef RTE_BBDEV_OFFLOAD_COST +static int +offload_latency_empty_q_test_dec(uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *deq_total_time, uint64_t *deq_min_time, + uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) +{ + int i, deq_total; + struct rte_bbdev_dec_op *ops[MAX_BURST]; + uint64_t deq_start_time, deq_last_time; + + /* Test deq offload latency from an empty queue */ + + for (i = 0, deq_total = 0; deq_total < num_to_process; + ++i, deq_total += burst_sz) { + deq_start_time = rte_rdtsc_precise(); + + if (unlikely(num_to_process - deq_total < burst_sz)) + burst_sz = num_to_process - deq_total; + if (op_type == RTE_BBDEV_OP_LDPC_DEC) + rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, ops, + burst_sz); + else + rte_bbdev_dequeue_dec_ops(dev_id, queue_id, ops, + burst_sz); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); + *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); + *deq_total_time += deq_last_time; + } + + return i; +} + +static int +offload_latency_empty_q_test_enc(uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *deq_total_time, uint64_t *deq_min_time, + uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) +{ + int i, deq_total; + struct rte_bbdev_enc_op *ops[MAX_BURST]; + uint64_t deq_start_time, deq_last_time; + + /* Test deq offload latency from an empty queue */ + for (i = 0, deq_total = 0; deq_total < num_to_process; + ++i, deq_total += burst_sz) { + deq_start_time = rte_rdtsc_precise(); + + if (unlikely(num_to_process - deq_total < burst_sz)) + burst_sz = num_to_process - deq_total; + if (op_type == RTE_BBDEV_OP_LDPC_ENC) + rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, ops, + burst_sz); + else + rte_bbdev_dequeue_enc_ops(dev_id, queue_id, ops, + burst_sz); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); + *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); + *deq_total_time += deq_last_time; + } + + return i; +} + +#endif + +static int +offload_latency_empty_q_test(struct active_device *ad, + struct test_op_params *op_params) +{ +#ifndef RTE_BBDEV_OFFLOAD_COST + RTE_SET_USED(ad); + RTE_SET_USED(op_params); + printf("Offload latency empty dequeue test is disabled.\n"); + printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); + return TEST_SKIPPED; +#else + int iter; + uint64_t deq_total_time, deq_min_time, deq_max_time; + uint16_t burst_sz = op_params->burst_sz; + const uint16_t num_to_process = op_params->num_to_process; + const enum rte_bbdev_op_type op_type = test_vector.op_type; + const uint16_t queue_id = ad->queue_ids[0]; + struct rte_bbdev_info info; + const char *op_type_str; + + deq_total_time = deq_max_time = 0; + deq_min_time = UINT64_MAX; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(ad->dev_id, &info); + + op_type_str = rte_bbdev_op_type_str(op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== test: offload latency empty dequeue\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", + info.dev_name, burst_sz, num_to_process, op_type_str); + + if (op_type == RTE_BBDEV_OP_TURBO_DEC || + op_type == RTE_BBDEV_OP_LDPC_DEC) + iter = offload_latency_empty_q_test_dec(ad->dev_id, queue_id, + num_to_process, burst_sz, &deq_total_time, + &deq_min_time, &deq_max_time, op_type); + else + iter = offload_latency_empty_q_test_enc(ad->dev_id, queue_id, + num_to_process, burst_sz, &deq_total_time, + &deq_min_time, &deq_max_time, op_type); + + if (iter <= 0) + return TEST_FAILED; + + printf("Empty dequeue offload:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n", + (double)deq_total_time / (double)iter, + (double)(deq_total_time * 1000000) / (double)iter / + (double)rte_get_tsc_hz(), (double)deq_min_time, + (double)(deq_min_time * 1000000) / rte_get_tsc_hz(), + (double)deq_max_time, (double)(deq_max_time * 1000000) / + rte_get_tsc_hz()); + + return TEST_SUCCESS; +#endif +} + +static int +bler_tc(void) +{ + return run_test_case(bler_test); +} + +static int +throughput_tc(void) +{ + return run_test_case(throughput_test); +} + +static int +offload_cost_tc(void) +{ + return run_test_case(offload_cost_test); +} + +static int +offload_latency_empty_q_tc(void) +{ + return run_test_case(offload_latency_empty_q_test); +} + +static int +latency_tc(void) +{ + return run_test_case(latency_test); +} + +static int +interrupt_tc(void) +{ + return run_test_case(throughput_test); +} + +static struct unit_test_suite bbdev_bler_testsuite = { + .suite_name = "BBdev BLER Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, bler_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_throughput_testsuite = { + .suite_name = "BBdev Throughput Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, throughput_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_validation_testsuite = { + .suite_name = "BBdev Validation Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_latency_testsuite = { + .suite_name = "BBdev Latency Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_offload_cost_testsuite = { + .suite_name = "BBdev Offload Cost Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, offload_cost_tc), + TEST_CASE_ST(ut_setup, ut_teardown, offload_latency_empty_q_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_interrupt_testsuite = { + .suite_name = "BBdev Interrupt Tests", + .setup = interrupt_testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, interrupt_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +REGISTER_TEST_COMMAND(bler, bbdev_bler_testsuite); +REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); +REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite); +REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite); +REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite); +REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite); diff --git a/targets/ARCH/test-bbdev/test_bbdev_vector.c b/targets/ARCH/test-bbdev/test_bbdev_vector.c new file mode 100644 index 0000000000..cdbc813285 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_bbdev_vector.c @@ -0,0 +1,1438 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation + */ + +#ifdef RTE_EXEC_ENV_FREEBSD + #define _WITH_GETLINE +#endif +#include +#include +#include + +#include "test_bbdev_vector.h" + +#define VALUE_DELIMITER "," +#define ENTRY_DELIMITER "=" + +const char *op_data_prefixes[] = { + "input", + "soft_output", + "hard_output", + "harq_input", + "harq_output", +}; + +/* trim leading and trailing spaces */ +static void +trim_space(char *str) +{ + char *start, *end; + + for (start = str; *start; start++) { + if (!isspace((unsigned char) start[0])) + break; + } + + for (end = start + strlen(start); end > start + 1; end--) { + if (!isspace((unsigned char) end[-1])) + break; + } + + *end = 0; + + /* Shift from "start" to the beginning of the string */ + if (start > str) + memmove(str, start, (end - start) + 1); +} + +static bool +starts_with(const char *str, const char *pre) +{ + return strncmp(pre, str, strlen(pre)) == 0; +} + +/* tokenization test values separated by a comma */ +static int +parse_values(char *tokens, uint32_t **data, uint32_t *data_length) +{ + uint32_t n_tokens = 0; + uint32_t data_size = 32; + + uint32_t *values, *values_resized; + char *tok, *error = NULL; + + tok = strtok(tokens, VALUE_DELIMITER); + if (tok == NULL) + return -1; + + values = (uint32_t *) + rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0); + if (values == NULL) + return -1; + + while (tok != NULL) { + values_resized = NULL; + + if (n_tokens >= data_size) { + data_size *= 2; + + values_resized = (uint32_t *) rte_realloc(values, + sizeof(uint32_t) * data_size, 0); + if (values_resized == NULL) { + rte_free(values); + return -1; + } + values = values_resized; + } + + values[n_tokens] = (uint32_t) strtoul(tok, &error, 0); + + if ((error == NULL) || (*error != '\0')) { + printf("Failed with convert '%s'\n", tok); + rte_free(values); + return -1; + } + + *data_length = *data_length + (strlen(tok) - strlen("0x"))/2; + + tok = strtok(NULL, VALUE_DELIMITER); + if (tok == NULL) + break; + + n_tokens++; + } + + values_resized = (uint32_t *) rte_realloc(values, + sizeof(uint32_t) * (n_tokens + 1), 0); + + if (values_resized == NULL) { + rte_free(values); + return -1; + } + + *data = values_resized; + + return 0; +} + +/* convert turbo decoder flag from string to unsigned long int*/ +static int +op_decoder_flag_strtoul(char *token, uint32_t *op_flag_value) +{ + if (!strcmp(token, "RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE")) + *op_flag_value = RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE; + else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_TYPE_24B")) + *op_flag_value = RTE_BBDEV_TURBO_CRC_TYPE_24B; + else if (!strcmp(token, "RTE_BBDEV_TURBO_EQUALIZER")) + *op_flag_value = RTE_BBDEV_TURBO_EQUALIZER; + else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUT_SATURATE")) + *op_flag_value = RTE_BBDEV_TURBO_SOFT_OUT_SATURATE; + else if (!strcmp(token, "RTE_BBDEV_TURBO_HALF_ITERATION_EVEN")) + *op_flag_value = RTE_BBDEV_TURBO_HALF_ITERATION_EVEN; + else if (!strcmp(token, "RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH")) + *op_flag_value = RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH; + else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUTPUT")) + *op_flag_value = RTE_BBDEV_TURBO_SOFT_OUTPUT; + else if (!strcmp(token, "RTE_BBDEV_TURBO_EARLY_TERMINATION")) + *op_flag_value = RTE_BBDEV_TURBO_EARLY_TERMINATION; + else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN")) + *op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN; + else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN")) + *op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN; + else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT")) + *op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT; + else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT")) + *op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; + else if (!strcmp(token, "RTE_BBDEV_TURBO_MAP_DEC")) + *op_flag_value = RTE_BBDEV_TURBO_MAP_DEC; + else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_SCATTER_GATHER")) + *op_flag_value = RTE_BBDEV_TURBO_DEC_SCATTER_GATHER; + else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP")) + *op_flag_value = RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP; + else { + printf("The given value is not a turbo decoder flag\n"); + return -1; + } + + return 0; +} + +/* convert LDPC flag from string to unsigned long int*/ +static int +op_ldpc_decoder_flag_strtoul(char *token, uint32_t *op_flag_value) +{ + if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK")) + *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK; + else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK")) + *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK; + else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP")) + *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP; + else if (!strcmp(token, "RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS")) + *op_flag_value = RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS; + else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE")) + *op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE; + else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE")) + *op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; + else if (!strcmp(token, "RTE_BBDEV_LDPC_DECODE_BYPASS")) + *op_flag_value = RTE_BBDEV_LDPC_DECODE_BYPASS; + else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_ENABLE")) + *op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_ENABLE; + else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS")) + *op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS; + else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS")) + *op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS; + else if (!strcmp(token, "RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE")) + *op_flag_value = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_INTERRUPTS")) + *op_flag_value = RTE_BBDEV_LDPC_DEC_INTERRUPTS; + else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_SCATTER_GATHER")) + *op_flag_value = RTE_BBDEV_LDPC_DEC_SCATTER_GATHER; + else if (!strcmp(token, "RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION")) + *op_flag_value = RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + else if (!strcmp(token, "RTE_BBDEV_LDPC_LLR_COMPRESSION")) + *op_flag_value = RTE_BBDEV_LDPC_LLR_COMPRESSION; + else if (!strcmp(token, + "RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE")) + *op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; + else if (!strcmp(token, + "RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE")) + *op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + else if (!strcmp(token, + "RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK")) + *op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; + else { + printf("The given value is not a LDPC decoder flag\n"); + return -1; + } + + return 0; +} + +/* convert turbo encoder flag from string to unsigned long int*/ +static int +op_encoder_flag_strtoul(char *token, uint32_t *op_flag_value) +{ + if (!strcmp(token, "RTE_BBDEV_TURBO_RV_INDEX_BYPASS")) + *op_flag_value = RTE_BBDEV_TURBO_RV_INDEX_BYPASS; + else if (!strcmp(token, "RTE_BBDEV_TURBO_RATE_MATCH")) + *op_flag_value = RTE_BBDEV_TURBO_RATE_MATCH; + else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24B_ATTACH")) + *op_flag_value = RTE_BBDEV_TURBO_CRC_24B_ATTACH; + else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24A_ATTACH")) + *op_flag_value = RTE_BBDEV_TURBO_CRC_24A_ATTACH; + else if (!strcmp(token, "RTE_BBDEV_TURBO_ENC_SCATTER_GATHER")) + *op_flag_value = RTE_BBDEV_TURBO_ENC_SCATTER_GATHER; + else { + printf("The given value is not a turbo encoder flag\n"); + return -1; + } + + return 0; +} + +/* convert LDPC encoder flag from string to unsigned long int*/ +static int +op_ldpc_encoder_flag_strtoul(char *token, uint32_t *op_flag_value) +{ + if (!strcmp(token, "RTE_BBDEV_LDPC_INTERLEAVER_BYPASS")) + *op_flag_value = RTE_BBDEV_LDPC_INTERLEAVER_BYPASS; + else if (!strcmp(token, "RTE_BBDEV_LDPC_RATE_MATCH")) + *op_flag_value = RTE_BBDEV_LDPC_RATE_MATCH; + else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24A_ATTACH")) + *op_flag_value = RTE_BBDEV_LDPC_CRC_24A_ATTACH; + else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24B_ATTACH")) + *op_flag_value = RTE_BBDEV_LDPC_CRC_24B_ATTACH; + else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_16_ATTACH")) + *op_flag_value = RTE_BBDEV_LDPC_CRC_16_ATTACH; + else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_INTERRUPTS")) + *op_flag_value = RTE_BBDEV_LDPC_ENC_INTERRUPTS; + else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_SCATTER_GATHER")) + *op_flag_value = RTE_BBDEV_LDPC_ENC_SCATTER_GATHER; + else { + printf("The given value is not a turbo encoder flag\n"); + return -1; + } + + return 0; +} + +/* tokenization turbo decoder/encoder flags values separated by a comma */ +static int +parse_turbo_flags(char *tokens, uint32_t *op_flags, + enum rte_bbdev_op_type op_type) +{ + char *tok = NULL; + uint32_t op_flag_value = 0; + + tok = strtok(tokens, VALUE_DELIMITER); + if (tok == NULL) + return -1; + + while (tok != NULL) { + trim_space(tok); + if (op_type == RTE_BBDEV_OP_TURBO_DEC) { + if (op_decoder_flag_strtoul(tok, &op_flag_value) == -1) + return -1; + } else if (op_type == RTE_BBDEV_OP_TURBO_ENC) { + if (op_encoder_flag_strtoul(tok, &op_flag_value) == -1) + return -1; + } else if (op_type == RTE_BBDEV_OP_LDPC_ENC) { + if (op_ldpc_encoder_flag_strtoul(tok, &op_flag_value) + == -1) + return -1; + } else if (op_type == RTE_BBDEV_OP_LDPC_DEC) { + if (op_ldpc_decoder_flag_strtoul(tok, &op_flag_value) + == -1) + return -1; + } else { + return -1; + } + + *op_flags = *op_flags | op_flag_value; + + tok = strtok(NULL, VALUE_DELIMITER); + if (tok == NULL) + break; + } + + return 0; +} + +/* convert turbo encoder/decoder op_type from string to enum*/ +static int +op_turbo_type_strtol(char *token, enum rte_bbdev_op_type *op_type) +{ + trim_space(token); + if (!strcmp(token, "RTE_BBDEV_OP_TURBO_DEC")) + *op_type = RTE_BBDEV_OP_TURBO_DEC; + else if (!strcmp(token, "RTE_BBDEV_OP_TURBO_ENC")) + *op_type = RTE_BBDEV_OP_TURBO_ENC; + else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_ENC")) + *op_type = RTE_BBDEV_OP_LDPC_ENC; + else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_DEC")) + *op_type = RTE_BBDEV_OP_LDPC_DEC; + else if (!strcmp(token, "RTE_BBDEV_OP_NONE")) + *op_type = RTE_BBDEV_OP_NONE; + else { + printf("Not valid turbo op_type: '%s'\n", token); + return -1; + } + + return 0; +} + +/* tokenization expected status values separated by a comma */ +static int +parse_expected_status(char *tokens, int *status, enum rte_bbdev_op_type op_type) +{ + char *tok = NULL; + bool status_ok = false; + + tok = strtok(tokens, VALUE_DELIMITER); + if (tok == NULL) + return -1; + + while (tok != NULL) { + trim_space(tok); + if (!strcmp(tok, "OK")) + status_ok = true; + else if (!strcmp(tok, "DMA")) + *status = *status | (1 << RTE_BBDEV_DRV_ERROR); + else if (!strcmp(tok, "FCW")) + *status = *status | (1 << RTE_BBDEV_DATA_ERROR); + else if (!strcmp(tok, "SYNCRC")) { + *status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR); + *status = *status | (1 << RTE_BBDEV_CRC_ERROR); + } else if (!strcmp(tok, "SYN")) + *status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR); + else if (!strcmp(tok, "CRC")) { + if ((op_type == RTE_BBDEV_OP_TURBO_DEC) || + (op_type == RTE_BBDEV_OP_LDPC_DEC)) + *status = *status | (1 << RTE_BBDEV_CRC_ERROR); + else { + printf( + "CRC is only a valid value for decoder\n"); + return -1; + } + } else { + printf("Not valid status: '%s'\n", tok); + return -1; + } + + tok = strtok(NULL, VALUE_DELIMITER); + if (tok == NULL) + break; + } + + if (status_ok && *status != 0) { + printf( + "Not valid status values. Cannot be OK and ERROR at the same time.\n"); + return -1; + } + + return 0; +} + +/* parse ops data entry (there can be more than 1 input entry, each will be + * contained in a separate op_data_buf struct) + */ +static int +parse_data_entry(const char *key_token, char *token, + struct test_bbdev_vector *vector, enum op_data_type type, + const char *prefix) +{ + int ret; + uint32_t data_length = 0; + uint32_t *data = NULL; + unsigned int id; + struct op_data_buf *op_data; + unsigned int *nb_ops; + + if (type >= DATA_NUM_TYPES) { + printf("Unknown op type: %d!\n", type); + return -1; + } +printf("parse data entry \n"); + + op_data = vector->entries[type].segments; + nb_ops = &vector->entries[type].nb_segments; +printf("nb segments %d\n",*nb_ops); + + if (*nb_ops >= RTE_BBDEV_TURBO_MAX_CODE_BLOCKS) { + printf("Too many segments (code blocks defined): %u, max %d!\n", + *nb_ops, RTE_BBDEV_TURBO_MAX_CODE_BLOCKS); + return -1; + } + + if (sscanf(key_token + strlen(prefix), "%u", &id) != 1) { + printf("Missing ID of %s\n", prefix); + return -1; + } + if (id != *nb_ops) { + printf( + "Please order data entries sequentially, i.e. %s0, %s1, ...\n", + prefix, prefix); + return -1; + } + + /* Clear new op data struct */ + memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf)); + + ret = parse_values(token, &data, &data_length); +printf("data %x length %d\n",*data,data_length); + if (!ret) { + op_data[*nb_ops].addr = data; + op_data[*nb_ops].length = data_length; + ++(*nb_ops); + } + + return ret; +} + +/* parses turbo decoder parameters and assigns to global variable */ +static int +parse_decoder_params(const char *key_token, char *token, + struct test_bbdev_vector *vector) +{ + int ret = 0, status = 0; + uint32_t op_flags = 0; + char *err = NULL; + + struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; + + /* compare keys */ + if (starts_with(key_token, op_data_prefixes[DATA_INPUT])) + ret = parse_data_entry(key_token, token, vector, + DATA_INPUT, op_data_prefixes[DATA_INPUT]); + + else if (starts_with(key_token, op_data_prefixes[DATA_SOFT_OUTPUT])) + ret = parse_data_entry(key_token, token, vector, + DATA_SOFT_OUTPUT, + op_data_prefixes[DATA_SOFT_OUTPUT]); + + else if (starts_with(key_token, op_data_prefixes[DATA_HARD_OUTPUT])) + ret = parse_data_entry(key_token, token, vector, + DATA_HARD_OUTPUT, + op_data_prefixes[DATA_HARD_OUTPUT]); + else if (!strcmp(key_token, "e")) { + vector->mask |= TEST_BBDEV_VF_E; + turbo_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0); + } else if (!strcmp(key_token, "ea")) { + vector->mask |= TEST_BBDEV_VF_EA; + turbo_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "eb")) { + vector->mask |= TEST_BBDEV_VF_EB; + turbo_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "k")) { + vector->mask |= TEST_BBDEV_VF_K; + turbo_dec->cb_params.k = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "k_pos")) { + vector->mask |= TEST_BBDEV_VF_K_POS; + turbo_dec->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "k_neg")) { + vector->mask |= TEST_BBDEV_VF_K_NEG; + turbo_dec->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "c")) { + vector->mask |= TEST_BBDEV_VF_C; + turbo_dec->tb_params.c = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "c_neg")) { + vector->mask |= TEST_BBDEV_VF_C_NEG; + turbo_dec->tb_params.c_neg = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "cab")) { + vector->mask |= TEST_BBDEV_VF_CAB; + turbo_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "rv_index")) { + vector->mask |= TEST_BBDEV_VF_RV_INDEX; + turbo_dec->rv_index = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "iter_max")) { + vector->mask |= TEST_BBDEV_VF_ITER_MAX; + turbo_dec->iter_max = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "iter_min")) { + vector->mask |= TEST_BBDEV_VF_ITER_MIN; + turbo_dec->iter_min = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "expected_iter_count")) { + vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT; + turbo_dec->iter_count = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "ext_scale")) { + vector->mask |= TEST_BBDEV_VF_EXT_SCALE; + turbo_dec->ext_scale = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "num_maps")) { + vector->mask |= TEST_BBDEV_VF_NUM_MAPS; + turbo_dec->num_maps = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "r")) { + vector->mask |= TEST_BBDEV_VF_R; + turbo_dec->tb_params.r = (uint8_t)strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "code_block_mode")) { + vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE; + turbo_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "op_flags")) { + vector->mask |= TEST_BBDEV_VF_OP_FLAGS; + ret = parse_turbo_flags(token, &op_flags, + vector->op_type); + if (!ret) + turbo_dec->op_flags = op_flags; + } else if (!strcmp(key_token, "expected_status")) { + vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS; + ret = parse_expected_status(token, &status, vector->op_type); + if (!ret) + vector->expected_status = status; + } else { + printf("Not valid dec key: '%s'\n", key_token); + return -1; + } + + if (ret != 0) { + printf("Failed with convert '%s\t%s'\n", key_token, token); + return -1; + } + + return 0; +} + +/* parses turbo encoder parameters and assigns to global variable */ +static int +parse_encoder_params(const char *key_token, char *token, + struct test_bbdev_vector *vector) +{ + int ret = 0, status = 0; + uint32_t op_flags = 0; + char *err = NULL; + + + struct rte_bbdev_op_turbo_enc *turbo_enc = &vector->turbo_enc; + + if (starts_with(key_token, op_data_prefixes[DATA_INPUT])) + ret = parse_data_entry(key_token, token, vector, + DATA_INPUT, op_data_prefixes[DATA_INPUT]); + else if (starts_with(key_token, "output")) + ret = parse_data_entry(key_token, token, vector, + DATA_HARD_OUTPUT, "output"); + else if (!strcmp(key_token, "e")) { + vector->mask |= TEST_BBDEV_VF_E; + turbo_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "ea")) { + vector->mask |= TEST_BBDEV_VF_EA; + turbo_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "eb")) { + vector->mask |= TEST_BBDEV_VF_EB; + turbo_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "k")) { + vector->mask |= TEST_BBDEV_VF_K; + turbo_enc->cb_params.k = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "k_neg")) { + vector->mask |= TEST_BBDEV_VF_K_NEG; + turbo_enc->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "k_pos")) { + vector->mask |= TEST_BBDEV_VF_K_POS; + turbo_enc->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "c_neg")) { + vector->mask |= TEST_BBDEV_VF_C_NEG; + turbo_enc->tb_params.c_neg = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "c")) { + vector->mask |= TEST_BBDEV_VF_C; + turbo_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "cab")) { + vector->mask |= TEST_BBDEV_VF_CAB; + turbo_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "rv_index")) { + vector->mask |= TEST_BBDEV_VF_RV_INDEX; + turbo_enc->rv_index = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "ncb")) { + vector->mask |= TEST_BBDEV_VF_NCB; + turbo_enc->cb_params.ncb = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "ncb_neg")) { + vector->mask |= TEST_BBDEV_VF_NCB_NEG; + turbo_enc->tb_params.ncb_neg = + (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "ncb_pos")) { + vector->mask |= TEST_BBDEV_VF_NCB_POS; + turbo_enc->tb_params.ncb_pos = + (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "r")) { + vector->mask |= TEST_BBDEV_VF_R; + turbo_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "code_block_mode")) { + vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE; + turbo_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "op_flags")) { + vector->mask |= TEST_BBDEV_VF_OP_FLAGS; + ret = parse_turbo_flags(token, &op_flags, + vector->op_type); + if (!ret) + turbo_enc->op_flags = op_flags; + } else if (!strcmp(key_token, "expected_status")) { + vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS; + ret = parse_expected_status(token, &status, vector->op_type); + if (!ret) + vector->expected_status = status; + } else { + printf("Not valid enc key: '%s'\n", key_token); + return -1; + } + + if (ret != 0) { + printf("Failed with convert '%s\t%s'\n", key_token, token); + return -1; + } + + return 0; +} + + +/* parses LDPC encoder parameters and assigns to global variable */ +static int +parse_ldpc_encoder_params(const char *key_token, char *token, + struct test_bbdev_vector *vector) +{ + int ret = 0, status = 0; + uint32_t op_flags = 0; + char *err = NULL; + + struct rte_bbdev_op_ldpc_enc *ldpc_enc = &vector->ldpc_enc; + + if (starts_with(key_token, op_data_prefixes[DATA_INPUT])) + ret = parse_data_entry(key_token, token, vector, + DATA_INPUT, + op_data_prefixes[DATA_INPUT]); + else if (starts_with(key_token, "output")) + ret = parse_data_entry(key_token, token, vector, + DATA_HARD_OUTPUT, + "output"); + else if (!strcmp(key_token, "e")) { + vector->mask |= TEST_BBDEV_VF_E; + ldpc_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "ea")) { + vector->mask |= TEST_BBDEV_VF_EA; + ldpc_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "eb")) { + vector->mask |= TEST_BBDEV_VF_EB; + ldpc_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "c")) { + vector->mask |= TEST_BBDEV_VF_C; + ldpc_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "cab")) { + vector->mask |= TEST_BBDEV_VF_CAB; + ldpc_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "rv_index")) { + vector->mask |= TEST_BBDEV_VF_RV_INDEX; + ldpc_enc->rv_index = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "n_cb")) { + vector->mask |= TEST_BBDEV_VF_NCB; + ldpc_enc->n_cb = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "r")) { + vector->mask |= TEST_BBDEV_VF_R; + ldpc_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "q_m")) { + vector->mask |= TEST_BBDEV_VF_QM; + ldpc_enc->q_m = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "basegraph")) { + vector->mask |= TEST_BBDEV_VF_BG; + ldpc_enc->basegraph = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "z_c")) { + vector->mask |= TEST_BBDEV_VF_ZC; + ldpc_enc->z_c = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "n_filler")) { + vector->mask |= TEST_BBDEV_VF_F; + ldpc_enc->n_filler = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "code_block_mode")) { + vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE; + ldpc_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "op_flags")) { + vector->mask |= TEST_BBDEV_VF_OP_FLAGS; + ret = parse_turbo_flags(token, &op_flags, vector->op_type); + if (!ret) + ldpc_enc->op_flags = op_flags; + } else if (!strcmp(key_token, "expected_status")) { + vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS; + ret = parse_expected_status(token, &status, vector->op_type); + if (!ret) + vector->expected_status = status; + } else { + printf("Not valid ldpc enc key: '%s'\n", key_token); + return -1; + } + + if (ret != 0) { + printf("Failed with convert '%s\t%s'\n", key_token, token); + return -1; + } + + return 0; +} + +/* parses LDPC decoder parameters and assigns to global variable */ +static int +parse_ldpc_decoder_params(const char *key_token, char *token, + struct test_bbdev_vector *vector) +{ + int ret = 0, status = 0; + uint32_t op_flags = 0; + char *err = NULL; + + struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec; + + if (starts_with(key_token, op_data_prefixes[DATA_INPUT])) + ret = parse_data_entry(key_token, token, vector, + DATA_INPUT, + op_data_prefixes[DATA_INPUT]); + else if (starts_with(key_token, "output")) + ret = parse_data_entry(key_token, token, vector, + DATA_HARD_OUTPUT, + "output"); + else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_INPUT])) + ret = parse_data_entry(key_token, token, vector, + DATA_HARQ_INPUT, + op_data_prefixes[DATA_HARQ_INPUT]); + else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_OUTPUT])) + ret = parse_data_entry(key_token, token, vector, + DATA_HARQ_OUTPUT, + op_data_prefixes[DATA_HARQ_OUTPUT]); + else if (!strcmp(key_token, "e")) { + vector->mask |= TEST_BBDEV_VF_E; + ldpc_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "ea")) { + vector->mask |= TEST_BBDEV_VF_EA; + ldpc_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "eb")) { + vector->mask |= TEST_BBDEV_VF_EB; + ldpc_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "c")) { + vector->mask |= TEST_BBDEV_VF_C; + ldpc_dec->tb_params.c = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "cab")) { + vector->mask |= TEST_BBDEV_VF_CAB; + ldpc_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "rv_index")) { + vector->mask |= TEST_BBDEV_VF_RV_INDEX; + ldpc_dec->rv_index = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "n_cb")) { + vector->mask |= TEST_BBDEV_VF_NCB; + ldpc_dec->n_cb = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "r")) { + vector->mask |= TEST_BBDEV_VF_R; + ldpc_dec->tb_params.r = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "q_m")) { + vector->mask |= TEST_BBDEV_VF_QM; + ldpc_dec->q_m = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "basegraph")) { + vector->mask |= TEST_BBDEV_VF_BG; + ldpc_dec->basegraph = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "z_c")) { + vector->mask |= TEST_BBDEV_VF_ZC; + ldpc_dec->z_c = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "n_filler")) { + vector->mask |= TEST_BBDEV_VF_F; + ldpc_dec->n_filler = (uint16_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "expected_iter_count")) { + vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT; + ldpc_dec->iter_count = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "iter_max")) { + vector->mask |= TEST_BBDEV_VF_ITER_MAX; + ldpc_dec->iter_max = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "code_block_mode")) { + vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE; + ldpc_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0); + ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; + } else if (!strcmp(key_token, "op_flags")) { + vector->mask |= TEST_BBDEV_VF_OP_FLAGS; + ret = parse_turbo_flags(token, &op_flags, vector->op_type); + if (!ret) + ldpc_dec->op_flags = op_flags; + } else if (!strcmp(key_token, "expected_status")) { + vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS; + ret = parse_expected_status(token, &status, vector->op_type); + if (!ret) + vector->expected_status = status; + } else { + printf("Not valid ldpc dec key: '%s'\n", key_token); + return -1; + } + + if (ret != 0) { + printf("Failed with convert '%s\t%s'\n", key_token, token); + return -1; + } + + return 0; +} + +/* checks the type of key and assigns data */ +static int +parse_entry(char *entry, struct test_bbdev_vector *vector) +{ +printf("parse entry \n"); + int ret = 0; + char *token, *key_token; + enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_NONE; + + if (entry == NULL) { + printf("Expected entry value\n"); + return -1; + } + + /* get key */ + token = strtok(entry, ENTRY_DELIMITER); + key_token = token; + /* get values for key */ + token = strtok(NULL, ENTRY_DELIMITER); + + if (key_token == NULL || token == NULL) { + printf("Expected 'key = values' but was '%.40s'..\n", entry); + return -1; + } + trim_space(key_token); + + /* first key_token has to specify type of operation */ + if (vector->op_type == RTE_BBDEV_OP_NONE) { + if (!strcmp(key_token, "op_type")) { + ret = op_turbo_type_strtol(token, &op_type); + if (!ret) + vector->op_type = op_type; + return (!ret) ? 0 : -1; + } + printf("First key_token (%s) does not specify op_type\n", + key_token); + return -1; + } + + /* compare keys */ + if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) { + if (parse_decoder_params(key_token, token, vector) == -1) + return -1; + } else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) { + if (parse_encoder_params(key_token, token, vector) == -1) + return -1; + } else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) { + if (parse_ldpc_encoder_params(key_token, token, vector) == -1) + return -1; + } else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) { + if (parse_ldpc_decoder_params(key_token, token, vector) == -1) + return -1; + } + + return 0; +} + +static int +check_decoder_segments(struct test_bbdev_vector *vector) +{ + unsigned char i; + struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; + + if (vector->entries[DATA_INPUT].nb_segments == 0) + return -1; + + for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++) + if (vector->entries[DATA_INPUT].segments[i].addr == NULL) + return -1; + + if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0) + return -1; + + for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; + i++) + if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL) + return -1; + + if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) && + (vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0)) + return -1; + + for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments; + i++) + if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL) + return -1; + + return 0; +} + +static int +check_ldpc_decoder_segments(struct test_bbdev_vector *vector) +{ + unsigned char i; + struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec; + + for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++) + if (vector->entries[DATA_INPUT].segments[i].addr == NULL) + return -1; + + for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++) + if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL) + return -1; + + if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) && + (vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0)) + return -1; + + for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments; i++) + if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL) + return -1; + + if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) && + (vector->entries[DATA_HARQ_OUTPUT].nb_segments == 0)) + return -1; + + for (i = 0; i < vector->entries[DATA_HARQ_OUTPUT].nb_segments; i++) + if (vector->entries[DATA_HARQ_OUTPUT].segments[i].addr == NULL) + return -1; + + return 0; +} + +static int +check_decoder_llr_spec(struct test_bbdev_vector *vector) +{ + struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; + + /* Check input LLR sign formalism specification */ + if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) && + (turbo_dec->op_flags & + RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) { + printf( + "Both positive and negative LLR input flags were set!\n"); + return -1; + } + if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) && + !(turbo_dec->op_flags & + RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) { + printf( + "INFO: input LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n"); + turbo_dec->op_flags |= RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN; + } + + if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT)) + return 0; + + /* Check output LLR sign formalism specification */ + if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) && + (turbo_dec->op_flags & + RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) { + printf( + "Both positive and negative LLR output flags were set!\n"); + return -1; + } + if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) && + !(turbo_dec->op_flags & + RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) { + printf( + "INFO: soft output LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n"); + turbo_dec->op_flags |= + RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; + } + + return 0; +} + +static int +check_decoder_op_flags(struct test_bbdev_vector *vector) +{ + struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; + + if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP) && + !(turbo_dec->op_flags & RTE_BBDEV_TURBO_CRC_TYPE_24B)) { + printf( + "WARNING: RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP flag is missing RTE_BBDEV_TURBO_CRC_TYPE_24B\n"); + return -1; + } + + return 0; +} + +/* checks decoder parameters */ +static int +check_decoder(struct test_bbdev_vector *vector) +{ + struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; + const int mask = vector->mask; + + if (check_decoder_segments(vector) < 0) + return -1; + + if (check_decoder_llr_spec(vector) < 0) + return -1; + + if (check_decoder_op_flags(vector) < 0) + return -1; + + /* Check which params were set */ + if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) { + printf( + "WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n"); + turbo_dec->code_block_mode = 1; + } + if (turbo_dec->code_block_mode == 0) { + if (!(mask & TEST_BBDEV_VF_EA)) + printf( + "WARNING: ea was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_EB)) + printf( + "WARNING: eb was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_K_NEG)) + printf( + "WARNING: k_neg was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_K_POS)) + printf( + "WARNING: k_pos was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_C_NEG)) + printf( + "WARNING: c_neg was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_C)) { + printf( + "WARNING: c was not specified in vector file and will be set to 1\n"); + turbo_dec->tb_params.c = 1; + } + if (!(mask & TEST_BBDEV_VF_CAB)) + printf( + "WARNING: cab was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_R)) + printf( + "WARNING: r was not specified in vector file and will be set to 0\n"); + } else { + if (!(mask & TEST_BBDEV_VF_E)) + printf( + "WARNING: e was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_K)) + printf( + "WARNING: k was not specified in vector file and will be set to 0\n"); + } + if (!(mask & TEST_BBDEV_VF_RV_INDEX)) + printf( + "INFO: rv_index was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_ITER_MIN)) + printf( + "WARNING: iter_min was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_ITER_MAX)) + printf( + "WARNING: iter_max was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT)) + printf( + "WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n"); + if (!(mask & TEST_BBDEV_VF_EXT_SCALE)) + printf( + "WARNING: ext_scale was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) { + printf( + "WARNING: op_flags was not specified in vector file and capabilities will not be validated\n"); + turbo_dec->num_maps = 0; + } else if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_MAP_DEC) && + mask & TEST_BBDEV_VF_NUM_MAPS) { + printf( + "INFO: RTE_BBDEV_TURBO_MAP_DEC was not set in vector file and num_maps will be set to 0\n"); + turbo_dec->num_maps = 0; + } + if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS)) + printf( + "WARNING: expected_status was not specified in vector file and will be set to 0\n"); + return 0; +} + +/* checks LDPC decoder parameters */ +static int +check_ldpc_decoder(struct test_bbdev_vector *vector) +{ + struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec; + const int mask = vector->mask; + + if (check_ldpc_decoder_segments(vector) < 0) + return -1; + + /* + * if (check_ldpc_decoder_llr_spec(vector) < 0) + * return -1; + * + * if (check_ldpc_decoder_op_flags(vector) < 0) + * return -1; + */ + + /* Check which params were set */ + if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) { + printf( + "WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n"); + ldpc_dec->code_block_mode = 1; + } + if (ldpc_dec->code_block_mode == 0) { + if (!(mask & TEST_BBDEV_VF_EA)) + printf( + "WARNING: ea was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_EB)) + printf( + "WARNING: eb was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_C)) { + printf( + "WARNING: c was not specified in vector file and will be set to 1\n"); + ldpc_dec->tb_params.c = 1; + } + if (!(mask & TEST_BBDEV_VF_CAB)) + printf( + "WARNING: cab was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_R)) + printf( + "WARNING: r was not specified in vector file and will be set to 0\n"); + } else { + if (!(mask & TEST_BBDEV_VF_E)) + printf( + "WARNING: e was not specified in vector file and will be set to 0\n"); + } + if (!(mask & TEST_BBDEV_VF_RV_INDEX)) + printf( + "INFO: rv_index was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_ITER_MAX)) + printf( + "WARNING: iter_max was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT)) + printf( + "WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n"); + if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) { + printf( + "WARNING: op_flags was not specified in vector file and capabilities will not be validated\n"); + } + if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS)) + printf( + "WARNING: expected_status was not specified in vector file and will be set to 0\n"); + return 0; +} + +/* checks encoder parameters */ +static int +check_encoder(struct test_bbdev_vector *vector) +{ + unsigned char i; + const int mask = vector->mask; + + if (vector->entries[DATA_INPUT].nb_segments == 0) + return -1; + + for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++) + if (vector->entries[DATA_INPUT].segments[i].addr == NULL) + return -1; + + if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0) + return -1; + + for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++) + if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL) + return -1; + + if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) { + printf( + "WARNING: code_block_mode was not specified in vector file and will be set to 1\n"); + vector->turbo_enc.code_block_mode = 1; + } + if (vector->turbo_enc.code_block_mode == 0) { + if (!(mask & TEST_BBDEV_VF_EA) && (vector->turbo_enc.op_flags & + RTE_BBDEV_TURBO_RATE_MATCH)) + printf( + "WARNING: ea was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_EB) && (vector->turbo_enc.op_flags & + RTE_BBDEV_TURBO_RATE_MATCH)) + printf( + "WARNING: eb was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_K_NEG)) + printf( + "WARNING: k_neg was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_K_POS)) + printf( + "WARNING: k_pos was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_C_NEG)) + printf( + "WARNING: c_neg was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_C)) { + printf( + "WARNING: c was not specified in vector file and will be set to 1\n"); + vector->turbo_enc.tb_params.c = 1; + } + if (!(mask & TEST_BBDEV_VF_CAB) && (vector->turbo_enc.op_flags & + RTE_BBDEV_TURBO_RATE_MATCH)) + printf( + "WARNING: cab was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_NCB_NEG)) + printf( + "WARNING: ncb_neg was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_NCB_POS)) + printf( + "WARNING: ncb_pos was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_R)) + printf( + "WARNING: r was not specified in vector file and will be set to 0\n"); + } else { + if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags & + RTE_BBDEV_TURBO_RATE_MATCH)) + printf( + "WARNING: e was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_K)) + printf( + "WARNING: k was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_NCB)) + printf( + "WARNING: ncb was not specified in vector file and will be set to 0\n"); + } + if (!(mask & TEST_BBDEV_VF_RV_INDEX)) + printf( + "INFO: rv_index was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) + printf( + "INFO: op_flags was not specified in vector file and capabilities will not be validated\n"); + if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS)) + printf( + "WARNING: expected_status was not specified in vector file and will be set to 0\n"); + + return 0; +} + + +/* checks encoder parameters */ +static int +check_ldpc_encoder(struct test_bbdev_vector *vector) +{ + unsigned char i; + const int mask = vector->mask; + + if (vector->entries[DATA_INPUT].nb_segments == 0) + return -1; + + for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++) + if (vector->entries[DATA_INPUT].segments[i].addr == NULL) + return -1; + + if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0) + return -1; + + for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++) + if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL) + return -1; + + if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) { + printf( + "WARNING: code_block_mode was not specified in vector file and will be set to 1\n"); + vector->turbo_enc.code_block_mode = 1; + } + if (vector->turbo_enc.code_block_mode == 0) { + } else { + if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags & + RTE_BBDEV_TURBO_RATE_MATCH)) + printf( + "WARNING: e was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_NCB)) + printf( + "WARNING: ncb was not specified in vector file and will be set to 0\n"); + } + if (!(mask & TEST_BBDEV_VF_BG)) + printf( + "WARNING: BG was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_ZC)) + printf( + "WARNING: Zc was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_RV_INDEX)) + printf( + "INFO: rv_index was not specified in vector file and will be set to 0\n"); + if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) + printf( + "INFO: op_flags was not specified in vector file and capabilities will not be validated\n"); + if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS)) + printf( + "WARNING: expected_status was not specified in vector file and will be set to 0\n"); + + return 0; +} + +static int +bbdev_check_vector(struct test_bbdev_vector *vector) +{ + if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) { + if (check_decoder(vector) == -1) + return -1; + } else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) { + if (check_encoder(vector) == -1) + return -1; + } else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) { + if (check_ldpc_encoder(vector) == -1) + return -1; + } else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) { + if (check_ldpc_decoder(vector) == -1) + return -1; + } else if (vector->op_type != RTE_BBDEV_OP_NONE) { + printf("Vector was not filled\n"); + return -1; + } + + return 0; +} + +int +test_bbdev_vector_read(const char *filename, + struct test_bbdev_vector *vector) +{ + int ret = 0; + size_t len = 0; + + FILE *fp = NULL; + char *line = NULL; + char *entry = NULL; + + fp = fopen(filename, "r"); + if (fp == NULL) { + printf("File %s does not exist\n", filename); + return -1; + } + + while (getline(&line, &len, fp) != -1) { + + /* ignore comments and new lines */ + if (line[0] == '#' || line[0] == '/' || line[0] == '\n' + || line[0] == '\r') + continue; + + trim_space(line); + + /* buffer for multiline */ + entry = realloc(entry, strlen(line) + 1); + if (entry == NULL) { + printf("Fail to realloc %zu bytes\n", strlen(line) + 1); + ret = -ENOMEM; + goto exit; + } + + strcpy(entry, line); + + /* check if entry ends with , or = */ + if (entry[strlen(entry) - 1] == ',' + || entry[strlen(entry) - 1] == '=') { + while (getline(&line, &len, fp) != -1) { + trim_space(line); + + /* extend entry about length of new line */ + char *entry_extended = realloc(entry, + strlen(line) + + strlen(entry) + 1); + + if (entry_extended == NULL) { + printf("Fail to allocate %zu bytes\n", + strlen(line) + + strlen(entry) + 1); + ret = -ENOMEM; + goto exit; + } + + entry = entry_extended; + /* entry has been allocated accordingly */ + strcpy(&entry[strlen(entry)], line); + + if (entry[strlen(entry) - 1] != ',') + break; + } + } + ret = parse_entry(entry, vector); + if (ret != 0) { + printf("An error occurred while parsing!\n"); + goto exit; + } + } + ret = bbdev_check_vector(vector); + if (ret != 0) + printf("An error occurred while checking!\n"); + +exit: + fclose(fp); + free(line); + free(entry); + + return ret; +} diff --git a/targets/ARCH/test-bbdev/test_bbdev_vector.h b/targets/ARCH/test-bbdev/test_bbdev_vector.h new file mode 100644 index 0000000000..4e5dbf5d50 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_bbdev_vector.h @@ -0,0 +1,79 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation + */ + +#ifndef TEST_BBDEV_VECTOR_H_ +#define TEST_BBDEV_VECTOR_H_ + +#include + +/* Flags which are set when specific parameter is define in vector file */ +enum { + TEST_BBDEV_VF_E = (1ULL << 0), + TEST_BBDEV_VF_EA = (1ULL << 1), + TEST_BBDEV_VF_EB = (1ULL << 2), + TEST_BBDEV_VF_K = (1ULL << 3), + TEST_BBDEV_VF_K_NEG = (1ULL << 4), + TEST_BBDEV_VF_K_POS = (1ULL << 5), + TEST_BBDEV_VF_C_NEG = (1ULL << 6), + TEST_BBDEV_VF_C = (1ULL << 7), + TEST_BBDEV_VF_CAB = (1ULL << 8), + TEST_BBDEV_VF_RV_INDEX = (1ULL << 9), + TEST_BBDEV_VF_ITER_MAX = (1ULL << 10), + TEST_BBDEV_VF_ITER_MIN = (1ULL << 11), + TEST_BBDEV_VF_EXPECTED_ITER_COUNT = (1ULL << 12), + TEST_BBDEV_VF_EXT_SCALE = (1ULL << 13), + TEST_BBDEV_VF_NUM_MAPS = (1ULL << 14), + TEST_BBDEV_VF_NCB = (1ULL << 15), + TEST_BBDEV_VF_NCB_NEG = (1ULL << 16), + TEST_BBDEV_VF_NCB_POS = (1ULL << 17), + TEST_BBDEV_VF_R = (1ULL << 18), + TEST_BBDEV_VF_BG = (1ULL << 19), + TEST_BBDEV_VF_ZC = (1ULL << 20), + TEST_BBDEV_VF_F = (1ULL << 21), + TEST_BBDEV_VF_QM = (1ULL << 22), + TEST_BBDEV_VF_CODE_BLOCK_MODE = (1ULL << 23), + TEST_BBDEV_VF_OP_FLAGS = (1ULL << 24), + TEST_BBDEV_VF_EXPECTED_STATUS = (1ULL << 25), +}; + +enum op_data_type { + DATA_INPUT = 0, + DATA_SOFT_OUTPUT, + DATA_HARD_OUTPUT, + DATA_HARQ_INPUT, + DATA_HARQ_OUTPUT, + DATA_NUM_TYPES, +}; + +struct op_data_buf { + uint32_t *addr; + uint32_t length; +}; + +struct op_data_entries { + struct op_data_buf segments[RTE_BBDEV_TURBO_MAX_CODE_BLOCKS]; + unsigned int nb_segments; +}; + +struct test_bbdev_vector { + enum rte_bbdev_op_type op_type; + int expected_status; + int mask; + union { + struct rte_bbdev_op_turbo_dec turbo_dec; + struct rte_bbdev_op_turbo_enc turbo_enc; + struct rte_bbdev_op_ldpc_dec ldpc_dec; + struct rte_bbdev_op_ldpc_enc ldpc_enc; + }; + /* Additional storage for op data entries */ + struct op_data_entries entries[DATA_NUM_TYPES]; +}; + +/* fills test vector parameters based on test file */ +int +test_bbdev_vector_read(const char *filename, + struct test_bbdev_vector *vector); + + +#endif /* TEST_BBDEV_VECTOR_H_ */ diff --git a/targets/ARCH/test-bbdev/test_vectors/bbdev_null.data b/targets/ARCH/test-bbdev/test_vectors/bbdev_null.data new file mode 100644 index 0000000000..c9a9abe9ea --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/bbdev_null.data @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_NONE \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_1_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_1_rv0_drv0.data new file mode 100755 index 0000000000..98a3f1869a --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_1_rv0_drv0.data @@ -0,0 +1,44 @@ +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x7f7f7f7f, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x817f8181, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x81817f81, 0x817f8181, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x81817f81, 0x81817f7f, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x81818181, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x817f7f81, 0x817f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x8181817f, 0x8181817f, 0x817f8181, 0x7f817f7f, 0x81818181, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x817f7f81, 0x7f81817f, 0x817f7f7f, 0x7f817f81, 0x817f8181, 0x7f818181, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x8181817f, 0x7f817f7f, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x817f7f81, 0x817f7f7f, 0x81817f7f, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f817f, 0x8181817f, 0x81817f81, 0x817f7f7f, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x817f817f, 0x817f8181, 0x81817f81, 0x7f7f7f81, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x8181817f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x817f8181, 0x8181817f, 0x7f7f817f, 0x81817f7f, 0x7f817f81, 0x817f817f, 0x81817f7f, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x817f7f7f, 0x7f81817f, 0x81818181, 0x8181817f, 0x817f817f, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x81817f7f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x81817f7f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x7f81817f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f818181, 0x817f8181, 0x817f8181, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x81818181, 0x81817f81, 0x81817f7f, 0x7f817f81, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x817f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x817f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x81817f81, 0x81817f7f, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f818181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, 0x817f817f, 0x81817f81, 0x7f81817f, 0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x817f8181, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x81818181, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x81817f7f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x817f7f81, 0x81818181, 0x7f817f81, 0x817f8181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x817f8181, 0x817f7f81, 0x817f7f81, 0x817f817f, 0x817f8181, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x817f8181, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, 0x7f817f7f, 0x7f818181, 0x7f817f7f, 0x7f7f817f, 0x817f8181, 0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x81818181, 0x817f817f, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x81818181, 0x817f817f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f7f, 0x7f817f81, 0x81817f81, 0x7f81817f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x81817f81, 0x7f7f7f7f, 0x8181817f, 0x817f817f, 0x81818181, 0x7f818181, 0x81817f81, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f7f8181, 0x817f8181, 0x817f8181, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x8181817f, 0x817f8181, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f818181, 0x7f817f7f, 0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x81818181, 0x7f817f7f, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x817f817f, 0x817f8181, 0x81817f81, 0x7f81817f, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f818181, 0x7f7f8181, 0x7f7f8181, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f817f, 0x7f81817f, 0x8181817f, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f7f, 0x8181817f, 0x81817f7f, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x8181817f, 0x7f7f817f, 0x8181817f, 0x817f8181, 0x7f818181, 0x7f7f8181, 0x817f7f7f, 0x81817f81, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x8181817f, 0x81817f81, 0x81818181, 0x81817f7f, 0x7f818181, 0x817f8181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x7f81817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x81818181, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, 0x81818181, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x81818181, 0x81817f7f, 0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, 0x8181817f, 0x7f818181, 0x817f817f, 0x81817f81, 0x817f7f7f, 0x81817f81, 0x817f8181, 0x81817f81, 0x817f817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f817f7f, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x7f7f817f, 0x817f7f81, 0x817f817f, 0x81818181, 0x8181817f, 0x8181817f, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x7f81817f, 0x7f7f7f81, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x7f818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x817f817f, 0x817f7f7f, 0x817f7f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x81818181, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x7f818181, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x7f817f81, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x817f8181, 0x7f817f81, 0x7f7f7f7f, 0x817f817f, 0x817f817f, 0x7f817f81, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x817f8181, 0x7f7f7f81, 0x81817f81, 0x7f7f7f7f, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f7f81, 0x81817f81, 0x8181817f, 0x81817f7f, 0x7f818181, 0x81817f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f81817f, 0x817f8181, 0x81818181, 0x8181817f, 0x81818181, 0x817f8181, 0x7f817f7f, 0x817f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f818181, 0x81817f7f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x8181817f, 0x7f7f8181, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x7f7f817f, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x7f818181, 0x81818181, 0x817f8181, 0x817f7f7f, 0x817f8181, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x7f7f817f, 0x7f81817f, 0x817f817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f81817f, 0x7f817f81, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f +output0 = +0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0xb2 + +basegraph= +1 + +z_c= +128 + +n_cb= +3200 + +q_m= +2 + +n_filler= +0 + +e = +3112 + +rv_index = +0 + +code_block_mode = +1 + +iter_max= +8 + +expected_iter_count= +6 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_2_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_2_rv0_drv0.data new file mode 100755 index 0000000000..3247abeca0 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_2_rv0_drv0.data @@ -0,0 +1,43 @@ +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x817f817f, 0x7f81817f, 0x8181817f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x81817f81, 0x817f817f, 0x81817f81, 0x81817f7f, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f8181, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x8181817f, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x8181817f, 0x817f7f7f, 0x817f8181, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f81, 0x817f8181, 0x817f8181, 0x817f817f, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x817f7f81, 0x817f817f, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x817f817f, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f818181, 0x81817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f817f81, 0x7f7f7f81, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x7f817f81, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x81818181, 0x7f81817f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x817f817f, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x7f817f81, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x817f817f, 0x7f81817f, 0x7f7f817f, 0x7f817f81, 0x81818181, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x81817f81, 0x817f7f7f, 0x7f7f7f81, 0x81817f81, 0x8181817f, 0x817f817f, 0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x817f7f81, 0x81818181, 0x8181817f, 0x81817f81, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x81817f81, 0x817f7f7f, 0x7f81817f, 0x7f7f7f7f, 0x7f817f7f, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x817f817f, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x7f818181, 0x7f81817f, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f817f, 0x7f817f7f, 0x8181817f, 0x81817f7f, 0x817f7f7f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f81, 0x81818181, 0x817f8181, 0x817f817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x8181817f, 0x7f818181, 0x81817f81, 0x7f817f7f, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x7f7f8181, 0x81818181, 0x7f7f7f81, 0x7f81817f, 0x817f8181, 0x7f818181, 0x7f81817f, 0x7f817f7f, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x817f8181, 0x81818181, 0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x7f81817f, 0x7f818181, 0x81817f7f, 0x7f818181, 0x8181817f, 0x8181817f, 0x817f817f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x81818181, 0x8181817f, 0x7f818181, 0x817f817f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x817f8181, 0x7f818181, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x8181817f, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x7f818181, 0x8181817f, 0x81817f7f, 0x81817f81, 0x817f8181, 0x817f7f7f, 0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x81817f7f, 0x7f81817f, 0x7f818181, 0x81818181, 0x7f818181, 0x7f817f81, 0x7f7f817f, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x81817f7f, 0x8181817f, 0x7f818181, 0x817f8181, 0x81817f7f, 0x7f7f817f, 0x817f8181, 0x817f7f81, 0x817f817f, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x817f8181, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f817f81, 0x7f7f7f7f, 0x817f817f, 0x81817f7f, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f817f81, 0x817f817f, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x81818181, 0x817f7f81, 0x7f818181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x817f8181, 0x817f8181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x817f8181, 0x7f817f81, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x817f8181, 0x7f7f817f, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x7f817f81, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x81818181, 0x8181817f, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x7f818181, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x7f818181, 0x81817f7f, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x817f8181, 0x817f7f7f, 0x817f7f81, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x81817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f81817f, 0x817f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, 0x7f817f81, 0x7f818181, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81817f81, 0x817f7f7f, 0x8181817f, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x817f7f81, 0x8181817f, 0x81818181, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x817f8181, 0x817f8181, 0x817f817f, 0x8181817f, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x81817f81, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x8181817f, 0x81818181, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f7f81, 0x817f817f, 0x81818181, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x7f7f8181, 0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x8181817f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x7f817f81, 0x817f7f7f, 0x817f7f81, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x81817f7f, 0x7f817f7f, 0x81817f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f818181, 0x81818181, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f817f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f817f, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f817f81, 0x817f817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f818181, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x7f818181, 0x7f7f817f, 0x81818181, 0x7f7f817f, 0x8181817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x817f7f81, 0x81818181, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x817f817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x7f81817f, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f7f8181, 0x817f8181, 0x8181817f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f81817f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x81818181, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x81818181, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x817f7f7f, 0x8181817f, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x81818181, 0x7f7f817f, 0x817f817f, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x7f7f7f81, 0x817f817f, 0x81817f81, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x81817f81, 0x817f8181, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x8181817f, 0x81818181, 0x81817f7f, 0x817f7f81, 0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f8181, 0x7f7f817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x8181817f, 0x817f817f, 0x81818181, 0x8181817f, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f818181, 0x7f7f8181, 0x8181817f, 0x7f7f817f, 0x81818181, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x81818181, 0x8181817f, 0x7f81817f, 0x81817f81, 0x81817f81, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x81818181, 0x817f8181, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x817f7f81, 0x817f817f, 0x817f817f, 0x81818181, 0x7f81817f, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x81817f7f, 0x7f817f7f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x7f818181, 0x7f7f817f, 0x817f817f, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x7f7f7f7f, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x8181817f, 0x81817f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x817f8181, 0x7f817f7f, 0x7f7f8181, 0x817f7f7f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x7f818181, 0x81818181, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f817f81, 0x817f8181, 0x81818181, 0x81818181, 0x817f7f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f81817f, 0x7f7f8181, 0x8181817f, 0x7f7f817f, 0x7f818181, 0x81817f81, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x817f8181, 0x7f818181, 0x7f818181, 0x817f8181, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x8181817f, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x8181817f, 0x81818181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f81, 0x817f8181, 0x817f7f81, 0x81818181, 0x817f8181, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f817f, 0x8181817f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, 0x817f8181, 0x81817f81, 0x81817f7f, 0x7f7f7f81, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x81817f81, 0x7f7f817f, 0x817f7f7f, 0x7f818181, 0x7f7f8181, 0x7f817f81, 0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x81817f7f, 0x817f7f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x8181817f, 0x817f817f, 0x8181817f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x817f8181, 0x7f81817f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x7f817f81, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x7f817f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f818181, 0x7f817f7f, 0x7f818181, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x7f818181, 0x81817f81, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x817f817f, 0x8181817f, 0x81818181, 0x7f7f7f81, 0x81818181, 0x817f817f, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x81817f7f, 0x7f81817f, 0x817f817f, 0x7f7f7f81, 0x7f818181, 0x81818181, 0x81818181, 0x7f7f7f81, 0x7f817f7f, 0x7f817f81, 0x81817f7f, 0x8181817f, 0x81817f81, 0x817f7f81, 0x817f817f, 0x8181817f, 0x7f818181, 0x817f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x817f8181, 0x817f817f, 0x81817f81, 0x8181817f, 0x7f81817f, 0x7f818181, 0x7f7f7f7f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x8181817f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x81818181, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f817f7f, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x7f817f81, 0x817f7f7f, 0x81817f7f, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x817f7f81, 0x81818181, 0x7f818181, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x81817f81, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x7f7f8181, 0x81817f81, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x7f818181, 0x817f817f, 0x7f818181, 0x817f7f81, 0x81817f81, 0x7f7f7f7f, 0x8181817f, 0x7f817f81, 0x8181817f, 0x81818181, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x817f7f81, 0x81817f7f, 0x817f7f7f, 0x8181817f, 0x81817f7f, 0x817f817f, 0x7f81817f, 0x817f817f, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f7f8181, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x817f7f7f, 0x817f7f7f, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x81817f7f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x81817f7f, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x7f81817f, 0x81817f81, 0x81817f7f, 0x8181817f, 0x8181817f, 0x7f7f8181, 0x7f7f7f7f, 0x81817f7f, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x817f817f, 0x81818181, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x817f8181, 0x81817f7f, 0x817f817f, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x817f8181, 0x817f8181, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x817f817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x81817f7f, 0x7f7f7f81, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x81818181, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x7f81817f, 0x8181817f, 0x817f8181, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x817f7f7f, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x8181817f, 0x817f8181, 0x7f81817f, 0x81817f7f, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x81818181, 0x817f817f, 0x817f8181, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f817f81, 0x7f817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f81, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x7f81817f, 0x81818181, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x7f818181, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f817f81, 0x81818181, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f81, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x81817f81, 0x817f7f7f, 0x7f817f7f, 0x7f818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x817f817f, 0x7f81817f, 0x7f818181, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f818181, 0x7f81817f, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x7f817f81, 0x81818181, 0x81818181, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x7f817f7f, 0x817f8181, 0x7f81817f, 0x81818181, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x817f817f, 0x81818181, 0x817f7f81, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x81817f7f, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x8181817f, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x7f7f817f, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x8181817f, 0x81817f81, 0x817f817f, 0x81818181, 0x7f817f81, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x8181817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x7f817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f7f, 0x817f817f, 0x7f818181, 0x81818181, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x7f818181, 0x817f817f, 0x81818181, 0x7f7f7f81, 0x81818181, 0x81817f7f, 0x817f7f7f, 0x7f818181, 0x817f817f, 0x81817f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x81817f81, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f818181, 0x817f8181, 0x817f7f7f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f81817f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x817f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x81817f81, 0x817f7f7f, 0x81817f7f, 0x7f818181, 0x7f818181, 0x7f817f81, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f81817f, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x7f81817f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x8181817f, 0x817f7f7f, 0x81818181, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x8181817f, 0x8181817f, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, 0x7f817f81, 0x7f818181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x8181817f, 0x817f817f, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x81817f7f, 0x7f81817f, 0x817f7f7f, 0x817f817f, 0x817f7f81, 0x81818181, 0x7f818181, 0x81818181, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x7f817f81, 0x817f7f7f, 0x817f817f, 0x817f8181, 0x817f7f81, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x817f8181, 0x7f818181, 0x7f81817f, 0x817f8181, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x81818181, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f81, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x7f7f7f81, 0x7f818181, 0x7f81817f, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x81818181, 0x81817f81, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f81817f, 0x81817f81, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x817f7f7f, 0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f817f81, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f8181, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x817f8181, 0x817f8181, 0x817f817f, 0x81818181, 0x7f81817f, 0x7f818181, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x81817f81, 0x7f7f7f81, 0x7f817f81, 0x817f7f7f, 0x81817f81, 0x81817f81, 0x7f818181, 0x81817f81, 0x7f817f7f, 0x7f7f8181, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x817f7f7f, 0x81818181, 0x817f8181, 0x7f7f8181, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x81818181, 0x7f81817f, 0x7f818181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x7f7f7f81, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x81817f81, 0x8181817f, 0x7f7f8181, 0x8181817f, 0x8181817f, 0x7f81817f, 0x81818181, 0x8181817f, 0x7f7f8181, 0x81818181, 0x817f8181, 0x817f8181, 0x7f818181, 0x81818181, 0x817f817f, 0x817f7f81, 0x81817f81, 0x81817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x8181817f, 0x817f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x81817f7f, 0x7f818181, 0x81818181, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x81817f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x7f818181, 0x81818181, 0x7f817f81, 0x81817f7f, 0x8181817f, 0x817f8181, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f81, 0x7f818181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x817f8181, 0x817f817f, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f817f, 0x7f817f81, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x7f817f81, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x8181817f, 0x7f818181, 0x8181817f, 0x81818181, 0x817f8181, 0x81817f7f, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, 0x817f8181, 0x8181817f, 0x81817f81, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x817f7f7f, 0x81817f7f, 0x81818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x817f7f81, 0x7f817f7f, 0x81817f81, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f81, 0x7f817f7f, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f81, 0x817f8181, 0x81817f81, 0x8181817f, 0x7f7f8181, 0x7f7f8181, 0x817f7f7f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x817f817f, 0x817f8181, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x817f7f7f, 0x7f818181, 0x81817f7f, 0x7f818181, 0x81818181, 0x817f8181, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x8181817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f818181, 0x7f818181, 0x7f818181, 0x81817f7f, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, 0x81818181, 0x817f817f, 0x81817f81, 0x817f817f, 0x7f817f7f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x8181817f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x81818181, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x7f817f7f, 0x7f81817f, 0x7f818181, 0x7f7f8181, 0x81817f81, 0x81817f81, 0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x817f7f7f, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x7f7f817f, 0x7f817f81, 0x81817f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f81, 0x81817f7f, 0x7f81817f, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f81, 0x81817f81, 0x81818181, 0x817f8181, 0x81818181, 0x817f817f, 0x7f817f7f, 0x81818181, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f7f7f, 0x817f8181, 0x81817f81, 0x81817f81, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x817f7f81, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x7f7f817f, 0x817f817f +output0 = +0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0x9cae44b2, 0xb0bb6e72, 0xf10de0af, 0x512b983d, 0x319a51ec, 0xbf548277, 0x4e71789d, 0xc2645c23, 0x5fb92dfe, 0xd3f357f9, 0x661045e9, 0x75c0cbc6, 0x7a3f88f9, 0x338d9b23, 0x91cddcb1, 0x26653b44, 0x59456601, 0xc96175e8, 0x9eca4c28, 0xcf94eb4e, 0xf2de9546, 0x75a5437b, 0x6506329d, 0xdec978f8, 0x4fdc9af2, 0x0119faa3, 0x2547fa31, 0x1af33692, 0x1670fe27, 0x1640a17f, 0x4fa73a5b, 0x26e5696d, 0x0af49c1e, 0x0f986c62, 0x33edbcd7, 0x7d888c5a, 0x342f5ee7, 0x66cb8e8c, 0x07060a3a, 0x2188b6b9, 0xf3c51f6f, 0x6eb156a6, 0x73c51893, 0xded24f9c, 0x019af43a, 0xa5395f1a, 0xc283f30b, 0x7b995783, 0xa0001c41, 0x6d7b0601, 0x6bf0aacf, 0xb78d3d51, 0x7f48cf8f, 0x8b302f20, 0xbedc689e, 0xcfeee53a, 0x7b3a9cf6, 0x06507c78, 0xc3aaa56e, 0xba5dd9c9, 0x20c3d1f2, 0x2bb833e5, 0x0fe6cb7e, 0x54efb0d6, 0x9f35e88a, 0x2bb893a7, 0xc0799177, 0x192ad6c1, 0x0c2e00c7, 0x11da4a91, 0xa5771c29, 0xe4374dc7, 0x1104c1b9, 0xd4638875, 0xd8fd103a, 0x0ba0c54c, 0x5ebefe53, 0x7d5c04ff, 0x5203d5ac, 0x0ff8744e, 0x2f597bec, 0x8522aab8, 0x19e86b6c, 0xd70574ec, 0x4f8e0649, 0x4c23b0ac, 0x1327dd27, 0xe9a85ef6, 0x4383b49c, 0xf0ed4320, 0xc11157d9, 0x0ab70023, 0xa13a3a3a, 0x4745de72, 0x588c1bd5, 0x9b5bde57, 0x8afc0658, 0xdcc8d4dd, 0x2a17c0ce, 0x4586d708, 0x925726ff, 0xc1a3cb82, 0x6faa49fb, 0xefc0bec4, 0x6d62a3ac, 0x24ae9d74, 0x66deb6d7, 0xb2654337, 0x8b0fa52a, 0x837f3061, 0x3a61cc89, 0x9f85ea27, 0x9d28a3e2, 0xc6d6fc58, 0x9c14864e, 0xad100cb2, 0xd6d7d579, 0x804049ff, 0xf910bfd9, 0xbf853137, 0x185f3010, 0x29674e69, 0xf8526a44, 0xd8a153c3, 0xae166339, 0xe28d1dc3, 0xa89aa0e9, 0x2ce8dbcd, 0x9333368d, 0x8bcda1ad, 0xaa3bb15f, 0xc35f690d, 0xf522728e, 0xffeb9813, 0x06f8ae05, 0x4af99305, 0xa77fb46f, 0x1c92eb48, 0xb26c8bf0, 0x504e3b6c, 0xae44b2fd, 0xbb6e729c, 0x0de0afb0, 0x2b983df1, 0x9a51ec51, 0x54827731, 0x71789dbf, 0x645c234e, 0xb92dfec2, 0xf357f95f, 0x1045e9d3, 0xc0cbc666, 0x3f88f975, 0x8d9b237a, 0xcddcb133, 0x653b4491, 0x45660126, 0x6175e859, 0xca4c28c9, 0x94eb4e9e, 0xde9546cf, 0xa5437bf2, 0x06329d75, 0xc978f865, 0xdc9af2de, 0x19faa34f, 0x47fa3101, 0xf3369225, 0x70fe271a, 0x40a17f16, 0xa73a5b16, 0xe5696d4f, 0xf49c1e26, 0x986c620a, 0xedbcd70f, 0x888c5a33, 0x7d + +basegraph= +1 + +z_c= +384 + +n_cb= +9600 + +q_m= +2 + +n_filler= +0 + +e = +9332 + +rv_index = +0 + +code_block_mode = +1 + +iter_max= +20 + +expected_iter_count= +4 + +op_flags = +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_3_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_3_rv0_drv0.data new file mode 100755 index 0000000000..082d15e4c0 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_3_rv0_drv0.data @@ -0,0 +1,44 @@ +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f7f8181, 0x81817f81, 0x7f817f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x817f7f7f, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f7f, 0x8181817f, 0x81817f81, 0x7f7f817f, 0x8181817f, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x81817f7f, 0x81818181, 0x8181817f, 0x817f817f, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x81818181, 0x7f817f7f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x81818181, 0x817f8181, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f7f, 0x7f81817f, 0x81817f7f, 0x81817f81, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x81818181, 0x81817f81, 0x7f817f7f, 0x8181817f, 0x817f817f, 0x817f7f7f, 0x7f818181, 0x817f8181, 0x817f7f81, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x7f818181, 0x81817f81, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x7f7f7f7f, 0x7f818181, 0x81817f81, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x7f817f7f, 0x81818181, 0x817f8181, 0x81818181, 0x81817f81, 0x81817f81, 0x81818181, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f81817f, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x8181817f, 0x817f7f81, 0x817f7f81, 0x7f818181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f81, 0x81817f7f, 0x8181817f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x7f7f817f, 0x81817f81, 0x817f8181, 0x81817f7f, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x7f817f81, 0x7f818181, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x81817f81, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x817f8181, 0x7f818181, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x81818181, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x817f8181, 0x7f818181, 0x817f7f7f, 0x7f81817f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x81817f81, 0x7f7f8181, 0x81818181, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x8181817f, 0x817f817f, 0x817f817f, 0x7f7f7f7f, 0x81817f7f, 0x81817f7f, 0x81818181, 0x8181817f, 0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x817f7f81, 0x81817f7f, 0x7f7f817f, 0x81818181, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x817f817f, 0x7f7f7f81, 0x81817f81, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, 0x81817f7f, 0x817f817f, 0x7f817f81, 0x817f817f, 0x7f7f817f, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x81817f81, 0x7f817f7f, 0x81818181, 0x8181817f, 0x817f817f, 0x817f7f81, 0x7f817f7f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x8181817f, 0x8181817f, 0x81817f81, 0x7f7f7f81, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f817f, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x81817f81, 0x8181817f, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x81817f81, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x817f817f, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x81818181, 0x7f7f8181, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x8181817f, 0x7f817f81, 0x817f817f, 0x817f8181, 0x7f818181, 0x7f81817f, 0x7f818181, 0x7f7f8181, 0x8181817f, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x81817f7f, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f81, 0x81817f7f, 0x7f817f7f, 0x81817f7f, 0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x817f817f, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x81818181, 0x81818181, 0x7f817f7f, 0x81818181, 0x817f8181, 0x81817f7f, 0x7f817f7f, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x817f8181, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, 0x817f8181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x817f8181, 0x7f818181, 0x81817f7f, 0x81818181, 0x7f81817f, 0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x8181817f, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x817f817f, 0x7f818181, 0x7f7f8181, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f81817f, 0x8181817f, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x817f8181, 0x817f817f, 0x817f817f, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x81817f7f, 0x8181817f, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x7f81817f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x7f81817f, 0x8181817f, 0x81817f81, 0x81818181, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f817f7f, 0x7f817f81, 0x7f7f7f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x817f817f, 0x7f7f8181, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, 0x817f7f81, 0x817f7f81, 0x817f8181, 0x817f7f81, 0x7f81817f, 0x817f8181, 0x7f818181, 0x7f818181, 0x81818181, 0x817f817f, 0x7f817f7f, 0x7f7f817f, 0x817f8181, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x7f81817f, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x81817f7f, 0x81818181, 0x8181817f, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x7f818181, 0x8181817f, 0x817f8181, 0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x817f817f, 0x81818181, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x81818181, 0x817f8181, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x7f81817f, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x81817f7f, 0x7f7f8181, 0x81817f81, 0x817f817f, 0x817f8181, 0x7f7f817f, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x817f817f, 0x7f818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f817f, 0x7f7f8181, 0x81818181, 0x81817f7f, 0x817f8181, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x81817f7f, 0x81818181, 0x7f818181, 0x81817f81, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x81817f81, 0x7f7f817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x817f817f, 0x817f7f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x81817f7f, 0x7f817f7f, 0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x81817f7f, 0x817f8181, 0x7f818181, 0x7f7f817f, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x817f7f81, 0x7f7f7f7f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x817f817f, 0x817f8181, 0x7f81817f, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x81817f7f, 0x81818181, 0x817f7f81, 0x81817f7f, 0x7f818181, 0x7f817f7f, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x7f81817f, 0x7f817f7f, 0x81818181, 0x81818181, 0x81817f7f, 0x81817f7f, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x7f817f7f, 0x8181817f, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x7f817f7f, 0x817f8181, 0x7f817f81, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x7f817f7f, 0x81818181, 0x817f817f, 0x81818181, 0x817f817f, 0x7f81817f, 0x7f7f8181, 0x817f817f, 0x8181817f, 0x7f81817f, 0x817f7f81, 0x81817f81, 0x81818181, 0x7f818181, 0x817f817f, 0x8181817f, 0x817f817f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x7f7f8181, 0x817f8181, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x81817f7f, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x817f817f, 0x81818181, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x81817f7f, 0x8181817f, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x817f8181, 0x817f817f, 0x7f7f817f, 0x81818181, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x8181817f, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f7f, 0x817f7f81, 0x817f7f81, 0x817f8181, 0x817f7f81, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x7f818181, 0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x817f7f81, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81818181, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x81818181, 0x817f7f81, 0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x817f8181, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x8181817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x8181817f, 0x81817f81, 0x7f818181, 0x817f7f81, 0x81817f81, 0x817f817f, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f817f81, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x8181817f, 0x7f818181, 0x81818181, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f7f7f81, 0x7f7f817f, 0x7f7f8181, 0x81817f81, 0x81818181, 0x8181817f, 0x7f81817f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x7f817f81, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f817f81, 0x7f817f81, 0x81818181, 0x81818181, 0x7f818181, 0x7f7f817f, 0x7f7f7f7f, 0x8181817f, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f818181, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x8181817f, 0x817f8181, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f817f7f, 0x81817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f7f8181, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f7f, 0x81817f81, 0x7f7f7f81, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x817f7f7f, 0x817f8181, 0x817f817f, 0x7f817f7f, 0x7f818181, 0x817f7f7f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x817f7f7f, 0x7f7f8181, 0x817f817f, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f818181, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x817f817f, 0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x7f7f817f, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f818181, 0x7f817f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x817f7f7f, 0x817f8181, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x7f818181, 0x817f7f7f, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x81818181, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x81817f7f, 0x81817f81, 0x7f817f81, 0x7f7f817f, 0x8181817f, 0x817f817f, 0x7f817f81, 0x7f818181, 0x8181817f, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x7f817f7f, 0x817f7f7f, 0x8181817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x7f817f7f, 0x817f7f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, 0x817f7f7f, 0x7f817f7f, 0x81817f7f, 0x81818181, 0x81817f7f, 0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x81818181, 0x81818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x81817f81, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x7f7f817f, 0x81817f7f, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x81817f81, 0x817f8181, 0x817f817f, 0x817f8181, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x7f818181, 0x81818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x8181817f, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x81818181, 0x81817f81, 0x81817f7f, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f81817f, 0x7f81817f, 0x817f817f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f81817f, 0x817f8181, 0x81817f7f, 0x817f7f81, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x817f7f81, 0x81817f81, 0x817f817f, 0x817f8181, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f7f, 0x81817f81, 0x7f81817f, 0x7f817f7f, 0x7f818181, 0x7f818181, 0x817f8181, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x7f817f81, 0x81817f81, 0x7f818181, 0x8181817f, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x817f817f, 0x8181817f, 0x81818181, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x81818181, 0x817f817f, 0x81817f81, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x817f817f, 0x8181817f, 0x7f7f817f, 0x817f817f, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x7f7f817f, 0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x817f8181, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f817f, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f81, 0x7f7f8181, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x817f8181, 0x7f818181, 0x7f7f7f81, 0x8181817f, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x817f817f, 0x81818181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f7f81, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x81817f81, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f81817f, 0x8181817f, 0x81817f81, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x7f818181, 0x817f7f7f, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x81818181, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x81817f81, 0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f + +output0 = +0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0x9cae44b2, 0xb0bb6e72, 0xf10de0af, 0x512b983d, 0x319a51ec, 0xbf548277, 0x4e71789d, 0xc2645c23, 0x5fb92dfe, 0xd3f357f9, 0x661045e9, 0x75c0cbc6, 0x7a3f88f9, 0x338d9b23, 0x91cddcb1, 0x26653b44, 0x59456601, 0xc96175e8, 0x9eca4c28, 0xcf94eb4e, 0xf2de9546, 0x75a5437b, 0x6506329d, 0xdec978f8, 0x4fdc9af2, 0x0119faa3, 0x2547fa31, 0x1af33692, 0x1670fe27, 0x1640a17f, 0x4fa73a5b, 0x26e5696d, 0x0af49c1e, 0x0f986c62, 0x33edbcd7, 0x7d888c5a, 0x342f5ee7, 0x66cb8e8c, 0x07060a3a, 0x2188b6b9, 0xf3c51f6f, 0x6eb156a6, 0x73c51893, 0xded24f9c, 0x019af43a, 0xa5395f1a, 0xc283f30b, 0x7b995783, 0xa0001c41, 0x6d7b0601, 0x6bf0aacf, 0xb78d3d51, 0x7f48cf8f, 0x8b302f20, 0xbedc689e, 0xcfeee53a, 0x7b3a9cf6, 0x06507c78, 0xc3aaa56e, 0xba5dd9c9, 0x20c3d1f2, 0x2bb833e5, 0x0fe6cb7e, 0x54efb0d6, 0x9f35e88a, 0x2bb893a7, 0xc0799177, 0x192ad6c1, 0x0c2e00c7, 0x11da4a91, 0xa5771c29, 0xe4374dc7, 0x1104c1b9, 0xd4638875, 0xd8fd103a, 0x0ba0c54c, 0x5ebefe53, 0x7d5c04ff, 0x5203d5ac, 0x0ff8744e, 0x2f597bec, 0x8522aab8, 0x19e86b6c, 0xd70574ec, 0x4f8e0649, 0x4c23b0ac, 0x1327dd27, 0xe9a85ef6, 0x9c + +basegraph= +1 + +z_c= +256 + +n_cb= +6400 + +q_m= +2 + +n_filler= +0 + +e = +6224 + +rv_index = +0 + +code_block_mode = +1 + +iter_max= +63 + +expected_iter_count= +4 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_4_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_4_rv0_drv0.data new file mode 100755 index 0000000000..23578c5650 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_4_rv0_drv0.data @@ -0,0 +1,44 @@ +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x7f7f7f81, 0x8181817f, 0x7f81817f, 0x7f818181, 0x817f7f7f, 0x8181817f, 0x8181817f, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f7f8181, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x7f818181, 0x81818181, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f81, 0x8181817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x817f7f81, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x7f7f7f7f, 0x8181817f, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x81817f81, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x7f817f7f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f7f, 0x81817f81, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x817f7f81, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x817f817f, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x817f8181, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x81818181, 0x8181817f, 0x8181817f, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x817f8181, 0x817f817f, 0x8181817f, 0x8181817f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x7f81817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x7f818181, 0x81818181, 0x8181817f, 0x817f817f, 0x7f7f8181, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x81817f81, 0x7f817f7f, 0x81818181, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x817f8181, 0x7f818181, 0x817f7f7f, 0x7f817f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x7f818181, 0x8181817f, 0x8181817f, 0x7f817f81, 0x81818181, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f7f81, 0x81817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x817f817f, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f818181, 0x817f7f81, 0x7f818181, 0x81818181, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x81817f81, 0x7f818181, 0x817f7f7f, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x7f817f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x81817f81, 0x7f7f8181, 0x7f817f7f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f818181, 0x7f7f817f, 0x7f7f8181, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f7f81, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x7f818181, 0x7f817f7f, 0x81817f7f, 0x817f7f7f, 0x817f8181, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x817f7f7f, 0x7f818181, 0x7f7f817f, 0x7f7f817f, 0x7f81817f, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f7f7f81, 0x817f7f7f, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x817f7f81, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f817f, 0x81818181, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x81817f7f, 0x81817f81, 0x817f8181, 0x81818181, 0x817f7f81, 0x81818181, 0x8181817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x81817f7f, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x817f8181, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x81818181, 0x7f7f7f81, 0x7f81817f, 0x817f8181, 0x817f8181, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x81818181, 0x81817f7f, 0x81817f81, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f817f7f, 0x7f7f8181, 0x817f8181, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x7f818181, 0x81817f81, 0x7f81817f, 0x817f817f, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f818181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f817f81, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x81818181, 0x7f7f817f, 0x817f8181, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x817f817f, 0x7f817f81, 0x7f818181, 0x7f817f7f, 0x81817f7f, 0x81818181, 0x7f81817f, 0x817f7f81, 0x81818181, 0x817f8181, 0x817f8181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x817f7f81, 0x81817f7f, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81817f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f817f7f, 0x7f817f7f, 0x8181817f, 0x81818181, 0x7f817f7f, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x817f7f81, 0x817f7f81, 0x817f7f7f, 0x81818181, 0x7f818181, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x7f817f7f, 0x81818181, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x8181817f, 0x7f818181, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x7f818181, 0x7f818181, 0x8181817f, 0x817f817f, 0x7f817f81, 0x7f7f7f81, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x8181817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f817f7f, 0x7f818181, 0x7f7f7f81, 0x7f818181, 0x8181817f, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x81817f7f, 0x817f7f81, 0x81818181, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x817f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x7f817f81, 0x81817f81, 0x7f81817f, 0x81817f7f, 0x8181817f, 0x8181817f, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x7f818181, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x81817f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x7f817f7f, 0x81817f7f, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f81, 0x7f7f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x817f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f817f7f, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x81817f81, 0x7f7f7f7f, 0x81818181, 0x7f817f81, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x7f7f8181, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f81817f, 0x817f8181, 0x81817f7f, 0x817f817f, 0x7f7f8181, 0x81817f81, 0x7f817f81, 0x8181817f, 0x7f817f7f, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x817f817f, 0x817f8181, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x8181817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x81817f7f, 0x81818181, 0x8181817f, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x7f817f81, 0x8181817f, 0x7f81817f, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x81818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x81817f81, 0x7f818181, 0x81817f7f, 0x817f7f81, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x817f817f, 0x817f817f, 0x81817f7f, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x7f817f81, 0x7f81817f, 0x817f8181, 0x7f81817f, 0x7f817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f81817f, 0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x7f81817f, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x8181817f, 0x7f818181, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x817f817f, 0x81818181, 0x7f817f7f, 0x81817f81, 0x7f7f7f7f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x817f7f7f, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x81818181, 0x817f8181, 0x7f81817f, 0x81818181, 0x7f818181, 0x81817f81, 0x8181817f, 0x817f817f, 0x7f7f8181, 0x81817f7f, 0x7f7f817f, 0x817f817f, 0x7f81817f, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x7f817f81, 0x7f7f817f, 0x7f7f8181, 0x7f818181, 0x817f8181, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x7f81817f, 0x8181817f, 0x7f817f81, 0x7f818181, 0x817f817f, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x81817f7f, 0x81818181, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x817f8181, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f817f, 0x7f81817f, 0x81817f81, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x817f7f81, 0x7f7f817f, 0x7f817f81, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x7f817f81, 0x817f817f, 0x7f81817f, 0x817f8181, 0x81817f81, 0x817f817f, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x817f8181, 0x7f817f81, 0x81817f7f, 0x817f7f81, 0x817f8181, 0x817f8181, 0x81817f7f, 0x817f7f7f, 0x817f7f7f, 0x7f818181, 0x817f817f, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f81817f, 0x7f818181, 0x81818181, 0x7f817f7f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x81818181, 0x817f8181, 0x7f81817f, 0x81817f81, 0x7f818181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x7f818181, 0x817f8181, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x7f817f7f, 0x7f818181, 0x7f7f7f7f, 0x817f8181, 0x817f7f7f, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x817f817f, 0x7f817f81, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x817f7f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x81818181, 0x7f81817f, 0x81818181, 0x7f81817f, 0x81818181, 0x817f7f7f, 0x81817f7f, 0x81818181, 0x81817f7f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x81817f81, 0x7f81817f, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f81817f, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f81817f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x7f81817f, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x7f81817f, 0x817f7f81, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x81817f7f, 0x817f7f81, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x8181817f, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f7f, 0x817f8181, 0x7f817f81, 0x81818181, 0x817f7f81, 0x817f7f81, 0x81818181, 0x817f8181, 0x81817f7f, 0x81817f81, 0x7f7f7f81, 0x817f817f, 0x817f7f7f, 0x7f81817f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x81818181, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x817f7f81, 0x817f7f81, 0x817f817f, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x81818181, 0x7f7f8181, 0x8181817f, 0x817f8181, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x7f818181, 0x7f818181, 0x817f8181, 0x817f817f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f817f81, 0x817f817f, 0x7f817f7f, 0x8181817f, 0x81817f7f, 0x817f7f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x81818181, 0x81817f81, 0x81817f7f, 0x81817f81, 0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f7f7f, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x8181817f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x7f817f7f, 0x7f81817f, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x7f7f817f, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x81818181, 0x7f7f8181, 0x7f81817f, 0x7f81817f, 0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x81817f7f, 0x7f7f8181, 0x81818181, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f81817f, 0x81818181, 0x81817f81, 0x7f818181, 0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x7f818181, 0x8181817f, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x817f817f, 0x817f8181, 0x81817f7f, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f817f7f, 0x7f817f7f, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f7f7f, 0x7f818181, 0x7f7f7f7f, 0x817f8181, 0x817f7f7f, 0x817f817f, 0x817f817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, 0x7f7f817f, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x817f817f, 0x8181817f, 0x81817f7f, 0x81817f81, 0x81818181, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, 0x817f7f81, 0x7f818181, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x81817f7f, 0x8181817f, 0x7f7f8181, 0x8181817f, 0x7f81817f, 0x7f818181, 0x8181817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x817f7f81, 0x81817f7f, 0x817f817f, 0x7f818181, 0x817f7f7f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x7f818181, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x81818181, 0x8181817f, 0x817f8181, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x81817f81, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f817f81, 0x817f817f, 0x7f818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x7f81817f, 0x81817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f817f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x817f8181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x817f7f81, 0x81818181, 0x7f7f817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x81817f81, 0x817f8181, 0x8181817f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x81817f81, 0x7f818181 + +output0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xf1f312fe, 0x8abcb1ed, 0xf3550fd6, 0x8060deb6, 0x82380005, 0xc1ea99de, 0xd0cfc143, 0x58fa9ca5, 0x5c2f5980, 0x39f24b7b, 0xc918a3ce, 0x656a8d76, 0xf6f8a3cf, 0x9d6d1184, 0x5c5060e0, 0x3171d366, 0xe77af42c, 0xf24290f4, 0x1df2f5e8, 0x56c1a6eb, 0x3be35b07, 0xdaee3c1b, 0x65dfcb90, 0x8ba0ede7, 0x311e72b1, 0x772ffa8a, 0xd863ce1d, 0x8974177a, 0x87d85875, 0x927596d1, 0x0481e7fa, 0x9768d335, 0x90a5f29b, 0x13e11b45, 0x73cbac15, 0x9301bfde, 0xf3026564, 0x794a8697, 0x552e6f6b, 0x2880a6cd, 0xe780e65f, 0xf68c45fe, 0x254e9ac4, 0x8509c8f8, 0xfc + +basegraph= +1 + +z_c= +128 + +n_cb= +8448 + +q_m= +2 + +n_filler= +0 + +e= +5632 + +rv_index= +0 + +code_block_mode= +1 + +iter_max= +20 + +expected_iter_count= +4 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + +expected_status= +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_5_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_5_rv0_drv0.data new file mode 100755 index 0000000000..5dfb56fbe9 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_5_rv0_drv0.data @@ -0,0 +1,44 @@ +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x8181817f, 0x81817f7f, 0x817f817f, 0x7f7f817f, 0x81817f81, 0x817f7f81, 0x81818181, 0x7f817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f817f, 0x8181817f, 0x817f817f, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x81818181, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x817f817f, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x817f7f81, 0x81817f7f, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x817f817f, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x81818181, 0x7f817f81, 0x817f7f7f, 0x817f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f817f, 0x7f81817f, 0x817f7f7f, 0x81818181, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x817f817f, 0x817f8181, 0x81817f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x8181817f, 0x8181817f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x81817f81, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x81818181, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f7f817f, 0x81818181, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x7f81817f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x817f7f81, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f8181, 0x8181817f, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x81817f81, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f81817f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x8181817f, 0x7f81817f, 0x817f7f7f, 0x8181817f, 0x817f817f, 0x7f817f7f, 0x8181817f, 0x81817f7f, 0x81817f7f, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x81817f81, 0x8181817f, 0x81818181, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x8181817f, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f7f, 0x81817f7f, 0x7f817f81, 0x7f818181, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f7f, 0x7f818181, 0x8181817f, 0x81817f7f, 0x817f8181, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x81818181, 0x81817f81, 0x81818181, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x81817f81, 0x81817f7f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f81, 0x81817f81, 0x817f7f81, 0x81817f81, 0x81817f81, 0x81817f81, 0x817f7f7f, 0x817f817f, 0x817f7f81, 0x817f7f7f, 0x8181817f, 0x81817f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x817f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x81817f7f, 0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x81818181, 0x817f8181, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x7f7f7f7f, 0x7f7f8181, 0x81817f81, 0x817f8181, 0x817f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x7f817f81, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x7f81817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f818181, 0x7f7f817f, 0x817f817f, 0x81817f7f, 0x7f817f81, 0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f7f7f81, 0x817f8181, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x817f7f7f, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x7f817f81, 0x7f7f8181, 0x7f818181, 0x7f81817f, 0x7f817f7f, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x7f817f81, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x817f8181, 0x81817f7f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x817f8181, 0x7f7f8181, 0x7f818181, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x7f817f81, 0x7f81817f, 0x81817f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x817f8181, 0x81818181, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f817f, 0x7f7f817f, 0x81818181, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x7f7f8181, 0x81818181, 0x7f818181, 0x7f817f81, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f8181, 0x8181817f, 0x81817f81, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x7f817f81, 0x7f81817f, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f818181, 0x8181817f, 0x81817f7f, 0x817f817f, 0x817f817f, 0x8181817f, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x817f817f, 0x817f817f, 0x8181817f, 0x7f7f7f7f, 0x81818181, 0x817f817f, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x7f817f7f, 0x817f8181, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x817f7f81, 0x81817f81, 0x817f7f81, 0x8181817f, 0x817f817f, 0x7f817f81, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x7f81817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x817f7f81, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x81817f7f, 0x7f817f81, 0x7f7f7f81 + +output0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xfe + +basegraph= +1 + +z_c= +64 + +n_cb= +4224 + +q_m= +2 + +n_filler= +0 + +e= +2240 + +rv_index= +0 + +code_block_mode= +1 + +iter_max= +63 + +expected_iter_count= +4 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + +expected_status= +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_6_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_6_rv0_drv0.data new file mode 100755 index 0000000000..e9867645ec --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_6_rv0_drv0.data @@ -0,0 +1,44 @@ +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x81818181, 0x7f818181, 0x817f7f7f, 0x817f817f, 0x817f817f, 0x7f81817f, 0x81818181, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x7f817f81, 0x7f7f7f81, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x7f81817f, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x81817f81, 0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f818181, 0x7f7f7f7f, 0x81818181, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x7f7f8181, 0x817f817f, 0x81818181, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x81817f81, 0x81818181, 0x81817f81, 0x81818181, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x7f817f81, 0x81818181, 0x81818181, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x817f7f81, 0x817f7f7f, 0x8181817f, 0x817f7f81, 0x81817f81, 0x817f7f81, 0x81817f81, 0x7f818181, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x817f817f, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x817f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x81817f7f, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f817f81, 0x817f817f, 0x817f7f81, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x81818181, 0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x8181817f, 0x81818181, 0x817f8181, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x81818181, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f81, 0x817f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x817f817f, 0x81817f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x817f8181, 0x81817f7f, 0x817f8181, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x7f7f8181, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x817f7f81, 0x817f7f7f, 0x817f7f81, 0x8181817f, 0x7f818181, 0x817f8181, 0x81817f81, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f817f7f, 0x817f7f81, 0x7f7f8181, 0x81818181, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x81818181, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x81817f81, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x7f818181, 0x7f818181, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x81817f7f, 0x7f817f81, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x7f818181, 0x8181817f, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f81, 0x7f81817f, 0x81818181, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x81818181, 0x817f7f81, 0x817f817f, 0x7f7f8181, 0x81818181, 0x8181817f, 0x7f7f817f, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x817f817f, 0x81817f81, 0x7f818181, 0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, 0x7f81817f, 0x7f817f7f, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x81818181, 0x7f7f8181, 0x81818181, 0x8181817f, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f8181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x81818181, 0x7f817f81, 0x81818181, 0x7f818181, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x81817f81, 0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x817f7f7f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x7f817f81, 0x817f8181, 0x81817f81, 0x817f817f, 0x81817f7f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x8181817f, 0x81818181, 0x7f817f7f, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x817f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x817f7f7f, 0x7f818181, 0x7f817f81, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x7f817f81, 0x7f7f7f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x7f817f81, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x81818181, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x7f7f8181, 0x817f817f, 0x7f7f7f7f, 0x81817f81, 0x81818181, 0x8181817f, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f817f81, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x81818181, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x81818181, 0x7f7f8181, 0x7f81817f, 0x7f7f8181, 0x7f7f817f, 0x817f817f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x817f817f, 0x817f7f7f, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x7f7f8181, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f8181, 0x7f818181, 0x817f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f818181, 0x817f7f7f, 0x81817f81, 0x81818181, 0x81817f81, 0x7f817f7f, 0x817f817f, 0x817f817f, 0x817f7f81, 0x817f8181, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x7f7f817f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f818181, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x81817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x817f8181, 0x7f817f7f, 0x7f7f7f81, 0x8181817f, 0x8181817f, 0x7f818181, 0x817f817f, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x817f817f, 0x81818181, 0x81818181, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f81817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x817f8181, 0x8181817f, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x7f81817f, 0x81817f81, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x7f817f81, 0x817f817f, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x7f81817f, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x8181817f, 0x81817f81, 0x7f817f81, 0x7f818181, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x817f817f, 0x817f817f, 0x817f8181, 0x7f818181, 0x7f818181, 0x7f7f817f, 0x817f8181, 0x7f818181, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x81818181, 0x7f818181, 0x7f81817f, 0x7f817f7f, 0x7f817f81, 0x7f817f81, 0x817f817f, 0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f818181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x81818181, 0x7f7f7f7f, 0x817f817f, 0x81817f7f, 0x8181817f, 0x8181817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x817f8181, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x7f818181, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f818181, 0x817f7f81, 0x81818181, 0x7f7f7f81, 0x7f818181, 0x8181817f, 0x817f8181, 0x7f7f8181, 0x7f7f7f81, 0x7f817f7f, 0x817f817f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x81818181, 0x81817f81, 0x7f81817f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x81817f7f + +output0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xf1f312fe, 0x8abcb1ed, 0xf3550fd6, 0x8060deb6, 0x82380005, 0xc1ea99de, 0xd0cfc143, 0x58fa9ca5, 0x5c2f5980, 0x39f24b7b, 0xc918a3ce, 0x656a8d76, 0xf6f8a3cf, 0x9d6d1184, 0x5c5060e0, 0x3171d366, 0xe77af42c, 0xf24290f4, 0x1df2f5e8, 0x56c1a6eb, 0x3be35b07, 0xdaee3c1b, 0x65dfcb90, 0x8ba0ede7, 0x311e72b1, 0x772ffa8a, 0xd863ce1d, 0x8974177a, 0x87d85875, 0x927596d1, 0x0481e7fa, 0x9768d335, 0x90a5f29b, 0x13e11b45, 0x73cbac15, 0x9301bfde, 0x64 + +basegraph= +2 + +z_c= +256 + +n_cb= +12800 + +q_m= +2 + +n_filler= +0 + +e= +3200 + +rv_index= +0 + +code_block_mode= +1 + +iter_max= +63 + +expected_iter_count= +4 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + +expected_status= +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_7_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_7_rv0_drv0.data new file mode 100755 index 0000000000..24568bd062 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_7_rv0_drv0.data @@ -0,0 +1,45 @@ + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x7f7f7f81, 0x81817f7f, 0x7f817f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x81818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f81, 0x81818181, 0x817f817f, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f818181, 0x8181817f, 0x8181817f, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f7f8181, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x8181817f, 0x8181817f, 0x7f7f8181, 0x817f817f, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x817f8181, 0x817f8181, 0x81817f81, 0x817f8181, 0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f8181, 0x81818181, 0x817f7f81, 0x817f7f7f, 0x81817f81, 0x8181817f, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x81817f7f, 0x7f817f7f, 0x81818181, 0x81817f81, 0x81817f7f, 0x7f81817f, 0x817f7f81, 0x7f7f817f, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x817f817f, 0x7f81817f, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x817f7f7f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x81818181, 0x7f817f7f, 0x7f818181, 0x81817f81, 0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f7f7f, 0x7f818181, 0x81817f7f, 0x81818181, 0x81817f81, 0x7f818181, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x7f7f817f, 0x817f7f7f, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x7f817f81, 0x7f818181, 0x7f817f81, 0x7f818181, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x817f8181, 0x8181817f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f817f81, 0x7f817f81, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x8181817f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x817f7f81, 0x817f7f7f, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x7f7f7f81, 0x817f8181, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x81818181, 0x817f7f81, 0x7f817f7f, 0x7f818181, 0x7f817f7f, 0x817f817f, 0x817f8181, 0x8181817f, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x81818181, 0x817f7f81, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x7f818181, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x81817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f81817f, 0x817f7f7f, 0x81817f81, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x7f7f7f81, 0x817f7f7f, 0x81817f7f, 0x7f817f7f, 0x7f81817f, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x817f817f, 0x81818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x8181817f, 0x81817f81, 0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x817f7f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x8181817f, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x7f817f81, 0x81817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f8181, 0x7f818181, 0x7f817f81, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x81817f7f, 0x81818181, 0x7f818181, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, 0x81817f7f, 0x7f817f81, 0x7f817f81, 0x7f7f7f81, 0x81817f81, 0x81817f7f, 0x8181817f, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x817f7f7f, 0x7f818181, 0x7f7f817f, 0x7f7f817f, 0x81817f81, 0x817f8181, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x8181817f, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x7f817f7f, 0x7f81817f, 0x7f81817f, 0x817f8181, 0x817f7f81, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f81817f, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f818181, 0x7f7f7f81, 0x7f7f7f81, 0x817f7f81, 0x817f817f, 0x81818181, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f817f81, 0x7f817f7f, 0x7f7f817f, 0x7f7f817f, 0x817f817f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x817f817f, 0x817f8181, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f7f81, 0x81817f7f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x7f81817f, 0x81818181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x81818181, 0x7f818181, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f7f8181, 0x7f818181, 0x81817f81, 0x817f7f81, 0x817f7f81, 0x81817f81, 0x817f8181, 0x817f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x81817f81, 0x81817f7f, 0x817f8181, 0x7f7f8181, 0x7f7f817f, 0x7f7f8181, 0x817f7f7f, 0x7f818181, 0x81817f7f, 0x817f8181, 0x817f7f7f, 0x81817f7f, 0x8181817f, 0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f7f81, 0x8181817f, 0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x817f7f7f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x7f817f81, 0x7f7f7f81, 0x817f7f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x81818181, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x817f8181 + +output0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60 + +basegraph= +2 + +z_c= +128 + +n_cb= +6400 + +q_m= +2 + +n_filler= +8 + +e = +2624 + +rv_index = +0 + +code_block_mode = +1 + +iter_max= +63 + +expected_iter_count= +4 + +op_flags = +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_8_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_8_rv0_drv0.data new file mode 100755 index 0000000000..eb8de69067 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_8_rv0_drv0.data @@ -0,0 +1,45 @@ + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x81817f81, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x817f7f81, 0x7f7f7f81, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f7f7f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f7f7f7f, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x7f7f817f, 0x81817f7f, 0x81817f7f, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x7f818181, 0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x817f817f, 0x81817f7f, 0x817f817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f81, 0x81817f81, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f818181, 0x8181817f, 0x7f818181, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x7f818181, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x817f7f7f, 0x817f817f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f81, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x8181817f, 0x81817f81, 0x7f7f7f7f, 0x7f81817f, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x8181817f, 0x817f8181, 0x81817f81, 0x81817f81, 0x81818181, 0x7f7f817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x817f817f, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x7f7f7f81, 0x7f817f81, 0x7f7f7f81, 0x7f817f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x81817f81, 0x81817f81, 0x81817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x817f8181, 0x817f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f81817f, 0x7f7f7f81, 0x81818181, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x817f817f, 0x817f7f81, 0x817f8181, 0x81817f7f, 0x7f818181, 0x817f7f7f, 0x817f7f81, 0x81818181, 0x7f81817f, 0x7f81817f, 0x81817f7f, 0x81817f7f, 0x7f7f8181, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x81817f7f, 0x8181817f, 0x81818181, 0x7f81817f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f7f817f, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x7f81817f, 0x7f818181, 0x81818181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f7f7f, 0x7f81817f, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f7f817f, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x8181817f, 0x817f8181, 0x817f8181, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x7f7f8181, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x7f817f81, 0x7f7f7f81, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x7f818181, 0x81817f7f, 0x81817f7f, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x817f7f81, 0x7f818181, 0x81818181, 0x7f817f7f, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x8181817f, 0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f818181, 0x8181817f, 0x817f7f7f, 0x817f8181, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x7f817f81, 0x817f817f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x7f7f7f7f, 0x817f8181, 0x7f817f81, 0x817f817f, 0x8181817f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x7f818181, 0x81817f81, 0x81817f7f, 0x7f818181, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f7f817f, 0x817f7f81, 0x81817f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x7f817f7f, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x817f817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x81818181 + +output0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xc8 + +basegraph= +2 + +z_c= +32 + +n_cb= +1600 + +q_m= +2 + +n_filler= +0 + +e= +1600 + +rv_index= +0 + +code_block_mode= +1 + +iter_max= +63 + +expected_iter_count= +4 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + +expected_status= +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_1_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_1_rv0.data new file mode 100755 index 0000000000..8377b7da76 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_1_rv0.data @@ -0,0 +1,38 @@ +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0xb2 + +output0 = +0xd0cb4a0f, 0xad2b9e58, 0x7cbd8ee4, 0x69b3ea44, 0xeeac54df, 0xc9c02427, 0x774a91f9, 0x7a9cfbd2, 0xc0de1a96, 0x6b3a8b1c, 0x822e47d2, 0x46a001f0, 0xd9493df3, 0x7bb5d313, 0xb85d5514, 0x4282b041, 0xcde3d920, 0xd7080357, 0x2f3fa543, 0x6fb16289, 0x2f0aa375, 0x83df31a8, 0x304116e0, 0x263f1656, 0x1e3890c1, 0xdd0e31e6, 0xb3af5042, 0xf121c4a7, 0x14c927e0, 0x4e368b05, 0xa98ff8fe, 0xfefbe873, 0xe4637404, 0xe4cce32a, 0x5b5172e2, 0xac605c67, 0x85fb607a, 0xe1adaf14, 0xc673ce2f, 0xc0dbfa09, 0x4d5d99cd, 0xe46d2781, 0x94f98a6c, 0xf0fd9343, 0x3754602f, 0xd7242ea6, 0xe9852911, 0xf5cdfe60, 0x4e1900df, 0x2a48f574, 0x6b19a2b6, 0x38eb5f07, 0xc5ddbc66, 0xe4d797b8, 0x5ec0309f, 0x010c4b65, 0xe2a85f70, 0xc7f214ef, 0x07523e26, 0x1b5c12e5, 0x6fdb5500, 0xcd0a8d04, 0x991ecc5e, 0x1d7f56c8, 0x3760b9e2, 0x67e67b31, 0xb5c1de47, 0x7b27c063, 0x8e62edf3, 0x9062db82, 0xf0ba6801, 0xe2f689d4, 0x81f430f3, 0xbdb1e5b7, 0x2f1250b5, 0x9554c91d, 0x68857ff7, 0xefba6225, 0x7e723d48, 0x19854d96, 0x5f889ef4, 0x9abe12b5, 0x98dd9261, 0x24f1aa29, 0x55a0ed8b, 0xb0d8aba8, 0x0c284a99, 0x313eb738, 0xe988a692, 0x6ff36048, 0xfdf76d8b, 0x3f0e282d, 0x67285a34, 0x984d4dca, 0xef506288, 0x462ddbd1, 0xba6a415e, 0xc0 + +basegraph= +1 + +z_c= +128 + +n_cb= +3200 + +q_m= +2 + +n_filler= +0 + +e = +3112 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_2_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_2_rv0.data new file mode 100755 index 0000000000..69b18b7f0f --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_2_rv0.data @@ -0,0 +1,38 @@ +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0x9cae44b2, 0xb0bb6e72, 0xf10de0af, 0x512b983d, 0x319a51ec, 0xbf548277, 0x4e71789d, 0xc2645c23, 0x5fb92dfe, 0xd3f357f9, 0x661045e9, 0x75c0cbc6, 0x7a3f88f9, 0x338d9b23, 0x91cddcb1, 0x26653b44, 0x59456601, 0xc96175e8, 0x9eca4c28, 0xcf94eb4e, 0xf2de9546, 0x75a5437b, 0x6506329d, 0xdec978f8, 0x4fdc9af2, 0x0119faa3, 0x2547fa31, 0x1af33692, 0x1670fe27, 0x1640a17f, 0x4fa73a5b, 0x26e5696d, 0x0af49c1e, 0x0f986c62, 0x33edbcd7, 0x7d888c5a, 0x342f5ee7, 0x66cb8e8c, 0x07060a3a, 0x2188b6b9, 0xf3c51f6f, 0x6eb156a6, 0x73c51893, 0xded24f9c, 0x019af43a, 0xa5395f1a, 0xc283f30b, 0x7b995783, 0xa0001c41, 0x6d7b0601, 0x6bf0aacf, 0xb78d3d51, 0x7f48cf8f, 0x8b302f20, 0xbedc689e, 0xcfeee53a, 0x7b3a9cf6, 0x06507c78, 0xc3aaa56e, 0xba5dd9c9, 0x20c3d1f2, 0x2bb833e5, 0x0fe6cb7e, 0x54efb0d6, 0x9f35e88a, 0x2bb893a7, 0xc0799177, 0x192ad6c1, 0x0c2e00c7, 0x11da4a91, 0xa5771c29, 0xe4374dc7, 0x1104c1b9, 0xd4638875, 0xd8fd103a, 0x0ba0c54c, 0x5ebefe53, 0x7d5c04ff, 0x5203d5ac, 0x0ff8744e, 0x2f597bec, 0x8522aab8, 0x19e86b6c, 0xd70574ec, 0x4f8e0649, 0x4c23b0ac, 0x1327dd27, 0xe9a85ef6, 0x4383b49c, 0xf0ed4320, 0xc11157d9, 0x0ab70023, 0xa13a3a3a, 0x4745de72, 0x588c1bd5, 0x9b5bde57, 0x8afc0658, 0xdcc8d4dd, 0x2a17c0ce, 0x4586d708, 0x925726ff, 0xc1a3cb82, 0x6faa49fb, 0xefc0bec4, 0x6d62a3ac, 0x24ae9d74, 0x66deb6d7, 0xb2654337, 0x8b0fa52a, 0x837f3061, 0x3a61cc89, 0x9f85ea27, 0x9d28a3e2, 0xc6d6fc58, 0x9c14864e, 0xad100cb2, 0xd6d7d579, 0x804049ff, 0xf910bfd9, 0xbf853137, 0x185f3010, 0x29674e69, 0xf8526a44, 0xd8a153c3, 0xae166339, 0xe28d1dc3, 0xa89aa0e9, 0x2ce8dbcd, 0x9333368d, 0x8bcda1ad, 0xaa3bb15f, 0xc35f690d, 0xf522728e, 0xffeb9813, 0x06f8ae05, 0x4af99305, 0xa77fb46f, 0x1c92eb48, 0xb26c8bf0, 0x504e3b6c, 0xae44b2fd, 0xbb6e729c, 0x0de0afb0, 0x2b983df1, 0x9a51ec51, 0x54827731, 0x71789dbf, 0x645c234e, 0xb92dfec2, 0xf357f95f, 0x1045e9d3, 0xc0cbc666, 0x3f88f975, 0x8d9b237a, 0xcddcb133, 0x653b4491, 0x45660126, 0x6175e859, 0xca4c28c9, 0x94eb4e9e, 0xde9546cf, 0xa5437bf2, 0x06329d75, 0xc978f865, 0xdc9af2de, 0x19faa34f, 0x47fa3101, 0xf3369225, 0x70fe271a, 0x40a17f16, 0xa73a5b16, 0xe5696d4f, 0xf49c1e26, 0x986c620a, 0xedbcd70f, 0x888c5a33, 0x7d + +output0 = +0xa1673514, 0xb589a27b, 0x1a0473b3, 0xe9254c23, 0x84ef742f, 0xf1e8aa50, 0xd7638a2f, 0xd0cbba1d, 0x4959dd98, 0xa56c6695, 0x84bd9e6c, 0xf1a88653, 0x2340702a, 0x97657fa2, 0xb9942d50, 0xb598fa31, 0x5a48108a, 0x7a59a420, 0x6a5ce2a6, 0x6cfe4a56, 0xc5d8b962, 0xb183c3bd, 0x1a91758b, 0x010d5e34, 0xf7b90b34, 0xd6b641bf, 0x02167b36, 0x0e5d47a1, 0x3f9f4504, 0x8d0e8d11, 0xcd0f8d1f, 0x583b0288, 0x2724e8e6, 0x63a37e31, 0xf0d59f03, 0x7e33c163, 0xcf22ecb2, 0xd562de86, 0xf1fe3d00, 0xe3e69c84, 0x84a175e7, 0xada0e5f7, 0x2e4754e5, 0xc140d948, 0x2cd13be7, 0xeaef3635, 0x7e332d49, 0x49954dd3, 0x5bd9cae1, 0x9eeb53a0, 0xccccc270, 0x74a5ba69, 0x10e0f98e, 0xf4ddabf8, 0x1d2c5e88, 0x306aa32d, 0xfdc9e2d6, 0x3ea3644c, 0xece27d9f, 0x2e4e7868, 0x273c1b35, 0xcd190ddf, 0xee056389, 0x0639ca81, 0xea7a041f, 0x86900a85, 0x177cb1e5, 0x7f199d1b, 0x73d5cdb9, 0x0ca8bb86, 0x941c0f88, 0x8532f2d7, 0x78f3b0fe, 0xbc213cf0, 0x201278d5, 0x589fa1d2, 0x1146a114, 0xd26be38d, 0x2ba333e6, 0xefba69e6, 0x51208774, 0x97e25490, 0x1156aa9e, 0x6e1bd2ea, 0x7280474f, 0x1507be9f, 0xbe66454a, 0xc63c8442, 0x3f2dad64, 0x2064d71c, 0x18278c6d, 0x5ef0c0fb, 0x16cd5e32, 0x960f95e2, 0x7c175b2c, 0x5ef4b8d8, 0xb385e246, 0xd7bd19ec, 0xc9875488, 0xe7e0c0d8, 0xd4b89af3, 0xf7c4a51c, 0x1e0b785f, 0xa2dc4fc7, 0xb6a14289, 0xbb76df90, 0xde4f438e, 0xf65589d9, 0xaf26d369, 0xe8905ee4, 0x0c580d3f, 0x0e4773ae, 0x8aedc1d2, 0x6305fbfe, 0x94ffad98, 0x26016950, 0x83bf4ec7, 0xee6dc970, 0xae7a74de, 0x80607fcd, 0x18d29fad, 0x00beb457, 0xb538dbc4, 0xb43809cf, 0xb970ca1e, 0xe3aa5473, 0x74750c9b, 0xa1d6b99d, 0xe82d197a, 0x019fdbca, 0x45a8afc9, 0x16efe255, 0xd597b35e, 0x57339b5c, 0x5732f5f8, 0x120b99c6, 0x4dc12b3a, 0xff8e6523, 0x957ba382, 0xa824167e, 0xe0765b5d, 0x5cb47468, 0xf658b8af, 0xaf3797da, 0x3b3296af, 0x5bf60aab, 0x626192e9, 0x69691102, 0x9fb439a1, 0x337b01e4, 0x908497ea, 0x8d2fab4e, 0xcb974e0c, 0x5e4ee785, 0xf1a7079b, 0x1793e6a1, 0xcb5a6535, 0x7c08737c, 0x3c791341, 0xc2723235, 0x376bc1a9, 0x87f4037c, 0xe535950c, 0xed96ccf0, 0xdeada935, 0xeaf475c2, 0x32823834, 0x49febdf2, 0x1e61da2b, 0x677b6298, 0x481ef2d2, 0x637d7d41, 0xc13b80fa, 0xb9e2d6f5, 0xc99308aa, 0xee74f0b6, 0xd9af5bc9, 0x17449347, 0xc8eb124b, 0x271d6e35, 0x690e08d3, 0x8c474bea, 0xfdaf2a1c, 0x2d57543b, 0x53d8ba6f, 0x2c074434, 0x9d5f8b26, 0xee317acc, 0xc679a779, 0x2d1972ad, 0xb5d7b943, 0x8c4164fa, 0xa078097c, 0xef158487, 0xe5de2bf3, 0x5b1ef3f8, 0xb1808963, 0xb67b9490, 0xed267ab9, 0x640aba19, 0xbd80e584, 0x2c6d8fe0, 0x9d14dc4a, 0x3e512944, 0x699a929a, 0x424cd494, 0xee13bb2c, 0x1eeb37a4, 0x68726dcd, 0xa97916cf, 0xc1571f97, 0x5a7a77a1, 0xea30e5d2, 0xe9b30ce3, 0x75ab881f, 0x47019996, 0xea23d812, 0x36dd921e, 0x4eef9f15, 0x5da10bd0, 0x3a234a95, 0xca3e93d2, 0xa1070324, 0x00894405, 0x39404211, 0xa36dde6e, 0x989cfff5, 0xde3800bf, 0xa34b4327, 0x6a8ea7d0, 0xaaf4fbc5, 0xbb6b9020, 0xee5d144d, 0xcb81055a, 0xd56dbc96, 0xeccee1f6, 0x72fc980a, 0xbba1b8bc, 0xa0972ceb, 0x9f6edc1f, 0xf12a816e, 0x2c040067, 0x27ccf828, 0x0af0cd8d, 0xc7b793a4, 0xddcff776, 0x07b359ef, 0x004d1be4, 0x0e1f37ec, 0x8f59c5cb, 0x9bf0f93e, 0xef517ded, 0x11da7da3, 0x6062efa8, 0x80f8c8d5, 0xea86625a, 0x0a876ac9, 0x9b5cc49a, 0x52d37f7e, 0x41b0d72a, 0x3df313a1, 0x9242d958, 0x15417eb0, 0xb005e90c, 0x8d604792, 0x5612ccb7, 0xe407875d, 0x72896e3a, 0xf3306fb4, 0x71fd3e1e, 0x12f0c6ce, 0x02477141, 0x8190676f, 0x70e70f79, 0x5542d84a, 0x80b2e3ee, 0x27b5f520, 0xca41149c, 0xacfb5e73, 0xec26f8de, 0x3114efbb, 0xf22af467, 0x32a3b48c, 0x48364a10, 0x342fa930, 0xab0490ea, 0xcf2ff5fd, 0xbb1dc322, 0xc8c990da, 0x67c40d0c, 0x8e2df179, 0x5094e8 + +basegraph= +1 + +z_c= +384 + +n_cb= +9600 + +q_m= +2 + +n_filler= +0 + +e = +9332 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_3_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_3_rv0.data new file mode 100755 index 0000000000..7c9040ed6a --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_3_rv0.data @@ -0,0 +1,38 @@ +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0x9cae44b2, 0xb0bb6e72, 0xf10de0af, 0x512b983d, 0x319a51ec, 0xbf548277, 0x4e71789d, 0xc2645c23, 0x5fb92dfe, 0xd3f357f9, 0x661045e9, 0x75c0cbc6, 0x7a3f88f9, 0x338d9b23, 0x91cddcb1, 0x26653b44, 0x59456601, 0xc96175e8, 0x9eca4c28, 0xcf94eb4e, 0xf2de9546, 0x75a5437b, 0x6506329d, 0xdec978f8, 0x4fdc9af2, 0x0119faa3, 0x2547fa31, 0x1af33692, 0x1670fe27, 0x1640a17f, 0x4fa73a5b, 0x26e5696d, 0x0af49c1e, 0x0f986c62, 0x33edbcd7, 0x7d888c5a, 0x342f5ee7, 0x66cb8e8c, 0x07060a3a, 0x2188b6b9, 0xf3c51f6f, 0x6eb156a6, 0x73c51893, 0xded24f9c, 0x019af43a, 0xa5395f1a, 0xc283f30b, 0x7b995783, 0xa0001c41, 0x6d7b0601, 0x6bf0aacf, 0xb78d3d51, 0x7f48cf8f, 0x8b302f20, 0xbedc689e, 0xcfeee53a, 0x7b3a9cf6, 0x06507c78, 0xc3aaa56e, 0xba5dd9c9, 0x20c3d1f2, 0x2bb833e5, 0x0fe6cb7e, 0x54efb0d6, 0x9f35e88a, 0x2bb893a7, 0xc0799177, 0x192ad6c1, 0x0c2e00c7, 0x11da4a91, 0xa5771c29, 0xe4374dc7, 0x1104c1b9, 0xd4638875, 0xd8fd103a, 0x0ba0c54c, 0x5ebefe53, 0x7d5c04ff, 0x5203d5ac, 0x0ff8744e, 0x2f597bec, 0x8522aab8, 0x19e86b6c, 0xd70574ec, 0x4f8e0649, 0x4c23b0ac, 0x1327dd27, 0xe9a85ef6, 0x35fb9a9c + +output0 = +0x9db2cc75, 0x86491306, 0x2f7fb407, 0x3fa46689, 0x2a1ff675, 0xd79f34a9, 0x201003e4, 0x673b1603, 0x1f6cc485, 0xd91e75b2, 0xb3fe4116, 0xf42194a6, 0x10dd72e1, 0x0e36ce00, 0xe8cbf8be, 0xbffbfd22, 0xf1767045, 0xe499a72f, 0x4a4072e2, 0xbd745937, 0xd5ae743b, 0xf0e8ba05, 0xc772de6a, 0xc48fbe1c, 0x1c08cc88, 0xe16d3780, 0xc0e89e6d, 0xf5bc8306, 0x3350752b, 0x96642ff7, 0xa9c53c11, 0xa5c9fe34, 0x1b58408b, 0x7a49a535, 0x2e59f7b2, 0x6caf5e53, 0xc4c9b877, 0xe48383a8, 0x4b85759b, 0x45081b64, 0xa7e80f75, 0x87e204fa, 0x43433f33, 0x0b1847b5, 0x2a8a5001, 0x890a8844, 0xcd1f9c0a, 0x5d7a539c, 0x2275ece6, 0x23b36f34, 0xf1c0db07, 0x7f629567, 0xca32fdf2, 0x8026df97, 0xa0af7d04, 0xf6e3cdc0, 0xd0f160b6, 0xeca5f4e7, 0x7e5611f4, 0x9455dd58, 0x6c857ae3, 0xeabf6735, 0x2a33781d, 0x5c941c82, 0x4ecc9be4, 0xcbfa07f0, 0xd999c371, 0x24f5ee6d, 0x05f0a9db, 0xb1dcaaac, 0x486d0f8d, 0x743fe72c, 0xbcdce7d2, 0x3ef37508, 0xfdf628cf, 0x6e4a3839, 0x332d4a74, 0x9d4c5dcb, 0xea4527c9, 0x173dcf84, 0xeb3f014b, 0x83d00ad0, 0x462cb4f1, 0x3f58c90b, 0x768488a8, 0x09e9fa82, 0xc4594e98, 0xc126a383, 0x3db7f0ab, 0xbd7039e4, 0x35077990, 0x49cfb0d6, 0x1002a150, 0x933fa389, 0x2fb662e2, 0xeeaf38f3, 0x51758221, 0xd2b240d1, 0x0046bbda, 0x2f1bc7aa, 0x76c5565f, 0x5557fe9b, 0xfa33100a, 0xd26cd117, 0x2f28b971, 0x74308619, 0x4877983d, 0x5af4d5aa, 0x43994f37, 0xc24fd5a6, 0x2c064e6c, 0x5ab4b9c8, 0xe2d4e716, 0xd2fc49a9, 0x9982109d, 0xe3b095d9, 0xd4e89ea2, 0xf2c4f518, 0x0f0e284f, 0xb78c5a92, 0xb7a453d9, 0xbe778f81, 0xca4e569b, 0xf241c9dc, 0xef77c669, 0xec841ba5, 0x4c48092a, 0x4a4376bf, 0x9ae98593, 0x7640feaf, 0xc0eae9c9, 0x67503900, 0xc2bb0ed7, 0xbf3c9831, 0xfa2a749a, 0xc1747e88, 0x1dc2ceb8, 0x11aee152, 0xe1388ac5, 0xa42959ce, 0xa824ce4e, 0xa2fb0566, 0x61741d8f, 0xe1d6e8d9, 0xa8290d7a, 0x10cfdf8b, 0x45e9af8c, 0x47bab310, 0x9596e75a, 0x17729a18, 0x1662b4ac, 0x121bd883, 0x48843f3f, 0xfa8f7436, 0x902ae297, 0xec20067f, 0xb4361b5c, 0x18b5643d, 0xb25dbdfb, 0xae36838f, 0x6a7697fa, 0x1eb30feb, 0x326596e9, 0x396d4413, 0xdfb579e0, 0x622b04f4, 0xd5c1d3ee, 0x8c7ebe1a, 0xca824e1d, 0x1f0eb7c5, 0xa0f7578a, 0x5687b7f5, 0x8a5f7435, 0x69493629, 0x3d381245, 0xd6767264, 0x276f84f8, 0x96b1166d, 0xa471851c, 0xbdc698b0, 0xdeb9bd21, 0xfae52587, 0x76c27934, 0x4dbba8b2, 0x1e619b6b, 0x227b7698, 0x195ee786, 0x76396951, 0xc52b81be, 0xe9f393a4, 0x89c70cfb, 0xbb71f1e3, 0xccbe0b8c, 0x1200c647, 0x421a + +basegraph= +1 + +z_c= +256 + +n_cb= +6400 + +q_m= +2 + +n_filler= +0 + +e = +6224 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_4_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_4_rv0.data new file mode 100755 index 0000000000..57e81468a8 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_4_rv0.data @@ -0,0 +1,40 @@ + +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xf1f312fe, 0x8abcb1ed, 0xf3550fd6, 0x8060deb6, 0x82380005, 0xc1ea99de, 0xd0cfc143, 0x58fa9ca5, 0x5c2f5980, 0x39f24b7b, 0xc918a3ce, 0x656a8d76, 0xf6f8a3cf, 0x9d6d1184, 0x5c5060e0, 0x3171d366, 0xe77af42c, 0xf24290f4, 0x1df2f5e8, 0x56c1a6eb, 0x3be35b07, 0xdaee3c1b, 0x65dfcb90, 0x8ba0ede7, 0x311e72b1, 0x772ffa8a, 0xd863ce1d, 0x8974177a, 0x87d85875, 0x927596d1, 0x0481e7fa, 0x9768d335, 0x90a5f29b, 0x13e11b45, 0x73cbac15, 0x9301bfde, 0xf3026564, 0x794a8697, 0x552e6f6b, 0x2880a6cd, 0xe780e65f, 0xf68c45fe, 0x254e9ac4, 0x8509c8f8, 0xb5235ffc + +output0 = +0x72176e87, 0xef78cd6b, 0x71b884e4, 0x64e89b8f, 0x35a0484a, 0x721ab211, 0x576e1cee, 0x09875528, 0x559cdeec, 0x6e4ee95d, 0x2b06d496, 0x2d5b79f7, 0x7474578d, 0xa7176633, 0x8d8661eb, 0x2f5bf8f2, 0xfb0205ff, 0x093ab91d, 0x10a19d30, 0x631ade9d, 0x894bac8f, 0xeaba510c, 0xe77a9c3f, 0xd9b0fe7a, 0x724110f2, 0x185f4e89, 0xfb9e9e02, 0xa4269001, 0x68e1db0d, 0xe9881752, 0x541dc095, 0xf3d65fc0, 0xe4ad7a49, 0x0be958cb, 0xb9bd36dc, 0x7096c51a, 0xce72c185, 0x87d41d23, 0x716a441e, 0x1ef80511, 0x20729182, 0x5bc5da2d, 0xb9864f01, 0xf9bd83d1, 0xf30225f7, 0x66ad97f0, 0xb0dd86bf, 0x02666b12, 0x3bbadc59, 0xde2ce355, 0x7e2941be, 0xe96f5ab6, 0xa74671b2, 0x7bddf4e4, 0x5ee57400, 0xaa31dad1, 0xdd9ff623, 0x0b938f82, 0x73675ab4, 0x2d7f22c8, 0x99410078, 0xb947ed1f, 0xf132f8a6, 0xab38961a, 0x2a3b0eff, 0xf0677e99, 0x8e5ae76e, 0x976e3907, 0xa00017f6, 0x210534aa, 0x4803bcfb, 0x12eb4bfb, 0x439be7e8, 0x98d1a09f, 0xba447cf6, 0x0bfe7263, 0xf9b738cb, 0x50c11478, 0x11017210, 0x18d0944b, 0x86d2a8b2, 0x12e19cb9, 0x16b04a21, 0x45b7fab0, 0xa0c6239c, 0x9073d9ae, 0xd3660485, 0xf072ba5c, 0x8f25cf3b, 0xc60f58ae, 0x4a9cbcb0, 0xd2a0c056, 0xa7c47c3f, 0x7629986d, 0x4ec9aaf4, 0x39bec0fb, 0x065674d4, 0xa296e279, 0x116900ac, 0xe0675076, 0x5fa3382d, 0x165e032b, 0x25afa51d, 0x6ffd9d7b, 0x45c375eb, 0x59ba4861, 0x26fbd5ec, 0xe7124cab, 0x7dcc8bf9, 0x7c3213f4, 0x8a676b05, 0xca0e4af9, 0xe05fdb56, 0x9da3ada9, 0xcee511d3, 0x777ceef7, 0xa6fc3ea8, 0xde8144cc, 0x0d2e46db, 0x165aa912, 0x99aad991, 0x6f6fbf08, 0xe9f4f313, 0xc4b64b7c, 0x6a02cd7e, 0xc280657f, 0xd476672e, 0x2f8094f6, 0x699213b2, 0x0d86733f, 0x3bfd99af, 0x34101685, 0x1ba2664f, 0x2fd29569, 0x49abdfc7, 0x148276d8, 0xde023764, 0x5a4256ed, 0xf0997352, 0x5f2bcae4, 0xaedab8b3, 0x0ac35311, 0x2669713d, 0x0efe1855, 0x69842e96, 0xc63fdc64, 0xee3cda68, 0x3323e84d, 0x799cb3b1, 0xd5580190, 0x2ca9ba22, 0x6fbd40d0, 0x3260b8be, 0x79aef4c0, 0xdcd365b4, 0x2249a834, 0x95b0d5ae, 0x66d48311, 0x3d73a5af, 0x47bc98aa, 0xcb8268f0, 0x767c3314, 0x35f998e7, 0xbee335e1, 0x5cce5171, 0x7efd26fb, 0x2c657d06, 0xdab1199b, 0x19dc335e, 0x43906378, 0x5d854831, 0x28e1cc04, 0x3f73e9f7, 0x0027b04d, 0x14f95dd1, 0xbe06dde2 + +basegraph= +1 + +z_c= +128 + +n_cb= +8448 + +q_m= +2 + +n_filler= +0 + +e = +5632 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK + diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_5_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_5_rv0.data new file mode 100755 index 0000000000..79e6ef5daf --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_5_rv0.data @@ -0,0 +1,39 @@ + +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xfe + +output0 = +0xf2b95473, 0x75b44105, 0x95950fd5, 0xda939dec, 0x6f8ffb15, 0x61151ca1, 0x52a009f1, 0x920ab25d, 0x76537ed7, 0xbe7c986b, 0x20adc5a1, 0x30eccb8b, 0x34f4195f, 0x760af744, 0x477a1cae, 0x4886016c, 0x449d8fac, 0x2a5ba809, 0x3a4294c7, 0x680e3db6, 0x756157cd, 0xb7523327, 0xd89364fa, 0x7a4bfcb7, 0xae1301bf, 0x192fb859, 0x01b19821, 0x730eda8c, 0x994eaddb, 0xfafb5049, 0xb36a8c6f, 0xcdb5fa2a, 0x264041f6, 0x580b5b9d, 0xbb9b9b02, 0xf0739115, 0x2ca0ca4d, 0xac891702, 0x114890c0, 0xe3861bc1, 0xf1fd6e19, 0x1abd0c9e, 0xe9ad729c, 0x60d2c14b, 0xcf3690c0, 0x96c00c66, 0x753a455e, 0x4fac1440, 0x7126c483, 0x1fc5db38, 0xf8861f14, 0xace8d3c1, 0xa25724e6, 0x33f8d3b5, 0xe0dcc3ae, 0x42636a42, 0x2afbdd0d, 0xcf7df244, 0x7b3c40ea, 0xf96b4aa3, 0xa75735e7, 0x6e88f5f0, 0x1ef57055, 0xfb21de90, 0x8cdee233, 0x5a979bc6, 0x76631ae4, 0x2c2b2289, 0xdc500039, 0xa813e95a + +basegraph= +1 + +z_c= +64 + +n_cb= +4224 + +q_m= +2 + +n_filler= +0 + +e = +2240 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_6_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_6_rv0.data new file mode 100755 index 0000000000..7aa8161156 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_6_rv0.data @@ -0,0 +1,39 @@ + +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xf1f312fe, 0x8abcb1ed, 0xf3550fd6, 0x8060deb6, 0x82380005, 0xc1ea99de, 0xd0cfc143, 0x58fa9ca5, 0x5c2f5980, 0x39f24b7b, 0xc918a3ce, 0x656a8d76, 0xf6f8a3cf, 0x9d6d1184, 0x5c5060e0, 0x3171d366, 0xe77af42c, 0xf24290f4, 0x1df2f5e8, 0x56c1a6eb, 0x3be35b07, 0xdaee3c1b, 0x65dfcb90, 0x8ba0ede7, 0x311e72b1, 0x772ffa8a, 0xd863ce1d, 0x8974177a, 0x87d85875, 0x927596d1, 0x0481e7fa, 0x9768d335, 0x90a5f29b, 0x13e11b45, 0x73cbac15, 0x9301bfde, 0x64 + +output0 = +0xfb5615fe, 0x4d6aa84c, 0x04b58965, 0x230fde89, 0xcc5fecca, 0xbfbf550c, 0xf67ad92b, 0xc8f1af3e, 0x370144b7, 0x494a1a9d, 0xea9b9b17, 0xb562c051, 0x3ce18b59, 0xacc91317, 0x155cc4d5, 0xb2820bc0, 0xa5f93b0d, 0x1fe9489e, 0xacfd67c9, 0x20c3914e, 0xcf239190, 0x87810976, 0x706e110b, 0x0fbd4550, 0x7567d4d3, 0x0fc18b28, 0xbdc21a14, 0xbced9791, 0xb21260a2, 0x27b9c3b5, 0xf49cc2bb, 0x12266f03, 0x2fff9d4c, 0x9e28b204, 0x2b6814ee, 0xf83a1fb2, 0xe75270a2, 0x6fd8b0a4, 0x5fb42455, 0xaa74cf95, 0xd88bb226, 0x5b828b86, 0x27624ee1, 0x382a36cc, 0x88405568, 0xfc53e81a, 0xb427b8f7, 0xfa3dc31b, 0x3e6b1efe, 0xf1263f88, 0xdb0aa37e, 0xc76f6953, 0xe04117f2, 0x345174ee, 0x1c13bcea, 0x17aa1eee, 0x02cae3a8, 0xd981f1df, 0xbf506ce6, 0x0eae2777, 0xfcf7789f, 0x10d5456c, 0x15047241, 0x4894851e, 0xc3c7f9f7, 0x03e18cb9, 0x12b01f64, 0x55b2bfe1, 0xa496679d, 0xc07289be, 0x826314c4, 0xf033eb1c, 0xca749a3a, 0xc65b19ea, 0x1f9db8b4, 0xc6e59002, 0xa790382b, 0x7728dd7c, 0x5f89fbe5, 0x28bbc5fb, 0x064320d0, 0xf393f369, 0x402810ad, 0xa4720036, 0x4ef67d2d, 0x024b166b, 0x34eaa55c, 0x7bacc96e, 0x45d220ae, 0x4dee5d75, 0x62fed1ed, 0xe21259aa, 0x3ccccab9, 0x697753f0, 0xdf266f01, 0x9a4f5ea8, 0xe51ede07, 0xdce7f8e9, 0xdfa05182, 0x6328afb6 + +basegraph= +2 + +z_c= +256 + +n_cb= +12800 + +q_m= +2 + +n_filler= +0 + +e = +3200 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_7_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_7_rv0.data new file mode 100755 index 0000000000..55d3cbdcf4 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_7_rv0.data @@ -0,0 +1,38 @@ +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60 + +output0 = +0x23062a83, 0xbe78896f, 0x34e984b1, 0x70a9cf9a, 0x65f5095b, 0x771ea744, 0x572b5cba, 0x48d2507c, 0x11d9dbad, 0x7b1bf95c, 0x2f538596, 0x3c4b69b3, 0x6161569d, 0xf2136773, 0x8cc275eb, 0x3f0ee8f2, 0xbb5245be, 0x0c2ab808, 0x14a4d971, 0x661edfd8, 0xcd5be9ce, 0xaeae555c, 0xf67a9d3e, 0xc9a1ea6b, 0x720154a6, 0x190f4f8c, 0xbf9ada12, 0xa1278144, 0x79a1ce09, 0xf88c1216, 0x444cc0d1, 0xe2925fc5, 0xb0b87f5d, 0x5fbc588f, 0xece93699, 0x21c2804b, 0xdb62d094, 0xd6804837, 0x606e111b, 0x0ead4500, 0x653281c3, 0x0b808f7c, 0xfc925f51, 0xbcbc87d1, 0xe30330e7, 0x66e9c3b5, 0xb18c92af, 0x02272f03, 0x6aafd818, 0xce2da351, 0x3f7d41af, 0xa83a0ae2, 0xb21375b3, 0x3fdda0a5, 0x4be46114, 0xaf70ced1, 0xcdcaf662, 0x5a969a87, 0x66724ef5, 0x6d6b66d9, 0xd9005578, 0xe806bc4e, 0x3dea5f89, 0x2c13678f, 0x16617450, 0x9a5144a2, 0x55bd665d, 0x1d1cc783, 0x0cfaf626, 0xb780e63f, 0xb9ce7360, 0xb330d19b, 0x3d1e4cdc, 0xf4307513, 0x667b381c, 0x1d18aea4, 0x10a8531e, 0x131ceb64, 0x3f823938, 0x6574c7d9, 0x2c6bc220, 0x4d0d4701 + +basegraph= +2 + +z_c= +128 + +n_cb= +6400 + +q_m= +2 + +n_filler= +8 + +e = +2624 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_8_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_8_rv0.data new file mode 100755 index 0000000000..fc38760fe5 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_8_rv0.data @@ -0,0 +1,39 @@ + +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xc8 + +output0 = +0x0dcd08ac, 0xf9309a7b, 0xb1663784, 0xe466b066, 0xe7f84133, 0x35a54111, 0x90c00f90, 0x8b829dbc, 0x7edeaa50, 0x215048f0, 0x53f11de5, 0xd34ae718, 0x62067b86, 0xbb7dc97e, 0xf995c5f4, 0x8311e2c5, 0xdf419b04, 0x1a828a85, 0x8639bbcd, 0x02137d25, 0x52356871, 0xca2d0387, 0x51f5687f, 0xa9cdb410, 0x1b4e4664, 0x193e9d65, 0xa03c63f6, 0xb26b7fd3, 0x26dee48e, 0x9a2d9bef, 0x16b40bf5, 0x00cab368, 0x4916c4b1, 0xe684ddd7, 0xfc0fd461, 0x1ca8fa78, 0x643ce308, 0xec27ef99, 0xe726ca76, 0x21e3c41d, 0x0d9e5dfa, 0x461972a5, 0xee3eebb9, 0x029b245a, 0x28069caf, 0xd8161167, 0xc8c880a3, 0xec2b2d8c, 0xb1290350, 0x9f37480d + +basegraph= +2 + +z_c= +32 + +n_cb= +1600 + +q_m= +2 + +n_filler= +0 + +e = +1600 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_0.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_0.data new file mode 100644 index 0000000000..5d4d27d607 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_0.data @@ -0,0 +1,353 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0xF301FC03, 0xF50F0EFA, 0xE70BF902, 0x1013060C, 0xF7F6FCE7, 0x04F3F709, 0x0C07FBF1, 0xFCF7070F, +0xEA0FFAF8, 0x0FF71209, 0x070906F2, 0xF705F004, 0x15FA05F7, 0xF4F8010A, 0x0B0E09F5, 0xF70014F6, +0xF106F80D, 0x0A06F9FC, 0x0DFBF803, 0x0308060D, 0x0CF9F8F9, 0xF2F409ED, 0x12FEF3EA, 0xF2FC07F9, +0xEF12EEF8, 0xF90F030C, 0xEC171408, 0x11F902F3, 0xF102F6FF, 0x0AF6090C, 0x0103FA10, 0xF9FFF011, +0x010FFB0F, 0xF80BFEF8, 0x10F2F1EE, 0x140204F6, 0x020AF206, 0x0BED04F2, 0x06FEF5F2, 0x0F070009, +0xECF0F9F0, 0x081405F5, 0xF1000E18, 0xF4F7090C, 0xFD0F01EF, 0x0D12E702, 0x07EF1008, 0xEF06FD02, +0x0302FD00, 0xF2F4040A, 0xF60BF9FC, 0x0BEEF20C, 0xF9ED0901, 0x00060406, 0xFF09F6F3, 0x0FF209F7, +0x0D0EF210, 0xF3150611, 0x06060EF8, 0x0E06EFEC, 0x070C05F8, 0x0CFBF4F1, 0xFBFE0CF6, 0xFD03F714, +0x03FCE40C, 0xF4F5F2F4, 0xF400F6FF, 0x0EF0090C, 0x04F9F9F6, 0xF5F6FEFD, 0xFE08FE01, 0x0607F3F3, +0x11F4020C, 0xFD0FFB04, 0xEEF30D05, 0xFD040406, 0xFCF8F108, 0x0DFAFBF9, 0xE9F10B09, 0xEEF2140D, +0xEE0A09F8, 0xFB010C0A, 0xF1FC0803, 0x0C07130A, 0x0312FD0A, 0xF6F10708, 0xFCF1FAEC, 0x0BF8F4F9, +0xF009FBFF, 0x14EEF2EB, 0xEF0DF701, 0xFA14F90C, 0x08EF0110, 0xF50401E5, 0xEE13F30C, 0xF1F60916, +0x05F414EC, 0xFF030A14, 0x0409FFF2, 0x0C0906FA, 0xF7F70414, 0xFBFA0EFA, 0xFD010BFD, 0xF5FA0EF1, +0xF40FFAF4, 0xFF060503, 0x0BEF0BFA, 0x0717E7F3, 0xF4F1FD09, 0xEF09FEFE, 0x07F9F3FB, 0x0DFD08FE, +0x0D0BF602, 0x05F21008, 0x1A0B0807, 0xEF0CFAF9, 0x090D0A06, 0x02EB0D0F, 0xF709FDFE, 0xFFF7F510, +0xF10A0AF8, 0x15EF1311, 0xF20BEDF9, 0xF10A0BF7, 0x15150B08, 0x0B170F0A, 0x06FAFAF1, 0xF1F803FD, +0x11F3EEEB, 0x0902FB04, 0x0703F215, 0x06EF10FE, 0xFB00140B, 0xF70CF806, 0x040AEE0E, 0xF9F1070C, +0xEAF9F6FC, 0x0AECF80E, 0x09F2F9F3, 0xF708E8F0, 0x0902E9F7, 0x0209F6FD, 0x02F6EE10, 0x090BE811, +0x0BF8E8F7, 0x03F8F5F1, 0x040AF109, 0x04F80CFB, 0x100A0913, 0x0CFBF403, 0xEE04FAF0, 0xFB040008, +0x16081113, 0xFCE80708, 0xF2FF03F3, 0xF9F1F1F4, 0xF4ED09F7, 0x0BEBF0FC, 0xF80A01E8, 0x02F714F0, +0xF516040E, 0x0A000AF1, 0xF5F3F101, 0x05F00807, 0xE9F20011, 0xE90E1613, 0xF6150AF4, 0x0707F4F8, +0x10F7F20B, 0xF9F9F0EE, 0xF5FE0715, 0xF90E06F7, 0x0AE8F40C, 0x0B07FB06, 0xF0F6F10E, 0xF4060811, +0x0A0C06F5, 0x0EFBFD0B, 0x0A0EF611, 0x03F4F8F5, 0xFDF10CEB, 0x13140CFD, 0xF712F80A, 0xF1F4E903, +0xF5030203, 0xF80900F8, 0xFDF8F40B, 0xFEFBFD0A, 0x070813F5, 0xF9FA0B14, 0xFAF7FD17, 0xF5F50603, +0xF916F210, 0x070F12FB, 0x0DF3F5FC, 0xEA11F207, 0x0DF70DF7, 0x10F1F4F4, 0x0BF409E8, 0x0606050E, +0x09F50EFF, 0xF70406F8, 0xED0C11FA, 0x0F0400F3, 0x0208F4F8, 0xF9100EF0, 0xFCEEEDF3, 0xF1F5FE14, +0xE0E80DFE, 0x0A0EF5ED, 0xF3E7F90B, 0x06E7F7FE, 0x12FE06F9, 0x0804F804, 0xF409F5F9, 0xF3F80EF5, +0x02F6EFF2, 0x120AFF0E, 0x0D0EF4F8, 0xF7F80408, 0x0400F0F3, 0x150112F2, 0x0719ECF2, 0x0403EDFC, +0xFBF205F8, 0xF00DF30F, 0xFC0CF413, 0x08F9F2FD, 0x1107FA03, 0xEC11EDFE, 0x0DF1F810, 0xFC0B11F9, +0xF9FE0AFD, 0x0B0EF4F3, 0xF9F1050C, 0xFC0EF9F8, 0x000F14EA, 0xF00A0107, 0xF903F810, 0x0A040EFA, +0x0C000203, 0xF40C02FE, 0xFA06130D, 0x100CFDF3, 0x0BF505FA, 0xF5FB00FC, 0xF8110808, 0x05ECEA0D, +0x04F7F30A, 0xFE090FEC, 0xF9FBEE08, 0xFD0CEF0E, 0x09F80B0A, 0xF90BF9F4, 0x0EFB0C0C, 0x10EFF2F0, +0x09F8F0FA, 0x060B0909, 0xF4FF0F13, 0x06FA0E16, 0x0515F512, 0x0E0B0708, 0xF6FBF9F7, 0xFBF405F2, +0x050A1207, 0xFA001C0C, 0xFB0FEBEE, 0x0B13100C, 0x0D08F6FB, 0x16FEF2F9, 0x12F9F412, 0x09F600F5, +0x02040B09, 0x0AF11310, 0x0C160A06, 0x0E09FF0E, 0xEF0B0CF3, 0x13F40DF5, 0x0BF704F9, 0x07EE0A00, +0xF0F504F6, 0x0BFAFCFB, 0x0B0BF70A, 0x0207FF08, 0xF20B09E7, 0xF9F1F115, 0xF0090812, 0xFF0DF5F8, +0x0C080709, 0x0512F3EF, 0xEE110708, 0x03EBFCFF, 0xEE0D08FE, 0x110BFCF6, 0x15F61408, 0xF413F30D, +0x06F2F2F1, 0x04120BEF, 0xF90CF30B, 0xE40400FB, 0x0BFC1A09, 0x130109FD, 0xFF08E7F9, 0xF2FAF4F8, +0x060BF901, 0xF112EE02, 0xFF060D0F, 0xFAFC0DED, 0x09FFF6FF, 0xF304ED0D, 0x050AF8F3, 0xF40403F8, +0xF5F6070B, 0xF8F7FF00, 0x170E0708, 0xF808FFF4, 0x03F80C0F, 0x0A06FCF7, 0xF3EFF404, 0xF10D09FD, +0xFDF9F016, 0x04FD06EF, 0xF5070EEF, 0xEFF20411, 0xF310FDF1, 0xF50AFB11, 0x040DF4F3, 0xF30307F7, +0xFC031C00, 0xF008ECF5, 0xF011F5F9, 0xFCF1ECF7, 0x16FF0F0C, 0xF9F611FC, 0x0CF70D04, 0x020C0BFF, +0x06FE0B09, 0xF9080C0C, 0x080DE706, 0x030FFAF8, 0xFF0C0D08, 0x03051108, 0xF402FA10, 0xF4FE0502, +0xF7F6F2E9, 0x0DFBEB11, 0xFAF2F2F1, 0x0E06F60B, 0xEDEA0EF9, 0x09EDF30B, 0xEF0CF202, 0xFE0208F3, +0x000D08FB, 0x0FF817F4, 0x0F0DFC01, 0x0D02FF0D, 0xED060EF1, 0x0B0CF0F4, 0x0EF80712, 0x0DF31402, +0x110EF3F2, 0xF208F60C, 0x02000B06, 0x1106E901, 0xF309F708, 0xEEF003FA, 0x00F9EF05, 0xFC08FDF9, +0x09050B08, 0xF5FB180A, 0x10F7EEF4, 0xF10F15F0, 0x0712FF10, 0xF5FFFB08, 0x11F6F0F1, 0xFEEEFC18, +0xF0E806F2, 0x10F90DF9, 0xF30900FD, 0x0A06F40B, 0x12EE0004, 0xED0A0AFE, 0xED04F5F8, 0xFE09F7F3, +0x01F601F8, 0xF7EA0405, 0x04080EF5, 0x0F1CF201, 0x0712F70F, 0xF0F21205, 0xFF0A1004, 0x0AF4F30D, +0x0DF3000D, 0xF6000B01, 0xEF0DEDFA, 0x0700F8FF, 0x03F7FBF7, 0x06020D0B, 0xFCF7F6F0, 0xFA0208F2, +0xFA0B04F1, 0xEE04F6F9, 0xFFEEF907, 0x080106EF, 0x0FF8F007, 0xFFEB0BE4, 0xF10FF8EF, 0x080AF3F9, +0xEF0BF311, 0xF00FF504, 0x0D100100, 0xF10BEEF9, 0xF3F8F612, 0xFB00FE0C, 0x06F30BF0, 0xF2030D11, +0x0002EB18, 0xEFF8FE07, 0x03F6EE14, 0x08ED08FF, 0x12150AF1, 0x06F0170C, 0x050F0C16, 0x1200100D, +0xFAF70707, 0xF0FA100E, 0xEF090D01, 0x09EE0808, 0x0809F2F5, 0x03FF090C, 0x060410F1, 0x01EE16F7, +0xF41015F9, 0x12F10B0C, 0x0FEBF1F7, 0xF906F40B, 0x0CFD02F6, 0x0FFAF00E, 0x0D030BF2, 0x0BF711F4, +0xF1F30A06, 0x0CF5F9F0, 0x031A0D0F, 0x0CEC0608, 0x08EEF5F5, 0xF202020A, 0xFAF7F1FB, 0x0FFB07F9, +0xF5010C0A, 0xF0F6FA0C, 0xF70FF0FF, 0x08ECF80E, 0x0EFBEC10, 0x01F0EF14, 0xE9030C08, 0x0A0EEFFD, +0xF7001415, 0xEF04FCF3, 0xFF0C13EE, 0x05F4F2FC, 0xF9F3E7F7, 0xEC0CF6FE, 0xFDF70702, 0xFE12EFF0, +0x0FFB0D07, 0xF6E8ED03, 0xF40607F5, 0x06040F0D, 0xF60700F1, 0x080503FA, 0xEE0B06F8, 0x0114050A, +0x0DFF0B11, 0xF5EFF7ED, 0x11EE0F13, 0x0201EAEF, 0xF80BF80F, 0x070D0F0C, 0x090502F0, 0x0BE70401, +0x0A0CF0F4, 0xF601F3F7, 0x1AEEF912, 0x11060C03, 0x09EDF7F9, 0xF6ED1708, 0xF0FA0E02, 0x0DF20FFC, +0xEFFCF7F3, 0x090EF50C, 0xFAF8FDF9, 0x0F0E1304, 0xF117F3F9, 0x0CF3020D, 0xF8FBF705, 0xFBFEF0ED, +0xF5F1EB14, 0x0D07F81B, 0xF9F704F4, 0xF1F3FE09, 0x03030DF6, 0xFA02F1F5, 0x11F4F600, 0x16081215, +0xF5090B0A, 0xFA0C0AF0, 0xF60F0E02, 0xF3E8160D, 0x08FDEEF8, 0x10F907FC, 0x0AFE00F5, 0x0AF0F00F, +0xF4F7EE0B, 0xFFF3F4F5, 0xFDF718EF, 0x0CFC0B10, 0xF70AFEFE, 0xFCF2EDFB, 0x08EC0F15, 0xFBEE11EC, +0x0BF6080E, 0x0D02F702, 0xF3FE09F9, 0xF9F30A10, 0x0FF20809, 0xF910FDF8, 0xFA060EEE, 0x10FBFE06, +0x150C0810, 0xEE0D160B, 0xFF08FB0C, 0x0411FC10, 0x09F8FEF6, 0x0BFC10F2, 0x0DEE0D07, 0x0C03F40D, +0xF1F5FC11, 0xF80C0011, 0x06EF0208, 0x070C08F6, 0xF807F80C, 0x10090000, 0x050EFD0F, 0xF80CF216, +0xF9FFF2F9, 0x08EE09F8, 0x09EEFFF5, 0xF8F70CF0, 0xF609F803, 0xF90AF509, 0x0E00FE0E, 0x05F7FE0A, +0xF807F1F6, 0xFCF5F6FF, 0x0AFE0BFD, 0x09F500E5, 0x0DF8FC0C, 0x070808F1, 0xEDEEF00D, 0x0900FBF2, +0xF407FAEA, 0xEFFA0CED, 0x10170A0B, 0xF807F6EA, 0xF1ECF9FF, 0xF5FEF4FF, 0x0E020B11, 0xFFEDFC0B, +0xF3F4ECE6, 0xEE0AF6F4, 0x09F7FE05, 0xF4F2EAFA, 0xF7F70D06, 0xF708EF07, 0x10F8FCF7, 0xEFFB08F2, +0xFA05FDF7, 0xF3F31111, 0x0109ECFB, 0x0DF1F208, 0x0EF3F307, 0xFFF1F4FE, 0xEDFF12FA, 0x13080405, +0xF307040D, 0xF408FCFC, 0x10120500, 0x090AEC07, 0x0CF10907, 0x09EEF8ED, 0xFCED0CFB, 0x0CF91008, +0xFB0FFCF2, 0xF709F7F6, 0x080608F8, 0xF70BF60C, 0x03F60808, 0x0507F9FC, 0x13F3F40C, 0xEC000A0F, +0xF7F307FD, 0xF2FF0B0E, 0x03FCF5F4, 0x04E4FE0B, 0x0F0BFEF4, 0x100C02F5, 0x13E9ED0D, 0x0204F4ED, +0xF5F3FAF1, 0x05FD0A05, 0x00F4E4FA, 0xF9FA0EEC, 0xF308F50F, 0xFAF8FB0C, 0x14F70B0A, 0x090A080B, +0x011207F4, 0xF0070AF0, 0xEDFE0EF3, 0x1311EF09, 0xF8F9F5F1, 0x04F5F507, 0xFFF70FFD, 0xF1F50413, +0xF6F8F50F, 0xF7FEF00A, 0xF70104F1, 0x0D04F717, 0xEBF31209, 0xFFF50CE7, 0x0CF7070C, 0xFA0AF50A, +0xF5FEF6F1, 0x050EEF00, 0x0705F6EF, 0x1204FAE5, 0xF80BF9FD, 0x0AF4FDEF, 0x08F80307, 0xEE04050C, +0xFBEFED07, 0x0A120401, 0x1208F2F1, 0xF6F31315, 0xF7F3E909, 0xF1F90F08, 0x03E40709, 0xFB0BFD0E, +0xF5F9F7F8, 0x0AF7FEEB, 0x12F4F306, 0x12F1FBF7, 0xF20606F6, 0xFAFB1402, 0x0E11FBF2, 0xFAECF8FD, +0xFAEEFCF6, 0xFA07FD02, 0x0DFCF604, 0xFAF4FC09, 0xF100EF10, 0xFDEE08F8, 0x0D0B14F0, 0x0BF30DEC, +0xF9000FF1, 0xF8090E06, 0x09EB03F7, 0x0FF90DF5, 0xEC11F6F8, 0xF6EE09FE, 0xF5F0F9FA, 0xF907EF0B, +0xFCEE06F8, 0x0FFEFB16, 0x0AFD0805, 0x05F10A08, 0x0CF303F7, 0x0115F3FA, 0xEE0D0A0D, 0xF9F6F80E, +0x100A0AF8, 0x0BF702FC, 0xF6080705, 0xFD01F3F4, 0x0DFE0101, 0x0EF7FF0A, 0xF00BFFF9, 0xF8FBEF0F, +0x1101F7F6, 0x1104F5E7, 0xF81709F6, 0x0809F7F5, 0xFEF509F8, 0xEBFB00E8, 0x0800FFF6, 0xF111FAFE, +0x14F2F6F5, 0xFAEF0108, 0x0FFB100F, 0xF0FB090C, 0xF608EF0B, 0xF304FB19, 0xFEEE0E11, 0x12030908, +0xF3090907, 0xF707FC11, 0xF8EDFD0F, 0x04F2F5F5, 0x03FEF2F6, 0xF00B02FA, 0xFBF805F9, 0xF5FA1012, +0x08060E06, 0x12E8F709, 0x0AEAFCEC, 0x080EF10C, 0xF510FEF8, 0xEF06F6FD, 0x0F0508FD, 0xFFF8FA05, +0xF6091212, 0x07F114F7, 0x070CF50B, 0xF3F501EF, 0x080BF00B, 0x06F9FDEF, 0x08F5EEF2, 0xFA0D0C05, +0x02FFF90E, 0x050AFA08, 0x0803FF00, 0xF40901F5, 0xF113F514, 0xF9080DF9, 0x03F6000A, 0x170AFCFE, +0x08050A04, 0x09E5F2FC, 0x0B00F00E, 0x10EF100A, 0x0BFF10F1, 0x120602FD, 0x0AF1F703, 0xF50DF811, +0xEBF5F012, 0xF908020C, 0x030112F2, 0x16F9E0F5, 0x06070008, 0xFEFAEAF6, 0xFA0D1305, 0xFFFEFA14, +0x0602F9EF, 0xF2F90202, 0xEF0E10ED, 0x06F00BFD, 0xF0E90503, 0x1506FAF2, 0x01F80A0D, 0xF6E90304, +0xF1F810F8, 0xF5F60A00, 0x0309F9F5, 0xF1F4F9FA, 0xF4FA0A07, 0xE5080803, 0xF7F9040B, 0x0FFC0FF9, +0x0AF4FCF5, 0xF0F20B02, 0xFAFB02FE, 0xF3000D0E, 0xF3FAF9FD, 0x02040209, 0xED0DF1F4, 0xF6F00DEA, +0xFC0004FF, 0x050BFF0D, 0xFFFBF80D, 0xF40302F8, 0xF8FA07F2, 0xF103F907, 0x050B08FB, 0xEF010E0C, +0xF8030DFD, 0xF814F60C, 0xFA09F506, 0xF4F4F2FE, 0x09F8EFED, 0x03F612F6, 0xF609F20D, 0xF90BFB11, +0xF60EF5F8, 0x00F60AF9, 0x0D0112E8, 0xF60900F0, 0x0C0008F8, 0xF5ECFD06, 0xEFF9000E, 0x0411FA09, +0x110B0BEF, 0x11EA0301, 0x0B0CF10A, 0xF1EFF50A, 0x111004FD, 0x0807FDF5, 0x0AF5F100, 0xF8080BF3, +0x0D01F7F5, 0x000716ED, 0xF3F6F80A, 0xFDF30513, 0xF8FA0B0E, 0x0DF80103, 0x020DF308, 0x10F6050B, +0x09F7F609, 0xFCF103F0, 0x0709F6F4, 0xF40D12F6, 0x0B02FD0B, 0xF2FC10ED, 0x04EDF7E9, 0x040E0E0E, +0x090708F2, 0xE90808F9, 0x0E0CEA13, 0x06F103FC, 0xF80C0506, 0xF4FF0DFB, 0x060A08F7, 0x09EBEE07, +0xF4F8FB0A, 0x0CF60306, 0xFB1EF1FF, 0x08F90C0E, 0x160BF5F5, 0x10F604EE, 0xF40302F7, 0x040507FF, +0xFDF3FD09, 0xFD0FFB0D, 0xF8F406F8, 0x0BFAF40C, 0x16F6FFF3, 0xFC1F0B0C, 0xF3EEF50F, 0x08F5EB0D, +0xF0FD0BF4, 0xECF5F9F7, 0xF30100EF, 0xF80BE9F5, 0x0200F50F, 0x08F7F8FA, 0x10F0F4F5, 0xF3ECEFFA, +0x09FEF5F1, 0xFEEAF402, 0xFAFC13FC, 0x15F8F70F, 0xF7060700, 0x07100D0B, 0x1705F901, 0x0EFF0605, +0xF407FA16, 0x02FA0615, 0xFDFF0BF4, 0xF211FA0F, 0x0F0406F8, 0x10EEEB0B, 0xEBF1FF12, 0x170E130F, +0x0B0BF3F4, 0x03120AF8, 0x00160304, 0xF7F6E3F4, 0x0DE6EEEF, 0xEC07F5ED, 0x050F060B, 0x141705EE, +0xFCFE0AF2, 0x16050AF5, 0x01FEF6F5, 0x0EEFFD0B, 0x0BFDEB15, 0x02FF0507, 0x1507F409, 0x03011609, +0xFCEE090D, 0xF202F3EB, 0x07FB040D, 0xFAF614F9, 0x0F07070E, 0x0AEFF2F6, 0xFE0604F6, 0xF709F908, +0xECFE06F1, 0xF1140E0F, 0x0BEEFCEB, 0x13F60DFC, 0xED140FF2, 0xF607F3EF, 0x10040D0B, 0xF2FB0D03, +0xF4F40CFC, 0xF10AF605, 0xF1FBF20D, 0x0E0D0BF6, 0xF50213F8, 0x0C060F0B, 0x13FBFB0E, 0xEBFFEE0F, +0xF40909F7, 0xF8090E07, 0xEC0F0A02, 0xF6F70818, 0x0DF0F105, 0xF90B09F8, 0xEFF6090D, 0xF6FE020C, +0xF6ECEFF0, 0x1409F7F4, 0xF9F3F00A, 0xF4040110, 0x10F1FB05, 0x13EB0B05, 0x110C0111, 0x0F05F3F9, +0x12F3ED0B, 0xECFC09F1, 0xF90BF8F3, 0x0D12030B, 0xF10403FC, 0xF403FA11, 0xF1FC0A0F, 0xFE03F40B, +0xE9EF0AFC, 0xF6FB0B09, 0xF7FBF111, 0xFFF5F00C, 0xF205F004, 0xF80B01F8, 0x0BFC1AF7, 0x00F61509, +0x13FB0F00, 0x09FEEE0C, 0xF7F7EAFB, 0x130F0D08, 0x00060809, 0x130BFBFD, 0xF00F0E15, 0xF10EF912, +0xF507F0F8, 0x0502010B, 0x0BFAF8F0, 0x0307F614, 0xFEF30508, 0x09060B15, 0xFAF8F3F9, 0xEBF2F8FD, +0xF9060AF8, 0xEAEE12F6, 0xF406F0E8, 0xF405FC09, 0x130612F7, 0x0D07F811, 0x0D03F8F8, 0x0100130C, +0x0CF9F20A, 0xF30406F9, 0x0CF5F4F7, 0x0006F10B, 0x11F2F0F7, 0xE80DF60C, 0xFE02F6F7, 0xF70607FB, +0x130AFCF5, 0xF8F71006, 0x0AFCFDF4, 0xF00E04F1, 0x16F5FCFE, 0xF6FA06FA, 0x09F9ED17, 0xFE051106, +0x0D0CED0A, 0xEDFC14F4, 0xF81012E8, 0x030303FC, 0xF400F8FD, 0xFDF3F407, 0x0B091406, 0x0CFCF6F4, +0x180D110B, 0x0DFBF10B, 0xFBE4FAF9, 0x0B10F417, 0x0608F9F2, 0xF2F2F904, 0xF80306F7, 0x0902F3FA, +0x080EFA07, 0x03F00600, 0xE2ED0DF1, 0x0AFB140A, 0xF50FFAEB, 0x0AE608F5, 0x0DF8FB0B, 0xE7F206FC, +0x050D0BFB, 0x0204FDF5, 0xFBF70706, 0xF4F0F60B, 0x0B07F7FC, 0x01F7F905, 0x0F16F309, 0x0C0AFAF0, +0xFDF2010F, 0x0BFF040D, 0x060E04F2, 0x0FEA0915, 0x0F020AF3, 0x06080E02, 0xFFF906F5, 0xF600F1FA, +0x060E1104, 0xFCEF0CF7, 0x0CF30D14, 0x010F03F6, 0xF9FAF6EE, 0xF6F112FE, 0xF0F302F2, 0x12080FF1, +0xF911F002, 0xF0F6F010, 0x0D02FC06, 0x10F8FEF2, 0xF6FCE703, 0xEA12FC0D, 0xFFF6FC13, 0xF407F0F8, +0x0DF5010D, 0xEA0C08F4, 0x02050AFB, 0x090DF6FF, 0xF2F4F709, 0xF104ED0E, 0x0906F8F6, 0xF8F806FB, +0xF8F20F0D, 0xF8F3F7FA, 0xFE04FB02, 0xF80DF7F9, 0x030EF400, 0x0A05EE08, 0x04EB06EC, 0xF6F50FEF, +0xEF0E03E7, 0x13FE090B, 0xF70FFC0E, 0x120B150E, 0x0712EDF4, 0x0E04EDF8, 0x0D0DF510, 0x080EF3EE, +0x0DF702EF, 0x0902E91A, 0xFD10F4EC, 0xF1F7FA0F, 0xFEFDF4FA, 0xFDF60F04, 0xF10FF20B, 0x031017E9, +0x12EF03FE, 0xF3F6110C, 0xFEF4FC07, 0xF20A08EB, 0x020613F0, 0xF5F6FB0A, 0x07160207, 0x15F5F20B, +0x18FFED0B, 0x0F11F911, 0xFFEF0B08, 0xF3F8F8F8, 0x0AF40B10, 0x0FF70A04, 0x0AEB13FE, 0xEE0B0C0A, +0xF5020605, 0x0A140A00, 0x010EF6F2, 0x1A0304FC, 0x08EB0FFF, 0xF0FDF617, 0x12FC01F4, 0xEC1709FA, +0x0C0C02FA, 0xF90DF9F9, 0xF0F50311, 0xF1100C04, 0xF20200FC, 0xF2141703, 0xFA051100, 0x0D14F8FC, +0x03F2F6FE, 0x04FCF6F6, 0x10FAFA03, 0x0309FB05, 0x09F00DF4, 0x0A08F4F3, 0xF3F5EFEF, 0xF106FBFE, +0x050105F8, 0x0D09F0F8, 0x0E130EF1, 0xFAF00B09, 0x080D11ED, 0xFDF703F8, 0xF8F10AFC, 0xFE04ED0A, +0xF4100B08, 0xF1FCF10F, 0x050E14F4, 0x05070D04, 0x0AEC100C, 0x0D0BFCF6, 0x01FAEB0C, 0xFF0C0DF8, +0x010E0DFF, 0x07F7F70F, 0x00FBF6FC, 0xF9FB0D09, 0xF1ED080D, 0xFCF9EDF4, 0xF3F80C0B, 0xFD0210F4, +0xFBF206F2, 0xF3F5F7FC, 0xF8FDFFF1, 0xF0020908, 0xF804F505, 0xF8F2080B, 0xF0FA09F3, 0xEFF8120A, +0x14EDF8EA, 0x0CF40E15, 0x0EEB0600, 0x02FD01FB, 0xF5F30D0F, 0xFFF400F1, 0xF30F0909, 0xF9ECF107, +0xEE0AF0FF, 0x05FA070D, 0xFD0CFB06, 0xF8F7EFEE, 0x13F0030B, 0x050404F4, 0xEE0FF6F5, 0xFC0813F5 + +output0 = +0xCE63DECD, 0xD5F54E4C, 0xB969BECF, 0x67199350, 0x73BD1B5F, 0xF3FA3DD7, 0xB72F3304, 0xCA6C9E7F, +0xC75EBD3C, 0xE9183BC1, 0xD2EFF1F5, 0xDB98D960, 0x9183FF24, 0x84E53C2E, 0xBC0ACB99, 0x7544F27D, +0x61B01F8C, 0x6F8E7BCA, 0x0F9A1912, 0xA4DE41C3, 0xFB1F18F3, 0x44764A35, 0x9525E193, 0xAD6AFC2C, +0xEAC9CBE7, 0x82E626C3, 0x6764F162, 0xB7180FC5, 0x92F0BF10, 0x6BE2A423, 0x6652CA83, 0x76AB8A79, +0xD2DC0142, 0x3684A5B0, 0x6AF81D1E, 0xCE7B11D8, 0x5C0A7AA6, 0x9B519157, 0xCF71DB9C, 0xE66B5219, +0x0976A858, 0x97CCD7A4, 0xBD21A44D, 0x694DB77D, 0x2046F400, 0x66BF01FF, 0x4FE7F1B2, 0x7D287C99, +0xA6DD65A8, 0xDDAC14DF, 0xB4EA7458, 0x9BF75449, 0xBCCF3BC5, 0x59B3E1D5, 0x04D5FEAA, 0xA91CED07, +0x264A3E33, 0x314BE435, 0x47FB659B, 0xC8C6CBDD, 0xD4BAF083, 0x51A5AE91, 0x39A33C7A, 0xC54DBA59, +0x81FD7FFA, 0xE2A3941C, 0x386750ED, 0x85C6A1CF, 0x52E46581, 0x2DD58578, 0x4F8C20DC, 0xCA6C89B8, +0xD33AF49E, 0xB73D9A1C, 0x8F5992A5, 0x4613FE36, 0x8F724B6A, 0xD2C9A290, 0x5C4791D6, 0x8AA4DE2A, +0xBCA9EEF4, 0x769D6618, 0x71DF1DFC, 0xE9DC6A93, 0x99E831C3, 0x88B8CBD4, 0x4C9E63C5, 0xBEBC2792, +0x9E54A535, 0x55181DEF, 0x0F83F8D2, 0x79A8094D, 0x2DA8AAEB, 0xD64C6C17, 0x4F0AADB5, 0x20CB1D7F, +0x2D6E9F16, 0xB97E8AA9, 0x36167C67, 0x8D84329F, 0x4002AA1C, 0x6326776B, 0xB9B50F8F, 0xF9C52D71, +0x4D1A117F, 0x604A6DEE, 0xBB19DFB2, 0x96121F4E, 0x9E7C8D9E, 0x00F8F1F3, 0x204B8054, 0xA67E9C60, +0xC534F776, 0x94B8C032, 0x38E7CFEC, 0xF1E48A55, 0x821E3625, 0xFAC9EBD0, 0xF3D38EF2, 0xB4DA79FB, +0xF32472 + +harq_output0 = +0x0FFA0103, 0x130C0B02, 0xF309F6E7, 0xF70F07F1, 0xF7090FF8, 0x050409F2, 0xF80AFAF7, 0x00F60EF5, +0x06FC060D, 0x080DFB03, 0xF4EDF9F9, 0xFCF9FEEA, 0x0F0C12F8, 0xF9F31708, 0xF60C02FF, 0xFF110310, +0x0BF80F0F, 0x02F6F2EE, 0xEDF20A06, 0x0709FEF2, 0x14F5F0F0, 0xF70C0018, 0x12020FEF, 0x0602EF08, +0xF40A0200, 0xEE0C0BFC, 0x0606ED01, 0xF2F709F3, 0x15110E10, 0x06EC06F8, 0xFBF10CF8, 0x0314FEF6, +0xF5F4FC0C, 0xF00C00FF, 0xF6FDF9F6, 0x07F30801, 0x0F04F40C, 0x0406F305, 0xFAF9F808, 0xF20DF109, +0x010A0AF8, 0x070AFC03, 0xF108120A, 0xF8F9F1EC, 0xEEEB09FF, 0x140C0D01, 0x04E5EF10, 0xF616130C, +0x0314F4EC, 0x09FA09F2, 0xFAFAF714, 0xFAF101FD, 0x06030FF4, 0x17F3EFFA, 0x09FEF109, 0xFDFEF9FB, +0xF2080B02, 0x0CF90B07, 0xEB0F0D06, 0xF71009FE, 0xEF110AF8, 0x0AF70BF9, 0x170A1508, 0xF8FDFAF1, +0x0204F3EB, 0xEFFE0315, 0x0C06000B, 0xF10C0A0E, 0xEC0EF9FC, 0x08F0F2F3, 0x09FD02F7, 0x0B11F610, +0xF8F1F8F7, 0xF8FB0A09, 0xFB030A13, 0x040804F0, 0xE8080813, 0xF1F4FFF3, 0xEBFCEDF7, 0xF7F00AE8, +0x00F1160E, 0xF007F301, 0x0E13F211, 0x07F815F4, 0xF9EEF70B, 0x0EF7FE15, 0x0706E80C, 0x0611F60E, +0xFB0B0CF5, 0xF4F50E11, 0x14FDF1EB, 0xF403120A, 0x09F80303, 0xFB0AF80B, 0xFA1408F5, 0xF503F717, +0x0FFB1610, 0x1107F3FC, 0xF1F4F7F7, 0x060EF4E8, 0x04F8F5FF, 0x04F30CFA, 0x10F008F8, 0xF514EEF3, +0x0EEDE8FE, 0xE7FEE70B, 0x0404FEF9, 0xF8F509F9, 0x0A0EF6F2, 0xF8080EF8, 0x01F200F3, 0x03FC19F2, +0x0D0FF2F8, 0xF9FD0C13, 0x11FE0703, 0x0BF9F110, 0x0EF3FEFD, 0x0EF8F10C, 0x0A070FEA, 0x04FA0310, +0x0CFE0003, 0x0CF3060D, 0xFBFCF5FA, 0xEC0D1108, 0x09ECF70A, 0x0C0EFB08, 0x0BF4F80A, 0xEFF0FB0C, +0x0B09F8FA, 0xFA16FF13, 0x0B081512, 0xF4F2FBF7, 0x000C0A07, 0x130C0FEE, 0xFEF908FB, 0xF6F5F912, +0xF1100409, 0x090E1606, 0xF4F50BF3, 0xEE00F7F9, 0xFAFBF5F6, 0x07080B0A, 0xF1150BE7, 0x0DF80912, +0x12EF0809, 0xEBFF1108, 0x0BF60DFE, 0x130DF608, 0x12EFF2F1, 0x04FB0C0B, 0x01FDFC09, 0xFAF808F9, +0x12020B01, 0xFCED060F, 0x040DFFFF, 0x04F80AF3, 0xF700F60B, 0x08F40E08, 0x06F7F80F, 0x0DFDEF04, +0xFDEFF916, 0xF21107EF, 0x0A1110F1, 0x03F70DF3, 0x08F50300, 0xF1F711F9, 0xF6FCFF0C, 0x0CFFF704, +0x080CFE09, 0x0FF80D06, 0x05080C08, 0xFE020210, 0xFB11F6E9, 0x060BF2F1, 0xED0BEAF9, 0x02F30C02, +0xF8F40DFB, 0x020D0D01, 0x0CF406F1, 0xF302F812, 0x080C0EF2, 0x06010006, 0xF0FA0908, 0x08F9F905, +0xFB0A0508, 0x0FF0F7F4, 0xFF081210, 0xEE18F6F1, 0xF9F9E8F2, 0x060B09FD, 0x0AFEEE04, 0x09F304F8, +0xEA05F6F8, 0x1C0108F5, 0xF205120F, 0xF40D0A04, 0x0001F30D, 0x00FF0DFA, 0x020BF7F7, 0x02F2F7F0, +0x04F90BF1, 0x01EFEE07, 0xEBE4F807, 0x0AF90FEF, 0x0F040B11, 0x0BF91000, 0x000CF812, 0x0311F3F0, +0xF8070218, 0xEDFFF614, 0xF00C15F1, 0x000D0F16, 0xFA0EF707, 0xEE080901, 0xFF0C09F5, 0xEEF704F1, +0xF10C10F9, 0x060BEBF7, 0xFA0EFDF6, 0xF7F403F2, 0xF5F0F306, 0xEC081A0F, 0x020AEEF5, 0xFBF9F7FB, +0xF60C010A, 0xEC0E0FFF, 0xF014FB10, 0x0EFD0308, 0x04F30015, 0xF4FC0CEE, 0x0CFEF3F7, 0x12F0F702, +0xE803FB07, 0x040D06F5, 0x05FA07F1, 0x140A0BF8, 0xEFEDFF11, 0x01EFEE13, 0x0D0C0B0F, 0xE70105F0, +0x01F70CF4, 0x0603EE12, 0xED08EDF9, 0xF2FCFA02, 0x0E0CFCF3, 0x0E04F8F9, 0xF30D17F9, 0xFEEDFB05, +0x071BF114, 0xF309F7F4, 0x02F503F6, 0x0815F400, 0x0CF0090A, 0xE80D0F02, 0xF9FCFDF8, 0xF00FFEF5, +0xF3F5F70B, 0xFC10F7EF, 0xF2FB0AFE, 0xEEECEC15, 0x0202F60E, 0xF310FEF9, 0x10F8F209, 0xFB0606EE, +0x0D0B0C10, 0x1110080C, 0xFCF2F8F6, 0x030DEE07, 0x0C11F511, 0x0CF6EF08, 0x0900070C, 0x0C160E0F, +0xEEF8FFF9, 0xF7F0EEF5, 0x0A090903, 0xF70A000E, 0xF5FF07F6, 0xF5E5FEFD, 0x08F1F80C, 0x00F2EE0D, +0xFAED07EA, 0x07EA170B, 0xFEFFECFF, 0xED0B0211, 0x0AF4F4E6, 0xF2FAF705, 0x0807F706, 0xFBF2F8F7, +0xF31105F7, 0xF10809FB, 0xF1FEF307, 0x0805FFFA, 0x08FC070D, 0x0A071200, 0xEEEDF107, 0xF908EDFB, +0x09F60FF2, 0x0B0C06F8, 0x07FCF608, 0x000FF30C, 0xFF0EF3FD, 0xE40BFCF4, 0x0CF50BF4, 0x04EDE90D, +0xFD05F3F1, 0xFAECF4FA, 0xF80C080F, 0x0A0BF70A, 0x07F012F4, 0x1109FEF3, 0xF507F9F1, 0xF513F7FD, +0xFE0AF80F, 0x041701F1, 0xF5E7F309, 0x0A0AF70C, 0x0E00FEF1, 0x04E505EF, 0xF4EF0BFD, 0x040CF807, +0x1201EF07, 0xF31508F1, 0xF908F309, 0x0B0EE409, 0xF7EBF9F8, 0xF1F7F406, 0xFB0206F6, 0xECFD11F2, +0x0702EEF6, 0xF409FC04, 0xEEF80010, 0xF3EC0BF0, 0x090600F1, 0xF9F5EBF7, 0xEEFE11F8, 0x070BF0FA, +0xFE16EEF8, 0xF108FD05, 0x15FAF3F7, 0xF60E0D0D, 0xF7FC0AF8, 0x01F40805, 0xF70AFE01, 0xFB0F0BF9, +0x04E701F6, 0x09F517F6, 0xFBE8F5F8, 0x11FE00F6, 0xEF08F2F5, 0xFB0CFB0F, 0x0419080B, 0x0308EE11, +0x07110907, 0xF2F5ED0F, 0x0BFAFEF6, 0xFA12F8F9, 0xE8090606, 0x0E0CEAEC, 0x06FD10F8, 0xF80505FD, +0xF1F70912, 0xF5EF0C0B, 0xF9EF0B0B, 0x0D05F5F2, 0x0A08FF0E, 0x09F50300, 0x08F91314, 0x0AFEF60A, +0xE5FC0504, 0xEF0A000E, 0x06FDFFF1, 0x0D11F103, 0x080CF512, 0xF9F501F2, 0xFAF60708, 0xFE140D05, +0xF90202EF, 0xF0FD0EED, 0x06F2E903, 0xE904F80D, 0xF600F8F8, 0xF4FA09F5, 0x0803FA07, 0xFCF9F90B, +0xF202F4F5, 0x000EFBFE, 0x0409FAFD, 0xF0EA0DF4, 0x0B0D00FF, 0x03F8FB0D, 0x0307FAF2, 0x010C0BFB, +0x140C03FD, 0xF4FE0906, 0xF6F6F8ED, 0x0B11090D, 0xF6F90EF8, 0x09F001E8, 0xEC0600F8, 0x1109F90E, +0xEA010BEF, 0xEF0A0C0A, 0x07F510FD, 0x08F3F500, 0x07ED01F5, 0xF313F60A, 0xF803FA0E, 0xF60B0D08, +0xF1F0F709, 0x0DF609F4, 0xFCED020B, 0x0E0EEDE9, 0x08F907F2, 0xF1FC0C13, 0xFFFB0C06, 0xEB070AF7, +0xF606F80A, 0xF90E1EFF, 0xF6EE0BF5, 0x05FF03F7, 0x0F0DF309, 0xFA0CF4F8, 0x1F0CF6F3, 0xF50DEE0F, +0xF5F7FDF4, 0x0BF501EF, 0xF7FA000F, 0xECFAF0F5, 0xEA02FEF1, 0xF80FFCFC, 0x100B0600, 0xFF050501, +0xFA150716, 0x110FFFF4, 0xEE0B04F8, 0x0E0FF112, 0x12F80BF4, 0xF6F41604, 0x07EDE6EF, 0x17EE0F0B, +0x05F5FEF2, 0xEF0BFEF5, 0xFF07FD15, 0x01090709, 0x02EBEE0D, 0xF6F9FB0D, 0xEFF6070E, 0x090806F6, +0x140FFEF1, 0xF6FCEEEB, 0x07EF14F2, 0xFB03040B, 0x0A05F4FC, 0x0DF6FB0D, 0x060B02F8, 0xFF0FFB0E, +0x090709F7, 0xF7180F02, 0x0BF8F005, 0xFE0CF60D, 0x09F4ECF0, 0x0410F30A, 0xEB05F105, 0x05F90C11, +0xFCF1F30B, 0x120B0BF3, 0x031104FC, 0x030BFC0F, 0xFB09EFFC, 0xF50CFB11, 0x0BF80504, 0xF609FCF7, +0xFE0CFB00, 0x0F08F7FB, 0x0BFD0609, 0x0E120F15, 0x020B07F8, 0x0714FAF0, 0x0615F308, 0xF2FDF8F9, +0xEEF606F8, 0x050906E8, 0x071106F7, 0x000C03F8, 0x04F9F90A, 0x060BF5F7, 0x0D0CF2F7, 0x06FB02F7, +0xF7060AF5, 0x0EF1FCF4, 0xFAFAF5FE, 0x0506F917, 0xFCF40C0A, 0x03FC10E8, 0xF30700FD, 0xFCF40906, +0xFB0B0D0B, 0x1017E4F9, 0xF20408F2, 0x02FA03F7, 0xF0000E07, 0xFB0AEDF1, 0xE6F50FEB, 0xF2FCF80B, +0x04F50DFB, 0xF00BF706, 0xF70507FC, 0x0AF01609, 0xFF0DF20F, 0xEA150EF2, 0x080202F3, 0x00FAF9F5, +0xEFF70E04, 0x0FF6F314, 0xF1FEFAEE, 0x08F1F3F2, 0xF6101102, 0xF8F20206, 0x120DFC03, 0x07F8F613, +0x0CF4F50D, 0x0DFF05FB, 0x040EF409, 0xF8FB06F6, 0xF3FAF20D, 0x0DF90402, 0x05080E00, 0xF5EFEBEC, +0xFE0B0EE7, 0x0B0E0F0E, 0x04F812F4, 0x0EEE0D10, 0x021AF7EF, 0xF70F10EC, 0xF604FDFA, 0x10E90F0B, +0xF60CEFFE, 0x0AEBF407, 0xF60A06F0, 0xF50B1607, 0x1111FF0B, 0xF8F8EF08, 0xF704F410, 0x0B0AEBFE, +0x14000205, 0x03FC0EF2, 0xFD17EBFF, 0x17FAFCF4, 0x0DF90CFA, 0x1004F511, 0x140302FC, 0x14FC0500, +0xFCF6F2FE, 0x0905FA03, 0x08F3F0F4, 0x06FEF5EF, 0x09F801F8, 0xF00913F1, 0xF7F80DED, 0x040AF1FC, +0xFC0F1008, 0x07040EF4, 0x0BF6EC0C, 0x0CF8FA0C, 0xF70F0EFF, 0xFB09FBFC, 0xF9F4ED0D, 0x02F4F80B, +0xF5FCF2F2, 0x0208FDF1, 0xF20B0405, 0xF80AFAF3, 0xF415EDEA, 0xFDFBEB00, 0xF4F1F30F, 0xEC070F09, +0xFA0D0AFF, 0xF7EE0C06, 0x04F4F00B, 0x08F50FF5, 0xF50EF3FC, 0x1006E7F9, 0x04F7F7FC, 0xFC070CFB, +0x0F12EAFA, 0xF7F00706, 0xF4011505, 0xF7140B09, 0x0AF9F1F8, 0x03060DF8, 0xF2090CF8, 0xF20712F3, +0xF903EFEE, 0x1102EC14, 0x0A09F1F6, 0xF9F001FA, 0xF8FE01FB, 0x140410F1, 0x0B0402F2, 0x0F0006F5, +0x0805ECF9, 0xF409F10E, 0x0DE7FD01, 0xEFFD0710, 0xF20403FD, 0x0BF2F6F9, 0x0004F909, 0x0F09FFF6, +0xF3060DF2, 0x0EEF060E, 0x0CF40705, 0xFDF7FB0C, 0xF4F203E4, 0x0E09F4F6, 0xF5FE04F9, 0x06F3FEFE, +0xFDFB1102, 0xFD04EE0D, 0x0DFBFCF1, 0xEE14E90B, 0xFB0CEE09, 0x0C13F108, 0xF60703FD, 0x0BF4FCFA, +0x14F2F0FB, 0xFAF9EFF7, 0xF5010801, 0xF109EEF3, 0xFF0A0514, 0x0C0604FF, 0xFB0EF704, 0xF50EFD0B, +0xFF05F4FA, 0x07E70B0B, 0xEFFEF4FD, 0x0D0807F3, 0x05100DF6, 0xEFFA1A08, 0x020D090A, 0xFFF5F7FD, +0x1513F10A, 0xF10BF2ED, 0x0B0F150B, 0xF10306FA, 0x09FB11EE, 0x061007F2, 0xF7F8FB14, 0xF90704EE, +0x0AF8EAF6, 0xF7E809F9, 0x02F609E9, 0x09E802EE, 0x03F50BE8, 0x040C04F1, 0x0CF41009, 0xFB00EEFA, +0xFC071611, 0xF9F1F203, 0x0BF0F409, 0x0214F801, 0x0A0AF504, 0x0508F5F1, 0xE916E900, 0x07F4F60A, +0xF9F010F2, 0xF906F507, 0x0BFB0AF4, 0xF408F0F1, 0x0EFD0A06, 0x03F80AF6, 0x130CFD0C, 0xF1E9F7F8, +0xF800F502, 0xFEFDFDF4, 0xF90B0713, 0xF506FAFD, 0x0712F9F2, 0xEAF20DF5, 0x10F40D0D, 0x06050B09, +0xF706090E, 0x0F00ED11, 0xF90E02F4, 0xF1FEFCED, 0x0AF5E00D, 0x06F7F3F9, 0x08F81206, 0xF30EF4F5, +0x12FF02EF, 0xF7040DF4, 0x151204F0, 0x04ED07EC, 0xF0F3FB05, 0x08F2FCF4, 0xECED11FA, 0xFC110DF8, +0x0BF4F90A, 0xFCF9F905, 0xF0010014, 0x0A0EF9F8, 0xF4020C02, 0x10FDFA13, 0xF5000B05, 0x05EAF808, +0xFE0F04F3, 0xFDEFF9EE, 0xF9F9090B, 0x10F20E0C, 0x060909F0, 0x060EF40F, 0x0E0705F5, 0xFB05F6F9, +0xFA1C0512, 0x0B10FBEB, 0x16F20DF6, 0x090012F4, 0x0A13020B, 0x0EFF0C0A, 0x130DEF0C, 0x070A0B04, +0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, +0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, +0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, +0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, +0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, +0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, +0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, +0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, +0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, +0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, +0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, +0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, +0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, +0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, +0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, +0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, +0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, +0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, +0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, +0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, +0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, +0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, +0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, +0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, +0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, +0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, +0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, +0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, +0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, +0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, +0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, +0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, +0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, +0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, +0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, +0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, +0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, +0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, +0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, +0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, +0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, +0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, +0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, +0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, +0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, +0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, +0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, +0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, +0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, +0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, +0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, +0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, +0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, +0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, +0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6 + +basegraph= +1 + +z_c= +176 + +n_cb= +11616 + +q_m= +2 + +n_filler= +8 + +e= +4640 + +rv_index= +0 + +code_block_mode= +1 + +iter_max= +20 + +expected_iter_count= +20 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE + +expected_status= +SYN diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_1.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_1.data new file mode 100644 index 0000000000..63c2d3b618 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_1.data @@ -0,0 +1,684 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0xF30110EF, 0x09FB0E0E, 0xFB0BF902, 0x10FF060C, 0xF70A10FB, 0xF007F709, 0x0CF30FF1, 0xFC0B07FB, +0xEA0FFA0D, 0xFB0B1209, 0x0709F1F2, 0x0BF1F004, 0x000EF10B, 0x08F8010A, 0xF70E0909, 0xF7EC00F6, +0x05F2F8F9, 0x0A060D10, 0x0DFB0CEF, 0xEFF4F2F9, 0xF80DF8F9, 0xF20809ED, 0xFDFEF3FE, 0xF2FC07F9, +0xEF12EEF8, 0x0D0FEF0C, 0x011714F4, 0xFDF902F3, 0x05020A13, 0x0A0BF5F8, 0x1517FA10, 0x0DFF04FD, +0xED0F0FFB, 0x0C0B12F8, 0x10F205EE, 0x14EEF0F6, 0xEEF50606, 0xF701F006, 0xF2120906, 0x0FF31409, +0x0004F9F0, 0x080005F5, 0x05000E18, 0x080BF50C, 0xE9FA01EF, 0x0DFDE702, 0xF303FC08, 0x0306FDED, +0x0302FD15, 0xF2F404F6, 0xF60B0DFC, 0xF702F2F8, 0x0D0109ED, 0xECF2F006, 0xFFF50AF3, 0xFB0609F7, +0xF9FAF2FC, 0xF3010611, 0xF2F20EF8, 0x0EF203EC, 0xF30C050D, 0x0CFB0905, 0x10EAF80A, 0x1103F714, +0x17FCE4F8, 0xF409F2F4, 0x09000A13, 0x0EF009F8, 0xF00DF90A, 0x0AF612E9, 0x12F4FE15, 0x06F3F307, +0xFDF4EEF8, 0xFDFBFB04, 0x02F30DF1, 0xE9F0F006, 0x10F80508, 0x0DFAFBF9, 0xE9F10B09, 0x020600F9, +0x020AF50C, 0x0FED0C0A, 0x05FCF403, 0xF8F3FFF6, 0x0312FD0A, 0x0A05F308, 0x10F10E00, 0x0B0CF40D, +0x04090FFF, 0x1402F2FF, 0xEF0D0B01, 0x0E00F9F8, 0x08040110, 0x0A04EDE5, 0xEE13080C, 0x05F6F516, +0x05F414EC, 0xFF030A00, 0xF0F5FF06, 0xF809F20E, 0xF70CF014, 0x0FFAFA0E, 0x1201F611, 0xE10E0EF1, +0xF40FFA09, 0x13F2F103, 0x0B030B0E, 0xF303FCF3, 0xF405FD09, 0xEF09FEEA, 0x07F908FB, 0xF9FD08FE, +0xF9F7F602, 0x0506FCF4, 0x060BF4F3, 0x040C0E0D, 0xF5F9F606, 0x02FF0DFB, 0x0BF51112, 0x13F7F5FB, +0xF10AF6F8, 0x15031311, 0x07F7ED0D, 0x050AF7F7, 0x0101F708, 0xF717FBF6, 0x06FAFA05, 0xF1F8EF11, +0x11070200, 0x09EEFB04, 0x07EF0601, 0x0603FCFE, 0x0FEC140B, 0xF7F7F806, 0xF00A02FA, 0x0E06F30C, +0xFEF90A10, 0x0AECF80E, 0xF5F2F907, 0x0B08E804, 0x0902E9F7, 0xEE09F6E9, 0xEEF60210, 0x09F7E8FD, +0x0B0CFC0B, 0x030C0905, 0xF0F6F109, 0xF0F8F8E7, 0x100A0913, 0xF8FB0817, 0x0204FA04, 0x0FF00008, +0x02F4FD13, 0xFCE8F208, 0x06EBEF07, 0x0DF1F1F4, 0x0801F5F7, 0xF7EB04FC, 0x0C0A15E8, 0x020B1404, +0xF502EF0E, 0xF600F6F1, 0x090705EC, 0xF1F008F2, 0xFDF2EC11, 0xE90E02FF, 0xF615F6F4, 0xF3F3F4F8, +0xFC0BF20B, 0xF9F90402, 0xF512F301, 0xF90E06F7, 0x0AFC080C, 0xF707FB06, 0xF0F6F1FA, 0x0806F4FD, +0xF6F8F10A, 0x0EFBFDF7, 0xF60EF6FD, 0x0308F809, 0x11050CFF, 0xFF140CFD, 0xF7FEF80A, 0xF1F4FD03, +0xF5EF0203, 0xF8F514F8, 0x11F808F7, 0x12FBFD0A, 0xF3F41309, 0x0D0FF700, 0xFA0B1103, 0xF50A06EF, +0xF902F210, 0x070FFEFB, 0x0D070910, 0xEA11F207, 0x0D0B0D0B, 0xFCF1F408, 0xF70809E8, 0x06F2F10E, +0x1DF5FAEB, 0xF7F0F20C, 0xED0C110E, 0xFBF000F3, 0x0208080D, 0x0DFCFAF0, 0x11EE0107, 0xF109FE00, +0xF4FCF9FE, 0x0AFAF501, 0xF3E7F90B, 0x06E70B12, 0xFDFE06F9, 0x08F00C04, 0xF409090D, 0xF30C0EF5, +0x02F6EF06, 0x12F6EB0E, 0x0DFA09F8, 0x0BF8EFF4, 0xF015F007, 0x15ED1206, 0x07050006, 0x18EF0111, +0x0FF2050C, 0x05F9070F, 0xFCF80813, 0xF3F90611, 0xFDF30EEF, 0x00FC0112, 0x0DF1F8FC, 0x10F7FDF9, +0xF9EA0AE9, 0xF70E0807, 0x0DF105F8, 0x100E0DF8, 0x140F14EA, 0x04F60107, 0x0D030C10, 0x0AF0F9FA, +0xF814EE17, 0xF4F802FE, 0xFA06FFF9, 0xFCF811F3, 0xF6F5050E, 0xF5FB00FC, 0xF811F4F3, 0xF0ECEA0D, +0x04F7070A, 0x12090F00, 0xF9FBEEF3, 0x11F8030E, 0xF5F8F7F6, 0xF90BF908, 0x0E0FF80C, 0x10EF06F0, +0xF5F804FA, 0x06F70909, 0x08EB0F13, 0xF20E0E16, 0xF11509FE, 0x0E0BF3F4, 0xF60F0E0B, 0xFBF405F2, +0x050AFDF3, 0x0EEC1C0C, 0xFBFBEB02, 0xF71310F8, 0xF9080BFB, 0x1612F2F9, 0xFE0DF412, 0xF50A0009, +0xEEF0F7F5, 0x0AF11310, 0x0C02F61B, 0x0EF4FF0E, 0x03F7F8F3, 0xFF08F909, 0x0B0BF00D, 0xF3EE0A00, +0xF0F504F6, 0xF70EFC0F, 0xF70B0BF6, 0x16F313F4, 0x060BF5E7, 0xF9050515, 0xF00908FE, 0xEB0D09F8, +0x0C08F309, 0x0512F303, 0xEEFCF308, 0x03FF1013, 0x02F9F412, 0xFD0B10F6, 0x010A14F4, 0x091307F9, +0x06F206F1, 0x04FE0B03, 0xF90C07F7, 0xE40400FB, 0x0BE81AF5, 0x1301F4FD, 0xEBF4E70D, 0x060EF4F8, +0x06F7F9ED, 0xF1FEEE02, 0x13F20DFB, 0xFAE7F9ED, 0x09FF0A13, 0xF304EDF9, 0x050AF807, 0x08F0EFF8, +0xF5F607F7, 0xF8F71400, 0x170E07F4, 0xF8F41308, 0xEFF80C0F, 0x1EF2FCF7, 0x07EF08F0, 0xF10D09FD, +0x11F9F002, 0x0411F2EF, 0x09070E03, 0xEFF2F0FC, 0xF310FDF1, 0x090AFBFD, 0x040DF407, 0xF317F2F7, +0xFCEF1CEB, 0xF00800F5, 0xF01109F9, 0xFCF1000B, 0x16FF0FF8, 0xF9F6FD10, 0xF80B0D18, 0x160CF713, +0x06FE0BF5, 0x0D08F80C, 0xF4F9FB06, 0x03FBFAF8, 0xFF0C0D08, 0x03F1FD08, 0xF4EE0E10, 0xF4EAF1EE, +0xF7F6F2FD, 0xF90FEB11, 0xFA0606F1, 0x0E06F6F7, 0xEDEAFA0D, 0x09EDF30B, 0xEF0CF202, 0xFEEEF4F3, +0x000DF40F, 0x0FF803F4, 0xFB0DFCEC, 0x0D02EB0D, 0x01060E05, 0x1F0CF0F4, 0x0E0C0712, 0xF9071402, +0xFD0E07F2, 0xF2F4F60C, 0x02150BF2, 0x1106E901, 0x07F50B08, 0xEEF017E6, 0x00F903F0, 0x10F4FD0D, +0xF505F7F4, 0x090F040A, 0xFC0BEE08, 0x050F15F0, 0x07FEFFFC, 0x09EB0F08, 0x110A04F1, 0x12EEFC03, +0xF0E8F106, 0x100DF9F9, 0x07F500FD, 0x0AF208F7, 0x12EE00F0, 0x010A0A12, 0x01EFF5F8, 0x12090BF3, +0xEDF601F8, 0xF7FEF005, 0x04F40EF5, 0xFB1C06ED, 0xF3120BFB, 0xF006FE05, 0x130AFCF0, 0x0A0807F9, +0xF907ECF9, 0xF600F701, 0x03F9EDFA, 0x0714F8FF, 0xEF0B0F0B, 0xF216F9F7, 0x10F70A04, 0xFAEEF4F2, +0xFA0B04F1, 0x02040AF9, 0x13020DF3, 0x08150603, 0x0FF804F3, 0xFFEB0BF8, 0x050FF8EF, 0x08F607F9, +0x03F7F3FD, 0x04FBF5F0, 0xF910ED00, 0x05F7EE0D, 0xF30C0A12, 0xFBECFEF7, 0xF2F30BF0, 0xF203F9FD, +0xEC16EB04, 0x03E4FEF3, 0x03F60200, 0x0802F4FF, 0xFE010A05, 0x06F0170C, 0x050F0C02, 0xFEEC100D, +0xFAF7F307, 0x04FA10FA, 0xEFF5F901, 0xF5020808, 0x0809F2F5, 0x03FF09F8, 0x0604FC05, 0x01EE02F7, +0xF4FC15F9, 0xFD05F70C, 0x0FEB05F7, 0xF9F2080B, 0x0C11EEF6, 0xFBFAF00E, 0x0D030BF2, 0x0BF7FDF4, +0xF1F30A06, 0xF7F5F9F0, 0x031AF90F, 0xF8000608, 0xF4EEF509, 0xF20202F6, 0xFA0B050F, 0x0F0F070D, +0x09EDF8F6, 0x040AFAF7, 0x0B0F04EB, 0x08ECF8FA, 0x0EFB00FC, 0xEDF00300, 0xFD03F8F4, 0x0AF90411, +0x0B001401, 0xEFF0FCF3, 0xFFF8FEEE, 0x0508F2FC, 0x0EF3FB0B, 0xEC0CF6FE, 0xFD0B0702, 0xFEFE0404, +0xFB0F0DF3, 0x0AFCED03, 0xF4F20709, 0xF2040FF9, 0x0A070005, 0xF4F1030E, 0xEE0BF20C, 0x1514F1F6, +0x0D130B11, 0xF5030BED, 0x11EEFB13, 0x02EDFE03, 0xF8F7F80F, 0xF3F9FBF8, 0xF5051604, 0xF7FBF001, +0x0A0C0408, 0xF6ED07F7, 0x1A020DFE, 0xFD060C18, 0xF5010BF9, 0xF6ED0308, 0x04FAFA16, 0x0D060FFC, +0xEFFCF7F3, 0xF50EF5F8, 0x0F0CE90E, 0xFB0E13F0, 0x0517F30D, 0x0CF302F9, 0x0C0FF705, 0xFBFE0501, +0x0905FF00, 0xF9F3F81B, 0x0D0BF0F4, 0xF10712F5, 0x0303F80A, 0x0EEE0509, 0xFDF4F600, 0x16F4FE01, +0xF509F70A, 0xFA0C0A04, 0xF60FF902, 0xF3FC02F9, 0xF4FDEE0C, 0xFC0D0710, 0x0AEA0009, 0x0AF0040F, +0x090BEEF7, 0xFFF3F4F5, 0xFDF718EF, 0xF8FCF7FC, 0xF70AEA12, 0xFC0601FB, 0xF4EC0F01, 0x0F021100, +0xF70A080E, 0x0D02F702, 0x08FE090D, 0x0DF3F6FC, 0x0FF20809, 0x0DFCFD0C, 0xFAF20EEE, 0x10FB1206, +0x150CF410, 0x02F9160B, 0xEBF4FB0C, 0x04FDFCFC, 0x09F8FE0B, 0xF7FCFC06, 0x0D02F9F3, 0x0CEF08F9, +0x0509FC11, 0xF80CEB11, 0xF2EFEEF3, 0x07F8080A, 0xF8F30C0C, 0xFC091400, 0xF10E110F, 0x0CF80616, +0xF913F20D, 0x08EE090D, 0x0902FF09, 0x0C0BF8F0, 0x0A09F8EF, 0x0D0AF5F5, 0x0E1412FA, 0x05F7EAF6, +0xF807050A, 0xFCF5F613, 0x0A120BFD, 0xF509ECE5, 0x0D0D100C, 0xF2F30805, 0xED02040D, 0x0900FB06, +0xF4070EFE, 0xEFFAF7ED, 0x1017F60B, 0xF807F6FE, 0xF100F9FF, 0x0912F413, 0x0E020BFD, 0xFF02FCF6, +0xF308ECFA, 0x020A0AF4, 0x09F7FEF1, 0xF406EAFA, 0xF7F70D1A, 0xF708EF07, 0x100CFC0B, 0xEFFBF4F2, +0x0E05FDF7, 0x07F3FDFD, 0x0109000F, 0x0D0606F4, 0xFAF3F307, 0x13F1F4FE, 0x01EBFEFA, 0xFF08F005, +0x0707F00D, 0x0808FC10, 0xFC120514, 0x09F600F3, 0xF7060907, 0xF502F8ED, 0x10010C0F, 0x0C0DFC08, +0xFB0FFCF2, 0xF709F7F6, 0x08F2F40C, 0xF70BF6F8, 0x03F608F4, 0x051BF9FC, 0xFF07080C, 0xECECF6FB, +0x0BF307FD, 0xF213F7FA, 0x03FCF5F4, 0x04F8FEF7, 0xFBF7FEF4, 0xFC0C0209, 0x13E901F9, 0x02F0F401, +0xF5F30E05, 0xF111F6F1, 0x0008E4FA, 0xF9FAFAEC, 0x07F4090F, 0x0EF8FBF8, 0x000BF70A, 0xF5F608F7, +0xEC1207F4, 0x04070AF0, 0x01FEFAF3, 0x13FD03F5, 0xF80E09F1, 0x04090907, 0xEAF70FE9, 0xF10904FF, +0x0A0C090F, 0xF7EAF0F6, 0xF7010406, 0xF8040B03, 0x0007FE09, 0x13F5F8E7, 0x0CF7F30C, 0xFA0AF5F6, +0x09FE0AF1, 0xF1FA0314, 0xF3190A03, 0x12F0FAE5, 0xF80BF911, 0xF6F411EF, 0xF40C03F3, 0x02F0F1F8, +0x0F03ED07, 0x0A1204ED, 0xFEF4F205, 0x0AF3FF01, 0xF7F3FDF5, 0x05F9FBF4, 0x03F8F309, 0x0F0BE90E, +0x09F90BF8, 0xF6F7EAEB, 0xFEF40706, 0x12F10F0B, 0x06F2F2F6, 0xFAFB14EE, 0x0E11FBF2, 0x0EECF811, +0xFAEEFCF6, 0x0E07FD16, 0x0D100AF0, 0x0E08FC09, 0x0500EF10, 0x12EE080D, 0xF9F700F0, 0xF7070DEC, +0xE500FB05, 0x0C090E06, 0xF5EB030B, 0x0F0D0DF5, 0x00110A0C, 0xF6020912, 0xF504F9FA, 0x0DF303F7, +0x1002060C, 0x0FEAFB02, 0x0A1108F1, 0x0505F608, 0xF807EFF7, 0xED0107FA, 0xEE0D0A0D, 0xF9F60C0E, +0x10F60A0C, 0x0BF71611, 0xF6F407F1, 0xFD010708, 0x0DFE0101, 0x0EF7FFF6, 0x04F7EBF9, 0x0C0FEF0F, +0xFD010B0A, 0x11EFF5E7, 0x0C02F5F6, 0x08090B09, 0xFE09F5F8, 0xFF0F14E8, 0xF40013F6, 0xF1FDFAFE, +0x0006F6F5, 0xFAEF0108, 0x0F0FFC0F, 0xF01009F8, 0x0AF4EF0B, 0xF304FB19, 0xFEEE0EFD, 0xFEEF0908, +0xF3F5F507, 0xF7071011, 0x0C0111FB, 0x04F20909, 0xEF13F20A, 0x040BEEFA, 0x0F0CF1F9, 0x09FAFC12, +0xF4F2F9F2, 0xFEE80B09, 0x0AFEFC00, 0x08FAF1F8, 0xF5FCFEF8, 0x03F20AFD, 0x0FF1F4FD, 0x13F8FA05, +0x0A09FE12, 0x07F100F7, 0x07F8F50B, 0x07091503, 0x08F7F00B, 0x06F9FDEF, 0x08F5EEF2, 0x0F0D0C05, +0x02FF0D0E, 0x190A0E08, 0xF4EEEB00, 0x0809EDF5, 0xF1130914, 0x0D080DF9, 0xEFF6000A, 0x020A10FE, +0x08050AF0, 0xF5E50610, 0xF7ECF0FA, 0x1004101E, 0xF7FFFB05, 0xFE0602FD, 0xF6F1F7EF, 0x090DF811, +0xFF090412, 0xF9F402F8, 0x0301FE06, 0x160DE009, 0x1AF30008, 0x12FAEAF6, 0x0FF8FFF1, 0x13FE0E14, +0xF2EEF903, 0x070D0202, 0xEFFAFCED, 0xF1F00BFD, 0x04E9F103, 0x01F20EF2, 0x150CF60D, 0xF6E9EF04, +0x05F810F8, 0xF50A0A00, 0xEF090D09, 0x05F40DFA, 0xF4FAF61B, 0xF9F408EF, 0x0B0DF00B, 0x0FFC0F0D, +0xF608FCF5, 0x04F2F7EE, 0xFA0FEE12, 0x0700F90E, 0x070FF911, 0x02F0EEF5, 0x01F905F4, 0xF604F9FE, +0xFC1404EB, 0xF10BFFF9, 0xEBFB0CF9, 0x0817020C, 0x0C0EF306, 0xF1030EF3, 0x05F7080F, 0x03010EF8, +0x0CEFF9FD, 0x0C14F6F8, 0x0EF5F5F2, 0x08F4F212, 0x090CEF01, 0xEF0AFEF6, 0x0A09060D, 0xF9F7FB11, +0xF6F9F50C, 0x14F6F60D, 0x0DECFEE8, 0xF60914F0, 0xF814F40C, 0xF5EC1106, 0xEF0D00FA, 0xF0FDFA09, +0xFCF70BEF, 0x11EA0301, 0x0BF805F6, 0xF103090A, 0x11FCF0FD, 0xF4F3FDF5, 0xF6F5F100, 0xF8F40BF3, +0x0DEC0BF5, 0x14F316ED, 0x070A0CF6, 0x11F30513, 0xF8FA0B0E, 0x0DF8EDEF, 0xEE0D07F4, 0x100A050B, +0xF5F7E2F5, 0xFCF1EFF0, 0xF309F6F4, 0x080D120A, 0x0BEEFDF7, 0xF21010ED, 0xF0ED0BFE, 0x040EFA0E, +0xF5F30806, 0xFDF408F9, 0x0EF8EAFF, 0x060503FC, 0x0CF705F2, 0xF413F9FB, 0x06F608F7, 0xF5FFEE07, +0xF4F80FF6, 0x0C0AEEF2, 0xFB1E06FF, 0xF40DF8FA, 0x160B0909, 0xFCF6F0EE, 0xF403020B, 0x04F10713, +0xFDF3FDF5, 0xFDFAFBF9, 0xF808060C, 0x0BFAF40C, 0x01F6EB07, 0xFC0BF7F8, 0x070209FB, 0x0809EBF9, +0x04FD0B08, 0xECF5F90B, 0xF31500EF, 0xF8F7E9F5, 0xEE00F5FB, 0x1C0B0CFA, 0xFCF00809, 0x070103FA, +0x09FE0905, 0xFEEAF402, 0x0EFCFF10, 0x150C0BFB, 0x0BF20714, 0xF3FB0DF7, 0x03F1F9ED, 0xFA13F205, +0x09F2FA16, 0x02FAF201, 0xFDFFF7F4, 0x06FD0EFB, 0x0F04F20C, 0xFCEEEB0B, 0xFF0513FD, 0x03FA13FB, +0x0BF707F4, 0x03FE0AF8, 0x000203EF, 0x0BF6F708, 0x0DE60203, 0x00F30901, 0xF1FA06F7, 0x140305EE, +0xFCEAF6F2, 0x02F10A09, 0x01FEF6F5, 0xFAEFFD0B, 0xF711EB15, 0xEEFF05F3, 0x01F3F409, 0x03ED0209, +0x10EE090D, 0x060207FF, 0x070F04F9, 0x0EF6000D, 0x0F0707FA, 0x0A03060A, 0xFE06040A, 0x0CF50DF4, +0x00FE1AF1, 0xF114FA0F, 0x0BEE10FF, 0xFFF6F9FC, 0xED000F06, 0xF6070703, 0x10040DF7, 0x06FBF9EF, +0xF4090CFC, 0x050AF6F0, 0xF10F06F9, 0x0EF90B0A, 0x0902FFF8, 0xF8F2FBF7, 0x13FBFB0E, 0xEBFFEEFB, +0xF409F50B, 0x0C090E07, 0xEC0F0A02, 0xF60B0818, 0xF9040505, 0xF90BF50C, 0x030AF5F9, 0x0A12EEF8, +0x0A0003F0, 0x00090BF4, 0xF907040A, 0x08F01510, 0x10050FF1, 0x13EBF7F1, 0x110CED11, 0xFB0507F9, +0xFDF3010B, 0xECE8F505, 0xF90B0CF3, 0x0D1203F7, 0x05EFEFFC, 0xF4EFFA11, 0x05FC0A0F, 0x12EF09F7, +0xFDEF0A10, 0xF6E70B09, 0xF7FB06FD, 0xFFF5040C, 0x0605F0F0, 0xF8F7EDF8, 0xF7FC1AF7, 0x00F60109, +0xFF0FFA00, 0x09EAEEF8, 0x0B0BEA10, 0xFFFB0DF4, 0x0006F4F5, 0x13F70F11, 0x04FBFA01, 0xF1FAF912, +0xF5F3040C, 0x0502ED0B, 0xF7FAF804, 0x03070A14, 0x1207F108, 0x0906F701, 0x0E0D070D, 0xFFF20C11, +0xF9F2F6F8, 0xFEEE12F6, 0x08F1F0E8, 0x08F0FC09, 0x1306FEF7, 0xF907F8FD, 0x0DEF0C0C, 0x0114FFF8, +0x0CF906F6, 0xF3F0F10D, 0xF7F5F40B, 0xECF2050B, 0xFD0604F7, 0xFCF9F60C, 0xFE02F6F7, 0x0B0607FB, +0x130AE809, 0xF8F7FCF2, 0xF6101108, 0xF0FA0405, 0x02091013, 0xF60E06FA, 0xF50DED03, 0x1205FD06, +0xF90CEDF6, 0x01FC00F4, 0xF8FCFEFC, 0xEE0303E8, 0xF4140C11, 0x11F3F4F3, 0xF6091406, 0x0CFC0BF4, +0x04F911F7, 0x0DFB050B, 0x0FF8FA0D, 0x0BFC0802, 0x0608F9F2, 0xF2F2F904, 0xF8EFF20B, 0xF5EEF30E, +0x080E0EF3, 0xEFF00600, 0xF6ED0DF1, 0xF6FB14F6, 0x0A0F0EEB, 0x0AFA08F5, 0xF90CFB0B, 0xFB06F2FC, +0xF1F8F70F, 0x16F01209, 0x0FF7F306, 0xF4F0F6F7, 0x0B070BFC, 0x01F70D05, 0xFB020709, 0x0C0A0EF0, +0xFDF2ED0F, 0x0BFF040D, 0x06FA0406, 0xFAEAF515, 0xFBED0AF3, 0xF208FA16, 0xFFF9F2F5, 0x0A00F10E, +0x06FA1104, 0x10EF0CF7, 0x0C08F914, 0x010FEFF6, 0xF9FA0A02, 0x0BF112FE, 0xF0F30206, 0x1208FB05, +0x0DFD05EE, 0x04F60410, 0xF9161006, 0x10F8FE06, 0x0AFCE7EF, 0xEAFEFC0D, 0xFFF6FC13, 0xF40704F8, +0xF909EDF9, 0xEA0C0808, 0x16F0F6FB, 0xF50DF6EB, 0x06F4F7F4, 0xF1F0010E, 0xF5F2F80A, 0xF8F806E7, +0x0CF2FA0D, 0xF8F3F7FA, 0xFE04FBEE, 0x0CF9F70D, 0xEF0E0800, 0x0AF1EEF4, 0xF0FFF2EC, 0x0A09FBEF, +0xEF0EEFE7, 0x13FEF50B, 0x0B0FFC0E, 0xFDF701FA, 0xF3FEEDF4, 0xFAF0010C, 0x0DF909FC, 0x08FAF3EE, +0xF9F70203, 0x0916FE1A, 0xFD10F4EC, 0x05F70F0F, 0xFE1108FA, 0x11F6FAF0, 0xF1FBF20B, 0x171003FD, +0xFE0303FE, 0xF3F6FC0C, 0xEA0810F3, 0x060AF4FF, 0xEE0613F0, 0x09F60FF6, 0x071602F3, 0x00F5F2F7, +0x04EB01F7, 0xFBFDF9FD, 0xEBEFF7F4, 0x070C0CF8, 0xF5090B10, 0x0FE3F6EF, 0xF6FFFF12, 0xEEF7F8F6, +0xF50206F1, 0x0A000A14, 0x010E0AF2, 0x0603F010, 0xF4EBFBFF, 0xF011F617, 0x12100108, 0x0017F5FA, +0x0CF8020E, 0x0D0DF9F9, 0xF0F5EF11, 0xF1FCF8F0, 0x06EEECFC, 0x06141703, 0x0EF1FD00, 0x0D00F810, +0x03060A12, 0xF011F60A, 0x10FA0EEF, 0x03F5FB05, 0xF5040DF4, 0xF6F408F3, 0x0809EFEF, 0xF1060F12, +0xF115050C, 0xF909F00C, 0xFA130E06, 0x0E04F7F4, 0x080D11ED, 0xFD0B030C, 0x0CF1F610, 0x12F0EDF6, +0x0810F708, 0x05FC050F, 0x050E1408, 0x05F3F9EF, 0x0AEC10F8, 0x0D0B100A, 0x01FAFF0C, 0xEA0CF9F8, +0x010E0DFF, 0x07F70BFB, 0x140F0AFC, 0xF90F0DF5, 0xF1EDF4F8, 0xFC0D02F4, 0xF30CF80B, 0xE902FC08, +0x0FF2F2F2, 0x07F5F710, 0xF8FDFFF1, 0x04020908, 0x0C04F5F1, 0x0C06080B, 0xF0E6F507, 0x03F8FEF6, +0x00ED0CFF, 0xF8F40E15, 0xFAEBF2EC, 0x02E801FB, 0x09F30D0F, 0x13081405, 0x070FF509, 0xF90005F3, +0x02F6F0EB, 0x05FAF30D, 0xFDF8FB06, 0x0C0BEFEE, 0x13F0EF0B, 0xF1041808, 0xEEFBF609, 0x10F4FFF5 + +harq_input0 = +0x0FFA0103, 0x130C0B02, 0xF309F6E7, 0xF70F07F1, 0xF7090FF8, 0x050409F2, 0xF80AFAF7, 0x00F60EF5, +0x06FC060D, 0x080DFB03, 0xF4EDF9F9, 0xFCF9FEEA, 0x0F0C12F8, 0xF9F31708, 0xF60C02FF, 0xFF110310, +0x0BF80F0F, 0x02F6F2EE, 0xEDF20A06, 0x0709FEF2, 0x14F5F0F0, 0xF70C0018, 0x12020FEF, 0x0602EF08, +0xF40A0200, 0xEE0C0BFC, 0x0606ED01, 0xF2F709F3, 0x15110E10, 0x06EC06F8, 0xFBF10CF8, 0x0314FEF6, +0xF5F4FC0C, 0xF00C00FF, 0xF6FDF9F6, 0x07F30801, 0x0F04F40C, 0x0406F305, 0xFAF9F808, 0xF20DF109, +0x010A0AF8, 0x070AFC03, 0xF108120A, 0xF8F9F1EC, 0xEEEB09FF, 0x140C0D01, 0x04E5EF10, 0xF616130C, +0x0314F4EC, 0x09FA09F2, 0xFAFAF714, 0xFAF101FD, 0x06030FF4, 0x17F3EFFA, 0x09FEF109, 0xFDFEF9FB, +0xF2080B02, 0x0CF90B07, 0xEB0F0D06, 0xF71009FE, 0xEF110AF8, 0x0AF70BF9, 0x170A1508, 0xF8FDFAF1, +0x0204F3EB, 0xEFFE0315, 0x0C06000B, 0xF10C0A0E, 0xEC0EF9FC, 0x08F0F2F3, 0x09FD02F7, 0x0B11F610, +0xF8F1F8F7, 0xF8FB0A09, 0xFB030A13, 0x040804F0, 0xE8080813, 0xF1F4FFF3, 0xEBFCEDF7, 0xF7F00AE8, +0x00F1160E, 0xF007F301, 0x0E13F211, 0x07F815F4, 0xF9EEF70B, 0x0EF7FE15, 0x0706E80C, 0x0611F60E, +0xFB0B0CF5, 0xF4F50E11, 0x14FDF1EB, 0xF403120A, 0x09F80303, 0xFB0AF80B, 0xFA1408F5, 0xF503F717, +0x0FFB1610, 0x1107F3FC, 0xF1F4F7F7, 0x060EF4E8, 0x04F8F5FF, 0x04F30CFA, 0x10F008F8, 0xF514EEF3, +0x0EEDE8FE, 0xE7FEE70B, 0x0404FEF9, 0xF8F509F9, 0x0A0EF6F2, 0xF8080EF8, 0x01F200F3, 0x03FC19F2, +0x0D0FF2F8, 0xF9FD0C13, 0x11FE0703, 0x0BF9F110, 0x0EF3FEFD, 0x0EF8F10C, 0x0A070FEA, 0x04FA0310, +0x0CFE0003, 0x0CF3060D, 0xFBFCF5FA, 0xEC0D1108, 0x09ECF70A, 0x0C0EFB08, 0x0BF4F80A, 0xEFF0FB0C, +0x0B09F8FA, 0xFA16FF13, 0x0B081512, 0xF4F2FBF7, 0x000C0A07, 0x130C0FEE, 0xFEF908FB, 0xF6F5F912, +0xF1100409, 0x090E1606, 0xF4F50BF3, 0xEE00F7F9, 0xFAFBF5F6, 0x07080B0A, 0xF1150BE7, 0x0DF80912, +0x12EF0809, 0xEBFF1108, 0x0BF60DFE, 0x130DF608, 0x12EFF2F1, 0x04FB0C0B, 0x01FDFC09, 0xFAF808F9, +0x12020B01, 0xFCED060F, 0x040DFFFF, 0x04F80AF3, 0xF700F60B, 0x08F40E08, 0x06F7F80F, 0x0DFDEF04, +0xFDEFF916, 0xF21107EF, 0x0A1110F1, 0x03F70DF3, 0x08F50300, 0xF1F711F9, 0xF6FCFF0C, 0x0CFFF704, +0x080CFE09, 0x0FF80D06, 0x05080C08, 0xFE020210, 0xFB11F6E9, 0x060BF2F1, 0xED0BEAF9, 0x02F30C02, +0xF8F40DFB, 0x020D0D01, 0x0CF406F1, 0xF302F812, 0x080C0EF2, 0x06010006, 0xF0FA0908, 0x08F9F905, +0xFB0A0508, 0x0FF0F7F4, 0xFF081210, 0xEE18F6F1, 0xF9F9E8F2, 0x060B09FD, 0x0AFEEE04, 0x09F304F8, +0xEA05F6F8, 0x1C0108F5, 0xF205120F, 0xF40D0A04, 0x0001F30D, 0x00FF0DFA, 0x020BF7F7, 0x02F2F7F0, +0x04F90BF1, 0x01EFEE07, 0xEBE4F807, 0x0AF90FEF, 0x0F040B11, 0x0BF91000, 0x000CF812, 0x0311F3F0, +0xF8070218, 0xEDFFF614, 0xF00C15F1, 0x000D0F16, 0xFA0EF707, 0xEE080901, 0xFF0C09F5, 0xEEF704F1, +0xF10C10F9, 0x060BEBF7, 0xFA0EFDF6, 0xF7F403F2, 0xF5F0F306, 0xEC081A0F, 0x020AEEF5, 0xFBF9F7FB, +0xF60C010A, 0xEC0E0FFF, 0xF014FB10, 0x0EFD0308, 0x04F30015, 0xF4FC0CEE, 0x0CFEF3F7, 0x12F0F702, +0xE803FB07, 0x040D06F5, 0x05FA07F1, 0x140A0BF8, 0xEFEDFF11, 0x01EFEE13, 0x0D0C0B0F, 0xE70105F0, +0x01F70CF4, 0x0603EE12, 0xED08EDF9, 0xF2FCFA02, 0x0E0CFCF3, 0x0E04F8F9, 0xF30D17F9, 0xFEEDFB05, +0x071BF114, 0xF309F7F4, 0x02F503F6, 0x0815F400, 0x0CF0090A, 0xE80D0F02, 0xF9FCFDF8, 0xF00FFEF5, +0xF3F5F70B, 0xFC10F7EF, 0xF2FB0AFE, 0xEEECEC15, 0x0202F60E, 0xF310FEF9, 0x10F8F209, 0xFB0606EE, +0x0D0B0C10, 0x1110080C, 0xFCF2F8F6, 0x030DEE07, 0x0C11F511, 0x0CF6EF08, 0x0900070C, 0x0C160E0F, +0xEEF8FFF9, 0xF7F0EEF5, 0x0A090903, 0xF70A000E, 0xF5FF07F6, 0xF5E5FEFD, 0x08F1F80C, 0x00F2EE0D, +0xFAED07EA, 0x07EA170B, 0xFEFFECFF, 0xED0B0211, 0x0AF4F4E6, 0xF2FAF705, 0x0807F706, 0xFBF2F8F7, +0xF31105F7, 0xF10809FB, 0xF1FEF307, 0x0805FFFA, 0x08FC070D, 0x0A071200, 0xEEEDF107, 0xF908EDFB, +0x09F60FF2, 0x0B0C06F8, 0x07FCF608, 0x000FF30C, 0xFF0EF3FD, 0xE40BFCF4, 0x0CF50BF4, 0x04EDE90D, +0xFD05F3F1, 0xFAECF4FA, 0xF80C080F, 0x0A0BF70A, 0x07F012F4, 0x1109FEF3, 0xF507F9F1, 0xF513F7FD, +0xFE0AF80F, 0x041701F1, 0xF5E7F309, 0x0A0AF70C, 0x0E00FEF1, 0x04E505EF, 0xF4EF0BFD, 0x040CF807, +0x1201EF07, 0xF31508F1, 0xF908F309, 0x0B0EE409, 0xF7EBF9F8, 0xF1F7F406, 0xFB0206F6, 0xECFD11F2, +0x0702EEF6, 0xF409FC04, 0xEEF80010, 0xF3EC0BF0, 0x090600F1, 0xF9F5EBF7, 0xEEFE11F8, 0x070BF0FA, +0xFE16EEF8, 0xF108FD05, 0x15FAF3F7, 0xF60E0D0D, 0xF7FC0AF8, 0x01F40805, 0xF70AFE01, 0xFB0F0BF9, +0x04E701F6, 0x09F517F6, 0xFBE8F5F8, 0x11FE00F6, 0xEF08F2F5, 0xFB0CFB0F, 0x0419080B, 0x0308EE11, +0x07110907, 0xF2F5ED0F, 0x0BFAFEF6, 0xFA12F8F9, 0xE8090606, 0x0E0CEAEC, 0x06FD10F8, 0xF80505FD, +0xF1F70912, 0xF5EF0C0B, 0xF9EF0B0B, 0x0D05F5F2, 0x0A08FF0E, 0x09F50300, 0x08F91314, 0x0AFEF60A, +0xE5FC0504, 0xEF0A000E, 0x06FDFFF1, 0x0D11F103, 0x080CF512, 0xF9F501F2, 0xFAF60708, 0xFE140D05, +0xF90202EF, 0xF0FD0EED, 0x06F2E903, 0xE904F80D, 0xF600F8F8, 0xF4FA09F5, 0x0803FA07, 0xFCF9F90B, +0xF202F4F5, 0x000EFBFE, 0x0409FAFD, 0xF0EA0DF4, 0x0B0D00FF, 0x03F8FB0D, 0x0307FAF2, 0x010C0BFB, +0x140C03FD, 0xF4FE0906, 0xF6F6F8ED, 0x0B11090D, 0xF6F90EF8, 0x09F001E8, 0xEC0600F8, 0x1109F90E, +0xEA010BEF, 0xEF0A0C0A, 0x07F510FD, 0x08F3F500, 0x07ED01F5, 0xF313F60A, 0xF803FA0E, 0xF60B0D08, +0xF1F0F709, 0x0DF609F4, 0xFCED020B, 0x0E0EEDE9, 0x08F907F2, 0xF1FC0C13, 0xFFFB0C06, 0xEB070AF7, +0xF606F80A, 0xF90E1EFF, 0xF6EE0BF5, 0x05FF03F7, 0x0F0DF309, 0xFA0CF4F8, 0x1F0CF6F3, 0xF50DEE0F, +0xF5F7FDF4, 0x0BF501EF, 0xF7FA000F, 0xECFAF0F5, 0xEA02FEF1, 0xF80FFCFC, 0x100B0600, 0xFF050501, +0xFA150716, 0x110FFFF4, 0xEE0B04F8, 0x0E0FF112, 0x12F80BF4, 0xF6F41604, 0x07EDE6EF, 0x17EE0F0B, +0x05F5FEF2, 0xEF0BFEF5, 0xFF07FD15, 0x01090709, 0x02EBEE0D, 0xF6F9FB0D, 0xEFF6070E, 0x090806F6, +0x140FFEF1, 0xF6FCEEEB, 0x07EF14F2, 0xFB03040B, 0x0A05F4FC, 0x0DF6FB0D, 0x060B02F8, 0xFF0FFB0E, +0x090709F7, 0xF7180F02, 0x0BF8F005, 0xFE0CF60D, 0x09F4ECF0, 0x0410F30A, 0xEB05F105, 0x05F90C11, +0xFCF1F30B, 0x120B0BF3, 0x031104FC, 0x030BFC0F, 0xFB09EFFC, 0xF50CFB11, 0x0BF80504, 0xF609FCF7, +0xFE0CFB00, 0x0F08F7FB, 0x0BFD0609, 0x0E120F15, 0x020B07F8, 0x0714FAF0, 0x0615F308, 0xF2FDF8F9, +0xEEF606F8, 0x050906E8, 0x071106F7, 0x000C03F8, 0x04F9F90A, 0x060BF5F7, 0x0D0CF2F7, 0x06FB02F7, +0xF7060AF5, 0x0EF1FCF4, 0xFAFAF5FE, 0x0506F917, 0xFCF40C0A, 0x03FC10E8, 0xF30700FD, 0xFCF40906, +0xFB0B0D0B, 0x1017E4F9, 0xF20408F2, 0x02FA03F7, 0xF0000E07, 0xFB0AEDF1, 0xE6F50FEB, 0xF2FCF80B, +0x04F50DFB, 0xF00BF706, 0xF70507FC, 0x0AF01609, 0xFF0DF20F, 0xEA150EF2, 0x080202F3, 0x00FAF9F5, +0xEFF70E04, 0x0FF6F314, 0xF1FEFAEE, 0x08F1F3F2, 0xF6101102, 0xF8F20206, 0x120DFC03, 0x07F8F613, +0x0CF4F50D, 0x0DFF05FB, 0x040EF409, 0xF8FB06F6, 0xF3FAF20D, 0x0DF90402, 0x05080E00, 0xF5EFEBEC, +0xFE0B0EE7, 0x0B0E0F0E, 0x04F812F4, 0x0EEE0D10, 0x021AF7EF, 0xF70F10EC, 0xF604FDFA, 0x10E90F0B, +0xF60CEFFE, 0x0AEBF407, 0xF60A06F0, 0xF50B1607, 0x1111FF0B, 0xF8F8EF08, 0xF704F410, 0x0B0AEBFE, +0x14000205, 0x03FC0EF2, 0xFD17EBFF, 0x17FAFCF4, 0x0DF90CFA, 0x1004F511, 0x140302FC, 0x14FC0500, +0xFCF6F2FE, 0x0905FA03, 0x08F3F0F4, 0x06FEF5EF, 0x09F801F8, 0xF00913F1, 0xF7F80DED, 0x040AF1FC, +0xFC0F1008, 0x07040EF4, 0x0BF6EC0C, 0x0CF8FA0C, 0xF70F0EFF, 0xFB09FBFC, 0xF9F4ED0D, 0x02F4F80B, +0xF5FCF2F2, 0x0208FDF1, 0xF20B0405, 0xF80AFAF3, 0xF415EDEA, 0xFDFBEB00, 0xF4F1F30F, 0xEC070F09, +0xFA0D0AFF, 0xF7EE0C06, 0x04F4F00B, 0x08F50FF5, 0xF50EF3FC, 0x1006E7F9, 0x04F7F7FC, 0xFC070CFB, +0x0F12EAFA, 0xF7F00706, 0xF4011505, 0xF7140B09, 0x0AF9F1F8, 0x03060DF8, 0xF2090CF8, 0xF20712F3, +0xF903EFEE, 0x1102EC14, 0x0A09F1F6, 0xF9F001FA, 0xF8FE01FB, 0x140410F1, 0x0B0402F2, 0x0F0006F5, +0x0805ECF9, 0xF409F10E, 0x0DE7FD01, 0xEFFD0710, 0xF20403FD, 0x0BF2F6F9, 0x0004F909, 0x0F09FFF6, +0xF3060DF2, 0x0EEF060E, 0x0CF40705, 0xFDF7FB0C, 0xF4F203E4, 0x0E09F4F6, 0xF5FE04F9, 0x06F3FEFE, +0xFDFB1102, 0xFD04EE0D, 0x0DFBFCF1, 0xEE14E90B, 0xFB0CEE09, 0x0C13F108, 0xF60703FD, 0x0BF4FCFA, +0x14F2F0FB, 0xFAF9EFF7, 0xF5010801, 0xF109EEF3, 0xFF0A0514, 0x0C0604FF, 0xFB0EF704, 0xF50EFD0B, +0xFF05F4FA, 0x07E70B0B, 0xEFFEF4FD, 0x0D0807F3, 0x05100DF6, 0xEFFA1A08, 0x020D090A, 0xFFF5F7FD, +0x1513F10A, 0xF10BF2ED, 0x0B0F150B, 0xF10306FA, 0x09FB11EE, 0x061007F2, 0xF7F8FB14, 0xF90704EE, +0x0AF8EAF6, 0xF7E809F9, 0x02F609E9, 0x09E802EE, 0x03F50BE8, 0x040C04F1, 0x0CF41009, 0xFB00EEFA, +0xFC071611, 0xF9F1F203, 0x0BF0F409, 0x0214F801, 0x0A0AF504, 0x0508F5F1, 0xE916E900, 0x07F4F60A, +0xF9F010F2, 0xF906F507, 0x0BFB0AF4, 0xF408F0F1, 0x0EFD0A06, 0x03F80AF6, 0x130CFD0C, 0xF1E9F7F8, +0xF800F502, 0xFEFDFDF4, 0xF90B0713, 0xF506FAFD, 0x0712F9F2, 0xEAF20DF5, 0x10F40D0D, 0x06050B09, +0xF706090E, 0x0F00ED11, 0xF90E02F4, 0xF1FEFCED, 0x0AF5E00D, 0x06F7F3F9, 0x08F81206, 0xF30EF4F5, +0x12FF02EF, 0xF7040DF4, 0x151204F0, 0x04ED07EC, 0xF0F3FB05, 0x08F2FCF4, 0xECED11FA, 0xFC110DF8, +0x0BF4F90A, 0xFCF9F905, 0xF0010014, 0x0A0EF9F8, 0xF4020C02, 0x10FDFA13, 0xF5000B05, 0x05EAF808, +0xFE0F04F3, 0xFDEFF9EE, 0xF9F9090B, 0x10F20E0C, 0x060909F0, 0x060EF40F, 0x0E0705F5, 0xFB05F6F9, +0xFA1C0512, 0x0B10FBEB, 0x16F20DF6, 0x090012F4, 0x0A13020B, 0x0EFF0C0A, 0x130DEF0C, 0x070A0B04, +0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, +0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, +0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, +0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, +0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, +0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, +0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, +0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, +0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, +0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, +0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, +0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, +0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, +0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, +0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, +0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, +0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, +0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, +0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, +0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, +0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, +0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, +0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, +0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, +0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, +0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, +0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, +0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, +0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, +0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, +0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, +0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, +0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, +0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, +0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, +0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, +0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, +0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, +0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, +0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, +0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, +0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, +0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, +0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, +0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, +0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, +0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, +0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, +0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, +0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, +0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, +0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, +0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, +0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, +0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 + +output0 = +0x8EC35F65, 0xF1011E4E, 0x01283C76, 0x46C59B44, 0x66BD1E7E, 0x71CC3D13, 0xF54F7B59, 0xC2E51E78, +0x878ACD1F, 0x0BB83AD9, 0xD6EB81F6, 0xDA98D960, 0x9583FF24, 0x84E13C2E, 0xB80A4BD9, 0x7546DA7D, +0x61301F84, 0x4E8E7BCA, 0x0F9A1992, 0x84DE01C3, 0xFB1B38F1, 0x44764A25, 0x9525C193, 0xAD6AFC2C, +0xEAC9CBE7, 0x822626C3, 0x6764F1E2, 0xB7080FC1, 0x92F0BF18, 0x2BE2A423, 0x6652CA22, 0x7E2B8B7D, +0xDADC0042, 0x1684A5B0, 0x6AF80D1E, 0xDE4B11F8, 0x4C027AA7, 0x9B499047, 0xDF71DF9C, 0xE66B5211, +0x0976A858, 0x97CCDFA6, 0xF921AC4D, 0x684DB77D, 0x2046F400, 0x66BF05FF, 0xCFE771B2, 0x7D285899, +0xA6DD74A8, 0xD5AC14DF, 0xB4EE744D, 0x9BF75449, 0xBCCF7BE5, 0xD9B3E1C5, 0x04D5FEEA, 0xA91CED17, +0x260A3E33, 0xB14FA433, 0xC7FB659B, 0xD847CBDD, 0xD4BAF083, 0x51A5AEB1, 0x39A13C7A, 0xC54DBA51, +0x81DD7FFE, 0xE2A3941C, 0x386750AD, 0x85C6A1CF, 0x52E46581, 0x2DC58468, 0x4F8C204C, 0xCA6C89B8, +0xD338F49E, 0xB71D9A1C, 0xAE5992A5, 0x461FFEB6, 0x0F724968, 0xD2D9A290, 0x4C0791D6, 0x8AA45E2A, +0xBCE9EEF4, 0x769D6618, 0x71D659F8, 0xE9DC6A13, 0x99E831C3, 0x8AB8CFD6, 0x489E23C5, 0xBEFC2792, +0x9E54E534, 0x54101DEF, 0x1F83D8D2, 0x69A8094D, 0x2DA8AAEB, 0x564C6C07, 0x4F2AADB5, 0x20CB1D7F, +0x2D6E9D54, 0xB97A8BC9, 0x36365C67, 0x8D84329F, 0x4000A81C, 0x6326766B, 0xB9B50B8D, 0xF9D51D73, +0x4D1A117F, 0x70486DEE, 0xBB19FFB6, 0x96929F46, 0x8E7C8D1C, 0x04B8D1F3, 0x204B8156, 0xA67E9C62, +0x4534F672, 0x94B8C832, 0x38E7CFE4, 0x71F48255, 0x82181625, 0xF8C9EB50, 0xF3D38EF0, 0xB4DE79FB, +0xF32452 + +harq_output0 = +0x0FFA0103, 0x130C0B02, 0xF309F6E7, 0xF70F07F1, 0xF7090FF8, 0x050409F2, 0xF80AFAF7, 0x00F60EF5, +0x06FC060D, 0x080DFB03, 0xF4EDF9F9, 0xFCF9FEEA, 0x0F0C12F8, 0xF9F31708, 0xF60C02FF, 0xFF110310, +0x0BF80F0F, 0x02F6F2EE, 0xEDF20A06, 0x0709FEF2, 0x14F5F0F0, 0xF70C0018, 0x12020FEF, 0x0602EF08, +0xF40A0200, 0xEE0C0BFC, 0x0606ED01, 0xF2F709F3, 0x15110E10, 0x06EC06F8, 0xFBF10CF8, 0x0314FEF6, +0xF5F4FC0C, 0xF00C00FF, 0xF6FDF9F6, 0x07F30801, 0x0F04F40C, 0x0406F305, 0xFAF9F808, 0xF20DF109, +0x010A0AF8, 0x070AFC03, 0xF108120A, 0xF8F9F1EC, 0xEEEB09FF, 0x140C0D01, 0x04E5EF10, 0xF616130C, +0x0314F4EC, 0x09FA09F2, 0xFAFAF714, 0xFAF101FD, 0x06030FF4, 0x17F3EFFA, 0x09FEF109, 0xFDFEF9FB, +0xF2080B02, 0x0CF90B07, 0xEB0F0D06, 0xF71009FE, 0xEF110AF8, 0x0AF70BF9, 0x170A1508, 0xF8FDFAF1, +0x0204F3EB, 0xEFFE0315, 0x0C06000B, 0xF10C0A0E, 0xEC0EF9FC, 0x08F0F2F3, 0x09FD02F7, 0x0B11F610, +0xF8F1F8F7, 0xF8FB0A09, 0xFB030A13, 0x040804F0, 0xE8080813, 0xF1F4FFF3, 0xEBFCEDF7, 0xF7F00AE8, +0x00F1160E, 0xF007F301, 0x0E13F211, 0x07F815F4, 0xF9EEF70B, 0x0EF7FE15, 0x0706E80C, 0x0611F60E, +0xFB0B0CF5, 0xF4F50E11, 0x14FDF1EB, 0xF403120A, 0x09F80303, 0xFB0AF80B, 0xFA1408F5, 0xF503F717, +0x0FFB1610, 0x1107F3FC, 0xF1F4F7F7, 0x060EF4E8, 0x04F8F5FF, 0x04F30CFA, 0x10F008F8, 0xF514EEF3, +0x0EEDE8FE, 0xE7FEE70B, 0x0404FEF9, 0xF8F509F9, 0x0A0EF6F2, 0xF8080EF8, 0x01F200F3, 0x03FC19F2, +0x0D0FF2F8, 0xF9FD0C13, 0x11FE0703, 0x0BF9F110, 0x0EF3FEFD, 0x0EF8F10C, 0x0A070FEA, 0x04FA0310, +0x0CFE0003, 0x0CF3060D, 0xFBFCF5FA, 0xEC0D1108, 0x09ECF70A, 0x0C0EFB08, 0x0BF4F80A, 0xEFF0FB0C, +0x0B09F8FA, 0xFA16FF13, 0x0B081512, 0xF4F2FBF7, 0x000C0A07, 0x130C0FEE, 0xFEF908FB, 0xF6F5F912, +0xF1100409, 0x090E1606, 0xF4F50BF3, 0xEE00F7F9, 0xFAFBF5F6, 0x07080B0A, 0xF1150BE7, 0x0DF80912, +0x12EF0809, 0xEBFF1108, 0x0BF60DFE, 0x130DF608, 0x12EFF2F1, 0x04FB0C0B, 0x01FDFC09, 0xFAF808F9, +0x12020B01, 0xFCED060F, 0x040DFFFF, 0x04F80AF3, 0xF700F60B, 0x08F40E08, 0x06F7F80F, 0x0DFDEF04, +0xFDEFF916, 0xF21107EF, 0x0A1110F1, 0x03F70DF3, 0x08F50300, 0xF1F711F9, 0xF6FCFF0C, 0x0CFFF704, +0x080CFE09, 0x0FF80D06, 0x05080C08, 0xFE020210, 0xFB11F6E9, 0x060BF2F1, 0xED0BEAF9, 0x02F30C02, +0xF8F40DFB, 0x020D0D01, 0x0CF406F1, 0xF302F812, 0x080C0EF2, 0x06010006, 0xF0FA0908, 0x08F9F905, +0xFB0A0508, 0x0FF0F7F4, 0xFF081210, 0xEE18F6F1, 0xF9F9E8F2, 0x060B09FD, 0x0AFEEE04, 0x09F304F8, +0xEA05F6F8, 0x1C0108F5, 0xF205120F, 0xF40D0A04, 0x0001F30D, 0x00FF0DFA, 0x020BF7F7, 0x02F2F7F0, +0x04F90BF1, 0x01EFEE07, 0xEBE4F807, 0x0AF90FEF, 0x0F040B11, 0x0BF91000, 0x000CF812, 0x0311F3F0, +0xF8070218, 0xEDFFF614, 0xF00C15F1, 0x000D0F16, 0xFA0EF707, 0xEE080901, 0xFF0C09F5, 0xEEF704F1, +0xF10C10F9, 0x060BEBF7, 0xFA0EFDF6, 0xF7F403F2, 0xF5F0F306, 0xEC081A0F, 0x020AEEF5, 0xFBF9F7FB, +0xF60C010A, 0xEC0E0FFF, 0xF014FB10, 0x0EFD0308, 0x04F30015, 0xF4FC0CEE, 0x0CFEF3F7, 0x12F0F702, +0xE803FB07, 0x040D06F5, 0x05FA07F1, 0x140A0BF8, 0xEFEDFF11, 0x01EFEE13, 0x0D0C0B0F, 0xE70105F0, +0x01F70CF4, 0x0603EE12, 0xED08EDF9, 0xF2FCFA02, 0x0E0CFCF3, 0x0E04F8F9, 0xF30D17F9, 0xFEEDFB05, +0x071BF114, 0xF309F7F4, 0x02F503F6, 0x0815F400, 0x0CF0090A, 0xE80D0F02, 0xF9FCFDF8, 0xF00FFEF5, +0xF3F5F70B, 0xFC10F7EF, 0xF2FB0AFE, 0xEEECEC15, 0x0202F60E, 0xF310FEF9, 0x10F8F209, 0xFB0606EE, +0x0D0B0C10, 0x1110080C, 0xFCF2F8F6, 0x030DEE07, 0x0C11F511, 0x0CF6EF08, 0x0900070C, 0x0C160E0F, +0xEEF8FFF9, 0xF7F0EEF5, 0x0A090903, 0xF70A000E, 0xF5FF07F6, 0xF5E5FEFD, 0x08F1F80C, 0x00F2EE0D, +0xFAED07EA, 0x07EA170B, 0xFEFFECFF, 0xED0B0211, 0x0AF4F4E6, 0xF2FAF705, 0x0807F706, 0xFBF2F8F7, +0xF31105F7, 0xF10809FB, 0xF1FEF307, 0x0805FFFA, 0x08FC070D, 0x0A071200, 0xEEEDF107, 0xF908EDFB, +0x09F60FF2, 0x0B0C06F8, 0x07FCF608, 0x000FF30C, 0xFF0EF3FD, 0xE40BFCF4, 0x0CF50BF4, 0x04EDE90D, +0xFD05F3F1, 0xFAECF4FA, 0xF80C080F, 0x0A0BF70A, 0x07F012F4, 0x1109FEF3, 0xF507F9F1, 0xF513F7FD, +0xFE0AF80F, 0x041701F1, 0xF5E7F309, 0x0A0AF70C, 0x0E00FEF1, 0x04E505EF, 0xF4EF0BFD, 0x040CF807, +0x1201EF07, 0xF31508F1, 0xF908F309, 0x0B0EE409, 0xF7EBF9F8, 0xF1F7F406, 0xFB0206F6, 0xECFD11F2, +0x0702EEF6, 0xF409FC04, 0xEEF80010, 0xF3EC0BF0, 0x090600F1, 0xF9F5EBF7, 0xEEFE11F8, 0x070BF0FA, +0xFE16EEF8, 0xF108FD05, 0x15FAF3F7, 0xF60E0D0D, 0xF7FC0AF8, 0x01F40805, 0xF70AFE01, 0xFB0F0BF9, +0x04E701F6, 0x09F517F6, 0xFBE8F5F8, 0x11FE00F6, 0xEF08F2F5, 0xFB0CFB0F, 0x0419080B, 0x0308EE11, +0x07110907, 0xF2F5ED0F, 0x0BFAFEF6, 0xFA12F8F9, 0xE8090606, 0x0E0CEAEC, 0x06FD10F8, 0xF80505FD, +0xF1F70912, 0xF5EF0C0B, 0xF9EF0B0B, 0x0D05F5F2, 0x0A08FF0E, 0x09F50300, 0x08F91314, 0x0AFEF60A, +0xE5FC0504, 0xEF0A000E, 0x06FDFFF1, 0x0D11F103, 0x080CF512, 0xF9F501F2, 0xFAF60708, 0xFE140D05, +0xF90202EF, 0xF0FD0EED, 0x06F2E903, 0xE904F80D, 0xF600F8F8, 0xF4FA09F5, 0x0803FA07, 0xFCF9F90B, +0xF202F4F5, 0x000EFBFE, 0x0409FAFD, 0xF0EA0DF4, 0x0B0D00FF, 0x03F8FB0D, 0x0307FAF2, 0x010C0BFB, +0x140C03FD, 0xF4FE0906, 0xF6F6F8ED, 0x0B11090D, 0xF6F90EF8, 0x09F001E8, 0xEC0600F8, 0x1109F90E, +0xEA010BEF, 0xEF0A0C0A, 0x07F510FD, 0x08F3F500, 0x07ED01F5, 0xF313F60A, 0xF803FA0E, 0xF60B0D08, +0xF1F0F709, 0x0DF609F4, 0xFCED020B, 0x0E0EEDE9, 0x08F907F2, 0xF1FC0C13, 0xFFFB0C06, 0xEB070AF7, +0xF606F80A, 0xF90E1EFF, 0xF6EE0BF5, 0x05FF03F7, 0x0F0DF309, 0xFA0CF4F8, 0x1F0CF6F3, 0xF50DEE0F, +0xF5F7FDF4, 0x0BF501EF, 0xF7FA000F, 0xECFAF0F5, 0xEA02FEF1, 0xF80FFCFC, 0x100B0600, 0xFF050501, +0xFA150716, 0x110FFFF4, 0xEE0B04F8, 0x0E0FF112, 0x12F80BF4, 0xF6F41604, 0x07EDE6EF, 0x17EE0F0B, +0x05F5FEF2, 0xEF0BFEF5, 0xFF07FD15, 0x01090709, 0x02EBEE0D, 0xF6F9FB0D, 0xEFF6070E, 0x090806F6, +0x140FFEF1, 0xF6FCEEEB, 0x07EF14F2, 0xFB03040B, 0x0A05F4FC, 0x0DF6FB0D, 0x060B02F8, 0xFF0FFB0E, +0x090709F7, 0xF7180F02, 0x0BF8F005, 0xFE0CF60D, 0x09F4ECF0, 0x0410F30A, 0xEB05F105, 0x05F90C11, +0xFCF1F30B, 0x120B0BF3, 0x031104FC, 0x030BFC0F, 0xFB09EFFC, 0xF50CFB11, 0x0BF80504, 0xF609FCF7, +0xFE0CFB00, 0x0F08F7FB, 0x0BFD0609, 0x0E120F15, 0x020B07F8, 0x0714FAF0, 0x0615F308, 0xF2FDF8F9, +0xEEF606F8, 0x050906E8, 0x071106F7, 0x000C03F8, 0x04F9F90A, 0x060BF5F7, 0x0D0CF2F7, 0x06FB02F7, +0xF7060AF5, 0x0EF1FCF4, 0xFAFAF5FE, 0x0506F917, 0xFCF40C0A, 0x03FC10E8, 0xF30700FD, 0xFCF40906, +0xFB0B0D0B, 0x1017E4F9, 0xF20408F2, 0x02FA03F7, 0xF0000E07, 0xFB0AEDF1, 0xE6F50FEB, 0xF2FCF80B, +0x04F50DFB, 0xF00BF706, 0xF70507FC, 0x0AF01609, 0xFF0DF20F, 0xEA150EF2, 0x080202F3, 0x00FAF9F5, +0xEFF70E04, 0x0FF6F314, 0xF1FEFAEE, 0x08F1F3F2, 0xF6101102, 0xF8F20206, 0x120DFC03, 0x07F8F613, +0x0CF4F50D, 0x0DFF05FB, 0x040EF409, 0xF8FB06F6, 0xF3FAF20D, 0x0DF90402, 0x05080E00, 0xF5EFEBEC, +0xFE0B0EE7, 0x0B0E0F0E, 0x04F812F4, 0x0EEE0D10, 0x021AF7EF, 0xF70F10EC, 0xF604FDFA, 0x10E90F0B, +0xF60CEFFE, 0x0AEBF407, 0xF60A06F0, 0xF50B1607, 0x1111FF0B, 0xF8F8EF08, 0xF704F410, 0x0B0AEBFE, +0x14000205, 0x03FC0EF2, 0xFD17EBFF, 0x17FAFCF4, 0x0DF90CFA, 0x1004F511, 0x140302FC, 0x14FC0500, +0xFCF6F2FE, 0x0905FA03, 0x08F3F0F4, 0x06FEF5EF, 0x09F801F8, 0xF00913F1, 0xF7F80DED, 0x040AF1FC, +0xFC0F1008, 0x07040EF4, 0x0BF6EC0C, 0x0CF8FA0C, 0xF70F0EFF, 0xFB09FBFC, 0xF9F4ED0D, 0x02F4F80B, +0xF5FCF2F2, 0x0208FDF1, 0xF20B0405, 0xF80AFAF3, 0xF415EDEA, 0xFDFBEB00, 0xF4F1F30F, 0xEC070F09, +0xFA0D0AFF, 0xF7EE0C06, 0x04F4F00B, 0x08F50FF5, 0xF50EF3FC, 0x1006E7F9, 0x04F7F7FC, 0xFC070CFB, +0x0F12EAFA, 0xF7F00706, 0xF4011505, 0xF7140B09, 0x0AF9F1F8, 0x03060DF8, 0xF2090CF8, 0xF20712F3, +0xF903EFEE, 0x1102EC14, 0x0A09F1F6, 0xF9F001FA, 0xF8FE01FB, 0x140410F1, 0x0B0402F2, 0x0F0006F5, +0x0805ECF9, 0xF409F10E, 0x0DE7FD01, 0xEFFD0710, 0xF20403FD, 0x0BF2F6F9, 0x0004F909, 0x0F09FFF6, +0xF3060DF2, 0x0EEF060E, 0x0CF40705, 0xFDF7FB0C, 0xF4F203E4, 0x0E09F4F6, 0xF5FE04F9, 0x06F3FEFE, +0xFDFB1102, 0xFD04EE0D, 0x0DFBFCF1, 0xEE14E90B, 0xFB0CEE09, 0x0C13F108, 0xF60703FD, 0x0BF4FCFA, +0x14F2F0FB, 0xFAF9EFF7, 0xF5010801, 0xF109EEF3, 0xFF0A0514, 0x0C0604FF, 0xFB0EF704, 0xF50EFD0B, +0xFF05F4FA, 0x07E70B0B, 0xEFFEF4FD, 0x0D0807F3, 0x05100DF6, 0xEFFA1A08, 0x020D090A, 0xFFF5F7FD, +0x1513F10A, 0xF10BF2ED, 0x0B0F150B, 0xF10306FA, 0x09FB11EE, 0x061007F2, 0xF7F8FB14, 0xF90704EE, +0x0AF8EAF6, 0xF7E809F9, 0x02F609E9, 0x09E802EE, 0x03F50BE8, 0x040C04F1, 0x0CF41009, 0xFB00EEFA, +0xFC071611, 0xF9F1F203, 0x0BF0F409, 0x0214F801, 0x0A0AF504, 0x0508F5F1, 0xE916E900, 0x07F4F60A, +0xF9F010F2, 0xF906F507, 0x0BFB0AF4, 0xF408F0F1, 0x0EFD0A06, 0x03F80AF6, 0x130CFD0C, 0xF1E9F7F8, +0xF800F502, 0xFEFDFDF4, 0xF90B0713, 0xF506FAFD, 0x0712F9F2, 0xEAF20DF5, 0x10F40D0D, 0x06050B09, +0xF706090E, 0x0F00ED11, 0xF90E02F4, 0xF1FEFCED, 0x0AF5E00D, 0x06F7F3F9, 0x08F81206, 0xF30EF4F5, +0x12FF02EF, 0xF7040DF4, 0x151204F0, 0x04ED07EC, 0xF0F3FB05, 0x08F2FCF4, 0xECED11FA, 0xFC110DF8, +0x0BF4F90A, 0xFCF9F905, 0xF0010014, 0x0A0EF9F8, 0xF4020C02, 0x10FDFA13, 0xF5000B05, 0x05EAF808, +0xFE0F04F3, 0xFDEFF9EE, 0xF9F9090B, 0x10F20E0C, 0x060909F0, 0x060EF40F, 0x0E0705F5, 0xFB05F6F9, +0xFA1C0512, 0x0B10FBEB, 0x16F20DF6, 0x090012F4, 0x0A13020B, 0x0EFF0C0A, 0x130DEF0C, 0x070A0B04, +0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, +0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, +0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, +0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, +0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, +0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, +0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, +0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, +0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, +0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, +0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, +0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, +0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, +0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, +0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, +0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, +0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, +0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, +0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, +0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, +0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, +0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, +0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, +0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, +0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, +0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, +0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, +0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, +0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, +0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, +0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, +0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, +0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, +0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, +0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, +0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, +0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, +0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, +0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, +0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, +0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, +0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, +0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, +0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, +0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, +0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, +0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, +0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, +0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, +0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, +0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, +0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, +0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, +0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, +0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0xFB0E01EF, 0xFF0C0B02, 0x07090AFB, 0x0BFBF3F1, 0x0B090F0D, 0xF10409F2, +0xF80A0E0B, 0xECF60E09, 0x0610F2F9, 0xF4F9FBEF, 0x08ED0DF9, 0xFCF9FEFE, 0x0F0C12F8, 0xF9F317F4, +0x0BF80213, 0xFFFD1710, 0x0BF80FFB, 0xEEF6F2EE, 0x0106F506, 0xF3091206, 0x00F504F0, 0x0B0C0018, +0xFD02FAEF, 0x06ED0308, 0xF4F60215, 0x02F80BFC, 0xF20601ED, 0x06F7F5F3, 0x0111FAFC, 0xF2ECF2F8, +0xFB050C0D, 0x0314EA0A, 0x09F4FCF8, 0xF0F80013, 0xF6E90D0A, 0xF307F415, 0xFB04F4F8, 0xF006F3F1, +0xFAF9F808, 0x06F9F109, 0xED0A0A0C, 0xF3F6FC03, 0x0508120A, 0x0C0DF100, 0x02FF09FF, 0x00F80D01, +0x04E50410, 0xF616130C, 0x0300F4EC, 0x090EF506, 0xFA0E0C14, 0x0EF10111, 0xF2030F09, 0x03F3030E, +0x09EA0509, 0xFDFEF9FB, 0x06F4F702, 0x0C0D0BF3, 0xFFFBF906, 0xF7FBF512, 0x03110AF8, 0x0AF7F70D, +0x17F60108, 0xF811FA05, 0xEE040700, 0x03FEEF01, 0xF706EC0B, 0x060C0AFA, 0xEC0EF910, 0x0804F207, +0x09E902F7, 0xF7FDF610, 0x0C050C0B, 0xF8E7F609, 0xFB170A13, 0xF0080404, 0xE808F413, 0xF1F4EB07, +0xEBFC01F7, 0x0B040AE8, 0x00F1020E, 0xF0F207EC, 0x0EFFF211, 0xF3F815F4, 0xF9020B0B, 0x0EF71201, +0x0706FC0C, 0x06FDF6FA, 0xFBF7F80A, 0x08090EFD, 0x14FD05FF, 0xF403FE0A, 0xF5F8EF03, 0xFB0AF8F7, +0x0F00F409, 0x0AEF0B03, 0x0FFB0210, 0x11070710, 0xF1080B0B, 0xF20E08E8, 0xF00CF5EB, 0xF0F30C0E, +0xFCF0080D, 0x0900EE07, 0xFA01FCFE, 0xE712E70B, 0xF004FEF9, 0x0CF5090D, 0xF60EF606, 0xF8F4FAF8, +0xED061507, 0xEF110506, 0xF90FF20C, 0xF911F813, 0xFC12F3EF, 0xF7F9F1FC, 0x0E07EAE9, 0x0EF8F1F8, +0xF6070FEA, 0xF0FA0310, 0xF8FE1417, 0xF8F306F9, 0xFBFCF50E, 0xEC0D11F3, 0x0900F70A, 0xF80EFBF3, +0x0B08F8F6, 0xEFF00F0C, 0xF709F8FA, 0x0E16EB13, 0x0BF415FE, 0xF4F20F0B, 0xEC0C0AF3, 0x13F8FB02, +0x12F908FB, 0x0A090D12, 0xF110F0F5, 0xF40E021B, 0x0809F7F3, 0xEE000B0D, 0x0E0FF5F6, 0xF3F40BF6, +0x05150BE7, 0x0DF809FE, 0x12030809, 0xFF13FC08, 0x0BF6F912, 0x13F90AF4, 0xFE03F2F1, 0x04FB0CF7, +0x01FDE8F5, 0x0EF8F40D, 0xFE02F7ED, 0xE7EDF2FB, 0x04F9FF13, 0xF0F80A07, 0xF700F6F7, 0xF4080EF4, +0xF2F7F80F, 0x0DFDEFF0, 0x11EFF902, 0xF2FC0703, 0x0AFD10F1, 0x17F70D07, 0x08F5EFEB, 0xF10B11F9, +0xF610FFF8, 0x0C130B18, 0x080CFEF5, 0xFBF8F906, 0xF1080C08, 0xEAEEEE10, 0x0F11F6FD, 0x06F706F1, +0xED0BEA0D, 0xEEF30C02, 0xF8F40D0F, 0x020D0DEC, 0x0CF40605, 0x07020C12, 0xF40C0EF2, 0x060115F2, +0xF0E6F508, 0xF40DF9F0, 0x0F0A05F4, 0x0FF00B08, 0xEB08FEFC, 0xEE030AF1, 0x0DF9E806, 0xF2F7F5FD, +0x0A12EEF0, 0x09F3EFF8, 0xFE05F6F8, 0x1CEDF4F5, 0x060512FB, 0x08F90AF0, 0x000107F9, 0x14FFF9FA, +0x16F70B0B, 0xEEF2F704, 0x04F90BF1, 0x150302F3, 0xEBF8F8F3, 0xF6F90FEF, 0xFBF0F7FD, 0xF70D1000, +0xECF70C12, 0x03FDF3F0, 0xE4F31604, 0x02FFF600, 0xF00C0105, 0xEC0D0F02, 0xFAFAF707, 0x0208F501, +0xFFF809F5, 0xEEF70405, 0x050CFCF9, 0xF20BEBF7, 0xFA0E11F6, 0xF7F403F2, 0xF5F0F306, 0x00081A0F, +0x02F6EE09, 0x0F0D0B0F, 0x0AF7EDF6, 0xECFA0FEB, 0xF000FBFC, 0xF91103F4, 0xF0F30001, 0x08FCF8EE, +0x0CFEF30B, 0xFE040B02, 0xFC030FF3, 0x04F9F209, 0xF10E0705, 0x14F60B0C, 0x03ED1311, 0xED03EE13, +0xF9F8F70F, 0xFB010504, 0xEDF70C08, 0x061802FE, 0xED0801F9, 0x06FCFA16, 0x0EF8FCF3, 0x0EF00C0E, +0xF3F9170D, 0xFE010F05, 0xF31B0500, 0x07F50BF4, 0xEE09030A, 0xF401F400, 0x0C04090A, 0xFCF90F02, +0x0D10FD0C, 0xF00FEA09, 0xF3F50BF7, 0xFCFCF7EF, 0x06FB0A12, 0x0200EC01, 0x02020A0E, 0xF3FCFE0D, +0xFC0CF209, 0xFB06F2EE, 0xF90B0C10, 0xFDFCF40C, 0xFC06F80B, 0xEFF902F3, 0x0C110911, 0xF80AEFF3, +0x0900F30C, 0xF8160E0F, 0xEE0D130D, 0x0BF00209, 0x0AF509EF, 0xF7F614FA, 0xF513070A, 0x09E512FD, +0xF3050D0C, 0x0006020D, 0xFAED07FE, 0x07FE170B, 0x121300FF, 0x02F602FD, 0x0AF408FA, 0x06FAF7F1, +0x0807F71A, 0xFBF20C0B, 0xF3FD05F7, 0x06F4090F, 0xF1FEF307, 0x0805EBFA, 0x0810070D, 0xF6F31214, +0x02ED0607, 0x0D08010F, 0x09F60FF2, 0x0BF8F20C, 0x1BFCF6F4, 0xECFB070C, 0x13FAF3FD, 0xF8F7FCF4, +0x0C09F7F4, 0xF001E9F9, 0x11F1F305, 0xFAEC08FA, 0xF8F8F40F, 0xF6F70B0A, 0x07F012F4, 0xFDF5FEF3, +0x09070EF1, 0x09FFF7E9, 0xEAF60C0F, 0x04030106, 0xF5E70709, 0x0AF6F70C, 0xFA14FEF1, 0xF0E51903, +0xF4EF0B11, 0xF0F80CF3, 0x12ED0307, 0xF301F405, 0xF9F4F3F5, 0x0B0EF809, 0xF7EBF9F8, 0xF10BF406, +0xFBEEF2F6, 0xEC1111F2, 0x0716EEF6, 0x080910F0, 0xEE0D0010, 0x07ECF7F0, 0x09060005, 0x0DF5EB0B, +0x0212110C, 0xF3F704FA, 0xEA02020C, 0x050811F1, 0x01FA07F7, 0xF60E0D0D, 0xF711F60C, 0x0108F4F1, +0xF7F6FE01, 0x0F0FF7F9, 0xEFE7010A, 0x090902F6, 0x0FE809F8, 0xFDFE00F6, 0xEF0806F5, 0x10F80F0F, +0x0419F40B, 0xEF08EEFD, 0x0711F507, 0xF20901FB, 0x0BFA130A, 0xFA120CF9, 0xE809F2F2, 0xFAF8FE00, +0xF2FDFCF8, 0xF805F1FD, 0xF1F70912, 0x0903F80B, 0xF9EFF70B, 0x0D05F5F2, 0x0A08FF0E, 0x09F5EE00, +0x08F91314, 0x0AFEF60A, 0xE51005F0, 0x041EECFA, 0x06FDFF05, 0x0D11F1EF, 0xF4F80912, 0x0D090106, +0xFAF6F308, 0xFE14F8F1, 0x0D02EE03, 0xF0FDFAED, 0xF2F2E903, 0xE9040C0D, 0x0A00F8F8, 0xF4FA0909, +0xF4EFFA1B, 0xFC0D0D0B, 0xF2EE08F5, 0x000E0F12, 0xF0F50F11, 0x04FEF9F4, 0x0BF914EB, 0x170CFBF9, +0x03F30E06, 0x01F8F70F, 0x14F8EFFD, 0xF412F5F2, 0x0AF60C01, 0xF711090D, 0xF60DF90C, 0x09F0ECE8, +0xEC06140C, 0xFD090DFA, 0xEA01F7EF, 0x030AF8F6, 0xF3F5FCFD, 0xF4F3F500, 0xF3EDECF5, 0xF3130AF6, +0xF8EFFA0E, 0x0A0B0DF4, 0xF1F0F7F5, 0x0D0A09F4, 0x10EDEEF7, 0x0E0EEDFE, 0xF4F9F306, 0x05FCF8FF, +0x13FBF7F2, 0xFF07F6F7, 0x0AF2F8F6, 0x0DFA1EFF, 0xF6EE0B09, 0xF113030B, 0xFAF9F3F5, 0xFA0C080C, +0x0BF8F607, 0x09F902FB, 0xF50BFD08, 0xF7F515EF, 0x0BFA00FB, 0x01FAF009, 0xEA02FE05, 0x0CFBFC10, +0xFBF7F214, 0x1305F1ED, 0xFA01F216, 0xFDFBFFF4, 0xEE0B040C, 0xFAFB05FD, 0xFEF8F7F4, 0xF60802EF, +0xF301E603, 0x03EEFAF7, 0xF109EAF2, 0xEF0BFEF5, 0xFFF31115, 0xED09F309, 0x02FFEE0D, 0xF60D0FF9, +0x030A07FA, 0xF5F4060A, 0x140FFEF1, 0xF6FCEEFF, 0x07030006, 0xFBEF04F7, 0x0AF009FC, 0xF90A0FF9, +0xF2F702F8, 0xFFFBFB0E, 0x0907090B, 0x0B180F02, 0x0B0C0405, 0x12F80AF9, 0x09F400F0, 0xF010070A, +0xEBF105F1, 0x05F90C11, 0xE805F30B, 0x12F70BF3, 0xEF11EFFC, 0xEFF7FC0F, 0xE709EF10, 0xF50CFBFD, +0xF7F805F0, 0xF609FCF7, 0xEAF80F00, 0xFBF40B10, 0xF71106F5, 0xFA12FB01, 0x020BF30C, 0x0714FA04, +0x06010708, 0xF2110D0D, 0xEEF6F2F8, 0xF009F1E8, 0x07FD06F7, 0x14F8EF0C, 0xF00DF9F6, 0xF20BF50B, +0xF90C06F7, 0x06FB02F7, 0xF7F20A09, 0xFA051008, 0x0EFA0913, 0x05060D03, 0xFCF40CF6, 0x03E8FCFC, +0xF3F31411, 0xFCF40906, 0xFB0BF9F7, 0xFC02F80D, 0xF20408F2, 0xEE0EEF0B, 0xF0000EF3, 0xFBF6EDF1, +0xFAF50FEB, 0x06FC0C0B, 0xF009F80F, 0xF0F7F706, 0xF70507FC, 0x0AF00209, 0xFF0DF20F, 0xEA15FA06, +0x0816EDF3, 0x000EF9F5, 0xEFF7FA04, 0x0FF60814, 0xF1FEFA02, 0x0805F306, 0xF610FDEE, 0xF8061606, +0xFE0DFCEF, 0x07F8F613, 0x0C0809F9, 0x0DEBF0FB, 0xF00EF4F4, 0xF8E7F20A, 0xF3FAF20D, 0xF90D04EE, +0xF1F40E00, 0x09EFFFEC, 0xFE0B0EE7, 0xF7FA0F0E, 0xF00CFEF4, 0xFAEEF9FC, 0x161AF703, 0xF70F10EC, +0xF6F011FA, 0x10FDFB0B, 0xF60C03FE, 0x0AFF08F3, 0xF6F606F0, 0xF5F716F3, 0xFDFDEBF7, 0x0CF8EFF4, +0xE3EF0910, 0xF7F6FF12, 0x001402F1, 0x03100EF2, 0x1117EBFF, 0x17FA1008, 0x0DF9F80E, 0xFCF0F511, +0x1403EEFC, 0x0010F100, 0x110A0612, 0xF505FAEF, 0xF4F304F4, 0x061209EF, 0x090C150C, 0x04F41306, +0x0B0C0DED, 0xF0F6F110, 0xFC0F1008, 0xF3EF0E08, 0x0B0AECF8, 0x0CF8FA0C, 0xF7FB0EFF, 0x0FF50FFC, +0x0DF4EDF8, 0x02080C0B, 0xF510F2F2, 0x0208FDF1, 0x060B04F1, 0xF8F6E607, 0xF415EDFF, 0xE8FBEBEC, +0x0805F30F, 0x00F30F09, 0xFA0DF6EB, 0x0BEEF806, 0x0408F00B, 0xF4F5FB09, 0x090EF310, 0x1006FBF9, +0xF0F7F710, 0xFC070C0F, 0xFB12EAFA, 0x0BF007F1, 0x080100F1, 0xF700F709, 0x0A0D05F8, 0xEFF20D0C, +0xF209F8F8, 0xF207FDF3, 0x0DEFEFEE, 0xFD020114, 0x0AF5050A, 0x0D0415FA, 0x0C12ED0F, 0x14F01005, +0xF7F0EE06, 0x0F14F209, 0x080500F9, 0x08F5050E, 0x0DE7E901, 0x03FDF3FC, 0xF20403FD, 0xF7F2F60D, +0xECF00D09, 0xFB09FF0A, 0xF306F9F2, 0x0E03F20E, 0x0C09F305, 0x11F710F8, 0xF4F217E4, 0x0E09090A, +0x0A12F0F9, 0x06F312FE, 0xFDFBFDEE, 0xE9F0020D, 0x0DFB1005, 0x0200E90B, 0x0F0C02F5, 0xF8FF05F4, +0x0AF303FD, 0x0BF4100E, 0x14F2040F, 0x0EF9EF0B, 0x0AED0801, 0x05F5EE08, 0xFF0A0514, 0xF8F2F0FF, +0x0FFAF7F0, 0xE10E12F6, 0x13F1F4FA, 0xF3FC0B0B, 0xEFFEF4FD, 0xF9080708, 0x05FCF9F6, 0x040E06F4, +0x020DF5F6, 0x13F50B11, 0x1513F1F6, 0x05F707ED, 0xF7FB01F7, 0xF1EF06FA, 0x09FB1102, 0x06FC0706, +0xF7F80F14, 0x0EF3F002, 0x0AF8FE0A, 0x0BE8F5F9, 0xEEF609E9, 0x09E8EE02, 0x03090BFC, 0xF0F8F0F1, +0xF8081009, 0x0F0002FA, 0xFCF202FD, 0x0DF106EF, 0xF70408F5, 0x02140C15, 0xF6F6F5EF, 0xF1080905, +0xE902FDEC, 0xF3F4F6F6, 0xF904FCF2, 0xF906F5F3, 0xF7FB0A08, 0x08F4F0F1, 0x0EFDF6F1, 0x03F8F6F6, +0xFF0C110C, 0xF1FDF7F8, 0xF814F502, 0x12FD1108, 0x0DF7F313, 0xF506FA11, 0x07FEF9F2, 0xEAF20D09, +0xFCF40D0D, 0x06F1F709, 0xF7F21DFA, 0xFB00ED11, 0x0DFA0208, 0xF1FE1101, 0x0AF5F4F9, 0x060BF3F9, +0x080CFD06, 0xF30EF409, 0x12EB02EF, 0x0BEF0D09, 0x1512F0F0, 0x18010700, 0x05070F05, 0xF306FC08, +0x0001FD0E, 0x10FD0DF8, 0xF708F90A, 0x100D0D05, 0x04011414, 0x0AF90D0C, 0xF402F8EE, 0xFC11FAFF, +0xF500F605, 0xF0EAF8F4, 0x120F0407, 0x1103F9EE, 0xF9F9F5F7, 0x10060EF8, 0x0609F504, 0xF20E080F, +0x0EF3F109, 0xFB05F60E, 0x0E1C05FD, 0xF710FBEB, 0x16F2F90B, 0xF500FEF4, 0x0A13EEF7, 0x0EFF0CF6, +0xFFF903F8, 0xF30A0BF0, 0xF7FCF004, 0x1613F70B, 0xF90506F5, 0xEB09F008, 0x05F30CF3, 0x0310EEF3, +0xFD1002F4, 0x09070114, 0x040B0606, 0xE400F907, 0x13F40B1A, 0x06F4EBE7, 0xF1EE06F9, 0xFAF9130D, +0xF3ED090A, 0x08EF05F8, 0xF814F507, 0xF8131707, 0x1EFCEF0C, 0xF1090708, 0x04F211F0, 0xEFF0090E, +0x09FBF3FD, 0xF3F204F4, 0xF000FC1C, 0xFC00F009, 0xF9FD160F, 0x16F7F80D, 0x0DF8060B, 0x03FAF4FB, +0x03FDFF0D, 0xF4F1F40E, 0xF9EBF7F2, 0x0EF6FA06, 0x09F3EDFA, 0xFEF4EFF2, 0x0F0300F4, 0x0DEBFBFC, +0x1FF0010E, 0xF9140E07, 0xF2F6FD07, 0x11E9020B, 0xEE17070B, 0x10FD0003, 0x0904F5F7, 0x0515FCEE, +0x090F07FF, 0x12FC1104, 0x10F9F0F1, 0x0A080700, 0x010A1200, 0x120B01F5, 0xF7F0ED01, 0xFB06040E, +0xF0FEF30B, 0x0A0713FC, 0xF6F7F9EC, 0x07F803ED, 0xF2F9EF0F, 0xFAF4100A, 0x020AFA04, 0x0806130D, +0xFF0B0F04, 0x080705F8, 0x04F503F3, 0x05EEF9ED, 0xFBFEF30A, 0xF2F9F20B, 0x03FEECEB, 0x08F40302, +0x0617FE0A, 0xFE10050C, 0x0410FAF3, 0xF508EFF9, 0x030908F2, 0x010206FC, 0xFDF7F415, 0xF9080F05, +0xFBF00CEE, 0x0BFD0D0B, 0xF7F9F10A, 0xF80603F9, 0xF202F4F5, 0x0F07FA05, 0x04FA09F8, 0x08F80B04, +0xED030E00, 0x0A04FDF8, 0xEFFC0B14, 0x05F2FFFE, 0xECF60EFB, 0xFE04FD07, 0x0AEDFB0D, 0xF20FF407, +0xF4030A00, 0x15F1EEF2, 0xF50B0D0B, 0x02FE11FB, 0xF3FBF8F8, 0xF7F0F516, 0xF6070A04, 0xFD0C1A0D, +0xF603F50B, 0x0D0F04FA, 0xF5F5EFF7, 0xFB130FE9, 0x0C0205F3, 0xFB050CF7, 0xF9F809FF, 0xF1120DF0, +0x0E0503F8, 0x16FEFDF6, 0xFA0AF5F7, 0xF302F6F9, 0xFC07F4EE, 0x0A040A00, 0xFFF409EE, 0xF8F7FD18, +0xFC01F7EA, 0x0F11F40F, 0x0DF7F708, 0x0DF60809, 0x0DFD0F08, 0x1012FA0E, 0x021615F4, 0x04FCEBFB, +0xF7FC09FE, 0x0C080DF9, 0xF8EB05FC, 0x0708F2EE, 0xFC14F80C, 0x0C06F111, 0x0809F9F2, 0x0CF809FF, +0x0DF50AF8, 0x05EA0E12, 0xFCF6F805, 0xF5EC0A0B, 0xF2080D10, 0x09FBED04, 0xEFF7F40E, 0xF8F610F6, +0x09F4F1F9, 0xFFFC0E0B, 0x020AF3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEFF410FC, 0x07FD0EFD, 0x0D060100, +0x13F4FAF3, 0xFFF001FE, 0x08FC07F0, 0x0900FC05, 0xF5F8F709, 0x0CFC100C, 0xF7F7FBFC, 0xF7F608F4, +0x05F90308, 0xECF6FF08, 0xF2F70B07, 0x04FE03F5, 0xFC02FBFE, 0x02F41301, 0xF1F6F50E, 0xF9FA00E4, +0x0EFB0709, 0xF50800F7, 0x040AEC07, 0x130301FA, 0x0409F809, 0xF104EA0F, 0xF7F00A09, 0xF80BF704, +0x13F800FE, 0xFAF50CF3, 0xF103090A, 0x12FAF30A, 0xF611F8F9, 0x02F1F403, 0x0A040FED, 0x0AFFFEF2, +0x05FBF7FD, 0x0FE903F3, 0xF6EA090B, 0x120FFE07, 0xFA1406F2, 0x0EF80EFB, 0x0EFDFAFC, 0x0EFC0D0A, +0x120805EF, 0xF70DF900, 0x0C0EE5FB, 0x0F0DF503, 0xF609000A, 0x0D03F5F9, 0x0FFB1006, 0x05F60A08, +0xED07F8EF, 0xF90CEE0A, 0x0B16100A, 0xFD07F607, 0x0EFF0D01, 0x0CEF04EB, 0x11F5FD0B, 0x080B0CF5, +0xFF14FEF5, 0xF1FAF413, 0xFA0100F6, 0xF0090FFC, 0xF3FB0AEF, 0xFE09FE0E, 0xF710F3F5, 0x04090C11, +0x04EEEFF2, 0x09FC0FF1, 0xFE0BF4F9, 0x08F10AFC, 0x030AF5FE, 0x13FA0FF4, 0x07000AFE, 0x071507F5, +0x06FD08F0, 0x0F0C08EE, 0x190E020D, 0x08EDF4EB, 0x0D0DF109, 0x0210EF00, 0xF506080A, 0x1010F7F0, +0xFE02F7FB, 0x09F8F6F7, 0xF902FF04, 0x16E003FE, 0x12EA1A00, 0x130E0FFF, 0x0702F2F9, 0xF10BEFFC, +0x010E04F1, 0xF6EF15F6, 0xF50A0510, 0x050DEF0D, 0xF908F4F6, 0x0F0F0BF0, 0x04F7F6FC, 0x07F9FAEE, +0x02EE07F9, 0xF6F90105, 0xF1FFFC04, 0x0802EB0C, 0xF10E0CF3, 0x030E0508, 0x0CF60CF9, 0x08F20EF5, +0xEFFE09EF, 0xF9FB0A06, 0x14F6F6F5, 0xF6140DFE, 0xF511F8F4, 0xF0FAEF00, 0x1103FC0B, 0xF1090B05, +0xF4FD11F0, 0xF80BF6F1, 0x14160D0B, 0x1105070C, 0x0DEDF80B, 0x1005EE07, 0xFCEFF5E2, 0x0812F3F6, +0xF2100BFD, 0x04FAF00B, 0xFD08F508, 0x06030EEA, 0xF4F90C05, 0xF5EE0608, 0x0CEEF40F, 0xF4F8FB06, +0xFCF01609, 0x0407F402, 0xFDFBFDFD, 0x0BF4F806, 0xFCF701EB, 0x08EB0709, 0xECF9040B, 0xF8E9F300, +0x1C0CEEF5, 0x0703FC08, 0xFEF40909, 0x150B0EFF, 0xF30D0B07, 0xFAF203F9, 0x02F209FA, 0x060EFDF7, +0xFCEB0FF2, 0x0313FF13, 0x030A0B07, 0x0BF70003, 0x00090D02, 0x1405F106, 0x020AFCF6, 0xFAFD01F6, +0xEE05F7EB, 0x030201F4, 0x06071009, 0x0E000704, 0x0A060F07, 0x0C0DFE04, 0xF1FA001A, 0xFFF90B10, +0xF607ED0F, 0x06F9100D, 0x05F6F40C, 0x0E0BF106, 0xF8FB09FF, 0xEBEE13FB, 0x0C0EF4F5, 0xF608EC0A, +0xF9F5F905, 0x0AEE03F5, 0x000B0A03, 0x0815F904, 0x13F7100F, 0xFB0711ED, 0xECF5FD01, 0x0D03F90C, +0xF4FA05EF, 0x1209050A, 0xF60BFD0A, 0xFF04F706, 0xF8ED06F0, 0x0001F71A, 0x09EEFFFA, 0xFF0D0BEA, +0x130F00F4, 0xF1F904FA, 0x05EDF504, 0x030AF7F8, 0x09F712F1, 0xFF0C0E07, 0xFE12F9F6, 0x08FC08F0, +0xF9F813FE, 0x01FF0D0C, 0xF3F10C06, 0xEC05F7F4, 0xFCF6FD04, 0x0B07FEF6, 0xF8FC13E8, 0xF004F611, +0xF6060210, 0x12FDF5ED, 0x0100F9ED, 0xEE03F8FE, 0x11F4F40C, 0x0C0BF614, 0x0D050411, 0x0B080FFA, +0xF2F906F9, 0xF5F3F8F2, 0xEF06080E, 0xF614F60D, 0x0A080A0E, 0xFBF2F9FB, 0x1612F1F7, 0xF4F60FF3, +0x010D0B0B, 0x0C0EFB07, 0x0B04FDED, 0xFAF50604, 0xF2FAFB0A, 0x0AF1FFF2, 0x100C0611, 0x01EF0CF9, +0x0B12F90A, 0x12FBF002, 0x04040D05, 0x10FEF910, 0xEAFC0AE7, 0xF404FFFC, 0xEA08F9ED, 0xF5F616F6, +0xF10106F7, 0xF806F5F8, 0xF8F70CFA, 0x0CF7FEFB, 0x0AEEEF08, 0x0AFBF0F2, 0x13F5EFEF, 0xFD010BFC, +0xFA01F3ED, 0x08F30D09, 0x09FEF902, 0x050FFDF4, 0x11FAFE08, 0x1703F1F2, 0xF3FCFE03, 0x06F4EA10, +0x090FEE13, 0x00F20702, 0xFBF90401, 0x070CEBF7, 0x0FF6F50B, 0xEEF8F6FF, 0x0A0AF506, 0x06F0010A, +0xF0F6F4FB, 0x00F51201, 0x0DF90C02, 0xF1F8F0EF, 0x061706EC, 0x0DF80EFD, 0xF0F6030A, 0x03FB100E, +0xF608F50D, 0xF10F08EF, 0xF9F0F105, 0x0EF7FA0E, 0xFD030811, 0x12ED0CF6, 0x050508F7, 0x05F90514, +0x0D100A10, 0xEAF901FF, 0x070B010D, 0xF90D140A, 0xFC02F1F4, 0xE9FCF3F8, 0x07F70FF2, 0x0409F8FF, +0x0C080CF5, 0x03FEF0F5, 0xF80E000C, 0x0201FAF2, 0x1314090D, 0xF90507F5, 0x05F302F0, 0x0CEFFDFB, +0xF11813EF, 0x10FFEEF6 + + +basegraph= +1 + +z_c= +176 + +n_cb= +11616 + +q_m= +2 + +n_filler= +8 + +e= +4640 + +rv_index= +2 + +code_block_mode= +1 + +iter_max= +20 + +expected_iter_count= +4 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE + +expected_status= +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_2.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_2.data new file mode 100644 index 0000000000..2463df6178 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_2.data @@ -0,0 +1,902 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0xF315FCEF, 0xF50FFAFA, 0xFBF70DEE, 0x1013060C, 0x0B0AFCE7, 0xF0F30BF4, 0x0C070F06, 0x10F7F30F, +0xFE0F0E0D, 0x0FF7FE09, 0x07090606, 0xF705F004, 0x150EF10B, 0x080C010A, 0xF7FA0909, 0x0B00140A, +0xF1F2F8F9, 0x0AF2F910, 0x0D0F0CEF, 0x03F4F20D, 0x0CF90CF9, 0x06F4F501, 0x12FEF3EA, 0xF210F3F9, +0x0312020C, 0x0D0FEF0C, 0x011714F4, 0x110E02F3, 0xF102F613, 0x0A0B090C, 0x1503FA10, 0x0D13F011, +0xED0F0F0F, 0xF8F712F8, 0x10060502, 0x14EEF0F6, 0xEEF50606, 0x0BEDF006, 0xF2120906, 0x0F0700F4, +0xECF00D04, 0xF414F1F5, 0xF1ECF918, 0xF40B090C, 0xFD0FEDEF, 0x0DFDFBED, 0x0703FCF3, 0xEFF2FDED, +0x03021100, 0x0608F00A, 0x0BF7F910, 0xF7EEF20C, 0xF9ED0901, 0xECF2F0F2, 0xEB09F6F3, 0x0F06F5F7, +0xF90E0610, 0x07010611, 0x06F20E0D, 0x0E06EF00, 0x070C050D, 0x0C0F09F1, 0x10FE0CF6, 0x11EF0B14, +0x03FCE40C, 0xF4F506F4, 0xF400F613, 0x0E0509F8, 0xF00DF9F6, 0xF5F612E9, 0x1208FE15, 0x0607F307, +0x1108EE0C, 0xFDFBFB04, 0x02F30D05, 0xFDF0041A, 0x100CF1F4, 0x0DFAFBF9, 0xE9F10B09, 0xEEF214F9, +0x02F6F5F8, 0x0F010CF6, 0xF11008EF, 0x0CF3130A, 0x03FE11F5, 0xF6050708, 0xFC050EEC, 0x0BF8F4F9, +0x04F50FFF, 0x000206EB, 0xEFF9F7ED, 0x0E14F90C, 0x080401FC, 0x0A0401E5, 0xEE13F30C, 0xF10A0916, +0xF0F400EC, 0xFF03F614, 0x0409EBF2, 0x0C0906FA, 0xF70C0400, 0x0FFAFAFA, 0x1201F611, 0xF5FAFAF1, +0xF40FFA09, 0xFFF2F1EF, 0x0BEFF7FA, 0x0703FC07, 0x08F11109, 0xEF09FEEA, 0x07F908FB, 0xF9FD0812, +0xF90B0A02, 0x05F210F4, 0x1AF7F407, 0xEFF8FA0D, 0xF5F9F606, 0x02EB0D0F, 0xF7F5FDFE, 0x130BF5FB, +0x05F6F6F8, 0x1503FFFD, 0xF2F701F9, 0xF1F6F70B, 0x01010B08, 0xF717FBF6, 0x06FAFA05, 0x050CEF11, +0x11F30200, 0x09020F04, 0x07030601, 0x0603FC12, 0xFB0014F7, 0xF7F70CF2, 0xF0F6EEFA, 0x0EF107F8, +0xEA0D0A10, 0x0AEC0C0E, 0xF5060D07, 0xF7F4E804, 0x0902E90B, 0xEE090AFD, 0x02F60210, 0x090BFCFD, +0xF7F8FCF7, 0x030C0905, 0x040AF1F5, 0xF0F80CE7, 0x100AF413, 0xF8FB0817, 0x02EFFA04, 0xFB04EC08, +0x16F4FDFE, 0xE8FD07F4, 0xF2FFEF07, 0x0DF105F4, 0xF4EDF50B, 0xF7EB04FC, 0xF8F601E8, 0xEE0B00F0, +0xF516040E, 0xF600F605, 0x090705EC, 0xF10408F2, 0xE9F2EC11, 0xE90E1613, 0xF601F6F4, 0xF307F4F8, +0x100B060B, 0xF90D0402, 0x09FE0715, 0xF90E06F7, 0xF6FC08F7, 0xF7F30FF2, 0x040A05FA, 0x08F1F411, +0xF6F806F5, 0x0EFBFD0B, 0x0A0EF6FD, 0xEFF4F8F5, 0xFD05F8EB, 0x1300F8FD, 0xF7FE0CF6, 0x05F4E903, +0xF50302EF, 0xF8F514F8, 0x11F8F4F7, 0x120F11F6, 0x07F4FF09, 0x0D0FF700, 0x0EF7FD03, 0x090A06EF, +0xF90206FC, 0xF20FFEFB, 0xF90709FC, 0xFEFDF2F3, 0x0DF70DF7, 0x10F10808, 0x0B08F5FC, 0xF20605F9, +0x1DF5FAFF, 0x0B04F20C, 0xEDF811FA, 0x0F04EC07, 0xEEF4F40D, 0xF9100EF0, 0xFCEEEDF3, 0xF109EA00, +0xE0E8F913, 0x0AFA0AED, 0xF3E7F90B, 0x06FB0BFE, 0x12FEF20D, 0xF4040C04, 0xF409090D, 0xF3F8FAF5, +0x02F60306, 0x12F6FFFA, 0xF9FAF4F8, 0xF70D0408, 0x0400F007, 0x1501FDF2, 0xF305ECF2, 0x18EF01FC, +0x0FF2050C, 0x050DF30F, 0xFCF80813, 0xF3F906FD, 0xFDF3FAEF, 0xECFCEDFE, 0x0D05F810, 0xFC0B11F9, +0xF9FE0AE9, 0xF70EF4F3, 0xF9F1F1F8, 0xFCFA0DF8, 0x140F00EA, 0xF00AED07, 0xF9030CFC, 0xF604F9FA, +0xF8140217, 0x08F816FE, 0xFA06FF0D, 0xFC0C11F3, 0xF6F5050E, 0x09FB0010, 0x0C11F4F3, 0x05ECFE0D, +0x04F7070A, 0x12F50FEC, 0x0DFB0208, 0x110C03FA, 0xF50CF70A, 0xF90BF908, 0xFA0F0CF8, 0x100306F0, +0xF50C04FA, 0x060B0909, 0xF4FF0F13, 0x06FAFA02, 0x05150912, 0x0E0BF308, 0x0BFB0E0B, 0x0FF405F2, +0xF10AFD07, 0xFA00080C, 0xFB0FEB02, 0xF7FFFC0C, 0x0DF40BFB, 0x16FE060D, 0xFEF908FE, 0xF5F600F5, +0x0204F7F5, 0xF605FFFC, 0xF802F606, 0xFA09EB0E, 0xEF0B0CF3, 0x1308F909, 0xF7F704F9, 0x0702F600, +0x04F5F00A, 0xF7FAFC0F, 0x0BF70BF6, 0x16F3FF08, 0xF20B09FB, 0xF905F115, 0x040908FE, 0xEBF9090C, +0xF808F3F5, 0x0512F3EF, 0xEEFC07F4, 0xEFFFFCFF, 0xEE0DF4FE, 0x11F7100A, 0x01F600F4, 0xF413F3F9, +0x06F2F2F1, 0xF0120B03, 0x0D0CF3F7, 0xE4F000FB, 0xF7FC1A09, 0xFFED0912, 0xFF08E7F9, 0x06FA08F8, +0x06F70D01, 0x05FEEE16, 0x13F2F90F, 0x0EFC0D01, 0xF5130AFF, 0xF3F0ED0D, 0xF10AF807, 0xF4F0030C, +0x090AF3F7, 0x0C0BFFEC, 0x17FAF3F4, 0x0C0813F4, 0xEF0C0C0F, 0x0AF2E7F7, 0xF3EF0804, 0x05F90912, +0xFDF9F002, 0x041106EF, 0xF51BFAEF, 0xEFF20411, 0x07FCFDF1, 0x09F6FB11, 0xF00D0907, 0x0717F20B, +0xFCEF0800, 0xF0080009, 0xF011F50D, 0xFC06EC0B, 0x16FF0FF8, 0xF9F611FC, 0xF8F70D18, 0x160C0B13, +0x0612F7F5, 0x0D08F80C, 0xF4F9E7F2, 0x03FB0EF8, 0xFF0CF908, 0xEFF111F4, 0xF4EE0EFB, 0xF4FE0502, +0xF70A06FD, 0x0DFBFFFD, 0xFAF2F205, 0xFA060A0B, 0xEDFE0EF9, 0xF5EDF30B, 0xEF0C0616, 0x12020807, +0x00F9F4FB, 0x0FF803F4, 0xFBF8FC01, 0x0D02EB0D, 0x01F2F9F1, 0x0B0CF0F4, 0xFA0C0712, 0x0DF314EE, +0xFD0E0706, 0x06080AF8, 0x1600F7F2, 0xFCF2FEED, 0xF3090BF4, 0xEE0417FA, 0x00F90305, 0x1008110D, +0xF5F1F7F4, 0xF5FB04F6, 0xFC0B02F4, 0xF1FB00F0, 0x0712FF10, 0xF5EB0FF4, 0x110AF005, 0xFE02FC18, +0xF0E8F106, 0x100DF90D, 0xF30900FD, 0xF6F208F7, 0xFE021404, 0xED0AF612, 0x0104F5F8, 0xFE09F7F3, +0xED0A01F8, 0x0BFE0405, 0xF008FA0A, 0xFB1CF201, 0x0712F70F, 0xF0F2FE05, 0xFFF6FC04, 0x0AF4070D, +0xF9F3ECF9, 0x0AEC0BED, 0xEF0D010E, 0xF314F8FF, 0xEF0BFB0B, 0x0602F90B, 0x10F70A04, 0xFAEE0806, +0x0EF7F005, 0xEEF0F60D, 0x13EE0D07, 0xF415F203, 0xFBF8F0F3, 0xEBEB0BE4, 0x05FBF803, 0xF40A07F9, +0xEFF7F311, 0x040FF5F0, 0x0DFCED00, 0x050BEEF9, 0xF30CF612, 0xFB00EA0C, 0xF208F7F0, 0x0603F911, +0xEC02EB04, 0xEFF812F3, 0xEFF60200, 0xF40208FF, 0x12010A05, 0x06F017F8, 0x050F0C16, 0x120010F9, +0x0EF70707, 0xF0FA100E, 0xEFF50D01, 0xF5EE0808, 0xF409F2F5, 0x03FFF50C, 0xF2F0FCF1, 0x01EE16F7, +0x081015F9, 0xFDF10BF7, 0xFBEBF10B, 0x0EF208F7, 0x0C11EE0A, 0x0FFAF00E, 0x0D03F706, 0xF7F711F4, +0x05F30A06, 0xF709F904, 0x031A0DFB, 0xF8EC0608, 0x08EE0909, 0xF202EEF6, 0xFAF7F10F, 0x0F0FF3F9, +0x09010CF6, 0x04F60EF7, 0x0B0FF0EB, 0x08ECF80E, 0x0EFB0010, 0x0104EF14, 0xE9EF0CF4, 0x0AF9EFFD, +0x0B001415, 0xEF04FC07, 0xFF0C13EE, 0xF1F4F2FC, 0x0E08E7F7, 0x000CF612, 0xFD0B07EE, 0xFEFE04F0, +0xFBFB0D07, 0x0AE80103, 0xF4F2F309, 0xF2EFFBF9, 0x0A07EC05, 0xF405EEFA, 0x03F706F8, 0x010005F6, +0x0DFFF711, 0xF5030BED, 0x11EEFB13, 0xEE01EAEF, 0xF8F70DFB, 0x070DFBF8, 0xF5F116F0, 0xF7FB0401, +0xF6F8F008, 0xF6EDF3F7, 0x1A02F912, 0xFD06F803, 0xF501F70D, 0x0A011708, 0xF0FA0E02, 0xF906FBFC, +0xEFFCF707, 0xF50E09F8, 0xFA0CE9F9, 0xFB0E13F0, 0xF117F30D, 0x0C0702F9, 0x0CFBF705, 0xFB12F0ED, +0xF5F1FF14, 0x0D070C07, 0xF90B0409, 0xF1F3FE09, 0xEF03F80A, 0xFAEE0509, 0x11F4F600, 0x16081215, +0x0909F7F6, 0x0EF80A04, 0x0AFB0EEE, 0xF3FC020D, 0xF4FDEEF8, 0xFCF9F310, 0x0AEA00F5, 0x0AF0040F, +0x09F7EEF7, 0xFFF3F409, 0x11F704EF, 0x0C10F710, 0xF70AEA12, 0xFCF201FB, 0xF4000F01, 0x0F021100, +0x0B0AF4FA, 0xF802F702, 0x0812090D, 0xF9F30A10, 0x0FF2F309, 0x0DFCE9F8, 0xFA06FA02, 0x10E7FE06, +0x15F8F410, 0x020D02F7, 0xEB0810F8, 0xF011FC10, 0xF5F812F6, 0xF71010F2, 0x0DEE0DF3, 0xF8EF08F9, +0xF1F5FC11, 0xF8F8EBFD, 0x0604EEF3, 0x070CF40A, 0x0C070CF8, 0xFC090014, 0xF10EFDFB, 0x0CF80616, +0x0DFFF2F9, 0x0802F5F8, 0x09EE1309, 0xF8F70C04, 0x0AF50C03, 0xF90AF5F5, 0x0E00FE0E, 0xF1F7FEF6, +0xF8F3050A, 0xFCF50A13, 0x0AFE0B11, 0xF5F500E5, 0x0D0DFCF8, 0xF208F405, 0x01EEF0F9, 0x0900FB06, +0xF4F30EEA, 0x03FA0C02, 0xFC03F60B, 0xF8070AEA, 0xF1ECF9FF, 0x09FE0813, 0xFA020B11, 0xFF0210F6, +0xF3F4ECE6, 0xEEF6F6F4, 0xF50CFEF1, 0x08F2EA0E, 0xF7F70D06, 0xF708EF07, 0xFB0CFC0B, 0xEF0FF4F2, +0xFAF0FD0C, 0xF3F311FD, 0x01F5EC0F, 0xF9F10608, 0x0E07F3F3, 0x130508FE, 0x01EB12FA, 0xFF0804F1, +0x0707040D, 0xF408FCFC, 0xFCFEF014, 0x090A0007, 0x0C06F5F3, 0xF5020CED, 0xFCED0C0F, 0x0C0D1008, +0x0F0FFC06, 0x0B09F7F6, 0x08F208F8, 0xF7F7F60C, 0x030AF408, 0x051BF9FC, 0x1307080C, 0x0000F60F, +0x0B07F211, 0x0613F70E, 0x0310F5F4, 0xF0F812F7, 0xFB0B1308, 0xFC0C02F5, 0x13FD010D, 0x02F008ED, +0xF5F30EF1, 0x0511F605, 0x0008F80E, 0xF90EFA00, 0x0708090F, 0xFAF8FB0C, 0x14F7F70A, 0x09F608F7, +0xEC120708, 0x04070A04, 0xEDFEFA08, 0xFF11EFF5, 0x0CF9F5F1, 0x04F5F507, 0xFFF70FFD, 0xF10904FF, +0xF6F8F50F, 0x0BFE040A, 0xF71504F1, 0x0D04F717, 0x00F3FEF5, 0x13F50CFB, 0xF8F707F8, 0xFA0A09F6, +0x09FEF605, 0x050E0300, 0x07190AEF, 0xFE040EE5, 0xF8F70D11, 0x0A08FD03, 0xF40C03F3, 0xEEF0050C, +0xFBEFED07, 0x0AFEEFED, 0xFE0806F1, 0x0A071315, 0xF707FDF5, 0xF10D0FF4, 0x03F80709, 0x0F0BE9FA, +0xF50D0B0C, 0x0AF7EAEB, 0x12F4F306, 0x12F10FF7, 0x06F2F20A, 0x0E0F14EE, 0xFAFC0F06, 0x0E000CFD, +0xFAEEFCF6, 0x0EF3FD02, 0xF9100A04, 0xFAF410F5, 0x051403FB, 0x12EEF40D, 0xF90B0004, 0xF7070DEC, +0xE5140FF1, 0x0C090E06, 0xF5FFEFF7, 0x0FF90D09, 0x00FD0A0C, 0x0A02F5FE, 0x09040DFA, 0x0D07030B, +0x10EEF2F8, 0x0FEA0F16, 0xF611F405, 0x05F10A08, 0xF80703F7, 0x010107FA, 0xEE0DF60D, 0xF9F6F80E, +0x10F6F5F8, 0x0B0B02FC, 0x0A08F305, 0x110107F4, 0x0D120101, 0x0EF7130A, 0x04F7EBF9, 0xF8FB03FB, +0xFD160BF6, 0x1104F5E7, 0xF802F5F6, 0x08090BF5, 0xEA09F50D, 0xFFFB14E8, 0x0800FF0A, 0x05FDE612, +0x14F2F609, 0xFA0301F4, 0xFBFBFC0F, 0x0410F40C, 0xF6F4EF0B, 0xF304FB05, 0xFEEE0E11, 0x12030908, +0x07090907, 0xF707FC11, 0x0C01FDFB, 0x04F20909, 0xEFFEF20A, 0xF00B02FA, 0x0FF8050D, 0xF50EFCFE, +0x08F20EF2, 0xFEFC0BF5, 0xF6EAFCEC, 0x08FA05F8, 0x0AFCFE0C, 0xEFF20A11, 0x0FF1F411, 0x13F8FAF1, +0x0A0912FE, 0x070514F7, 0xF3F8F50B, 0xF3091503, 0x080BF00B, 0xF2F9FD03, 0xF3F503F2, 0xFAF9F819, +0x02FFF9FA, 0x19F6FA08, 0xF403FF00, 0xF40901F5, 0x0613F514, 0xF9F40DF9, 0x030A14F6, 0x170AFC12, +0xF4F10AF0, 0xF5E506FC, 0x0BECF0FA, 0xFC04101E, 0x0BFFFBF1, 0x12F2EEFD, 0xF605F7EF, 0x090DF8FD, +0xFF09F012, 0xF9F4020C, 0x03011206, 0x16F9E009, 0x0607EC1D, 0xFE0EEAF6, 0xFA0DFFF1, 0x13FEFA14, +0x06020D03, 0xF2F902EE, 0xEF0EFCED, 0xF104F711, 0xF0E90503, 0x15060EF2, 0x01F80AF9, 0x0AFDEF04, +0xF10C100D, 0x090AF600, 0x03F5F909, 0x05080DFA, 0xF40E0A1B, 0xF9F408EF, 0x0BF9F0F7, 0xFB100FF9, +0xF6081009, 0xF006F7EE, 0xFA0F0212, 0x0714F90E, 0x070F0DFD, 0x160402F5, 0xED0DF108, 0xF6F0F9EA, +0x1000F0FF, 0xF10B130D, 0xFF0F0C0D, 0x081702F8, 0x0C0EF306, 0x0517F907, 0x05F708FB, 0x0301FAF8, +0xF803F912, 0xF8140AF8, 0x0EF5F506, 0xF4F406FE, 0xF5F8EFED, 0xEF0A120A, 0x0A0906F9, 0x0D0BFB11, +0xF60EF5F8, 0x000B0A0D, 0xF9EC12E8, 0x0A0900F0, 0x0C14F40C, 0xF50011F2, 0x030D000E, 0xF0FD0E09, +0x11F70B03, 0x11EA0316, 0xF7F8050A, 0xF103F5F6, 0xFD1004FD, 0x08F31109, 0xF6F5F114, 0x0CF40BF3, +0x0DEC0BF5, 0x14F30202, 0x070AF80A, 0x11F3F1FF, 0xF8FA0BFA, 0xF90C01EF, 0xEE0DF308, 0x10F6F10B, +0x09F7E2F5, 0x10F1EF04, 0xF3F50AF4, 0x08F9120A, 0x0B02FDF7, 0x06FC1001, 0x0401F7FE, 0x18FAFAFA, +0xF5F3F4F2, 0xE9F4F40D, 0xFA0CFEFF, 0x060503FC, 0xF8F7F106, 0x0813F9FB, 0xF20AF4F7, 0x09EBEEF3, +0xF40CFBF6, 0x0CF6EEF2, 0x0F1EF1EB, 0xF4F90C0E, 0x160BF5F5, 0xFCF6F0EE, 0xF403EEF7, 0x04F10713, +0x11071109, 0xFDFA0F0D, 0x0C08060C, 0x0BFA08F8, 0x010AFF07, 0x101FF7F8, 0xF3EE090F, 0x08F5EBF9, +0x04FDF708, 0xEC090DF7, 0xF3150003, 0xF80BFD0A, 0xEE000A0F, 0x08F7F8FA, 0xFCF008F5, 0x0701EFFA, +0xF5FEF505, 0xEAEAF4EE, 0x0EFCFF10, 0x15F80BFB, 0xF7060700, 0xF3100D0B, 0x1705F901, 0xFA130605, +0xF4F2FA16, 0xEEFA0615, 0xFD130BF4, 0x06FDFA0F, 0xFB0406F8, 0xFC03EB0B, 0xFFF113FD, 0x03FA130F, +0x0B0B07F4, 0x03120AF8, 0x00020304, 0xF70AE308, 0xF9FA0203, 0x0007F501, 0x05FAF2F7, 0x1417F1EE, +0xFCEAF606, 0x02050AF5, 0xED12F609, 0x0E03FD0B, 0xF7FDEB01, 0x02FFF107, 0x1507F4F5, 0xEFED1609, +0xFC02F5F9, 0x06ED07FF, 0x070F18F9, 0xFA0A000D, 0x0FF307FA, 0xF6EFF20A, 0x120604F6, 0xF7090DF4, +0xEC120605, 0x0514FAFB, 0x0BEEFCFF, 0x130A0D10, 0x0100FAF2, 0xF6F307EF, 0x10F0F9F7, 0xF2FB0DEF, +0xF409F8FC, 0xF10A0A05, 0xF10F060D, 0x0EF9F7F6, 0xF502FFF8, 0x0CF20F0B, 0xFFFBFB0E, 0xEBFFEE0F, +0x0809F50B, 0xF809FAF3, 0x00FBF6EE, 0x0A0B0804, 0x0D04F105, 0x0DF709F8, 0x03F6F5F9, 0x0A12EE0C, +0xF6ECEFF0, 0x14090BF4, 0xF907040A, 0xF4F01510, 0x10050FF1, 0x13FFF705, 0x11F80111, 0xFB05F30D, +0x12F3EDF7, 0xECE80905, 0xF90BF8F3, 0x0DFE030B, 0xF1EF0310, 0x08030E11, 0x0510F6FB, 0x12EF09F7, +0xFD03F610, 0xF6FB0B09, 0x0B0F06FD, 0x1309F0F8, 0x060504F0, 0x0CF7EDF8, 0xF7101AF7, 0x000A0109, +0xFFFBFA00, 0xF5EAEEF8, 0xF7F7EAFB, 0x13FB0D08, 0x14F2F4F5, 0xFFF7FB11, 0xF00FFA01, 0x050EF9FE, +0x09F3040C, 0xF002ED0B, 0xF7FA0C04, 0x03070A00, 0xFEF3F108, 0x09F2F701, 0xFAF8070D, 0xEBF20C11, +0xF9060AF8, 0xEA02120A, 0xF4F104FC, 0x08051009, 0x1306FE0C, 0xF9F30C11, 0xF9EFF8F8, 0x1500FFF8, +0xF80DF20A, 0x07F0F1F9, 0xF709F40B, 0xEC06F10B, 0x11F2040B, 0xE80D0AF8, 0xFE02F60B, 0xF7F2070F, +0x13F6FCF5, 0xF80B1006, 0x0A1011F4, 0x040E04F1, 0x02F51013, 0xF6FA06FA, 0xF50D0103, 0x12F111F2, +0xF90CEDF6, 0xED111408, 0x0DFC12E8, 0x0303EFE8, 0xF400F811, 0xFD070807, 0x0BF500F2, 0x0C100BF4, +0x180DFDF7, 0x0DFB050B, 0x0FF80E0D, 0xF710F402, 0x06080D06, 0xF2F20D04, 0xF803F2F7, 0xF5EEF30E, +0xF40E0EF3, 0x03F00600, 0xE201F9F1, 0xF60F14F6, 0x0A0F0EFF, 0x0AFA0809, 0x0DF8E6F7, 0xE7F206FC, +0x05F8F7FB, 0x1604FD09, 0x0F0BF306, 0x08F00AF7, 0xF7070B11, 0x150BF905, 0x0F16F309, 0xF8F60E04, +0xFDF2EDFB, 0x0BFF040D, 0x06FAF0F2, 0xFAFEF501, 0x0F02F6F3, 0x0608FA16, 0x13F9F20A, 0x0A00F10E, +0x06FAFD04, 0x10EFF8F7, 0x0C08F914, 0x01FB030A, 0x0D0E0A02, 0x0BF1FEFE, 0xF00702F2, 0xFE080F05, +0x0D110502, 0x04F60410, 0xF9161006, 0xFCF8FEF2, 0xF6FCFCEF, 0xFEFEFCF8, 0xEB0AFCFF, 0x08F304F8, +0xF909010D, 0xFE0C08F4, 0x02F0F60F, 0x09F90AFF, 0xF2F40B09, 0xF104010E, 0xF5060CF6, 0x0C0CF2E7, +0x0CF2FA0D, 0xF8F3F7FA, 0xFEF00F02, 0xF80D0BF9, 0x03FAF400, 0x0A05EE08, 0xF0EBF200, 0xF6090F03, +0x030E03E7, 0x13FEF50B, 0x0B0FFC0E, 0x12F701FA, 0xF3FE01F4, 0x0E04010C, 0xF90DF510, 0xF4FAF302, +0xF90B0203, 0xF516E906, 0xFDFCF400, 0xF1F7FA0F, 0x121108FA, 0xFDF60F04, 0xF1FBF20B, 0x03FC17FD, +0xFE03EE12, 0x070A11F8, 0xFEF4FCF3, 0xF20AF4FF, 0x02F213F0, 0x09F6FBF6, 0x070202F3, 0x1509060B, +0x04EB010B, 0xFB110DFD, 0xEB030BF4, 0x070C0CF8, 0x0A09F7FC, 0xFAF70AEF, 0xF6EBFFFE, 0xEEF70C0A, +0xF5EE06F1, 0x0A14F500, 0x01FAF606, 0x1AEFF0FC, 0x08EB0FEB, 0x0411F617, 0xFE10EDF4, 0xEC0309FA, +0xF8F802FA, 0x0D0D0D0D, 0x0409EFFD, 0xF1FC0C04, 0x06EEECFC, 0x061417EF, 0x0E05FD00, 0xF914F8FC, +0xEFF20AFE, 0xF011F60A, 0x100EFA03, 0x03F5FBF1, 0x0904F808, 0xF608F4F3, 0x08F5EF03, 0xF1060FFE, +0xF115050C, 0x0D09F0F8, 0xFAFF0E06, 0xFA04F7F4, 0xF40D11ED, 0xE90B030C, 0xF805F610, 0x120401F6, +0x08FC0BF4, 0xF110F1FB, 0xF10E1408, 0x1907F9EF, 0x0AEC10F8, 0xF9F7FCF6, 0x010EFF0C, 0xFFF8F90C, +0x01FAF913, 0xF30B0BFB, 0x00FBF610, 0xF90FF809, 0x05ED080D, 0xFC0DEDF4, 0x07F80C0B, 0xFDEEFCF4, +0x0FF2F2F2, 0x07090B10, 0xF8FD1305, 0x04EE0908, 0x0C18F505, 0x0C06080B, 0xF0E6F5F3, 0xEFF812F6, +0x14010CFF, 0xF8080E15, 0xFAFFF2EC, 0x16FD010F, 0x0907F9FB, 0x13F400F1, 0x07FBF509, 0x0DEC05F3, +0x020A04FF, 0x05FA070D, 0x110C0FF2, 0x0C0B0302, 0xFF0403F7, 0x05F018F4, 0x02FB0BF5, 0x10F413F5 + +harq_input0 = +0x0FFA0103, 0x130C0B02, 0xF309F6E7, 0xF70F07F1, 0xF7090FF8, 0x050409F2, 0xF80AFAF7, 0x00F60EF5, +0x06FC060D, 0x080DFB03, 0xF4EDF9F9, 0xFCF9FEEA, 0x0F0C12F8, 0xF9F31708, 0xF60C02FF, 0xFF110310, +0x0BF80F0F, 0x02F6F2EE, 0xEDF20A06, 0x0709FEF2, 0x14F5F0F0, 0xF70C0018, 0x12020FEF, 0x0602EF08, +0xF40A0200, 0xEE0C0BFC, 0x0606ED01, 0xF2F709F3, 0x15110E10, 0x06EC06F8, 0xFBF10CF8, 0x0314FEF6, +0xF5F4FC0C, 0xF00C00FF, 0xF6FDF9F6, 0x07F30801, 0x0F04F40C, 0x0406F305, 0xFAF9F808, 0xF20DF109, +0x010A0AF8, 0x070AFC03, 0xF108120A, 0xF8F9F1EC, 0xEEEB09FF, 0x140C0D01, 0x04E5EF10, 0xF616130C, +0x0314F4EC, 0x09FA09F2, 0xFAFAF714, 0xFAF101FD, 0x06030FF4, 0x17F3EFFA, 0x09FEF109, 0xFDFEF9FB, +0xF2080B02, 0x0CF90B07, 0xEB0F0D06, 0xF71009FE, 0xEF110AF8, 0x0AF70BF9, 0x170A1508, 0xF8FDFAF1, +0x0204F3EB, 0xEFFE0315, 0x0C06000B, 0xF10C0A0E, 0xEC0EF9FC, 0x08F0F2F3, 0x09FD02F7, 0x0B11F610, +0xF8F1F8F7, 0xF8FB0A09, 0xFB030A13, 0x040804F0, 0xE8080813, 0xF1F4FFF3, 0xEBFCEDF7, 0xF7F00AE8, +0x00F1160E, 0xF007F301, 0x0E13F211, 0x07F815F4, 0xF9EEF70B, 0x0EF7FE15, 0x0706E80C, 0x0611F60E, +0xFB0B0CF5, 0xF4F50E11, 0x14FDF1EB, 0xF403120A, 0x09F80303, 0xFB0AF80B, 0xFA1408F5, 0xF503F717, +0x0FFB1610, 0x1107F3FC, 0xF1F4F7F7, 0x060EF4E8, 0x04F8F5FF, 0x04F30CFA, 0x10F008F8, 0xF514EEF3, +0x0EEDE8FE, 0xE7FEE70B, 0x0404FEF9, 0xF8F509F9, 0x0A0EF6F2, 0xF8080EF8, 0x01F200F3, 0x03FC19F2, +0x0D0FF2F8, 0xF9FD0C13, 0x11FE0703, 0x0BF9F110, 0x0EF3FEFD, 0x0EF8F10C, 0x0A070FEA, 0x04FA0310, +0x0CFE0003, 0x0CF3060D, 0xFBFCF5FA, 0xEC0D1108, 0x09ECF70A, 0x0C0EFB08, 0x0BF4F80A, 0xEFF0FB0C, +0x0B09F8FA, 0xFA16FF13, 0x0B081512, 0xF4F2FBF7, 0x000C0A07, 0x130C0FEE, 0xFEF908FB, 0xF6F5F912, +0xF1100409, 0x090E1606, 0xF4F50BF3, 0xEE00F7F9, 0xFAFBF5F6, 0x07080B0A, 0xF1150BE7, 0x0DF80912, +0x12EF0809, 0xEBFF1108, 0x0BF60DFE, 0x130DF608, 0x12EFF2F1, 0x04FB0C0B, 0x01FDFC09, 0xFAF808F9, +0x12020B01, 0xFCED060F, 0x040DFFFF, 0x04F80AF3, 0xF700F60B, 0x08F40E08, 0x06F7F80F, 0x0DFDEF04, +0xFDEFF916, 0xF21107EF, 0x0A1110F1, 0x03F70DF3, 0x08F50300, 0xF1F711F9, 0xF6FCFF0C, 0x0CFFF704, +0x080CFE09, 0x0FF80D06, 0x05080C08, 0xFE020210, 0xFB11F6E9, 0x060BF2F1, 0xED0BEAF9, 0x02F30C02, +0xF8F40DFB, 0x020D0D01, 0x0CF406F1, 0xF302F812, 0x080C0EF2, 0x06010006, 0xF0FA0908, 0x08F9F905, +0xFB0A0508, 0x0FF0F7F4, 0xFF081210, 0xEE18F6F1, 0xF9F9E8F2, 0x060B09FD, 0x0AFEEE04, 0x09F304F8, +0xEA05F6F8, 0x1C0108F5, 0xF205120F, 0xF40D0A04, 0x0001F30D, 0x00FF0DFA, 0x020BF7F7, 0x02F2F7F0, +0x04F90BF1, 0x01EFEE07, 0xEBE4F807, 0x0AF90FEF, 0x0F040B11, 0x0BF91000, 0x000CF812, 0x0311F3F0, +0xF8070218, 0xEDFFF614, 0xF00C15F1, 0x000D0F16, 0xFA0EF707, 0xEE080901, 0xFF0C09F5, 0xEEF704F1, +0xF10C10F9, 0x060BEBF7, 0xFA0EFDF6, 0xF7F403F2, 0xF5F0F306, 0xEC081A0F, 0x020AEEF5, 0xFBF9F7FB, +0xF60C010A, 0xEC0E0FFF, 0xF014FB10, 0x0EFD0308, 0x04F30015, 0xF4FC0CEE, 0x0CFEF3F7, 0x12F0F702, +0xE803FB07, 0x040D06F5, 0x05FA07F1, 0x140A0BF8, 0xEFEDFF11, 0x01EFEE13, 0x0D0C0B0F, 0xE70105F0, +0x01F70CF4, 0x0603EE12, 0xED08EDF9, 0xF2FCFA02, 0x0E0CFCF3, 0x0E04F8F9, 0xF30D17F9, 0xFEEDFB05, +0x071BF114, 0xF309F7F4, 0x02F503F6, 0x0815F400, 0x0CF0090A, 0xE80D0F02, 0xF9FCFDF8, 0xF00FFEF5, +0xF3F5F70B, 0xFC10F7EF, 0xF2FB0AFE, 0xEEECEC15, 0x0202F60E, 0xF310FEF9, 0x10F8F209, 0xFB0606EE, +0x0D0B0C10, 0x1110080C, 0xFCF2F8F6, 0x030DEE07, 0x0C11F511, 0x0CF6EF08, 0x0900070C, 0x0C160E0F, +0xEEF8FFF9, 0xF7F0EEF5, 0x0A090903, 0xF70A000E, 0xF5FF07F6, 0xF5E5FEFD, 0x08F1F80C, 0x00F2EE0D, +0xFAED07EA, 0x07EA170B, 0xFEFFECFF, 0xED0B0211, 0x0AF4F4E6, 0xF2FAF705, 0x0807F706, 0xFBF2F8F7, +0xF31105F7, 0xF10809FB, 0xF1FEF307, 0x0805FFFA, 0x08FC070D, 0x0A071200, 0xEEEDF107, 0xF908EDFB, +0x09F60FF2, 0x0B0C06F8, 0x07FCF608, 0x000FF30C, 0xFF0EF3FD, 0xE40BFCF4, 0x0CF50BF4, 0x04EDE90D, +0xFD05F3F1, 0xFAECF4FA, 0xF80C080F, 0x0A0BF70A, 0x07F012F4, 0x1109FEF3, 0xF507F9F1, 0xF513F7FD, +0xFE0AF80F, 0x041701F1, 0xF5E7F309, 0x0A0AF70C, 0x0E00FEF1, 0x04E505EF, 0xF4EF0BFD, 0x040CF807, +0x1201EF07, 0xF31508F1, 0xF908F309, 0x0B0EE409, 0xF7EBF9F8, 0xF1F7F406, 0xFB0206F6, 0xECFD11F2, +0x0702EEF6, 0xF409FC04, 0xEEF80010, 0xF3EC0BF0, 0x090600F1, 0xF9F5EBF7, 0xEEFE11F8, 0x070BF0FA, +0xFE16EEF8, 0xF108FD05, 0x15FAF3F7, 0xF60E0D0D, 0xF7FC0AF8, 0x01F40805, 0xF70AFE01, 0xFB0F0BF9, +0x04E701F6, 0x09F517F6, 0xFBE8F5F8, 0x11FE00F6, 0xEF08F2F5, 0xFB0CFB0F, 0x0419080B, 0x0308EE11, +0x07110907, 0xF2F5ED0F, 0x0BFAFEF6, 0xFA12F8F9, 0xE8090606, 0x0E0CEAEC, 0x06FD10F8, 0xF80505FD, +0xF1F70912, 0xF5EF0C0B, 0xF9EF0B0B, 0x0D05F5F2, 0x0A08FF0E, 0x09F50300, 0x08F91314, 0x0AFEF60A, +0xE5FC0504, 0xEF0A000E, 0x06FDFFF1, 0x0D11F103, 0x080CF512, 0xF9F501F2, 0xFAF60708, 0xFE140D05, +0xF90202EF, 0xF0FD0EED, 0x06F2E903, 0xE904F80D, 0xF600F8F8, 0xF4FA09F5, 0x0803FA07, 0xFCF9F90B, +0xF202F4F5, 0x000EFBFE, 0x0409FAFD, 0xF0EA0DF4, 0x0B0D00FF, 0x03F8FB0D, 0x0307FAF2, 0x010C0BFB, +0x140C03FD, 0xF4FE0906, 0xF6F6F8ED, 0x0B11090D, 0xF6F90EF8, 0x09F001E8, 0xEC0600F8, 0x1109F90E, +0xEA010BEF, 0xEF0A0C0A, 0x07F510FD, 0x08F3F500, 0x07ED01F5, 0xF313F60A, 0xF803FA0E, 0xF60B0D08, +0xF1F0F709, 0x0DF609F4, 0xFCED020B, 0x0E0EEDE9, 0x08F907F2, 0xF1FC0C13, 0xFFFB0C06, 0xEB070AF7, +0xF606F80A, 0xF90E1EFF, 0xF6EE0BF5, 0x05FF03F7, 0x0F0DF309, 0xFA0CF4F8, 0x1F0CF6F3, 0xF50DEE0F, +0xF5F7FDF4, 0x0BF501EF, 0xF7FA000F, 0xECFAF0F5, 0xEA02FEF1, 0xF80FFCFC, 0x100B0600, 0xFF050501, +0xFA150716, 0x110FFFF4, 0xEE0B04F8, 0x0E0FF112, 0x12F80BF4, 0xF6F41604, 0x07EDE6EF, 0x17EE0F0B, +0x05F5FEF2, 0xEF0BFEF5, 0xFF07FD15, 0x01090709, 0x02EBEE0D, 0xF6F9FB0D, 0xEFF6070E, 0x090806F6, +0x140FFEF1, 0xF6FCEEEB, 0x07EF14F2, 0xFB03040B, 0x0A05F4FC, 0x0DF6FB0D, 0x060B02F8, 0xFF0FFB0E, +0x090709F7, 0xF7180F02, 0x0BF8F005, 0xFE0CF60D, 0x09F4ECF0, 0x0410F30A, 0xEB05F105, 0x05F90C11, +0xFCF1F30B, 0x120B0BF3, 0x031104FC, 0x030BFC0F, 0xFB09EFFC, 0xF50CFB11, 0x0BF80504, 0xF609FCF7, +0xFE0CFB00, 0x0F08F7FB, 0x0BFD0609, 0x0E120F15, 0x020B07F8, 0x0714FAF0, 0x0615F308, 0xF2FDF8F9, +0xEEF606F8, 0x050906E8, 0x071106F7, 0x000C03F8, 0x04F9F90A, 0x060BF5F7, 0x0D0CF2F7, 0x06FB02F7, +0xF7060AF5, 0x0EF1FCF4, 0xFAFAF5FE, 0x0506F917, 0xFCF40C0A, 0x03FC10E8, 0xF30700FD, 0xFCF40906, +0xFB0B0D0B, 0x1017E4F9, 0xF20408F2, 0x02FA03F7, 0xF0000E07, 0xFB0AEDF1, 0xE6F50FEB, 0xF2FCF80B, +0x04F50DFB, 0xF00BF706, 0xF70507FC, 0x0AF01609, 0xFF0DF20F, 0xEA150EF2, 0x080202F3, 0x00FAF9F5, +0xEFF70E04, 0x0FF6F314, 0xF1FEFAEE, 0x08F1F3F2, 0xF6101102, 0xF8F20206, 0x120DFC03, 0x07F8F613, +0x0CF4F50D, 0x0DFF05FB, 0x040EF409, 0xF8FB06F6, 0xF3FAF20D, 0x0DF90402, 0x05080E00, 0xF5EFEBEC, +0xFE0B0EE7, 0x0B0E0F0E, 0x04F812F4, 0x0EEE0D10, 0x021AF7EF, 0xF70F10EC, 0xF604FDFA, 0x10E90F0B, +0xF60CEFFE, 0x0AEBF407, 0xF60A06F0, 0xF50B1607, 0x1111FF0B, 0xF8F8EF08, 0xF704F410, 0x0B0AEBFE, +0x14000205, 0x03FC0EF2, 0xFD17EBFF, 0x17FAFCF4, 0x0DF90CFA, 0x1004F511, 0x140302FC, 0x14FC0500, +0xFCF6F2FE, 0x0905FA03, 0x08F3F0F4, 0x06FEF5EF, 0x09F801F8, 0xF00913F1, 0xF7F80DED, 0x040AF1FC, +0xFC0F1008, 0x07040EF4, 0x0BF6EC0C, 0x0CF8FA0C, 0xF70F0EFF, 0xFB09FBFC, 0xF9F4ED0D, 0x02F4F80B, +0xF5FCF2F2, 0x0208FDF1, 0xF20B0405, 0xF80AFAF3, 0xF415EDEA, 0xFDFBEB00, 0xF4F1F30F, 0xEC070F09, +0xFA0D0AFF, 0xF7EE0C06, 0x04F4F00B, 0x08F50FF5, 0xF50EF3FC, 0x1006E7F9, 0x04F7F7FC, 0xFC070CFB, +0x0F12EAFA, 0xF7F00706, 0xF4011505, 0xF7140B09, 0x0AF9F1F8, 0x03060DF8, 0xF2090CF8, 0xF20712F3, +0xF903EFEE, 0x1102EC14, 0x0A09F1F6, 0xF9F001FA, 0xF8FE01FB, 0x140410F1, 0x0B0402F2, 0x0F0006F5, +0x0805ECF9, 0xF409F10E, 0x0DE7FD01, 0xEFFD0710, 0xF20403FD, 0x0BF2F6F9, 0x0004F909, 0x0F09FFF6, +0xF3060DF2, 0x0EEF060E, 0x0CF40705, 0xFDF7FB0C, 0xF4F203E4, 0x0E09F4F6, 0xF5FE04F9, 0x06F3FEFE, +0xFDFB1102, 0xFD04EE0D, 0x0DFBFCF1, 0xEE14E90B, 0xFB0CEE09, 0x0C13F108, 0xF60703FD, 0x0BF4FCFA, +0x14F2F0FB, 0xFAF9EFF7, 0xF5010801, 0xF109EEF3, 0xFF0A0514, 0x0C0604FF, 0xFB0EF704, 0xF50EFD0B, +0xFF05F4FA, 0x07E70B0B, 0xEFFEF4FD, 0x0D0807F3, 0x05100DF6, 0xEFFA1A08, 0x020D090A, 0xFFF5F7FD, +0x1513F10A, 0xF10BF2ED, 0x0B0F150B, 0xF10306FA, 0x09FB11EE, 0x061007F2, 0xF7F8FB14, 0xF90704EE, +0x0AF8EAF6, 0xF7E809F9, 0x02F609E9, 0x09E802EE, 0x03F50BE8, 0x040C04F1, 0x0CF41009, 0xFB00EEFA, +0xFC071611, 0xF9F1F203, 0x0BF0F409, 0x0214F801, 0x0A0AF504, 0x0508F5F1, 0xE916E900, 0x07F4F60A, +0xF9F010F2, 0xF906F507, 0x0BFB0AF4, 0xF408F0F1, 0x0EFD0A06, 0x03F80AF6, 0x130CFD0C, 0xF1E9F7F8, +0xF800F502, 0xFEFDFDF4, 0xF90B0713, 0xF506FAFD, 0x0712F9F2, 0xEAF20DF5, 0x10F40D0D, 0x06050B09, +0xF706090E, 0x0F00ED11, 0xF90E02F4, 0xF1FEFCED, 0x0AF5E00D, 0x06F7F3F9, 0x08F81206, 0xF30EF4F5, +0x12FF02EF, 0xF7040DF4, 0x151204F0, 0x04ED07EC, 0xF0F3FB05, 0x08F2FCF4, 0xECED11FA, 0xFC110DF8, +0x0BF4F90A, 0xFCF9F905, 0xF0010014, 0x0A0EF9F8, 0xF4020C02, 0x10FDFA13, 0xF5000B05, 0x05EAF808, +0xFE0F04F3, 0xFDEFF9EE, 0xF9F9090B, 0x10F20E0C, 0x060909F0, 0x060EF40F, 0x0E0705F5, 0xFB05F6F9, +0xFA1C0512, 0x0B10FBEB, 0x16F20DF6, 0x090012F4, 0x0A13020B, 0x0EFF0C0A, 0x130DEF0C, 0x070A0B04, +0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, +0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, +0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, +0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, +0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, +0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, +0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, +0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, +0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, +0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, +0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, +0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, +0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, +0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, +0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, +0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, +0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, +0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, +0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, +0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, +0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, +0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, +0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, +0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, +0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, +0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, +0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, +0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, +0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, +0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, +0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, +0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, +0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, +0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, +0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, +0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, +0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, +0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, +0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, +0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, +0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, +0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, +0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, +0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, +0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, +0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, +0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, +0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, +0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, +0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, +0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, +0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, +0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, +0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, +0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0xFB0E01EF, 0xFF0C0B02, 0x07090AFB, 0x0BFBF3F1, 0x0B090F0D, 0xF10409F2, +0xF80A0E0B, 0xECF60E09, 0x0610F2F9, 0xF4F9FBEF, 0x08ED0DF9, 0xFCF9FEFE, 0x0F0C12F8, 0xF9F317F4, +0x0BF80213, 0xFFFD1710, 0x0BF80FFB, 0xEEF6F2EE, 0x0106F506, 0xF3091206, 0x00F504F0, 0x0B0C0018, +0xFD02FAEF, 0x06ED0308, 0xF4F60215, 0x02F80BFC, 0xF20601ED, 0x06F7F5F3, 0x0111FAFC, 0xF2ECF2F8, +0xFB050C0D, 0x0314EA0A, 0x09F4FCF8, 0xF0F80013, 0xF6E90D0A, 0xF307F415, 0xFB04F4F8, 0xF006F3F1, +0xFAF9F808, 0x06F9F109, 0xED0A0A0C, 0xF3F6FC03, 0x0508120A, 0x0C0DF100, 0x02FF09FF, 0x00F80D01, +0x04E50410, 0xF616130C, 0x0300F4EC, 0x090EF506, 0xFA0E0C14, 0x0EF10111, 0xF2030F09, 0x03F3030E, +0x09EA0509, 0xFDFEF9FB, 0x06F4F702, 0x0C0D0BF3, 0xFFFBF906, 0xF7FBF512, 0x03110AF8, 0x0AF7F70D, +0x17F60108, 0xF811FA05, 0xEE040700, 0x03FEEF01, 0xF706EC0B, 0x060C0AFA, 0xEC0EF910, 0x0804F207, +0x09E902F7, 0xF7FDF610, 0x0C050C0B, 0xF8E7F609, 0xFB170A13, 0xF0080404, 0xE808F413, 0xF1F4EB07, +0xEBFC01F7, 0x0B040AE8, 0x00F1020E, 0xF0F207EC, 0x0EFFF211, 0xF3F815F4, 0xF9020B0B, 0x0EF71201, +0x0706FC0C, 0x06FDF6FA, 0xFBF7F80A, 0x08090EFD, 0x14FD05FF, 0xF403FE0A, 0xF5F8EF03, 0xFB0AF8F7, +0x0F00F409, 0x0AEF0B03, 0x0FFB0210, 0x11070710, 0xF1080B0B, 0xF20E08E8, 0xF00CF5EB, 0xF0F30C0E, +0xFCF0080D, 0x0900EE07, 0xFA01FCFE, 0xE712E70B, 0xF004FEF9, 0x0CF5090D, 0xF60EF606, 0xF8F4FAF8, +0xED061507, 0xEF110506, 0xF90FF20C, 0xF911F813, 0xFC12F3EF, 0xF7F9F1FC, 0x0E07EAE9, 0x0EF8F1F8, +0xF6070FEA, 0xF0FA0310, 0xF8FE1417, 0xF8F306F9, 0xFBFCF50E, 0xEC0D11F3, 0x0900F70A, 0xF80EFBF3, +0x0B08F8F6, 0xEFF00F0C, 0xF709F8FA, 0x0E16EB13, 0x0BF415FE, 0xF4F20F0B, 0xEC0C0AF3, 0x13F8FB02, +0x12F908FB, 0x0A090D12, 0xF110F0F5, 0xF40E021B, 0x0809F7F3, 0xEE000B0D, 0x0E0FF5F6, 0xF3F40BF6, +0x05150BE7, 0x0DF809FE, 0x12030809, 0xFF13FC08, 0x0BF6F912, 0x13F90AF4, 0xFE03F2F1, 0x04FB0CF7, +0x01FDE8F5, 0x0EF8F40D, 0xFE02F7ED, 0xE7EDF2FB, 0x04F9FF13, 0xF0F80A07, 0xF700F6F7, 0xF4080EF4, +0xF2F7F80F, 0x0DFDEFF0, 0x11EFF902, 0xF2FC0703, 0x0AFD10F1, 0x17F70D07, 0x08F5EFEB, 0xF10B11F9, +0xF610FFF8, 0x0C130B18, 0x080CFEF5, 0xFBF8F906, 0xF1080C08, 0xEAEEEE10, 0x0F11F6FD, 0x06F706F1, +0xED0BEA0D, 0xEEF30C02, 0xF8F40D0F, 0x020D0DEC, 0x0CF40605, 0x07020C12, 0xF40C0EF2, 0x060115F2, +0xF0E6F508, 0xF40DF9F0, 0x0F0A05F4, 0x0FF00B08, 0xEB08FEFC, 0xEE030AF1, 0x0DF9E806, 0xF2F7F5FD, +0x0A12EEF0, 0x09F3EFF8, 0xFE05F6F8, 0x1CEDF4F5, 0x060512FB, 0x08F90AF0, 0x000107F9, 0x14FFF9FA, +0x16F70B0B, 0xEEF2F704, 0x04F90BF1, 0x150302F3, 0xEBF8F8F3, 0xF6F90FEF, 0xFBF0F7FD, 0xF70D1000, +0xECF70C12, 0x03FDF3F0, 0xE4F31604, 0x02FFF600, 0xF00C0105, 0xEC0D0F02, 0xFAFAF707, 0x0208F501, +0xFFF809F5, 0xEEF70405, 0x050CFCF9, 0xF20BEBF7, 0xFA0E11F6, 0xF7F403F2, 0xF5F0F306, 0x00081A0F, +0x02F6EE09, 0x0F0D0B0F, 0x0AF7EDF6, 0xECFA0FEB, 0xF000FBFC, 0xF91103F4, 0xF0F30001, 0x08FCF8EE, +0x0CFEF30B, 0xFE040B02, 0xFC030FF3, 0x04F9F209, 0xF10E0705, 0x14F60B0C, 0x03ED1311, 0xED03EE13, +0xF9F8F70F, 0xFB010504, 0xEDF70C08, 0x061802FE, 0xED0801F9, 0x06FCFA16, 0x0EF8FCF3, 0x0EF00C0E, +0xF3F9170D, 0xFE010F05, 0xF31B0500, 0x07F50BF4, 0xEE09030A, 0xF401F400, 0x0C04090A, 0xFCF90F02, +0x0D10FD0C, 0xF00FEA09, 0xF3F50BF7, 0xFCFCF7EF, 0x06FB0A12, 0x0200EC01, 0x02020A0E, 0xF3FCFE0D, +0xFC0CF209, 0xFB06F2EE, 0xF90B0C10, 0xFDFCF40C, 0xFC06F80B, 0xEFF902F3, 0x0C110911, 0xF80AEFF3, +0x0900F30C, 0xF8160E0F, 0xEE0D130D, 0x0BF00209, 0x0AF509EF, 0xF7F614FA, 0xF513070A, 0x09E512FD, +0xF3050D0C, 0x0006020D, 0xFAED07FE, 0x07FE170B, 0x121300FF, 0x02F602FD, 0x0AF408FA, 0x06FAF7F1, +0x0807F71A, 0xFBF20C0B, 0xF3FD05F7, 0x06F4090F, 0xF1FEF307, 0x0805EBFA, 0x0810070D, 0xF6F31214, +0x02ED0607, 0x0D08010F, 0x09F60FF2, 0x0BF8F20C, 0x1BFCF6F4, 0xECFB070C, 0x13FAF3FD, 0xF8F7FCF4, +0x0C09F7F4, 0xF001E9F9, 0x11F1F305, 0xFAEC08FA, 0xF8F8F40F, 0xF6F70B0A, 0x07F012F4, 0xFDF5FEF3, +0x09070EF1, 0x09FFF7E9, 0xEAF60C0F, 0x04030106, 0xF5E70709, 0x0AF6F70C, 0xFA14FEF1, 0xF0E51903, +0xF4EF0B11, 0xF0F80CF3, 0x12ED0307, 0xF301F405, 0xF9F4F3F5, 0x0B0EF809, 0xF7EBF9F8, 0xF10BF406, +0xFBEEF2F6, 0xEC1111F2, 0x0716EEF6, 0x080910F0, 0xEE0D0010, 0x07ECF7F0, 0x09060005, 0x0DF5EB0B, +0x0212110C, 0xF3F704FA, 0xEA02020C, 0x050811F1, 0x01FA07F7, 0xF60E0D0D, 0xF711F60C, 0x0108F4F1, +0xF7F6FE01, 0x0F0FF7F9, 0xEFE7010A, 0x090902F6, 0x0FE809F8, 0xFDFE00F6, 0xEF0806F5, 0x10F80F0F, +0x0419F40B, 0xEF08EEFD, 0x0711F507, 0xF20901FB, 0x0BFA130A, 0xFA120CF9, 0xE809F2F2, 0xFAF8FE00, +0xF2FDFCF8, 0xF805F1FD, 0xF1F70912, 0x0903F80B, 0xF9EFF70B, 0x0D05F5F2, 0x0A08FF0E, 0x09F5EE00, +0x08F91314, 0x0AFEF60A, 0xE51005F0, 0x041EECFA, 0x06FDFF05, 0x0D11F1EF, 0xF4F80912, 0x0D090106, +0xFAF6F308, 0xFE14F8F1, 0x0D02EE03, 0xF0FDFAED, 0xF2F2E903, 0xE9040C0D, 0x0A00F8F8, 0xF4FA0909, +0xF4EFFA1B, 0xFC0D0D0B, 0xF2EE08F5, 0x000E0F12, 0xF0F50F11, 0x04FEF9F4, 0x0BF914EB, 0x170CFBF9, +0x03F30E06, 0x01F8F70F, 0x14F8EFFD, 0xF412F5F2, 0x0AF60C01, 0xF711090D, 0xF60DF90C, 0x09F0ECE8, +0xEC06140C, 0xFD090DFA, 0xEA01F7EF, 0x030AF8F6, 0xF3F5FCFD, 0xF4F3F500, 0xF3EDECF5, 0xF3130AF6, +0xF8EFFA0E, 0x0A0B0DF4, 0xF1F0F7F5, 0x0D0A09F4, 0x10EDEEF7, 0x0E0EEDFE, 0xF4F9F306, 0x05FCF8FF, +0x13FBF7F2, 0xFF07F6F7, 0x0AF2F8F6, 0x0DFA1EFF, 0xF6EE0B09, 0xF113030B, 0xFAF9F3F5, 0xFA0C080C, +0x0BF8F607, 0x09F902FB, 0xF50BFD08, 0xF7F515EF, 0x0BFA00FB, 0x01FAF009, 0xEA02FE05, 0x0CFBFC10, +0xFBF7F214, 0x1305F1ED, 0xFA01F216, 0xFDFBFFF4, 0xEE0B040C, 0xFAFB05FD, 0xFEF8F7F4, 0xF60802EF, +0xF301E603, 0x03EEFAF7, 0xF109EAF2, 0xEF0BFEF5, 0xFFF31115, 0xED09F309, 0x02FFEE0D, 0xF60D0FF9, +0x030A07FA, 0xF5F4060A, 0x140FFEF1, 0xF6FCEEFF, 0x07030006, 0xFBEF04F7, 0x0AF009FC, 0xF90A0FF9, +0xF2F702F8, 0xFFFBFB0E, 0x0907090B, 0x0B180F02, 0x0B0C0405, 0x12F80AF9, 0x09F400F0, 0xF010070A, +0xEBF105F1, 0x05F90C11, 0xE805F30B, 0x12F70BF3, 0xEF11EFFC, 0xEFF7FC0F, 0xE709EF10, 0xF50CFBFD, +0xF7F805F0, 0xF609FCF7, 0xEAF80F00, 0xFBF40B10, 0xF71106F5, 0xFA12FB01, 0x020BF30C, 0x0714FA04, +0x06010708, 0xF2110D0D, 0xEEF6F2F8, 0xF009F1E8, 0x07FD06F7, 0x14F8EF0C, 0xF00DF9F6, 0xF20BF50B, +0xF90C06F7, 0x06FB02F7, 0xF7F20A09, 0xFA051008, 0x0EFA0913, 0x05060D03, 0xFCF40CF6, 0x03E8FCFC, +0xF3F31411, 0xFCF40906, 0xFB0BF9F7, 0xFC02F80D, 0xF20408F2, 0xEE0EEF0B, 0xF0000EF3, 0xFBF6EDF1, +0xFAF50FEB, 0x06FC0C0B, 0xF009F80F, 0xF0F7F706, 0xF70507FC, 0x0AF00209, 0xFF0DF20F, 0xEA15FA06, +0x0816EDF3, 0x000EF9F5, 0xEFF7FA04, 0x0FF60814, 0xF1FEFA02, 0x0805F306, 0xF610FDEE, 0xF8061606, +0xFE0DFCEF, 0x07F8F613, 0x0C0809F9, 0x0DEBF0FB, 0xF00EF4F4, 0xF8E7F20A, 0xF3FAF20D, 0xF90D04EE, +0xF1F40E00, 0x09EFFFEC, 0xFE0B0EE7, 0xF7FA0F0E, 0xF00CFEF4, 0xFAEEF9FC, 0x161AF703, 0xF70F10EC, +0xF6F011FA, 0x10FDFB0B, 0xF60C03FE, 0x0AFF08F3, 0xF6F606F0, 0xF5F716F3, 0xFDFDEBF7, 0x0CF8EFF4, +0xE3EF0910, 0xF7F6FF12, 0x001402F1, 0x03100EF2, 0x1117EBFF, 0x17FA1008, 0x0DF9F80E, 0xFCF0F511, +0x1403EEFC, 0x0010F100, 0x110A0612, 0xF505FAEF, 0xF4F304F4, 0x061209EF, 0x090C150C, 0x04F41306, +0x0B0C0DED, 0xF0F6F110, 0xFC0F1008, 0xF3EF0E08, 0x0B0AECF8, 0x0CF8FA0C, 0xF7FB0EFF, 0x0FF50FFC, +0x0DF4EDF8, 0x02080C0B, 0xF510F2F2, 0x0208FDF1, 0x060B04F1, 0xF8F6E607, 0xF415EDFF, 0xE8FBEBEC, +0x0805F30F, 0x00F30F09, 0xFA0DF6EB, 0x0BEEF806, 0x0408F00B, 0xF4F5FB09, 0x090EF310, 0x1006FBF9, +0xF0F7F710, 0xFC070C0F, 0xFB12EAFA, 0x0BF007F1, 0x080100F1, 0xF700F709, 0x0A0D05F8, 0xEFF20D0C, +0xF209F8F8, 0xF207FDF3, 0x0DEFEFEE, 0xFD020114, 0x0AF5050A, 0x0D0415FA, 0x0C12ED0F, 0x14F01005, +0xF7F0EE06, 0x0F14F209, 0x080500F9, 0x08F5050E, 0x0DE7E901, 0x03FDF3FC, 0xF20403FD, 0xF7F2F60D, +0xECF00D09, 0xFB09FF0A, 0xF306F9F2, 0x0E03F20E, 0x0C09F305, 0x11F710F8, 0xF4F217E4, 0x0E09090A, +0x0A12F0F9, 0x06F312FE, 0xFDFBFDEE, 0xE9F0020D, 0x0DFB1005, 0x0200E90B, 0x0F0C02F5, 0xF8FF05F4, +0x0AF303FD, 0x0BF4100E, 0x14F2040F, 0x0EF9EF0B, 0x0AED0801, 0x05F5EE08, 0xFF0A0514, 0xF8F2F0FF, +0x0FFAF7F0, 0xE10E12F6, 0x13F1F4FA, 0xF3FC0B0B, 0xEFFEF4FD, 0xF9080708, 0x05FCF9F6, 0x040E06F4, +0x020DF5F6, 0x13F50B11, 0x1513F1F6, 0x05F707ED, 0xF7FB01F7, 0xF1EF06FA, 0x09FB1102, 0x06FC0706, +0xF7F80F14, 0x0EF3F002, 0x0AF8FE0A, 0x0BE8F5F9, 0xEEF609E9, 0x09E8EE02, 0x03090BFC, 0xF0F8F0F1, +0xF8081009, 0x0F0002FA, 0xFCF202FD, 0x0DF106EF, 0xF70408F5, 0x02140C15, 0xF6F6F5EF, 0xF1080905, +0xE902FDEC, 0xF3F4F6F6, 0xF904FCF2, 0xF906F5F3, 0xF7FB0A08, 0x08F4F0F1, 0x0EFDF6F1, 0x03F8F6F6, +0xFF0C110C, 0xF1FDF7F8, 0xF814F502, 0x12FD1108, 0x0DF7F313, 0xF506FA11, 0x07FEF9F2, 0xEAF20D09, +0xFCF40D0D, 0x06F1F709, 0xF7F21DFA, 0xFB00ED11, 0x0DFA0208, 0xF1FE1101, 0x0AF5F4F9, 0x060BF3F9, +0x080CFD06, 0xF30EF409, 0x12EB02EF, 0x0BEF0D09, 0x1512F0F0, 0x18010700, 0x05070F05, 0xF306FC08, +0x0001FD0E, 0x10FD0DF8, 0xF708F90A, 0x100D0D05, 0x04011414, 0x0AF90D0C, 0xF402F8EE, 0xFC11FAFF, +0xF500F605, 0xF0EAF8F4, 0x120F0407, 0x1103F9EE, 0xF9F9F5F7, 0x10060EF8, 0x0609F504, 0xF20E080F, +0x0EF3F109, 0xFB05F60E, 0x0E1C05FD, 0xF710FBEB, 0x16F2F90B, 0xF500FEF4, 0x0A13EEF7, 0x0EFF0CF6, +0xFFF903F8, 0xF30A0BF0, 0xF7FCF004, 0x1613F70B, 0xF90506F5, 0xEB09F008, 0x05F30CF3, 0x0310EEF3, +0xFD1002F4, 0x09070114, 0x040B0606, 0xE400F907, 0x13F40B1A, 0x06F4EBE7, 0xF1EE06F9, 0xFAF9130D, +0xF3ED090A, 0x08EF05F8, 0xF814F507, 0xF8131707, 0x1EFCEF0C, 0xF1090708, 0x04F211F0, 0xEFF0090E, +0x09FBF3FD, 0xF3F204F4, 0xF000FC1C, 0xFC00F009, 0xF9FD160F, 0x16F7F80D, 0x0DF8060B, 0x03FAF4FB, +0x03FDFF0D, 0xF4F1F40E, 0xF9EBF7F2, 0x0EF6FA06, 0x09F3EDFA, 0xFEF4EFF2, 0x0F0300F4, 0x0DEBFBFC, +0x1FF0010E, 0xF9140E07, 0xF2F6FD07, 0x11E9020B, 0xEE17070B, 0x10FD0003, 0x0904F5F7, 0x0515FCEE, +0x090F07FF, 0x12FC1104, 0x10F9F0F1, 0x0A080700, 0x010A1200, 0x120B01F5, 0xF7F0ED01, 0xFB06040E, +0xF0FEF30B, 0x0A0713FC, 0xF6F7F9EC, 0x07F803ED, 0xF2F9EF0F, 0xFAF4100A, 0x020AFA04, 0x0806130D, +0xFF0B0F04, 0x080705F8, 0x04F503F3, 0x05EEF9ED, 0xFBFEF30A, 0xF2F9F20B, 0x03FEECEB, 0x08F40302, +0x0617FE0A, 0xFE10050C, 0x0410FAF3, 0xF508EFF9, 0x030908F2, 0x010206FC, 0xFDF7F415, 0xF9080F05, +0xFBF00CEE, 0x0BFD0D0B, 0xF7F9F10A, 0xF80603F9, 0xF202F4F5, 0x0F07FA05, 0x04FA09F8, 0x08F80B04, +0xED030E00, 0x0A04FDF8, 0xEFFC0B14, 0x05F2FFFE, 0xECF60EFB, 0xFE04FD07, 0x0AEDFB0D, 0xF20FF407, +0xF4030A00, 0x15F1EEF2, 0xF50B0D0B, 0x02FE11FB, 0xF3FBF8F8, 0xF7F0F516, 0xF6070A04, 0xFD0C1A0D, +0xF603F50B, 0x0D0F04FA, 0xF5F5EFF7, 0xFB130FE9, 0x0C0205F3, 0xFB050CF7, 0xF9F809FF, 0xF1120DF0, +0x0E0503F8, 0x16FEFDF6, 0xFA0AF5F7, 0xF302F6F9, 0xFC07F4EE, 0x0A040A00, 0xFFF409EE, 0xF8F7FD18, +0xFC01F7EA, 0x0F11F40F, 0x0DF7F708, 0x0DF60809, 0x0DFD0F08, 0x1012FA0E, 0x021615F4, 0x04FCEBFB, +0xF7FC09FE, 0x0C080DF9, 0xF8EB05FC, 0x0708F2EE, 0xFC14F80C, 0x0C06F111, 0x0809F9F2, 0x0CF809FF, +0x0DF50AF8, 0x05EA0E12, 0xFCF6F805, 0xF5EC0A0B, 0xF2080D10, 0x09FBED04, 0xEFF7F40E, 0xF8F610F6, +0x09F4F1F9, 0xFFFC0E0B, 0x020AF3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEFF410FC, 0x07FD0EFD, 0x0D060100, +0x13F4FAF3, 0xFFF001FE, 0x08FC07F0, 0x0900FC05, 0xF5F8F709, 0x0CFC100C, 0xF7F7FBFC, 0xF7F608F4, +0x05F90308, 0xECF6FF08, 0xF2F70B07, 0x04FE03F5, 0xFC02FBFE, 0x02F41301, 0xF1F6F50E, 0xF9FA00E4, +0x0EFB0709, 0xF50800F7, 0x040AEC07, 0x130301FA, 0x0409F809, 0xF104EA0F, 0xF7F00A09, 0xF80BF704, +0x13F800FE, 0xFAF50CF3, 0xF103090A, 0x12FAF30A, 0xF611F8F9, 0x02F1F403, 0x0A040FED, 0x0AFFFEF2, +0x05FBF7FD, 0x0FE903F3, 0xF6EA090B, 0x120FFE07, 0xFA1406F2, 0x0EF80EFB, 0x0EFDFAFC, 0x0EFC0D0A, +0x120805EF, 0xF70DF900, 0x0C0EE5FB, 0x0F0DF503, 0xF609000A, 0x0D03F5F9, 0x0FFB1006, 0x05F60A08, +0xED07F8EF, 0xF90CEE0A, 0x0B16100A, 0xFD07F607, 0x0EFF0D01, 0x0CEF04EB, 0x11F5FD0B, 0x080B0CF5, +0xFF14FEF5, 0xF1FAF413, 0xFA0100F6, 0xF0090FFC, 0xF3FB0AEF, 0xFE09FE0E, 0xF710F3F5, 0x04090C11, +0x04EEEFF2, 0x09FC0FF1, 0xFE0BF4F9, 0x08F10AFC, 0x030AF5FE, 0x13FA0FF4, 0x07000AFE, 0x071507F5, +0x06FD08F0, 0x0F0C08EE, 0x190E020D, 0x08EDF4EB, 0x0D0DF109, 0x0210EF00, 0xF506080A, 0x1010F7F0, +0xFE02F7FB, 0x09F8F6F7, 0xF902FF04, 0x16E003FE, 0x12EA1A00, 0x130E0FFF, 0x0702F2F9, 0xF10BEFFC, +0x010E04F1, 0xF6EF15F6, 0xF50A0510, 0x050DEF0D, 0xF908F4F6, 0x0F0F0BF0, 0x04F7F6FC, 0x07F9FAEE, +0x02EE07F9, 0xF6F90105, 0xF1FFFC04, 0x0802EB0C, 0xF10E0CF3, 0x030E0508, 0x0CF60CF9, 0x08F20EF5, +0xEFFE09EF, 0xF9FB0A06, 0x14F6F6F5, 0xF6140DFE, 0xF511F8F4, 0xF0FAEF00, 0x1103FC0B, 0xF1090B05, +0xF4FD11F0, 0xF80BF6F1, 0x14160D0B, 0x1105070C, 0x0DEDF80B, 0x1005EE07, 0xFCEFF5E2, 0x0812F3F6, +0xF2100BFD, 0x04FAF00B, 0xFD08F508, 0x06030EEA, 0xF4F90C05, 0xF5EE0608, 0x0CEEF40F, 0xF4F8FB06, +0xFCF01609, 0x0407F402, 0xFDFBFDFD, 0x0BF4F806, 0xFCF701EB, 0x08EB0709, 0xECF9040B, 0xF8E9F300, +0x1C0CEEF5, 0x0703FC08, 0xFEF40909, 0x150B0EFF, 0xF30D0B07, 0xFAF203F9, 0x02F209FA, 0x060EFDF7, +0xFCEB0FF2, 0x0313FF13, 0x030A0B07, 0x0BF70003, 0x00090D02, 0x1405F106, 0x020AFCF6, 0xFAFD01F6, +0xEE05F7EB, 0x030201F4, 0x06071009, 0x0E000704, 0x0A060F07, 0x0C0DFE04, 0xF1FA001A, 0xFFF90B10, +0xF607ED0F, 0x06F9100D, 0x05F6F40C, 0x0E0BF106, 0xF8FB09FF, 0xEBEE13FB, 0x0C0EF4F5, 0xF608EC0A, +0xF9F5F905, 0x0AEE03F5, 0x000B0A03, 0x0815F904, 0x13F7100F, 0xFB0711ED, 0xECF5FD01, 0x0D03F90C, +0xF4FA05EF, 0x1209050A, 0xF60BFD0A, 0xFF04F706, 0xF8ED06F0, 0x0001F71A, 0x09EEFFFA, 0xFF0D0BEA, +0x130F00F4, 0xF1F904FA, 0x05EDF504, 0x030AF7F8, 0x09F712F1, 0xFF0C0E07, 0xFE12F9F6, 0x08FC08F0, +0xF9F813FE, 0x01FF0D0C, 0xF3F10C06, 0xEC05F7F4, 0xFCF6FD04, 0x0B07FEF6, 0xF8FC13E8, 0xF004F611, +0xF6060210, 0x12FDF5ED, 0x0100F9ED, 0xEE03F8FE, 0x11F4F40C, 0x0C0BF614, 0x0D050411, 0x0B080FFA, +0xF2F906F9, 0xF5F3F8F2, 0xEF06080E, 0xF614F60D, 0x0A080A0E, 0xFBF2F9FB, 0x1612F1F7, 0xF4F60FF3, +0x010D0B0B, 0x0C0EFB07, 0x0B04FDED, 0xFAF50604, 0xF2FAFB0A, 0x0AF1FFF2, 0x100C0611, 0x01EF0CF9, +0x0B12F90A, 0x12FBF002, 0x04040D05, 0x10FEF910, 0xEAFC0AE7, 0xF404FFFC, 0xEA08F9ED, 0xF5F616F6, +0xF10106F7, 0xF806F5F8, 0xF8F70CFA, 0x0CF7FEFB, 0x0AEEEF08, 0x0AFBF0F2, 0x13F5EFEF, 0xFD010BFC, +0xFA01F3ED, 0x08F30D09, 0x09FEF902, 0x050FFDF4, 0x11FAFE08, 0x1703F1F2, 0xF3FCFE03, 0x06F4EA10, +0x090FEE13, 0x00F20702, 0xFBF90401, 0x070CEBF7, 0x0FF6F50B, 0xEEF8F6FF, 0x0A0AF506, 0x06F0010A, +0xF0F6F4FB, 0x00F51201, 0x0DF90C02, 0xF1F8F0EF, 0x061706EC, 0x0DF80EFD, 0xF0F6030A, 0x03FB100E, +0xF608F50D, 0xF10F08EF, 0xF9F0F105, 0x0EF7FA0E, 0xFD030811, 0x12ED0CF6, 0x050508F7, 0x05F90514, +0x0D100A10, 0xEAF901FF, 0x070B010D, 0xF90D140A, 0xFC02F1F4, 0xE9FCF3F8, 0x07F70FF2, 0x0409F8FF, +0x0C080CF5, 0x03FEF0F5, 0xF80E000C, 0x0201FAF2, 0x1314090D, 0xF90507F5, 0x05F302F0, 0x0CEFFDFB, +0xF11813EF, 0x10FFEEF6, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 + + +output0 = +0x8EC35F65, 0xF1011E4E, 0x01283C76, 0x46C59B44, 0x66BD1E7E, 0x71CC3D13, 0xF54F7B59, 0xC2E51E78, +0x878ACD1F, 0x0BB83AD9, 0xD6EB81F6, 0xDA98D960, 0x9583FF24, 0x84E13C2E, 0xB80A4BD9, 0x7546DA7D, +0x61301F84, 0x4E8E7BCA, 0x0F9A1992, 0x84DE01C3, 0xFB1B38F1, 0x44764A25, 0x9525C193, 0xAD6AFC2C, +0xEAC9CBE7, 0x822626C3, 0x6764F1E2, 0xB7080FC1, 0x92F0BF18, 0x2BE2A423, 0x6652CA22, 0x7E2B8B7D, +0xDADC0042, 0x1684A5B0, 0x6AF80D1E, 0xDE4B11F8, 0x4C027AA7, 0x9B499047, 0xDF71DF9C, 0xE66B5211, +0x0976A858, 0x97CCDFA6, 0xF921AC4D, 0x684DB77D, 0x2046F400, 0x66BF05FF, 0xCFE771B2, 0x7D285899, +0xA6DD74A8, 0xD5AC14DF, 0xB4EE744D, 0x9BF75449, 0xBCCF7BE5, 0xD9B3E1C5, 0x04D5FEEA, 0xA91CED17, +0x260A3E33, 0xB14FA433, 0xC7FB659B, 0xD847CBDD, 0xD4BAF083, 0x51A5AEB1, 0x39A13C7A, 0xC54DBA51, +0x81DD7FFE, 0xE2A3941C, 0x386750AD, 0x85C6A1CF, 0x52E46581, 0x2DC58468, 0x4F8C204C, 0xCA6C89B8, +0xD338F49E, 0xB71D9A1C, 0xAE5992A5, 0x461FFEB6, 0x0F724968, 0xD2D9A290, 0x4C0791D6, 0x8AA45E2A, +0xBCE9EEF4, 0x769D6618, 0x71D659F8, 0xE9DC6A13, 0x99E831C3, 0x8AB8CFD6, 0x489E23C5, 0xBEFC2792, +0x9E54E534, 0x54101DEF, 0x1F83D8D2, 0x69A8094D, 0x2DA8AAEB, 0x564C6C07, 0x4F2AADB5, 0x20CB1D7F, +0x2D6E9D54, 0xB97A8BC9, 0x36365C67, 0x8D84329F, 0x4000A81C, 0x6326766B, 0xB9B50B8D, 0xF9D51D73, +0x4D1A117F, 0x70486DEE, 0xBB19FFB6, 0x96929F46, 0x8E7C8D1C, 0x04B8D1F3, 0x204B8156, 0xA67E9C62, +0x4534F672, 0x94B8C832, 0x38E7CFE4, 0x71F48255, 0x82181625, 0xF8C9EB50, 0xF3D38EF0, 0xB4DE79FB, +0xF32452 + +harq_output0 = +0x14EFEB09, 0x16171D0B, 0xF210F3E8, 0xE4180EE6, 0xE40811F1, 0x0F1118EB, 0xE714EDF1, 0x09EA14EB, +0x1AF71812, 0x121DE902, 0xE7DCF9EB, 0xF7E8EEE1, 0x19111BF4, 0xF2E92615, 0xE81704F7, 0xFE20FE1E, +0x14EB181A, 0x0DFAEDDC, 0xE4EA0E0B, 0x1915F4EB, 0x1DE9DCE0, 0xE71C0722, 0x110714E0, 0x0B0FE719, +0xDC0FF5F7, 0xEC1716EF, 0x0917DC11, 0xE1EE19EE, 0x101A1120, 0x0FE415F5, 0xF2E911E8, 0x0D1D0EED, +0xDFECF70C, 0xEB14F7FA, 0xED0EEBEB, 0x15F11702, 0x110FE718, 0x0B06ED09, 0xECFAEB10, 0xE41EE916, +0x031410F0, 0x0C13EDFF, 0xE4191816, 0xF8F1E0E4, 0xDEE41609, 0x1A17160C, 0x11DDE11B, 0xE8251517, +0x0E1AEAE1, 0x17EB19E6, 0xF4F4EC27, 0xEBE30E00, 0x170B1BEA, 0x1ADBEBE2, 0x1005F11A, 0x0DF2EEED, +0xED1318F9, 0x1CFB0314, 0xDD13150C, 0xE51E0CF5, 0xDF1118EB, 0x19ED0CEA, 0x11132407, 0xEAF9F2E8, +0x060DEBE6, 0xDFF50E1B, 0x170B071C, 0xE7102017, 0xEB1BEBF7, 0x06F1ECE5, 0x111304EA, 0x0B1FEF1A, +0xE7E8F2FB, 0xF305121D, 0xEC011815, 0x0C0D0BE2, 0xDE181915, 0xE9E615F9, 0xE9F4E9E6, 0xEAE814E7, +0x0CE51F1B, 0xE906E310, 0x1221E61A, 0x13DF1BEA, 0xECE8E918, 0x1BF0EE17, 0x0C0EE20C, 0x0F14E10E, +0xF9161ADC, 0xEBEF1D1F, 0x1809EFDF, 0xEE051F1A, 0x1FFE0E06, 0xF219F40B, 0xF01819EF, 0xF100F222, +0x19F31922, 0x1B06E7EF, 0xE7EAE9E7, 0x0F19F6DB, 0x15F5E00A, 0x10EB0FEE, 0x07DF11F4, 0xEC1ED9F1, +0x22EDD6EF, 0xD6FAE111, 0x151BE9E4, 0xFBEF19ED, 0x171BEEEC, 0xF40C17F5, 0x15E1EEEF, 0x17F81EF2, +0x1E19E4F6, 0xEEEE1A16, 0x19F10B0B, 0x11F7E613, 0x17EB1309, 0x12ECF012, 0x15131CD7, 0x08F00820, +0x1CF9FCF7, 0x13E21415, 0xF2F2E1F2, 0xE4191F14, 0x14E7F11D, 0x1B17F618, 0x18E8E517, 0xDDE4F317, +0x1419EAEC, 0xE81EFC18, 0x11132D17, 0xECE8E1EA, 0x08210B06, 0x101B0EDA, 0xF2EA0FF6, 0xE2E8F41B, +0xEB1D0E08, 0x141022F8, 0xE4E90FEA, 0xE2F5F2EE, 0xEFF5E8F2, 0x170E0617, 0xE12016E3, 0x1DEB1521, +0x21ED0617, 0xE2EF180E, 0x13F722EF, 0x1E21ED11, 0x1CE8E3E9, 0x07ED1917, 0x07F20815, 0xECEB1AEC, +0x1FF10E03, 0x0DEF0723, 0x0E16F0F5, 0x11E81FED, 0xEF12E31A, 0x1CE41E0D, 0x11E7E615, 0x1CFDE10D, +0xF1E0E523, 0xE61AF8E8, 0x170C0DDE, 0xF2F414EF, 0x0EE50611, 0xE8E91CF2, 0xE2ECF815, 0x1BF4E2FA, +0x0F12F70F, 0x1DE71314, 0x1111130D, 0x0F0D121C, 0xEF17F9CD, 0x1414E6E7, 0xE21DDAF2, 0x08E61E00, +0xF5EF1EE9, 0xFF110F0E, 0x19EF16E2, 0xE116E11D, 0x171810E7, 0x1214F10E, 0xE6010C19, 0x13EDF513, +0xFB100917, 0x1DE9E6EB, 0x09091A11, 0xDF21E4E4, 0xF8EFD8F2, 0x12110DE8, 0x19F8E508, 0xFEED16EE, +0xE9F6EAF2, 0x23FD13EC, 0xE1031A20, 0xED15110C, 0x0511EC17, 0xEFF927EE, 0x0418ECED, 0x15E7EEED, +0x19F810E7, 0xF2E6E008, 0xE2DFF912, 0x0FE815E9, 0x18131C13, 0x11F51706, 0xF718F326, 0x1118E3DE, +0x0213EC22, 0xE4E7EB21, 0xDE161EDA, 0x09091118, 0xFD17EE03, 0xDE140DF2, 0xF71419E9, 0xE9E306EB, +0xD91326F6, 0x1310DDE6, 0xF112F1EB, 0xE5F4FBF3, 0xEBE6E80A, 0xDD102314, 0xEB20D7E1, 0xEEEDEDF1, +0xEF101110, 0xE5141806, 0xE723F118, 0x16F1070D, 0x12F0F61B, 0xE3F416E4, 0x1FF6F0EF, 0x17D9EE0E, +0xE017F009, 0x161E17E9, 0x12F10EF0, 0x1D1019F5, 0xE1EBF817, 0xFFE1E71C, 0x1D14181C, 0xD90610E5, +0x0CE929EE, 0x15EFDB23, 0xE616DBED, 0xE3E6F6EF, 0x1816DCEC, 0x140FEBF2, 0xE71929EB, 0xF1E7EF0E, +0x191AF317, 0xEA0DF0E8, 0x17F207E6, 0x2016E7EC, 0x11E3180F, 0xDB130B0A, 0xE5E9FAF2, 0xEC200BED, +0xEAE9F015, 0xF81DF0E0, 0xE2E81EFE, 0xE4E5E521, 0x0A18EE10, 0xEF21F8F8, 0x19F8E80E, 0x000412E2, +0x1F1A1017, 0x2213150E, 0xF5EBEDED, 0x1313E813, 0x121AEA15, 0x12F0E317, 0x17F30C15, 0x1B1B191D, +0xE800F0F6, 0xEEECE9E0, 0x200F160E, 0xEC0AFE16, 0xEBFE09ED, 0xEFD0F6F3, 0x1BEAE718, 0x07E8E511, +0xF1E90BDA, 0x1DE92216, 0xF7F0DE08, 0xD8140619, 0x0FE7ECD9, 0xE1F6E50C, 0x1917E5FA, 0xEFE5F9F7, +0xE31C0BE9, 0xD50816EE, 0xF007EA21, 0x0E0DFEE1, 0x0DEA0D1A, 0x181425F9, 0xE1DAE611, 0xED0BDEF3, +0x15F518E5, 0x171F1DEB, 0x11E3E514, 0x0518E614, 0x0314F0ED, 0xD30FF1EE, 0x15F012F1, 0x0BDFD916, +0xED05EFF9, 0xF6D8E4EF, 0xF11D1E1E, 0x2016EF17, 0x14E818EB, 0x1417F2DA, 0xE418F8EA, 0xE918EB0B, +0x0B09EF15, 0xFE21FBE3, 0xEADAE017, 0x1C12E612, 0x1D03FEE5, 0x11D000EB, 0xFFDF0CF6, 0x1120F20E, +0x180BEC0E, 0xEF131EE8, 0xE71FE614, 0x1B1FE40C, 0xECEFEEEF, 0xE2F7F008, 0xF0110DF5, 0xEAF922E2, +0x17FBDEE7, 0xEA11EF04, 0xDBEEFE24, 0xF1E30CE5, 0x140AEDF2, 0xF4E7DBF1, 0xDEFC18EF, 0x1112EFF6, +0x0821E7E4, 0xE400EC06, 0x1BF3E2F2, 0xF0161D17, 0xE5F218E8, 0xF5E61B12, 0xE215F9F1, 0xEF1610F1, +0x08DCF0E9, 0x0EE324E3, 0xF6D2E8EE, 0x17F7F2ED, 0xDE1ADEE0, 0xEF14EA11, 0x0A301A15, 0x1518F31D, +0xF721170E, 0xE7FDDC1C, 0x0EEFF2E8, 0xFB28EAF5, 0xE5140E1B, 0x1C14E5DD, 0x15ED1CE6, 0xEF1612F4, +0xE8F00E1C, 0xEDF50F18, 0xEBDD1314, 0x1CF8EFE3, 0x0E16081A, 0x11ED0EF0, 0x09E82114, 0x14EDDF16, +0xD4F81018, 0xE0FCFF21, 0x06F30DD8, 0x0B15EE0A, 0x120DF01F, 0xEBF0F5E5, 0xEEE411F4, 0xFF19100B, +0xEE0D0FE6, 0xDEE71FE8, 0x0DEDE110, 0xE008ED23, 0xECF3EEE8, 0xF1F223EE, 0x121AEFFE, 0xF5F4E919, +0xE70BE3EC, 0xFB21F5E7, 0x100BEBF0, 0xEBDA19EB, 0x1819F5FE, 0xF4F6F411, 0xFD0CE9EA, 0x171E1CF1, +0x22160CF4, 0xE7001314, 0xF2E9ECDB, 0x1515130D, 0xF5ED17E6, 0x15E712EC, 0xE807F7E2, 0x201AED1D, +0xE2F816E3, 0xE8141413, 0x14DE1FF0, 0x18F1EFFA, 0x09EF16E9, 0xE30FE11A, 0xEF13EF20, 0xEE131A15, +0xE9DBE805, 0x14EA0FE2, 0xF8ED0E17, 0x1A14DEE6, 0x10EE14E4, 0xE9081526, 0xF8F01612, 0xDC0518F5, +0xF210F00F, 0xEE0E280A, 0xE8E218F1, 0x0EFA04E7, 0x1219E717, 0xF216F0EE, 0x2814E7EC, 0xF41DE81A, +0xE3EDF0E0, 0x13DFF6ED, 0xEEE9F71C, 0xDBEEEBF1, 0xDD13F8EE, 0xF115FDE8, 0x231314F3, 0xFE090613, +0xEE110E1A, 0x1A0FFBE4, 0xE31710ED, 0x1A1FED1E, 0x1DEF1AF0, 0xEDEA1E0C, 0x0CE6E9E3, 0x17E42213, +0x0BEC09E4, 0xDF1D01EA, 0xFB09F828, 0x03111A0A, 0x07E1E31B, 0xEFF3FB05, 0xE9F10E17, 0x12101AED, +0x1819EAF8, 0xF5EBDBE5, 0x0BE420E7, 0xEC07031A, 0x1509EAF1, 0x1AEDF211, 0x191702F6, 0xF918F315, +0x0E0A12ED, 0xF526160C, 0x15F5E812, 0xEC11EA10, 0x13E3E7DD, 0x0E23F110, 0xDC14E802, 0x14E20F18, +0x06DBE816, 0x241A1DE6, 0x11250AEE, 0x1117F61E, 0x0906E9F8, 0xEF1CF41B, 0x1DEC0A07, 0xED16F5F7, +0x0A1AE00F, 0x1E15ECEA, 0x15F20613, 0x1B151822, 0x111A17EA, 0x0C1EF0E4, 0x071CEB0B, 0xEBF5E6EF, +0xF9F816ED, 0x161010DB, 0x152413F8, 0xF80F07E3, 0x15EEF615, 0x0E16EDEC, 0x0C20DCEC, 0x0BE10AF6, +0xF1071EEB, 0x12E5F7F0, 0xEDF5EBED, 0x170FF725, 0xF3F01313, 0x07051CE5, 0xE309EFEF, 0xF1F0180B, +0xF9161519, 0x181CDAF5, 0xE10E12F0, 0x15F412EB, 0xF7141819, 0xEE1FE0E6, 0xD8F217DB, 0xECF4EB0E, +0x1DEF0FF4, 0xE40CEB05, 0xF0120DF1, 0x21EC191D, 0xF413E619, 0xE62519E2, 0x1AF00DEE, 0x09F2EFEC, +0xE8F90DF4, 0x25D6F626, 0xEFE800DA, 0x1BEBEDF1, 0xE812170F, 0xE9E9F102, 0x271BEC08, 0x11E7F71D, +0x15EAE61D, 0x120C08F4, 0xFD16E813, 0xF30A11E6, 0xE3F1E81D, 0x14F2FE04, 0x1B0A150D, 0xEBE8D8DD, +0xEF1E1ED7, 0x13100E1A, 0x09F11EE7, 0x11E81218, 0xFA24EFE8, 0xEB151EE1, 0xE516F2E9, 0x1DE41911, +0xF616E5F3, 0x14EBED19, 0xEB1B12E4, 0xE5191907, 0x22141016, 0xE9EDE60D, 0xFF15F114, 0x1715E1EF, +0x28020F10, 0x14ED15EA, 0xF618E30A, 0x27EBEAE7, 0x1DE815DC, 0x1816E81B, 0x1A130DF9, 0x2CF609F7, +0xE5EAE7F2, 0x0F08F401, 0x10ECE8E5, 0x0FECE7E3, 0x15E6F5F3, 0xE41522E2, 0xF3E823E2, 0x0811E5EA, +0xF91E2119, 0x120C1AFA, 0x1BEDED0B, 0x14E3ED15, 0xE31C12F6, 0xF306EEFC, 0x01ECDB17, 0x09E3F413, +0xDFF0E7E7, 0x17130BF0, 0xE518FB0C, 0xF21011EC, 0xE21BE1E4, 0x03F5E80B, 0xF0DCEE15, 0xEF1A0E1C, +0xFD171506, 0xEED10C09, 0x04E9E90D, 0x1CE614E7, 0xF718EFF2, 0x1E03D4EF, 0x06E8EEE7, 0xEB1D21EF, +0x1519E6EF, 0xF1F00E1E, 0xEAF3240C, 0xEE211D0D, 0x0FF3DDFE, 0x161318F4, 0xE8100DF2, 0xE41422EC, +0xEA0DE3E6, 0x1FF9DD1A, 0x1618E6F5, 0xE4DE00F5, 0xF0F809F0, 0x1E0C10E7, 0x180D0FE3, 0x19EE09EA, +0x1C10E2E8, 0xE81EEA12, 0x20DE0D10, 0xEAF01811, 0xDE0D15EA, 0x18F5EFF1, 0x0812EA0C, 0x211204EC, +0xE9110AE8, 0x21DF1114, 0x18E10D09, 0xFDF8F226, 0xE9E002DE, 0x2116EBE0, 0xF4F918ED, 0x0BECEEF8, +0xEDE81A06, 0x000EE519, 0x16F2FAE2, 0xD920E312, 0xE51EE713, 0x1423E50C, 0xEF1316FB, 0x20F3F5F2, +0x1BE3E8ED, 0xE6EAE6EB, 0xDD0B1905, 0xE810ECE9, 0xF71A1810, 0x100A0E10, 0xF114F914, 0x071FF20C, +0xEC19EDE7, 0x0AD6181D, 0xEC06E8F5, 0x191312F3, 0x121525F3, 0xE6EE2916, 0xF41A0F17, 0xF4E8EFEF, +0x1819E518, 0xE71FD4E6, 0x15171F19, 0xD80913E0, 0x1FF816E5, 0x0E1A16E5, 0x0CF1F21F, 0xF11513E1, +0x15FCE7E3, 0xF1DD0FE9, 0x08F018DF, 0x13D915E0, 0x13ED11E5, 0x050F10EA, 0x17F21D13, 0xF90FDEFC, +0x000B2316, 0xF5EFEB13, 0x09ECEA05, 0x0A18E3FD, 0x0812EE05, 0x0E12F7E7, 0xDA17DB0B, 0x13E6EB16, +0xF1E71CEC, 0xF111F316, 0x15E90DE8, 0xEA17E0E3, 0x21F20D09, 0x15F915F2, 0x210DF00D, 0xE5DCF0ED, +0xEDE9EE04, 0xEFF7FAE8, 0xF61A191B, 0xF81DEBEF, 0x0E23F7E0, 0xDCE60BF1, 0x19EF0F20, 0x1B0B120B, +0xF2130D0F, 0x160CD81C, 0xF3180CEB, 0xDF0AF2EC, 0x14EAD513, 0x20E7F4EF, 0x0CEE1A15, 0xDF17F2E2, +0x1F0CFAF1, 0xE81011E3, 0x1B290ADC, 0xFDE515E9, 0xE0E9EA0F, 0x0BED0CEE, 0xE2E11AF2, 0xED2015E7, +0x18E4EA0F, 0xF6F0F313, 0xD904F425, 0x1C0FF1EE, 0xE5F3140D, 0x29F6EB27, 0xEEFC1515, 0x04E3F907, +0xF11A05EC, 0xF6E7F9E4, 0xF5E60E13, 0x0DEE1518, 0x0D1418E2, 0x0A17EC22, 0x1A0F11EA, 0xEA17E6EE, +0xF22A191E, 0x2111F5DD, 0x29F216EF, 0x160519E9, 0x0F1A040F, 0x1A021D19, 0x1825EE0F, 0x171D0D0F, +0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, +0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, +0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, +0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, +0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, +0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, +0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, +0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, +0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, +0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, +0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, +0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, +0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, +0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, +0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, +0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, +0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, +0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, +0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, +0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, +0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, +0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, +0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, +0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, +0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, +0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, +0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, +0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, +0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, +0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, +0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, +0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, +0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, +0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, +0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, +0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, +0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, +0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, +0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, +0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, +0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, +0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, +0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, +0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, +0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, +0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, +0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, +0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, +0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, +0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, +0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, +0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, +0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, +0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, +0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0xFB0E01EF, 0xFF0C0B02, 0x07090AFB, 0x0BFBF3F1, 0x0B090F0D, 0xF10409F2, +0xF80A0E0B, 0xECF60E09, 0x0610F2F9, 0xF4F9FBEF, 0x08ED0DF9, 0xFCF9FEFE, 0x0F0C12F8, 0xF9F317F4, +0x0BF80213, 0xFFFD1710, 0x0BF80FFB, 0xEEF6F2EE, 0x0106F506, 0xF3091206, 0x00F504F0, 0x0B0C0018, +0xFD02FAEF, 0x06ED0308, 0xF4F60215, 0x02F80BFC, 0xF20601ED, 0x06F7F5F3, 0x0111FAFC, 0xF2ECF2F8, +0xFB050C0D, 0x0314EA0A, 0x09F4FCF8, 0xF0F80013, 0xF6E90D0A, 0xF307F415, 0xFB04F4F8, 0xF006F3F1, +0xFAF9F808, 0x06F9F109, 0xED0A0A0C, 0xF3F6FC03, 0x0508120A, 0x0C0DF100, 0x02FF09FF, 0x00F80D01, +0x04E50410, 0xF616130C, 0x0300F4EC, 0x090EF506, 0xFA0E0C14, 0x0EF10111, 0xF2030F09, 0x03F3030E, +0x09EA0509, 0xFDFEF9FB, 0x06F4F702, 0x0C0D0BF3, 0xFFFBF906, 0xF7FBF512, 0x03110AF8, 0x0AF7F70D, +0x17F60108, 0xF811FA05, 0xEE040700, 0x03FEEF01, 0xF706EC0B, 0x060C0AFA, 0xEC0EF910, 0x0804F207, +0x09E902F7, 0xF7FDF610, 0x0C050C0B, 0xF8E7F609, 0xFB170A13, 0xF0080404, 0xE808F413, 0xF1F4EB07, +0xEBFC01F7, 0x0B040AE8, 0x00F1020E, 0xF0F207EC, 0x0EFFF211, 0xF3F815F4, 0xF9020B0B, 0x0EF71201, +0x0706FC0C, 0x06FDF6FA, 0xFBF7F80A, 0x08090EFD, 0x14FD05FF, 0xF403FE0A, 0xF5F8EF03, 0xFB0AF8F7, +0x0F00F409, 0x0AEF0B03, 0x0FFB0210, 0x11070710, 0xF1080B0B, 0xF20E08E8, 0xF00CF5EB, 0xF0F30C0E, +0xFCF0080D, 0x0900EE07, 0xFA01FCFE, 0xE712E70B, 0xF004FEF9, 0x0CF5090D, 0xF60EF606, 0xF8F4FAF8, +0xED061507, 0xEF110506, 0xF90FF20C, 0xF911F813, 0xFC12F3EF, 0xF7F9F1FC, 0x0E07EAE9, 0x0EF8F1F8, +0xF6070FEA, 0xF0FA0310, 0xF8FE1417, 0xF8F306F9, 0xFBFCF50E, 0xEC0D11F3, 0x0900F70A, 0xF80EFBF3, +0x0B08F8F6, 0xEFF00F0C, 0xF709F8FA, 0x0E16EB13, 0x0BF415FE, 0xF4F20F0B, 0xEC0C0AF3, 0x13F8FB02, +0x12F908FB, 0x0A090D12, 0xF110F0F5, 0xF40E021B, 0x0809F7F3, 0xEE000B0D, 0x0E0FF5F6, 0xF3F40BF6, +0x05150BE7, 0x0DF809FE, 0x12030809, 0xFF13FC08, 0x0BF6F912, 0x13F90AF4, 0xFE03F2F1, 0x04FB0CF7, +0x01FDE8F5, 0x0EF8F40D, 0xFE02F7ED, 0xE7EDF2FB, 0x04F9FF13, 0xF0F80A07, 0xF700F6F7, 0xF4080EF4, +0xF2F7F80F, 0x0DFDEFF0, 0x11EFF902, 0xF2FC0703, 0x0AFD10F1, 0x17F70D07, 0x08F5EFEB, 0xF10B11F9, +0xF610FFF8, 0x0C130B18, 0x080CFEF5, 0xFBF8F906, 0xF1080C08, 0xEAEEEE10, 0x0F11F6FD, 0x06F706F1, +0xED0BEA0D, 0xEEF30C02, 0xF8F40D0F, 0x020D0DEC, 0x0CF40605, 0x07020C12, 0xF40C0EF2, 0x060115F2, +0xF0E6F508, 0xF40DF9F0, 0x0F0A05F4, 0x0FF00B08, 0xEB08FEFC, 0xEE030AF1, 0x0DF9E806, 0xF2F7F5FD, +0x0A12EEF0, 0x09F3EFF8, 0xFE05F6F8, 0x1CEDF4F5, 0x060512FB, 0x08F90AF0, 0x000107F9, 0x14FFF9FA, +0x16F70B0B, 0xEEF2F704, 0x04F90BF1, 0x150302F3, 0xEBF8F8F3, 0xF6F90FEF, 0xFBF0F7FD, 0xF70D1000, +0xECF70C12, 0x03FDF3F0, 0xE4F31604, 0x02FFF600, 0xF00C0105, 0xEC0D0F02, 0xFAFAF707, 0x0208F501, +0xFFF809F5, 0xEEF70405, 0x050CFCF9, 0xF20BEBF7, 0xFA0E11F6, 0xF7F403F2, 0xF5F0F306, 0x00081A0F, +0x02F6EE09, 0x0F0D0B0F, 0x0AF7EDF6, 0xECFA0FEB, 0xF000FBFC, 0xF91103F4, 0xF0F30001, 0x08FCF8EE, +0x0CFEF30B, 0xFE040B02, 0xFC030FF3, 0x04F9F209, 0xF10E0705, 0x14F60B0C, 0x03ED1311, 0xED03EE13, +0xF9F8F70F, 0xFB010504, 0xEDF70C08, 0x061802FE, 0xED0801F9, 0x06FCFA16, 0x0EF8FCF3, 0x0EF00C0E, +0xF3F9170D, 0xFE010F05, 0xF31B0500, 0x07F50BF4, 0xEE09030A, 0xF401F400, 0x0C04090A, 0xFCF90F02, +0x0D10FD0C, 0xF00FEA09, 0xF3F50BF7, 0xFCFCF7EF, 0x06FB0A12, 0x0200EC01, 0x02020A0E, 0xF3FCFE0D, +0xFC0CF209, 0xFB06F2EE, 0xF90B0C10, 0xFDFCF40C, 0xFC06F80B, 0xEFF902F3, 0x0C110911, 0xF80AEFF3, +0x0900F30C, 0xF8160E0F, 0xEE0D130D, 0x0BF00209, 0x0AF509EF, 0xF7F614FA, 0xF513070A, 0x09E512FD, +0xF3050D0C, 0x0006020D, 0xFAED07FE, 0x07FE170B, 0x121300FF, 0x02F602FD, 0x0AF408FA, 0x06FAF7F1, +0x0807F71A, 0xFBF20C0B, 0xF3FD05F7, 0x06F4090F, 0xF1FEF307, 0x0805EBFA, 0x0810070D, 0xF6F31214, +0x02ED0607, 0x0D08010F, 0x09F60FF2, 0x0BF8F20C, 0x1BFCF6F4, 0xECFB070C, 0x13FAF3FD, 0xF8F7FCF4, +0x0C09F7F4, 0xF001E9F9, 0x11F1F305, 0xFAEC08FA, 0xF8F8F40F, 0xF6F70B0A, 0x07F012F4, 0xFDF5FEF3, +0x09070EF1, 0x09FFF7E9, 0xEAF60C0F, 0x04030106, 0xF5E70709, 0x0AF6F70C, 0xFA14FEF1, 0xF0E51903, +0xF4EF0B11, 0xF0F80CF3, 0x12ED0307, 0xF301F405, 0xF9F4F3F5, 0x0B0EF809, 0xF7EBF9F8, 0xF10BF406, +0xFBEEF2F6, 0xEC1111F2, 0x0716EEF6, 0x080910F0, 0xEE0D0010, 0x07ECF7F0, 0x09060005, 0x0DF5EB0B, +0x0212110C, 0xF3F704FA, 0xEA02020C, 0x050811F1, 0x01FA07F7, 0xF60E0D0D, 0xF711F60C, 0x0108F4F1, +0xF7F6FE01, 0x0F0FF7F9, 0xEFE7010A, 0x090902F6, 0x0FE809F8, 0xFDFE00F6, 0xEF0806F5, 0x10F80F0F, +0x0419F40B, 0xEF08EEFD, 0x0711F507, 0xF20901FB, 0x0BFA130A, 0xFA120CF9, 0xE809F2F2, 0xFAF8FE00, +0xF2FDFCF8, 0xF805F1FD, 0xF1F70912, 0x0903F80B, 0xF9EFF70B, 0x0D05F5F2, 0x0A08FF0E, 0x09F5EE00, +0x08F91314, 0x0AFEF60A, 0xE51005F0, 0x041EECFA, 0x06FDFF05, 0x0D11F1EF, 0xF4F80912, 0x0D090106, +0xFAF6F308, 0xFE14F8F1, 0x0D02EE03, 0xF0FDFAED, 0xF2F2E903, 0xE9040C0D, 0x0A00F8F8, 0xF4FA0909, +0xF4EFFA1B, 0xFC0D0D0B, 0xF2EE08F5, 0x000E0F12, 0xF0F50F11, 0x04FEF9F4, 0x0BF914EB, 0x170CFBF9, +0x03F30E06, 0x01F8F70F, 0x14F8EFFD, 0xF412F5F2, 0x0AF60C01, 0xF711090D, 0xF60DF90C, 0x09F0ECE8, +0xEC06140C, 0xFD090DFA, 0xEA01F7EF, 0x030AF8F6, 0xF3F5FCFD, 0xF4F3F500, 0xF3EDECF5, 0xF3130AF6, +0xF8EFFA0E, 0x0A0B0DF4, 0xF1F0F7F5, 0x0D0A09F4, 0x10EDEEF7, 0x0E0EEDFE, 0xF4F9F306, 0x05FCF8FF, +0x13FBF7F2, 0xFF07F6F7, 0x0AF2F8F6, 0x0DFA1EFF, 0xF6EE0B09, 0xF113030B, 0xFAF9F3F5, 0xFA0C080C, +0x0BF8F607, 0x09F902FB, 0xF50BFD08, 0xF7F515EF, 0x0BFA00FB, 0x01FAF009, 0xEA02FE05, 0x0CFBFC10, +0xFBF7F214, 0x1305F1ED, 0xFA01F216, 0xFDFBFFF4, 0xEE0B040C, 0xFAFB05FD, 0xFEF8F7F4, 0xF60802EF, +0xF301E603, 0x03EEFAF7, 0xF109EAF2, 0xEF0BFEF5, 0xFFF31115, 0xED09F309, 0x02FFEE0D, 0xF60D0FF9, +0x030A07FA, 0xF5F4060A, 0x140FFEF1, 0xF6FCEEFF, 0x07030006, 0xFBEF04F7, 0x0AF009FC, 0xF90A0FF9, +0xF2F702F8, 0xFFFBFB0E, 0x0907090B, 0x0B180F02, 0x0B0C0405, 0x12F80AF9, 0x09F400F0, 0xF010070A, +0xEBF105F1, 0x05F90C11, 0xE805F30B, 0x12F70BF3, 0xEF11EFFC, 0xEFF7FC0F, 0xE709EF10, 0xF50CFBFD, +0xF7F805F0, 0xF609FCF7, 0xEAF80F00, 0xFBF40B10, 0xF71106F5, 0xFA12FB01, 0x020BF30C, 0x0714FA04, +0x06010708, 0xF2110D0D, 0xEEF6F2F8, 0xF009F1E8, 0x07FD06F7, 0x14F8EF0C, 0xF00DF9F6, 0xF20BF50B, +0xF90C06F7, 0x06FB02F7, 0xF7F20A09, 0xFA051008, 0x0EFA0913, 0x05060D03, 0xFCF40CF6, 0x03E8FCFC, +0xF3F31411, 0xFCF40906, 0xFB0BF9F7, 0xFC02F80D, 0xF20408F2, 0xEE0EEF0B, 0xF0000EF3, 0xFBF6EDF1, +0xFAF50FEB, 0x06FC0C0B, 0xF009F80F, 0xF0F7F706, 0xF70507FC, 0x0AF00209, 0xFF0DF20F, 0xEA15FA06, +0x0816EDF3, 0x000EF9F5, 0xEFF7FA04, 0x0FF60814, 0xF1FEFA02, 0x0805F306, 0xF610FDEE, 0xF8061606, +0xFE0DFCEF, 0x07F8F613, 0x0C0809F9, 0x0DEBF0FB, 0xF00EF4F4, 0xF8E7F20A, 0xF3FAF20D, 0xF90D04EE, +0xF1F40E00, 0x09EFFFEC, 0xFE0B0EE7, 0xF7FA0F0E, 0xF00CFEF4, 0xFAEEF9FC, 0x161AF703, 0xF70F10EC, +0xF6F011FA, 0x10FDFB0B, 0xF60C03FE, 0x0AFF08F3, 0xF6F606F0, 0xF5F716F3, 0xFDFDEBF7, 0x0CF8EFF4, +0xE3EF0910, 0xF7F6FF12, 0x001402F1, 0x03100EF2, 0x1117EBFF, 0x17FA1008, 0x0DF9F80E, 0xFCF0F511, +0x1403EEFC, 0x0010F100, 0x110A0612, 0xF505FAEF, 0xF4F304F4, 0x061209EF, 0x090C150C, 0x04F41306, +0x0B0C0DED, 0xF0F6F110, 0xFC0F1008, 0xF3EF0E08, 0x0B0AECF8, 0x0CF8FA0C, 0xF7FB0EFF, 0x0FF50FFC, +0x0DF4EDF8, 0x02080C0B, 0xF510F2F2, 0x0208FDF1, 0x060B04F1, 0xF8F6E607, 0xF415EDFF, 0xE8FBEBEC, +0x0805F30F, 0x00F30F09, 0xFA0DF6EB, 0x0BEEF806, 0x0408F00B, 0xF4F5FB09, 0x090EF310, 0x1006FBF9, +0xF0F7F710, 0xFC070C0F, 0xFB12EAFA, 0x0BF007F1, 0x080100F1, 0xF700F709, 0x0A0D05F8, 0xEFF20D0C, +0xF209F8F8, 0xF207FDF3, 0x0DEFEFEE, 0xFD020114, 0x0AF5050A, 0x0D0415FA, 0x0C12ED0F, 0x14F01005, +0xF7F0EE06, 0x0F14F209, 0x080500F9, 0x08F5050E, 0x0DE7E901, 0x03FDF3FC, 0xF20403FD, 0xF7F2F60D, +0xECF00D09, 0xFB09FF0A, 0xF306F9F2, 0x0E03F20E, 0x0C09F305, 0x11F710F8, 0xF4F217E4, 0x0E09090A, +0x0A12F0F9, 0x06F312FE, 0xFDFBFDEE, 0xE9F0020D, 0x0DFB1005, 0x0200E90B, 0x0F0C02F5, 0xF8FF05F4, +0x0AF303FD, 0x0BF4100E, 0x14F2040F, 0x0EF9EF0B, 0x0AED0801, 0x05F5EE08, 0xFF0A0514, 0xF8F2F0FF, +0x0FFAF7F0, 0xE10E12F6, 0x13F1F4FA, 0xF3FC0B0B, 0xEFFEF4FD, 0xF9080708, 0x05FCF9F6, 0x040E06F4, +0x020DF5F6, 0x13F50B11, 0x1513F1F6, 0x05F707ED, 0xF7FB01F7, 0xF1EF06FA, 0x09FB1102, 0x06FC0706, +0xF7F80F14, 0x0EF3F002, 0x0AF8FE0A, 0x0BE8F5F9, 0xEEF609E9, 0x09E8EE02, 0x03090BFC, 0xF0F8F0F1, +0xF8081009, 0x0F0002FA, 0xFCF202FD, 0x0DF106EF, 0xF70408F5, 0x02140C15, 0xF6F6F5EF, 0xF1080905, +0xE902FDEC, 0xF3F4F6F6, 0xF904FCF2, 0xF906F5F3, 0xF7FB0A08, 0x08F4F0F1, 0x0EFDF6F1, 0x03F8F6F6, +0xFF0C110C, 0xF1FDF7F8, 0xF814F502, 0x12FD1108, 0x0DF7F313, 0xF506FA11, 0x07FEF9F2, 0xEAF20D09, +0xFCF40D0D, 0x06F1F709, 0xF7F21DFA, 0xFB00ED11, 0x0DFA0208, 0xF1FE1101, 0x0AF5F4F9, 0x060BF3F9, +0x080CFD06, 0xF30EF409, 0x12EB02EF, 0x0BEF0D09, 0x1512F0F0, 0x18010700, 0x05070F05, 0xF306FC08, +0x0001FD0E, 0x10FD0DF8, 0xF708F90A, 0x100D0D05, 0x04011414, 0x0AF90D0C, 0xF402F8EE, 0xFC11FAFF, +0xF500F605, 0xF0EAF8F4, 0x120F0407, 0x1103F9EE, 0xF9F9F5F7, 0x10060EF8, 0x0609F504, 0xF20E080F, +0x0EF3F109, 0xFB05F60E, 0x0E1C05FD, 0xF710FBEB, 0x16F2F90B, 0xF500FEF4, 0x0A13EEF7, 0x0EFF0CF6, +0xFFF903F8, 0xF30A0BF0, 0xF7FCF004, 0x1613F70B, 0xF90506F5, 0xEB09F008, 0x05F30CF3, 0x0310EEF3, +0xFD1002F4, 0x09070114, 0x040B0606, 0xE400F907, 0x13F40B1A, 0x06F4EBE7, 0xF1EE06F9, 0xFAF9130D, +0xF3ED090A, 0x08EF05F8, 0xF814F507, 0xF8131707, 0x1EFCEF0C, 0xF1090708, 0x04F211F0, 0xEFF0090E, +0x09FBF3FD, 0xF3F204F4, 0xF000FC1C, 0xFC00F009, 0xF9FD160F, 0x16F7F80D, 0x0DF8060B, 0x03FAF4FB, +0x03FDFF0D, 0xF4F1F40E, 0xF9EBF7F2, 0x0EF6FA06, 0x09F3EDFA, 0xFEF4EFF2, 0x0F0300F4, 0x0DEBFBFC, +0x1FF0010E, 0xF9140E07, 0xF2F6FD07, 0x11E9020B, 0xEE17070B, 0x10FD0003, 0x0904F5F7, 0x0515FCEE, +0x090F07FF, 0x12FC1104, 0x10F9F0F1, 0x0A080700, 0x010A1200, 0x120B01F5, 0xF7F0ED01, 0xFB06040E, +0xF0FEF30B, 0x0A0713FC, 0xF6F7F9EC, 0x07F803ED, 0xF2F9EF0F, 0xFAF4100A, 0x020AFA04, 0x0806130D, +0xFF0B0F04, 0x080705F8, 0x04F503F3, 0x05EEF9ED, 0xFBFEF30A, 0xF2F9F20B, 0x03FEECEB, 0x08F40302, +0x0617FE0A, 0xFE10050C, 0x0410FAF3, 0xF508EFF9, 0x030908F2, 0x010206FC, 0xFDF7F415, 0xF9080F05, +0xFBF00CEE, 0x0BFD0D0B, 0xF7F9F10A, 0xF80603F9, 0xF202F4F5, 0x0F07FA05, 0x04FA09F8, 0x08F80B04, +0xED030E00, 0x0A04FDF8, 0xEFFC0B14, 0x05F2FFFE, 0xECF60EFB, 0xFE04FD07, 0x0AEDFB0D, 0xF20FF407, +0xF4030A00, 0x15F1EEF2, 0xF50B0D0B, 0x02FE11FB, 0xF3FBF8F8, 0xF7F0F516, 0xF6070A04, 0xFD0C1A0D, +0xF603F50B, 0x0D0F04FA, 0xF5F5EFF7, 0xFB130FE9, 0x0C0205F3, 0xFB050CF7, 0xF9F809FF, 0xF1120DF0, +0x0E0503F8, 0x16FEFDF6, 0xFA0AF5F7, 0xF302F6F9, 0xFC07F4EE, 0x0A040A00, 0xFFF409EE, 0xF8F7FD18, +0xFC01F7EA, 0x0F11F40F, 0x0DF7F708, 0x0DF60809, 0x0DFD0F08, 0x1012FA0E, 0x021615F4, 0x04FCEBFB, +0xF7FC09FE, 0x0C080DF9, 0xF8EB05FC, 0x0708F2EE, 0xFC14F80C, 0x0C06F111, 0x0809F9F2, 0x0CF809FF, +0x0DF50AF8, 0x05EA0E12, 0xFCF6F805, 0xF5EC0A0B, 0xF2080D10, 0x09FBED04, 0xEFF7F40E, 0xF8F610F6, +0x09F4F1F9, 0xFFFC0E0B, 0x020AF3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEFF410FC, 0x07FD0EFD, 0x0D060100, +0x13F4FAF3, 0xFFF001FE, 0x08FC07F0, 0x0900FC05, 0xF5F8F709, 0x0CFC100C, 0xF7F7FBFC, 0xF7F608F4, +0x05F90308, 0xECF6FF08, 0xF2F70B07, 0x04FE03F5, 0xFC02FBFE, 0x02F41301, 0xF1F6F50E, 0xF9FA00E4, +0x0EFB0709, 0xF50800F7, 0x040AEC07, 0x130301FA, 0x0409F809, 0xF104EA0F, 0xF7F00A09, 0xF80BF704, +0x13F800FE, 0xFAF50CF3, 0xF103090A, 0x12FAF30A, 0xF611F8F9, 0x02F1F403, 0x0A040FED, 0x0AFFFEF2, +0x05FBF7FD, 0x0FE903F3, 0xF6EA090B, 0x120FFE07, 0xFA1406F2, 0x0EF80EFB, 0x0EFDFAFC, 0x0EFC0D0A, +0x120805EF, 0xF70DF900, 0x0C0EE5FB, 0x0F0DF503, 0xF609000A, 0x0D03F5F9, 0x0FFB1006, 0x05F60A08, +0xED07F8EF, 0xF90CEE0A, 0x0B16100A, 0xFD07F607, 0x0EFF0D01, 0x0CEF04EB, 0x11F5FD0B, 0x080B0CF5, +0xFF14FEF5, 0xF1FAF413, 0xFA0100F6, 0xF0090FFC, 0xF3FB0AEF, 0xFE09FE0E, 0xF710F3F5, 0x04090C11, +0x04EEEFF2, 0x09FC0FF1, 0xFE0BF4F9, 0x08F10AFC, 0x030AF5FE, 0x13FA0FF4, 0x07000AFE, 0x071507F5, +0x06FD08F0, 0x0F0C08EE, 0x190E020D, 0x08EDF4EB, 0x0D0DF109, 0x0210EF00, 0xF506080A, 0x1010F7F0, +0xFE02F7FB, 0x09F8F6F7, 0xF902FF04, 0x16E003FE, 0x12EA1A00, 0x130E0FFF, 0x0702F2F9, 0xF10BEFFC, +0x010E04F1, 0xF6EF15F6, 0xF50A0510, 0x050DEF0D, 0xF908F4F6, 0x0F0F0BF0, 0x04F7F6FC, 0x07F9FAEE, +0x02EE07F9, 0xF6F90105, 0xF1FFFC04, 0x0802EB0C, 0xF10E0CF3, 0x030E0508, 0x0CF60CF9, 0x08F20EF5, +0xEFFE09EF, 0xF9FB0A06, 0x14F6F6F5, 0xF6140DFE, 0xF511F8F4, 0xF0FAEF00, 0x1103FC0B, 0xF1090B05, +0xF4FD11F0, 0xF80BF6F1, 0x14160D0B, 0x1105070C, 0x0DEDF80B, 0x1005EE07, 0xFCEFF5E2, 0x0812F3F6, +0xF2100BFD, 0x04FAF00B, 0xFD08F508, 0x06030EEA, 0xF4F90C05, 0xF5EE0608, 0x0CEEF40F, 0xF4F8FB06, +0xFCF01609, 0x0407F402, 0xFDFBFDFD, 0x0BF4F806, 0xFCF701EB, 0x08EB0709, 0xECF9040B, 0xF8E9F300, +0x1C0CEEF5, 0x0703FC08, 0xFEF40909, 0x150B0EFF, 0xF30D0B07, 0xFAF203F9, 0x11EC1EE9, 0x191AF4E5, +0xEFDF19D9, 0xFA220619, 0xFA131A14, 0x10FB0909, 0x0C131B0D, 0x140FEB0F, 0xF41AEEEF, 0xEE0A10E5, +0xE206F0E4, 0x13FBFFDE, 0x15132215, 0x1CF31EF8, 0x1512111A, 0x1F1E0114, 0xE8F20F29, 0xEDEF1112, +0xE30DE215, 0x0DED2213, 0x19EBE410, 0x1917DD1E, 0xF5E818EE, 0xDDDB16EE, 0x1418F6F5, 0xE414E31A, +0xEBE7E606, 0x10E50CE8, 0x011C1813, 0x0E15EB11, 0x22E81C1C, 0xEA1B0FE3, 0xE1E9F90D, 0x12FBF91F, +0xEAE312E5, 0x19100D1F, 0xF10F0516, 0xEF1EEA0B, 0xF2E612E4, 0xF2FAE823, 0x0AE4F5F2, 0xF2171BD9, +0x1817FEE9, 0xE9F209E6, 0x07D8EA03, 0x1716F0E5, 0x0DDC16ED, 0x09222113, 0x0126EDE2, 0x11F611E2, +0xF3F21FFE, 0xFBF00E1D, 0xE5E01B0F, 0xEF0CE6EE, 0x05E0EE0D, 0x0819F7F1, 0xEAF01EEA, 0xE811ED18, +0xE115FB16, 0x1DF8EAEB, 0x04FDEFE5, 0xE40EEFF7, 0x28EAF514, 0x181CF019, 0x0F09F711, 0x0E1A12FB, +0xE9EB06F0, 0xE6EBEEEC, 0xDB14151E, 0xEA18FC14, 0x13050C19, 0x06EFEF0B, 0x2217E9EE, 0xECDD19E8, +0xFC24151E, 0x1016EA0B, 0x08F8F1EB, 0xEBE9050B, 0xDDF6E815, 0x15E1F5DA, 0x10111C1F, 0x05E113E5, +0x1925EB1B, 0x19F3F1F6, 0x11061810, 0x1EF5F725, 0xDDEE06DE, 0xE51509F6, 0xE513F1E2, 0xE9EB24F3, +0xF1FE0BE2, 0xEC09F3EE, 0xEDEF0FE9, 0x1BEDF6F2, 0x19EEE311, 0x14EAE7F5, 0x22F0F1EB, 0xFAF412F8, +0xEB09EAE4, 0x0EEC1505, 0x0D0AEE01, 0x0916F5EE, 0x21EAF215, 0x2003DFE5, 0xEDE9E616, 0x01F2D11B, +0x0D13EC20, 0xF8E7100F, 0xF1F3FA07, 0x1414E5EF, 0x10E8F512, 0xDDF4FBF1, 0x1719E712, 0xFFEDF91D, +0xECF4E7EA, 0x0BEE1711, 0x1BEC0AEB, 0xEBF0E1E7, 0x101E15D6, 0x11F211F9, 0xE8F41721, 0x0FEE161B, +0xF118EA1B, 0xDD1C19E2, 0xEEDCE80F, 0x1AF1F516, 0x080B141B, 0x15DD1BEE, 0x100E14F1, 0xFFFB0427, +0x18181F22, 0xDEEBFC0A, 0x07170B14, 0xF819230C, 0xFA0FE5EF, 0xDFF1ECF6, 0x0CF313E7, 0x0D17FA05, +0x141117E8, 0x05FEE7EE, 0xF21DF516, 0xF509F1E8, 0x18291408, 0xF21110F3, 0x17E20AE5, 0x0BEEF9EF, +0xE82220ED, 0x23F8E4EA, 0x1203F2F1, 0xF0FB0CF7, 0xED12FC09, 0xFAF808F9, 0xFE16F701, 0xFC01F20F, +0xF00D13FF, 0xF00C0A07, 0x0BEC0AF7, 0x08F4FAF4, 0xF2F70C0F, 0xF912EF04, 0x11EFF902, 0xF2111BEF, +0xF611FCF1, 0x170B0D07, 0x0809EF00, 0x060B110D, 0xF6FCFFF8, 0x0C13F718, 0x080C12F5, 0xFBF8F9F2, +0xF1F40C08, 0xFE02EEFB, 0xFBFD0AFD, 0x060BF205, 0xED0BFEF9, 0x02070C16, 0xF8F4F9FB, 0x020DF801, +0x0CF4F2F1, 0xF3EE0C12, 0x08F80E06, 0xF2ED00F2, 0x04FA09F4, 0x080DF905, 0xFBF6F1F4, 0xFBF00BF4, +0xEBF41210, 0x02180A05, 0x0D0DE806, 0xF2F709FD, 0x0A120204, 0x09F304F8, 0xFE050AF8, 0x1C01080A, +0xF205120F, 0xF40DF604, 0xECEDF3F9, 0x14FF0D0E, 0x020B0B0B, 0xEE06F704, 0xF00DF705, 0x1503EE07, +0xEBE4F8F3, 0x0AF9FB03, 0x0FF0F711, 0x0BF9FC00, 0x000C0C12, 0x031108F0, 0xF8F30204, 0x02FFF600, +0xF0F80105, 0x00F90F16, 0xFA0EF707, 0xEE08F501, 0xFF0C09F5, 0xEEF7F0F1, 0xF1F710F9, 0xF2F7EB0B, +0xFA0E110A, 0xF7F40306, 0x0904F306, 0xEC081AFB, 0x02F6EE09, 0x0FF9F70F, 0xF6F701F6, 0xEC0E0FEB, +0x0414FB10, 0xF9FDEFF4, 0x04070015, 0xF4FC0CEE, 0x0C1208F7, 0xFEF00BEE, 0xE803FB07, 0xEFF9F209, +0x05FA0705, 0x00F6F7F8, 0x03EDFF11, 0x01EFEE13, 0x0DF8F7FB, 0xFB01F1F0, 0xEDF7F808, 0x06030212, +0x0108010D, 0x06FCFA02, 0x0EF8FC07, 0x0EF00CF9, 0x07F9170D, 0x12EDFB05, 0x0707F114, 0xF3090B09, +0xEE09030A, 0x0815F400, 0xF80409F6, 0xFC0DFBEE, 0xF910FDF8, 0xF00FEAF5, 0xF309F7F7, 0x1010F7EF, +0xF2FB0A12, 0x02000001, 0x02020AFA, 0xF310120D, 0xFCF8F209, 0xE7060602, 0x0DF7F810, 0x111008F8, +0x10F2F8F6, 0xEFF9EEF3, 0xF8FDF511, 0x0C0A04F3, 0x091407F8, 0xF8160EFB, 0x02F8FFF9, 0xF704EE09, +0x0AF5F503, 0xF7F6000E, 0xF513F30A, 0xF5E5FE11, 0x08050DF8, 0x0006EEF9, 0xFA02F3EA, 0x07EA030B, +0xFE13ECFF, 0x02F60211, 0xF6F4F4E6, 0xF20E0CF1, 0x0807F706, 0x0FF20C0B, 0xF3FDF00C, 0xF108F50F, +0x05FE07F3, 0x08F1EBFA, 0x08FC070D, 0x0A07FE14, 0x02ED06F3, 0x0D08ED0F, 0x09F60F06, 0xF70CF2F8, +0x1BFC0A08, 0x000F070C, 0x130E0711, 0xF8F710F4, 0x0CF50B08, 0xF0EDFD0D, 0x1105F3F1, 0x0E00080E, +0xF80C080F, 0xF6F7F70A, 0x07041208, 0x11F5FE08, 0xF507F9F1, 0x09FFF7FD, 0xFE0AF80F, 0x041715F1, +0xF5FBF3F5, 0x0AF6F7F8, 0x0E00FE05, 0x04E519EF, 0x0803F711, 0xF00C0CF3, 0xFEEDEF07, 0x071508F1, +0x0DF407F5, 0x0BFAF809, 0xF7EB0D0C, 0xF1F7F406, 0x0FEEF20A, 0x00FDFC06, 0xF302EEF6, 0xF4F51004, +0xEE0D14FB, 0x07EC0B04, 0x090614F1, 0xF909FFF7, 0x02FEFD0C, 0x070B04FA, 0xEA16EEF8, 0xF1081105, +0x01FA07F7, 0xF60E0D0D, 0x0BFCF6F8, 0x01F40805, 0xF70A1201, 0xFBFBF7F9, 0x04E716F6, 0x09F502F6, +0xFBE8090D, 0xFD12000A, 0x03F4F209, 0x100CFB0F, 0x0405F40B, 0x0308EE11, 0x07110907, 0xF20901FB, +0x0BFAFE0A, 0x0EFEF80D, 0xFCF5F2F2, 0xFAF8EAEC, 0xF211FC0C, 0xF8F1F111, 0x05F709FE, 0x0903F80B, +0xF9030B0B, 0xF919F5F2, 0xF608FFFA, 0x09F50300, 0xF4F91314, 0x0A120AF6, 0xE5FCF1F0, 0x041EECFA, +0xF2FDFFF1, 0x0DFD05EF, 0xF40C0912, 0xF9090106, 0x0EF6071D, 0xFE140DF1, 0xF9EE0203, 0x04110EED, +0x06F2E903, 0xFD04F8F9, 0x0A000C0D, 0x08FAF509, 0xF4EF0E1B, 0x10F9F9F7, 0x06EE0809, 0x140E0F12, +0x04F50FFD, 0xF0EA0D08, 0x0B0D00FF, 0x17F80F0D, 0x17070E06, 0x01F8F7FB, 0x14F80312, 0xF4FEF506, +0x0A0AF8ED, 0x0B1109F9, 0x0B0D0EF8, 0x09F0ECE8, 0x00F2140C, 0xFD090D0E, 0xEA16F703, 0x03F6F80A, +0xF30910FD, 0xF4F3F514, 0xF302ECF5, 0xF3FF0A0A, 0x0CEFFAFA, 0xF60B0D08, 0xF104F7F5, 0xF90AF5F4, +0xFC0102F7, 0xFAFA01FE, 0xF40DF3F2, 0x05FC0CFF, 0x13FBF706, 0xEBF30AF7, 0xF6F20CF6, 0xF90E1EEB, +0xF6EE0BF5, 0xF11303F7, 0xFA0D0709, 0xFAF8080C, 0x1FF80A07, 0xF5F9EE0F, 0x09F7FD08, 0x0B0A1503, +0xF7FA000F, 0x01FAF0F5, 0xEAEEFE05, 0xF8FBFC10, 0x100B0600, 0x13050501, 0xFA15F216, 0xFD0F13F4, +0x030B04F8, 0xFA0FF1FD, 0x12F80BF4, 0x0A080204, 0x0701FA03, 0x17EEFAF7 + +basegraph= +1 + +z_c= +176 + +n_cb= +11616 + +q_m= +2 + +n_filler= +8 + +e= +4640 + +rv_index= +3 + +code_block_mode= +1 + +iter_max= +20 + +expected_iter_count= +3 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE + +expected_status= +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v11835.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v11835.data new file mode 100644 index 0000000000..84a04e11cc --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v11835.data @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x817F7F81, 0x817F817F, 0x7F818181, 0x7F818181, 0x7F817F81, 0x7F7F8181, 0x817F7F7F, 0x81817F81, +0x7F7F6B7F, 0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x81817F7F, 0x7F818192, 0x7F81817F, 0x817F7F7F, +0x8181 + +output0 = +0x44FB08C0, 0x661CCC + +basegraph= +2 + +z_c= +10 + +n_cb= +500 + +q_m= +6 + +n_filler= +44 + +e= +66 + +rv_index= +0 + +code_block_mode= +1 + +iter_max= +20 + +expected_iter_count= +4 + +op_flags= +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE + +expected_status= +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v2342_drop.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v2342_drop.data new file mode 100644 index 0000000000..f30726e46a --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v2342_drop.data @@ -0,0 +1,745 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x7F817F81, 0x817F7F81, 0x8181817F, 0x7F817F81, 0x7F818181, 0x7F81817F, 0x7F817F81, 0x817F8181, +0x817F8181, 0x817F8181, 0x7F818181, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x7F7F8181, +0x7F7F7F81, 0x7F7F817F, 0x7F81817F, 0x7F81817F, 0x7F818181, 0x8181817F, 0x8181817F, 0x7F7F817F, +0x7F7F8181, 0x8181817F, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x7F7F817F, 0x7F818181, 0x81817F7F, +0x7F7F7F7F, 0x7F7F817F, 0x7F7F8181, 0x81817F7F, 0x817F8181, 0x7F817F81, 0x7F7F817F, 0x7F7F7F81, +0x7F7F7F81, 0x817F8181, 0x817F7F7F, 0x817F7F81, 0x7F817F7F, 0x7F7F8181, 0x817F7F7F, 0x7F818181, +0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F81, 0x81818181, 0x7F818181, +0x817F8181, 0x7F818181, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F818181, 0x7F7F8181, +0x81817F81, 0x8181817F, 0x7F7F817F, 0x7F817F81, 0x81817F7F, 0x817F7F7F, 0x81817F81, 0x81818181, +0x7F7F8181, 0x81817F81, 0x81817F7F, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x7F81817F, 0x81817F7F, +0x7F817F7F, 0x81817F7F, 0x7F7F817F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, +0x7F817F7F, 0x81817F81, 0x81817F81, 0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x817F817F, 0x7F7F7F81, +0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x8181817F, 0x81817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F7F, +0x81817F7F, 0x7F7F7F81, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F81, 0x81817F81, +0x7F817F7F, 0x7F81817F, 0x81817F81, 0x817F817F, 0x7F7F7F81, 0x817F8181, 0x81818181, 0x81817F81, +0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x7F817F7F, 0x81818181, 0x81818181, 0x817F7F7F, 0x81817F81, +0x817F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F817F, 0x7F817F7F, 0x7F81817F, 0x7F7F817F, 0x7F817F7F, +0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x817F817F, 0x7F817F81, 0x817F7F81, 0x81818181, 0x8181817F, +0x81817F81, 0x7F817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F7F817F, 0x7F81817F, 0x817F8181, +0x817F7F81, 0x817F817F, 0x817F817F, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x81817F7F, 0x7F7F7F81, +0x8181817F, 0x817F7F81, 0x7F817F81, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, 0x817F7F81, 0x7F7F817F, +0x7F81817F, 0x7F81817F, 0x817F8181, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x7F817F7F, 0x7F7F817F, +0x81817F81, 0x81817F7F, 0x817F817F, 0x817F817F, 0x8181817F, 0x7F817F7F, 0x81817F7F, 0x7F818181, +0x817F8181, 0x81817F81, 0x8181817F, 0x7F7F7F81, 0x81817F81, 0x81817F7F, 0x8181817F, 0x817F8181, +0x8181817F, 0x8181817F, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F818181, 0x7F817F81, 0x81817F7F, +0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F7F, 0x817F7F7F, 0x81817F7F, 0x7F818181, 0x7F7F7F7F, +0x7F817F81, 0x7F7F8181, 0x817F817F, 0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x7F7F817F, 0x7F817F7F, +0x817F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F8181, 0x7F818181, 0x81817F81, +0x7F7F817F, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x817F817F, 0x7F7F8181, 0x7F817F81, +0x7F818181, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x81817F7F, 0x817F8181, 0x7F817F7F, 0x7F817F7F, +0x7F7F8181, 0x81818181, 0x817F8181, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, +0x8181817F, 0x8181817F, 0x8181817F, 0x817F817F, 0x7F817F7F, 0x7F818181, 0x7F817F81, 0x7F817F81, +0x7F7F8181, 0x817F817F, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x7F7F7F7F, +0x817F817F, 0x8181817F, 0x7F7F7F81, 0x817F817F, 0x81817F7F, 0x7F7F8181, 0x817F817F, 0x7F818181, +0x7F7F7F81, 0x81818181, 0x7F818181, 0x7F7F8181, 0x817F8181, 0x817F8181, 0x7F81817F, 0x81817F7F, +0x81818181, 0x7F7F7F81, 0x817F817F, 0x7F81817F, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, 0x817F7F81, +0x817F817F, 0x7F81817F, 0x81818181, 0x817F8181, 0x7F817F81, 0x81817F81, 0x7F7F817F, 0x817F7F7F, +0x817F8181, 0x8181817F, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x7F81817F, 0x7F818181, 0x81817F81, +0x8181817F, 0x7F7F8181, 0x817F7F81, 0x7F7F8181, 0x7F7F817F, 0x7F818181, 0x7F7F817F, 0x81818181, +0x81817F7F, 0x817F7F81, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F7F, 0x817F817F, +0x7F817F81, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, 0x7F7F7F7F, 0x81818181, 0x817F817F, 0x81817F7F, +0x81817F7F, 0x7F817F7F, 0x7F7F7F7F, 0x7F818181, 0x817F8181, 0x7F817F7F, 0x81818181, 0x81818181, +0x7F81817F, 0x81817F7F, 0x8181817F, 0x817F7F81, 0x817F817F, 0x81818181, 0x81817F7F, 0x817F7F81, +0x81818181, 0x8181817F, 0x81817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F8181, +0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x817F7F81, 0x81817F81, 0x7F7F8181, 0x817F8181, 0x81817F7F, +0x7F7F7F7F, 0x81818181, 0x817F8181, 0x817F7F81, 0x7F81817F, 0x7F818181, 0x7F7F817F, 0x817F8181, +0x817F817F, 0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F7F8181, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, +0x817F7F7F, 0x81817F7F, 0x7F7F817F, 0x7F817F81, 0x817F7F81, 0x817F8181, 0x817F7F81, 0x81817F81, +0x7F81817F, 0x7F818181, 0x81818181, 0x81817F7F, 0x8181817F, 0x81817F81, 0x7F7F817F, 0x817F7F7F, +0x817F8181, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x81817F81, 0x817F817F, 0x817F7F7F, 0x81817F81, +0x7F817F7F, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x8181817F, 0x817F7F81, 0x8181817F, 0x7F817F7F, +0x7F817F81, 0x817F817F, 0x8181817F, 0x81818181, 0x7F817F7F, 0x817F7F81, 0x7F817F7F, 0x81818181, +0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x7F817F81, 0x7F817F7F, 0x7F7F7F7F, +0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, +0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F7F7F81, 0x8181817F, +0x817F7F81, 0x817F8181, 0x7F7F817F, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x81817F7F, 0x81817F7F, +0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x817F817F, 0x817F7F7F, 0x7F818181, 0x7F81817F, +0x7F81817F, 0x7F818181, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F817F81, 0x817F817F, 0x7F81817F, +0x7F81817F, 0x7F7F817F, 0x7F7F7F7F, 0x81817F81, 0x81817F7F, 0x817F8181, 0x7F818181, 0x7F7F8181, +0x7F817F81, 0x7F818181, 0x817F817F, 0x7F817F81, 0x817F817F, 0x817F7F7F, 0x7F7F8181, 0x81817F81, +0x7F7F8181, 0x817F8181, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x81817F81, 0x7F818181, 0x7F7F817F, +0x817F8181, 0x817F7F7F, 0x81817F81, 0x7F7F7F7F, 0x7F818181, 0x7F817F7F, 0x7F817F7F, 0x7F817F81, +0x7F817F7F, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x7F7F8181, 0x817F8181, +0x817F8181, 0x7F7F7F81, 0x7F818181, 0x7F7F817F, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x81817F81, +0x817F8181, 0x7F81817F, 0x7F7F7F81, 0x817F8181, 0x7F81817F, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, +0x81817F81, 0x817F7F7F, 0x7F7F7F81, 0x817F8181, 0x7F7F8181, 0x81818181, 0x817F7F7F, 0x7F7F817F, +0x81817F81, 0x7F81817F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x817F7F81, +0x7F817F81, 0x7F7F817F, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x817F817F, 0x817F817F, +0x7F7F7F81, 0x7F7F8181, 0x817F7F81, 0x81818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, +0x7F817F7F, 0x81817F7F, 0x7F81817F, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, 0x817F817F, +0x7F817F7F, 0x8181817F, 0x817F8181, 0x81817F81, 0x81817F7F, 0x8181817F, 0x7F81817F, 0x7F7F7F7F, +0x7F817F81, 0x7F817F81, 0x7F817F81, 0x81817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F817F7F, 0x7F81817F, +0x7F7F8181, 0x7F81817F, 0x7F7F817F, 0x7F817F81, 0x817F8181, 0x7F7F8181, 0x81818181, 0x7F7F7F81, +0x7F7F8181, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x81817F7F, 0x7F7F817F, 0x817F817F, 0x81817F7F, +0x817F817F, 0x817F817F, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x7F81817F, 0x8181817F, 0x81817F81, +0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x81817F81, +0x81817F81, 0x7F817F81, 0x7F817F81, 0x817F7F7F, 0x81818181, 0x8181817F, 0x7F7F7F81, 0x817F7F81, +0x7F7F7F7F, 0x7F81817F, 0x817F7F81, 0x7F81817F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F8181, 0x81817F81, +0x817F7F7F, 0x7F817F81, 0x817F8181, 0x8181817F, 0x8181817F, 0x7F817F7F, 0x7F81817F, 0x817F817F, +0x7F818181, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F7F7F, +0x81817F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x817F817F, 0x81817F7F, 0x817F8181, 0x81817F7F, +0x81817F81, 0x817F8181, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x81818181, 0x817F7F7F, 0x7F817F7F, +0x7F817F81, 0x81817F7F, 0x7F818181, 0x7F817F7F, 0x81817F81, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, +0x7F81817F, 0x7F81817F, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F818181, 0x7F7F7F7F, +0x7F7F7F81, 0x81818181, 0x7F81817F, 0x7F7F7F7F, 0x8181817F, 0x7F818181, 0x817F7F81, 0x7F818181, +0x8181817F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x817F817F, +0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x817F8181, 0x7F7F817F, 0x7F817F81, 0x817F7F7F, 0x7F7F7F81, +0x817F7F81, 0x81817F81, 0x7F7F817F, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x817F8181, 0x7F7F817F, +0x817F7F7F, 0x81818181, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F81, 0x817F8181, 0x8181817F, 0x7F817F81, +0x81817F81, 0x7F7F7F81, 0x8181817F, 0x7F817F81, 0x7F7F8181, 0x817F7F81, 0x817F817F, 0x7F7F817F, +0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, +0x81817F7F, 0x7F817F81, 0x7F818181, 0x7F7F7F7F, 0x81817F7F, 0x817F8181, 0x817F8181, 0x81818181, +0x817F7F7F, 0x7F818181, 0x81817F7F, 0x817F7F7F, 0x8181817F, 0x7F818181, 0x81817F81, 0x817F7F81, +0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x81818181, 0x7F817F7F, 0x7F817F81, 0x81817F81, 0x81817F81, +0x817F817F, 0x81817F81, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x817F817F, 0x81817F7F, +0x817F8181, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x7F7F7F81, +0x817F7F81, 0x817F817F, 0x817F8181, 0x817F8181, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, +0x7F817F81, 0x7F81817F, 0x7F818181, 0x7F817F81, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F7F, +0x7F7F7F7F, 0x7F7F817F, 0x81818181, 0x817F817F, 0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x81817F81, +0x7F81817F, 0x81818181, 0x81817F7F, 0x817F7F7F, 0x81817F81, 0x7F818181, 0x817F8181, 0x81817F7F, +0x7F81817F, 0x7F7F817F, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, 0x817F8181, 0x817F7F81, 0x81817F81, +0x7F81817F, 0x7F7F7F81, 0x7F817F81, 0x7F817F7F, 0x81818181, 0x7F7F817F, 0x7F7F7F81, 0x7F818181, +0x7F817F81, 0x817F8181, 0x7F7F8181, 0x817F7F81, 0x7F7F8181, 0x81817F81, 0x81818181, 0x7F817F81, +0x81817F7F, 0x81818181, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F81817F, 0x817F8181, 0x7F7F8181, +0x817F8181, 0x817F7F7F, 0x7F818181, 0x81817F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x7F7F7F81, +0x7F817F81, 0x817F7F7F, 0x7F818181, 0x81817F7F, 0x81818181, 0x81817F7F, 0x817F7F81, 0x7F817F7F, +0x7F817F81, 0x7F7F8181, 0x7F817F7F, 0x817F7F7F, 0x7F7F8181, 0x817F7F7F, 0x817F7F7F, 0x7F818181, +0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x81818181, 0x8181817F, 0x7F7F817F, 0x7F817F81, 0x7F81817F, +0x7F818181, 0x81818181, 0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F8181, 0x7F81817F, 0x7F817F81, +0x7F7F8181, 0x7F7F7F7F, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x7F7F7F7F, 0x81818181, +0x7F7F8181, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x7F7F8181, 0x7F817F81, 0x7F7F817F, 0x7F817F7F, +0x817F8181, 0x817F8181, 0x81817F7F, 0x7F81817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F818181, 0x7F7F7F7F, +0x7F7F7F81, 0x817F7F7F, 0x817F7F81, 0x81817F7F, 0x8181817F, 0x81817F7F, 0x817F7F81, 0x8181817F, +0x7F7F7F7F, 0x7F7F817F, 0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, +0x81817F81, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x817F7F81, 0x7F818181, 0x817F7F81, 0x7F817F7F, +0x8181817F, 0x81818181, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, +0x817F7F7F, 0x81818181, 0x817F817F, 0x81818181, 0x7F817F7F, 0x817F8181, 0x7F7F7F81, 0x817F7F81, +0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, 0x8181817F, 0x817F7F7F, 0x7F7F7F7F, 0x81818181, +0x817F817F, 0x7F7F7F81, 0x7F817F81, 0x7F817F81, 0x7F7F817F, 0x817F817F, 0x817F8181, 0x81817F7F, +0x7F7F8181, 0x7F7F817F, 0x817F7F7F, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x81818181, 0x81817F7F, +0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F817F81, 0x81817F81, 0x81817F81, 0x7F7F8181, +0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x7F818181, 0x817F7F7F, 0x7F818181, +0x8181817F, 0x817F7F7F, 0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F81, +0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x81817F81, 0x81817F7F, +0x8181817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x81818181, 0x8181817F, 0x7F817F7F, 0x81818181, +0x7F818181, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F7F7F, +0x7F7F8181, 0x7F7F7F7F, 0x817F7F81, 0x817F817F, 0x817F7F7F, 0x7F817F81, 0x81817F81, 0x7F7F817F, +0x8181817F, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x7F7F7F7F, 0x817F7F7F, +0x7F81817F, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, 0x7F7F817F, +0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, +0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x81818181, 0x7F818181, 0x7F817F7F, 0x7F818181, 0x81817F81, +0x81818181, 0x7F7F7F7F, 0x81818181, 0x81818181, 0x7F81817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F7F81, +0x7F7F817F, 0x7F7F7F7F, 0x817F8181, 0x7F818181, 0x7F81817F, 0x7F81817F, 0x8181817F, 0x81817F81, +0x817F8181, 0x7F81817F, 0x7F81817F, 0x817F817F, 0x81818181, 0x7F81817F, 0x81818181, 0x81818181, +0x817F7F81, 0x7F817F7F, 0x7F7F817F, 0x8181817F, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F81, +0x7F7F7F7F, 0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x817F8181, +0x81818181, 0x7F7F7F7F, 0x817F7F81, 0x81817F81, 0x817F7F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, +0x81817F81, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x817F7F81, 0x81817F7F, 0x7F7F8181, 0x8181817F, +0x817F7F81, 0x7F81817F, 0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x817F7F81, 0x7F81817F, 0x817F7F81, +0x7F7F817F, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x8181817F, +0x81817F7F, 0x81817F7F, 0x81817F81, 0x817F817F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, +0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x7F817F7F, 0x81817F81, 0x81817F7F, 0x7F818181, 0x7F7F7F81, +0x7F817F7F, 0x7F7F817F, 0x81817F7F, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, +0x8181817F, 0x7F7F817F, 0x817F817F, 0x7F7F8181, 0x817F7F81, 0x7F7F817F, 0x81817F7F, 0x817F8181, +0x817F8181, 0x7F7F7F81, 0x8181817F, 0x817F817F, 0x81817F81, 0x817F8181, 0x7F7F817F, 0x817F7F81, +0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x817F8181, 0x8181817F, 0x81817F81, 0x7F817F81, +0x7F817F81, 0x81817F81, 0x7F817F81, 0x81818181, 0x81817F81, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F81, +0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x7F7F7F81, 0x81817F7F, 0x7F7F817F, 0x81817F7F, +0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x7F7F7F81, 0x7F817F81, +0x817F817F, 0x7F7F7F81, 0x817F7F81, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F7F, 0x8181817F, +0x81817F81, 0x7F81817F, 0x8181817F, 0x7F817F81, 0x81817F7F, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, +0x7F81817F, 0x81817F7F, 0x8181817F, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, 0x81817F7F, 0x81817F81, +0x7F818181, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, +0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x817F8181, 0x7F7F7F81, +0x7F818181, 0x8181817F, 0x817F7F7F, 0x817F7F81, 0x81817F7F, 0x7F817F7F, 0x8181817F, 0x7F817F7F, +0x8181817F, 0x7F7F7F7F, 0x817F817F, 0x7F7F817F, 0x7F81817F, 0x7F818181, 0x7F7F817F, 0x81818181, +0x817F7F81, 0x7F817F7F, 0x7F7F8181, 0x81818181, 0x81818181, 0x81817F7F, 0x7F818181, 0x7F7F817F, +0x7F7F7F81, 0x7F817F81, 0x7F7F8181, 0x7F7F8181, 0x7F817F81, 0x7F817F81, 0x81817F7F, 0x8181817F, +0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F7F817F, 0x7F817F81, 0x7F7F817F, +0x81817F7F, 0x817F7F81, 0x817F8181, 0x7F817F81, 0x7F7F817F, 0x817F8181, 0x7F818181, 0x7F7F817F, +0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x7F81817F, 0x7F7F7F81, +0x7F7F817F, 0x8181817F, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, 0x7F7F817F, 0x81817F7F, 0x81817F7F, +0x81817F7F, 0x7F7F7F81, 0x7F818181, 0x7F7F817F, 0x7F81817F, 0x7F818181, 0x817F7F81, 0x7F817F81, +0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x81818181, 0x7F817F81, 0x7F7F7F7F, 0x817F817F, 0x81818181, +0x7F7F817F, 0x7F7F7F81, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F818181, 0x817F8181, 0x7F817F7F, +0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, 0x7F7F817F, 0x7F81817F, +0x7F817F81, 0x7F818181, 0x817F7F81, 0x817F7F7F, 0x817F817F, 0x7F7F817F, 0x817F8181, 0x7F818181, +0x81817F7F, 0x7F818181, 0x7F7F7F81, 0x817F817F, 0x8181817F, 0x817F8181, 0x7F7F817F, 0x817F7F7F, +0x81817F7F, 0x817F7F7F, 0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x8181817F, 0x7F7F8181, 0x7F81817F, +0x7F7F8181, 0x81818181, 0x817F8181, 0x7F7F8181, 0x817F8181, 0x8181817F, 0x8181817F, 0x817F7F81, +0x7F7F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F7F, +0x7F818181, 0x817F7F81, 0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, +0x7F818181, 0x7F817F81, 0x7F817F7F, 0x817F817F, 0x817F7F81, 0x817F817F, 0x81817F81, 0x817F817F, +0x7F817F81, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x8181817F, 0x81817F81, 0x7F818181, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F81, 0x7F817F81, 0x7F817F7F, 0x817F817F, 0x81817F81, 0x817F7F7F, +0x7F7F7F7F, 0x8181817F, 0x81818181, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x7F817F7F, 0x7F7F7F7F, +0x7F818181, 0x7F7F7F81, 0x81818181, 0x7F7F817F, 0x81818181, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, +0x7F817F7F, 0x81817F81, 0x81817F81, 0x817F8181, 0x7F7F817F, 0x7F7F817F, 0x7F7F8181, 0x81818181, +0x7F7F7F81, 0x817F8181, 0x817F8181, 0x817F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, +0x81817F7F, 0x81817F81, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F7F7F7F, +0x817F7F7F, 0x7F817F7F, 0x7F817F81, 0x8181817F, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F7F7F, 0x817F8181, +0x7F817F7F, 0x7F817F7F, 0x7F817F7F, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x81818181, 0x7F818181, +0x817F7F7F, 0x8181817F, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F817F7F, 0x817F7F7F, 0x817F817F, +0x817F7F81, 0x817F8181, 0x7F818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F7F, 0x8181817F, 0x7F817F81, +0x817F817F, 0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x81817F81, 0x7F7F817F, 0x7F7F817F, 0x817F7F81, +0x817F817F, 0x7F7F817F, 0x7F817F81, 0x7F818181, 0x81818181, 0x81817F7F, 0x81817F81, 0x817F7F81, +0x81817F81, 0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, 0x7F817F81, 0x81818181, +0x7F81817F, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x7F817F81, 0x81818181, 0x8181817F, 0x817F7F81, +0x817F817F, 0x817F7F81, 0x81817F81, 0x7F817F81, 0x81817F7F, 0x7F7F7F7F, 0x8181817F, 0x7F7F817F, +0x817F7F7F, 0x7F7F8181, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x7F818181, 0x7F817F81, +0x8181817F, 0x817F8181, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x81817F7F, +0x817F8181, 0x7F7F8181, 0x7F818181, 0x817F7F7F, 0x81818181, 0x817F7F7F, 0x817F7F7F, 0x7F818181, +0x7F7F8181, 0x7F7F7F81, 0x81818181, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x81818181, 0x817F817F, +0x8181817F, 0x7F818181, 0x81817F81, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x7F7F7F81, 0x7F7F7F7F, +0x81817F81, 0x81817F81, 0x7F81817F, 0x7F818181, 0x817F817F, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, +0x817F7F7F, 0x817F8181, 0x81817F81, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x817F817F, 0x7F7F7F81, +0x81817F7F, 0x7F7F8181, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, 0x81818181, 0x817F7F7F, 0x7F7F7F7F, +0x8181817F, 0x817F7F7F, 0x7F817F81, 0x817F817F, 0x7F7F7F7F, 0x7F818181, 0x81817F7F, 0x817F7F81, +0x7F7F7F7F, 0x7F817F7F, 0x7F7F8181, 0x81817F7F, 0x817F817F, 0x7F7F817F, 0x8181817F, 0x817F8181, +0x81817F81, 0x7F818181, 0x7F818181, 0x7F7F8181, 0x7F7F817F, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, +0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F7F8181, 0x81817F7F, 0x7F81817F, +0x7F818181, 0x7F818181, 0x7F817F7F, 0x81817F81, 0x81817F81, 0x8181817F, 0x81817F7F, 0x7F7F7F81, +0x817F7F81, 0x7F7F7F81, 0x817F817F, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, +0x7F81817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, +0x817F8181, 0x7F817F7F, 0x81817F81, 0x7F7F7F7F, 0x7F7F817F, 0x7F817F7F, 0x817F817F, 0x8181817F, +0x81817F81, 0x7F7F7F81, 0x81818181, 0x7F7F7F7F, 0x81818181, 0x817F817F, 0x7F817F81, 0x7F7F7F81, +0x817F817F, 0x817F8181, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x7F7F817F, 0x817F7F81, 0x817F7F7F, +0x7F7F7F7F, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x81817F7F, +0x7F7F8181, 0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x8181817F, 0x817F817F, 0x81817F7F, 0x817F7F7F, +0x8181817F, 0x7F7F8181, 0x7F817F7F, 0x81818181, 0x7F817F81, 0x7F817F81, 0x7F817F7F, 0x817F7F81, +0x8181817F, 0x81817F7F, 0x7F818181, 0x817F8181, 0x81817F7F, 0x81818181, 0x81818181, 0x817F817F, +0x7F81817F, 0x81817F81, 0x7F817F7F, 0x81817F7F, 0x7F7F817F, 0x817F7F7F, 0x81818181, 0x7F818181, +0x7F818181, 0x7F7F8181, 0x7F7F817F, 0x8181817F, 0x817F7F7F, 0x7F818181, 0x7F7F7F7F, 0x817F7F81, +0x7F7F817F, 0x8181817F, 0x817F817F, 0x7F81817F, 0x817F7F7F, 0x817F7F81, 0x817F8181, 0x7F817F7F, +0x81817F81, 0x817F817F, 0x7F817F81, 0x7F7F7F81, 0x7F817F81, 0x7F818181, 0x7F7F8181, 0x7F817F81, +0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x817F817F, 0x817F8181, 0x817F7F81, 0x7F7F7F7F, 0x7F818181, +0x817F817F, 0x7F81817F, 0x8181817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, 0x817F817F, +0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F81, 0x8181817F, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x817F7F7F, +0x7F818181, 0x7F818181, 0x7F818181, 0x7F7F7F81, 0x81818181, 0x81818181, 0x817F7F7F, 0x7F81817F, +0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x7F817F7F, +0x7F817F81, 0x81818181, 0x81818181, 0x7F7F8181, 0x7F818181, 0x7F7F817F, 0x7F7F8181, 0x817F817F, +0x7F7F817F, 0x81817F81, 0x7F7F817F, 0x7F7F8181, 0x7F7F8181, 0x7F817F7F, 0x7F817F7F, 0x8181817F, +0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x7F818181, 0x7F818181, 0x7F7F7F81, 0x81817F7F, 0x817F8181, +0x7F7F8181, 0x7F81817F, 0x7F817F81, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x817F817F, 0x7F7F817F, +0x817F7F81, 0x81817F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F81817F, +0x817F7F81, 0x8181817F, 0x7F817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, 0x817F7F7F, +0x8181817F, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x817F8181, 0x817F817F, +0x81818181, 0x8181817F, 0x8181817F, 0x7F817F81, 0x817F7F7F, 0x7F81817F, 0x7F7F817F, 0x817F7F81, +0x817F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x7F818181, 0x817F8181, +0x817F7F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F817F7F, 0x7F817F81, 0x7F81817F, +0x7F817F81, 0x817F7F81, 0x7F81817F, 0x81817F81, 0x8181817F, 0x8181817F, 0x81817F81, 0x817F7F7F, +0x81817F81, 0x7F81817F, 0x7F817F7F, 0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x817F7F81, 0x81818181, +0x8181817F, 0x817F8181, 0x7F7F817F, 0x817F7F7F, 0x817F7F7F, 0x7F7F8181, 0x7F81817F, 0x817F7F7F, +0x81817F81, 0x7F81817F, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F817F7F, 0x81817F7F, 0x81817F81, +0x7F817F7F, 0x7F817F7F, 0x817F8181, 0x81817F81, 0x7F817F81, 0x8181817F, 0x817F7F7F, 0x7F817F81, +0x7F7F7F7F, 0x7F818181, 0x81818181, 0x7F7F817F, 0x7F817F81, 0x817F8181, 0x81818181, 0x7F7F817F, +0x81818181, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x7F7F817F, 0x81817F81, 0x7F817F81, 0x7F817F7F, +0x817F7F81, 0x817F8181, 0x817F817F, 0x81818181, 0x817F817F, 0x7F7F8181, 0x81818181, 0x7F817F7F, +0x8181817F, 0x7F818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F817F7F, 0x7F7F8181, 0x7F818181, 0x817F817F, +0x7F817F7F, 0x7F81817F, 0x817F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F8181, 0x81817F7F, 0x81817F81, +0x7F818181, 0x7F7F817F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x8181817F, 0x7F7F817F, 0x7F7F8181, +0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x7F7F8181, 0x7F7F7F7F, 0x7F817F7F, 0x8181817F, 0x81817F7F, +0x817F8181, 0x7F7F7F81, 0x8181817F, 0x8181817F, 0x817F817F, 0x817F7F81, 0x817F7F7F, 0x81818181, +0x817F7F81, 0x817F8181, 0x817F7F81, 0x8181817F, 0x7F817F81, 0x81818181, 0x7F81817F, 0x7F7F8181, +0x817F7F81, 0x81818181, 0x8181817F, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x7F818181, 0x81818181, +0x7F81817F, 0x7F817F81, 0x817F7F81, 0x81818181, 0x817F7F7F, 0x7F817F7F, 0x8181817F, 0x7F7F7F7F, +0x7F7F8181, 0x817F8181, 0x7F817F7F, 0x817F7F7F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, +0x8181817F, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x817F817F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, +0x7F818181, 0x817F817F, 0x7F817F7F, 0x7F7F817F, 0x7F818181, 0x81817F81, 0x7F7F8181, 0x81817F7F, +0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x7F81817F, 0x7F818181, 0x7F818181, 0x7F818181, 0x7F7F817F, +0x8181817F, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x817F7F81, 0x7F7F7F7F, 0x817F7F81, 0x81818181, +0x817F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F7F, 0x7F81817F, 0x7F7F7F81, 0x81818181, 0x817F8181, +0x817F7F81, 0x7F817F7F, 0x817F8181, 0x81818181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x7F7F8181, +0x7F7F817F, 0x8181817F, 0x7F817F81, 0x817F7F7F, 0x7F817F7F, 0x817F8181, 0x81818181, 0x817F7F81, +0x7F7F8181, 0x81817F7F, 0x7F7F8181, 0x8181817F, 0x81818181, 0x8181817F, 0x81817F81, 0x7F817F7F, +0x81817F81, 0x7F81817F, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x817F817F, 0x817F817F, 0x817F7F81, +0x8181817F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x81818181, 0x7F7F7F81, 0x7F7F817F, 0x817F8181, +0x817F817F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x817F8181, 0x7F817F7F, 0x8181817F, +0x817F7F81, 0x7F81817F, 0x817F8181, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x81817F81, 0x7F818181, +0x8181817F, 0x81818181, 0x7F7F817F, 0x7F7F8181, 0x81817F7F, 0x7F7F8181, 0x8181817F, 0x7F817F81, +0x7F817F7F, 0x81818181, 0x81817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F7F, 0x7F7F8181, 0x817F817F, +0x7F81817F, 0x817F817F, 0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x81817F81, 0x7F81817F, 0x817F817F, +0x817F7F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x817F817F, 0x81817F7F, 0x7F81817F, +0x7F7F7F81, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x81817F81, 0x817F7F7F, 0x817F7F81, 0x7F7F7F81, +0x7F818181, 0x7F7F7F7F, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F817F81, 0x817F7F7F, 0x8181817F, +0x7F7F8181, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x7F817F7F, 0x81817F81, 0x7F818181, +0x7F7F7F81, 0x8181817F, 0x81817F81, 0x7F81817F, 0x81818181, 0x7F81817F, 0x817F8181, 0x817F8181, +0x7F818181, 0x7F81817F, 0x817F8181, 0x81817F81, 0x7F818181, 0x81817F7F, 0x7F7F817F, 0x817F7F81, +0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x8181817F, +0x7F81817F, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x7F81817F, 0x81817F7F, +0x7F818181, 0x7F7F8181, 0x7F817F81, 0x7F817F81, 0x81818181, 0x817F8181, 0x7F7F7F7F, 0x817F817F, +0x7F817F81, 0x7F7F817F, 0x81817F7F, 0x7F7F7F81, 0x8181817F, 0x7F7F8181, 0x81818181, 0x7F817F81, +0x817F7F7F, 0x7F7F7F81, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x817F7F81, 0x817F817F, 0x7F818181, +0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x7F7F8181, 0x81817F81, 0x8181817F, 0x81818181, 0x7F7F7F81, +0x81817F81, 0x8181817F, 0x81817F7F, 0x817F817F, 0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x81817F81, +0x7F7F8181, 0x7F7F7F81, 0x8181817F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x8181817F, 0x7F818181, +0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F7F8181, 0x7F817F7F, 0x7F81817F, 0x7F7F8181, +0x817F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x7F7F817F, 0x81817F7F, 0x7F7F7F7F, +0x817F817F, 0x81817F81, 0x7F7F7F7F, 0x7F81817F, 0x81817F81, 0x817F7F7F, 0x7F818181, 0x7F7F8181, +0x7F81817F, 0x7F818181, 0x81817F81, 0x817F7F81, 0x7F7F7F7F, 0x7F817F81, 0x81817F81, 0x7F7F7F7F, +0x8181817F, 0x7F818181, 0x7F7F8181, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x8181817F, +0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x7F7F817F, 0x7F817F81, 0x7F81817F, 0x7F7F7F7F, 0x7F817F81, +0x7F7F7F81, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x817F7F7F, 0x7F7F817F, 0x81818181, 0x817F817F, +0x7F818181, 0x81817F81, 0x7F7F8181, 0x7F818181, 0x81818181, 0x81817F7F, 0x817F8181, 0x81817F81, +0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F817F7F, +0x817F7F81, 0x817F7F7F, 0x817F7F7F, 0x7F81817F, 0x7F7F7F7F, 0x817F8181, 0x817F7F81, 0x7F817F81, +0x817F817F, 0x7F7F7F7F, 0x817F8181, 0x81818181, 0x7F818181, 0x81817F7F, 0x7F7F7F7F, 0x8181817F, +0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F817F, +0x81818181, 0x8181817F, 0x7F7F817F, 0x817F7F81, 0x81818181, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, +0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x7F7F8181, 0x817F7F7F, +0x7F7F7F7F, 0x817F7F81, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x817F8181, 0x7F81817F, 0x81818181, +0x817F7F7F, 0x817F817F, 0x81817F81, 0x7F817F7F, 0x7F7F8181, 0x8181817F, 0x81818181, 0x7F81817F, +0x7F7F817F, 0x7F818181, 0x7F7F7F81, 0x81817F81, 0x8181817F, 0x7F7F817F, 0x8181817F, 0x81817F7F, +0x81818181, 0x81818181, 0x817F817F, 0x81817F81, 0x817F7F81, 0x81818181, 0x7F817F81, 0x81818181, +0x7F818181, 0x7F81817F, 0x7F7F7F81, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x817F8181, 0x817F8181, +0x7F817F81, 0x7F817F81, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, 0x7F817F81, 0x817F7F81, +0x817F8181, 0x7F817F81, 0x7F817F81, 0x7F7F817F, 0x7F81817F, 0x817F817F, 0x817F817F, 0x817F7F81, +0x81817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81818181, 0x7F817F7F, 0x7F817F81, 0x8181817F, 0x7F81817F, +0x8181817F, 0x7F7F7F81, 0x8181817F, 0x817F817F, 0x7F817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F817F, +0x7F81817F, 0x817F8181, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x81817F81, 0x7F817F81, +0x81817F81, 0x8181817F, 0x81817F81, 0x7F7F8181, 0x7F7F8181, 0x7F817F81, 0x7F817F7F, 0x7F7F8181, +0x7F81817F, 0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x7F817F7F, 0x7F818181, 0x817F7F81, 0x81817F7F, +0x8181817F, 0x7F818181, 0x81818181, 0x81817F7F, 0x81818181, 0x81817F7F, 0x817F8181, 0x7F81817F, +0x817F7F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F817F, 0x817F7F81, 0x81818181, 0x8181817F, 0x7F817F7F, +0x7F7F7F7F, 0x8181817F, 0x7F818181, 0x81817F81, 0x7F818181, 0x7F817F81, 0x7F818181, 0x817F817F, +0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x817F8181, 0x817F7F7F, 0x7F7F8181, +0x7F7F8181, 0x817F7F81, 0x7F818181, 0x7F81817F, 0x7F818181, 0x817F817F, 0x7F7F7F7F, 0x8181817F, +0x817F8181, 0x817F817F, 0x7F818181, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, +0x7F7F7F81, 0x817F8181, 0x817F817F, 0x817F817F, 0x7F7F7F81, 0x7F7F7F81, 0x817F8181, 0x7F7F817F, +0x7F818181, 0x81817F81, 0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x7F7F8181, 0x7F817F7F, 0x81817F7F, +0x7F7F8181, 0x7F817F81, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x81817F81, 0x817F817F, 0x8181817F, +0x817F817F, 0x7F7F7F7F, 0x7F817F7F, 0x7F817F7F, 0x81817F7F, 0x817F817F, 0x7F817F81, 0x7F7F8181, +0x817F817F, 0x81817F7F, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x81817F81, 0x7F7F7F81, 0x817F817F, +0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F818181, 0x7F7F8181, +0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x81817F7F, 0x8181817F, +0x7F817F7F, 0x81817F7F, 0x817F8181, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x7F81817F, +0x7F7F7F81, 0x7F7F817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x7F7F817F, 0x817F7F7F, 0x7F7F817F, +0x7F81817F, 0x817F817F, 0x81817F81, 0x7F818181, 0x7F81817F, 0x81818181, 0x7F817F7F, 0x7F7F7F81, +0x7F818181, 0x817F7F81, 0x7F817F81, 0x817F7F7F, 0x81818181, 0x817F817F, 0x817F8181, 0x81818181, +0x817F7F7F, 0x817F817F, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x81817F81, 0x8181817F, 0x817F7F7F, +0x817F7F7F, 0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x7F817F81, 0x7F818181, +0x7F817F81, 0x817F817F, 0x81817F7F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x7F818181, 0x7F7F7F81, +0x8181817F, 0x817F8181, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F817F, 0x817F7F81, 0x817F7F81, +0x81817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x7F81817F, 0x7F817F7F, 0x7F81817F, +0x7F817F81, 0x817F7F7F, 0x81818181, 0x7F818181, 0x7F817F81, 0x8181817F, 0x81817F7F, 0x817F817F, +0x8181817F, 0x817F7F81, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x81817F7F, 0x81817F7F, 0x7F818181, +0x7F817F81, 0x81817F7F, 0x817F8181, 0x7F7F7F81, 0x817F817F, 0x817F7F7F, 0x7F7F817F, 0x817F7F7F, +0x817F8181, 0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, 0x7F81817F, 0x8181817F, +0x817F7F81, 0x817F7F81, 0x7F7F8181, 0x817F7F81, 0x7F7F7F81, 0x7F81817F, 0x7F7F8181, 0x817F817F, +0x7F81817F, 0x81818181, 0x81818181, 0x81818181, 0x81818181, 0x7F818181, 0x7F818181, 0x81818181, +0x7F817F7F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F7F8181, 0x817F8181, 0x817F7F7F, +0x817F7F81, 0x8181817F, 0x7F7F7F81, 0x8181817F, 0x81817F81, 0x81817F7F, 0x7F7F7F7F, 0x7F818181, +0x817F7F7F, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x81818181, 0x8181817F, 0x7F7F7F81, 0x817F817F, +0x8181817F, 0x7F81817F, 0x7F818181, 0x7F7F7F81, 0x7F818181, 0x7F817F81, 0x817F817F, 0x81818181, +0x7F818181, 0x7F817F7F, 0x7F818181, 0x7F7F817F, 0x81818181, 0x81817F81, 0x8181817F, 0x7F7F7F81, +0x81817F7F, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, +0x7F817F81, 0x81818181, 0x81817F81, 0x7F7F7F7F, 0x817F817F, 0x7F7F817F, 0x7F81817F, 0x7F818181, +0x81818181, 0x8181817F, 0x8181817F, 0x7F817F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F817F, 0x7F7F8181, +0x81818181, 0x8181817F, 0x817F817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F817F, +0x7F818181, 0x7F7F8181, 0x7F818181, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F817F81, 0x817F7F81, +0x81818181, 0x81818181, 0x81817F81, 0x7F81817F, 0x817F8181, 0x817F8181, 0x7F817F81, 0x81818181, +0x817F817F, 0x81817F7F, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x817F7F7F, 0x8181817F, 0x817F7F81, +0x7F817F7F, 0x81817F7F, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x817F7F7F, +0x817F7F81, 0x817F817F, 0x8181817F, 0x81817F81, 0x8181817F, 0x81817F81, 0x817F7F81, 0x817F7F81, +0x7F818181, 0x81817F7F, 0x7F81817F, 0x81817F7F, 0x81818181, 0x7F7F8181, 0x817F7F81, 0x81817F81, +0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x7F7F817F, 0x7F818181, 0x7F818181, 0x7F818181, 0x7F817F81, +0x7F818181, 0x7F81817F, 0x7F7F8181, 0x81818181, 0x7F817F81, 0x7F818181, 0x817F7F7F, 0x7F7F817F, +0x81817F7F, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x817F7F81, 0x7F817F81, 0x7F7F8181, 0x7F817F7F, +0x817F817F, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, +0x7F817F81, 0x7F7F8181, 0x817F8181, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x7F81817F, 0x81817F81, +0x81817F7F, 0x81818181, 0x817F8181, 0x7F817F81, 0x7F818181, 0x7F817F81, 0x817F7F81, 0x7F817F81, +0x7F7F7F81, 0x7F817F7F, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, +0x7F818181, 0x7F7F8181, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x8181817F, 0x817F8181, 0x7F81817F, +0x7F81817F, 0x817F817F, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F818181, 0x7F818181, +0x817F817F, 0x7F7F7F7F, 0x81818181, 0x817F8181, 0x81817F7F, 0x81817F7F, 0x81817F7F, 0x81818181, +0x817F8181, 0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x817F8181, 0x7F81817F, 0x7F817F81, 0x81817F81, +0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, +0x81818181, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x7F818181, 0x7F7F7F7F, 0x7F81817F, 0x817F7F81, +0x7F7F7F81, 0x7F818181, 0x81817F81, 0x817F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F817F, 0x7F7F7F81, +0x817F7F81, 0x7F7F7F81, 0x7F7F8181, 0x7F817F81, 0x817F8181, 0x81818181, 0x7F818181, 0x817F7F7F, +0x8181817F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x81818181, +0x7F7F817F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, +0x817F7F81, 0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F7F, 0x817F817F, +0x7F7F8181, 0x7F7F8181, 0x81818181, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x7F7F7F81, +0x817F8181, 0x7F81817F, 0x817F8181, 0x7F7F817F, 0x81818181, 0x81818181, 0x7F7F7F81, 0x8181817F, +0x8181817F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F7F, 0x817F817F, 0x817F8181, 0x817F7F81, 0x81818181, +0x7F817F7F, 0x7F7F7F7F, 0x817F7F81, 0x817F817F, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x81817F81, +0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x817F817F, 0x7F7F8181, +0x7F7F8181, 0x817F7F81, 0x81817F7F, 0x817F8181, 0x817F817F, 0x7F817F7F, 0x7F81817F, 0x7F81817F, +0x7F817F81, 0x81817F7F, 0x7F818181, 0x7F818181, 0x817F8181, 0x7F7F7F7F, 0x817F817F, 0x7F7F817F, +0x7F7F8181, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, 0x817F8181, +0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F817F81, 0x81817F7F, 0x81817F81, 0x7F81817F, 0x7F81817F, +0x817F817F, 0x7F817F7F, 0x7F818181, 0x817F7F81, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, +0x81817F81, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x7F817F7F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, +0x7F817F7F, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, 0x81817F7F, 0x81818181, +0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F81, 0x817F817F, +0x7F818181, 0x81818181, 0x7F81817F, 0x8181817F, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F818181, +0x817F7F81, 0x7F7F8181, 0x7F7F817F, 0x817F8181, 0x81817F7F, 0x81817F7F, 0x7F7F817F, 0x7F817F81, +0x7F81817F, 0x81818181, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x81817F81, 0x7F7F7F81, 0x7F81817F, +0x81817F7F, 0x81818181, 0x8181817F, 0x817F7F7F, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x7F81817F, +0x81818181, 0x7F818181, 0x8181817F, 0x7F818181, 0x7F7F7F81, 0x817F8181, 0x7F818181, 0x817F8181, +0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x817F7F81, 0x7F817F7F, 0x81818181, 0x7F817F7F, +0x817F7F7F, 0x7F817F7F, 0x8181817F, 0x817F817F, 0x7F818181, 0x817F7F81, 0x817F8181, 0x7F817F7F, +0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x817F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F818181, 0x7F7F7F81, +0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, 0x81817F7F, 0x81817F7F, 0x817F8181, +0x81817F7F, 0x81818181, 0x817F7F7F, 0x81817F81, 0x81817F81, 0x8181817F, 0x7F818181, 0x81818181, +0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x817F7F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F81, +0x81817F7F, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x8181817F, 0x817F817F, 0x7F7F7F81, 0x81818181, +0x7F7F8181, 0x817F7F81, 0x81818181, 0x81817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F8181, +0x7F81817F, 0x7F7F7F81, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, +0x817F8181, 0x817F7F81, 0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x7F7F7F7F, 0x8181817F, 0x8181817F, +0x7F818181, 0x7F7F817F, 0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F81817F, +0x817F7F81, 0x7F7F8181, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x817F7F81, 0x817F817F, 0x7F817F7F, +0x817F817F, 0x81817F7F, 0x81817F81, 0x817F7F7F, 0x817F817F, 0x817F7F81, 0x7F81817F, 0x8181817F, +0x8181817F, 0x81817F81, 0x817F817F, 0x7F818181, 0x8181817F, 0x7F818181, 0x8181817F, 0x7F7F817F, +0x7F818181, 0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x817F7F7F, 0x7F7F817F, 0x7F7F8181, +0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x7F818181, 0x81817F7F, 0x7F817F7F, +0x7F818181, 0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x81817F81, 0x81817F7F, 0x817F817F, 0x7F7F817F, +0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x7F81817F, 0x7F7F817F, 0x817F8181, 0x7F7F8181, 0x81817F81, +0x7F817F81, 0x7F7F817F, 0x7F7F817F, 0x81817F81, 0x7F7F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, +0x817F7F7F, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x7F7F817F, 0x81817F81, +0x817F8181, 0x817F7F7F, 0x7F81817F, 0x7F817F81, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, +0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x7F817F81, 0x7F818181, +0x81817F81, 0x7F7F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, 0x81817F81, 0x7F7F7F81, 0x7F817F7F, +0x81818181, 0x81818181, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, +0x817F7F7F, 0x81817F81, 0x8181817F, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F81, +0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F7F817F, 0x81817F81, 0x817F8181, 0x7F818181, +0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x81818181, 0x7F7F7F81, +0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x7F817F81, 0x7F7F8181, 0x7F7F817F, 0x81817F7F, 0x7F7F8181, +0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F81, 0x81818181, 0x7F818181, 0x8181817F, 0x7F7F8181, +0x817F7F81, 0x817F8181, 0x81817F81, 0x7F7F8181, 0x7F817F81, 0x8181817F, 0x817F7F81, 0x7F7F8181, +0x81817F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F818181, +0x81818181, 0x7F81817F, 0x81817F7F, 0x817F817F, 0x7F817F7F, 0x817F817F, 0x81818181, 0x817F7F81, +0x817F7F81, 0x817F7F81, 0x7F7F8181, 0x7F81817F, 0x817F7F81, 0x7F7F8181, 0x81818181, 0x817F7F7F, +0x81818181, 0x7F7F817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F81, +0x7F7F7F81, 0x7F817F7F, 0x81817F7F, 0x81818181, 0x817F817F, 0x81818181, 0x81818181, 0x817F7F7F, +0x7F7F817F, 0x7F7F8181, 0x7F7F8181, 0x817F7F7F, 0x7F81817F, 0x7F7F8181, 0x7F7F8181, 0x81818181, +0x8181817F, 0x7F818181, 0x7F817F81, 0x817F817F, 0x8181817F, 0x817F8181, 0x81818181, 0x7F817F7F, +0x7F7F7F81, 0x7F817F7F, 0x7F7F7F81, 0x817F7F81, 0x817F8181, 0x81817F81, 0x81817F81, 0x7F7F7F81, +0x81817F7F, 0x817F8181, 0x7F817F7F, 0x7F81817F, 0x8181817F, 0x7F818181, 0x81818181, 0x7F7F8181, +0x817F7F7F, 0x817F7F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x7F81817F, 0x81817F7F, +0x81817F81, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F81817F, 0x817F7F7F, +0x7F7F7F81, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x7F7F8181, 0x81817F81, 0x7F7F7F81, +0x7F81817F, 0x7F7F817F, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F8181, +0x7F817F7F, 0x7F7F8181, 0x81818181, 0x81818181, 0x817F8181, 0x81818181, 0x817F8181, 0x7F7F7F81, +0x8181817F, 0x8181817F, 0x7F7F7F7F, 0x7F818181, 0x817F817F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, +0x7F7F7F81, 0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x81817F7F, 0x7F7F817F, 0x817F7F7F, 0x7F817F81, +0x8181817F, 0x81818181, 0x7F817F81, 0x817F7F81, 0x81818181, 0x81817F81, 0x81817F81, 0x7F81817F, +0x7F7F7F81, 0x817F8181, 0x817F7F81, 0x817F817F, 0x7F817F81, 0x817F7F7F, 0x8181817F, 0x8181817F, +0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F81, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, +0x7F817F7F, 0x817F7F81, 0x817F817F, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F7F7F81, 0x7F7F7F7F, +0x7F7F817F, 0x817F7F7F, 0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x81817F7F, +0x7F7F7F7F, 0x81818181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F81, 0x81817F7F, 0x817F7F81, +0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x817F817F, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, +0x7F7F7F81, 0x8181817F, 0x7F818181, 0x817F7F81, 0x7F818181, 0x817F8181, 0x7F817F7F, 0x81818181, +0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x817F817F, 0x7F7F7F81, 0x81817F7F, +0x7F7F817F, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x7F818181, +0x817F7F81, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F7F81, 0x7F818181, 0x7F7F7F81, +0x7F7F817F, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F7F817F, 0x81817F7F, 0x81817F7F, 0x7F817F7F, +0x7F7F7F81, 0x7F7F7F7F, 0x817F817F, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x817F7F81, 0x7F7F8181, +0x7F817F7F, 0x7F818181, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x81818181, 0x7F7F817F, 0x7F817F81, +0x817F817F, 0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x817F7F7F, 0x81818181, 0x7F81817F, +0x8181817F, 0x7F81817F, 0x7F7F8181, 0x817F817F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x817F7F81, +0x81817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, +0x7F81817F, 0x817F8181, 0x7F818181, 0x817F7F7F, 0x7F7F817F, 0x8181817F, 0x81818181, 0x7F7F7F7F, +0x81817F81, 0x8181817F, 0x7F7F7F81, 0x7F7F817F, 0x817F7F81, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, +0x817F817F, 0x817F817F, 0x7F7F8181, 0x817F7F81, 0x81817F81, 0x7F81817F, 0x7F7F7F7F, 0x7F7F7F7F, +0x7F7F7F7F, 0x81817F7F, 0x817F7F81, 0x817F7F7F, 0x81817F81, 0x817F7F7F, 0x7F817F81, 0x8181817F, +0x7F81817F, 0x817F7F81, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x7F818181, 0x8181817F, 0x81817F81, +0x7F7F817F, 0x81817F7F, 0x7F817F7F, 0x7F7F817F, 0x81817F7F, 0x7F818181, 0x8181817F, 0x81817F7F, +0x7F817F81, 0x7F818181, 0x7F81817F, 0x7F818181, 0x817F7F81, 0x7F817F81, 0x7F7F817F, 0x7F7F7F81, +0x7F817F7F, 0x7F7F8181, 0x8181817F, 0x81817F81, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x81817F81, +0x7F7F817F, 0x7F7F7F81, 0x81818181, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x7F81817F, 0x7F817F81, +0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x817F7F81, 0x7F817F81, 0x7F817F7F, 0x7F818181, 0x81818181, +0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x7F818181, 0x7F81817F, 0x7F7F817F, 0x7F7F8181, 0x7F7F817F, +0x7F7F8181, 0x817F817F, 0x8181817F, 0x81818181, 0x81818181, 0x7F817F7F, 0x81817F7F, 0x7F81817F, +0x81817F81, 0x7F817F7F, 0x7F818181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x8181817F, +0x81817F7F, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x81818181, +0x7F7F8181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x7F7F8181, +0x7F817F81, 0x81817F7F, 0x7F817F81, 0x817F7F7F, 0x7F817F7F, 0x7F817F81, 0x7F81817F, 0x7F7F7F81, +0x7F817F7F, 0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F818181, 0x8181817F, 0x81817F7F, 0x7F81817F, +0x7F817F81, 0x7F7F7F81, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x7F817F81, 0x817F817F, 0x8181817F, +0x7F7F8181, 0x7F818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F7F81, +0x817F8181, 0x7F7F817F, 0x7F817F81, 0x817F8181, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x7F818181, +0x7F7F7F7F, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, +0x81818181, 0x817F817F, 0x8181817F, 0x7F81817F, 0x817F817F, 0x817F817F, 0x7F7F817F, 0x7F817F81, +0x7F818181, 0x81817F7F, 0x81817F7F, 0x817F8181, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, +0x8181817F, 0x7F817F81, 0x7F7F8181, 0x7F817F81, 0x817F7F81, 0x7F818181, 0x817F7F81, 0x817F7F7F, +0x7F7F7F81, 0x8181817F, 0x817F8181, 0x7F818181, 0x81818181, 0x81818181, 0x817F7F7F, 0x7F7F817F, +0x7F817F81, 0x81818181, 0x817F7F81, 0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x81817F7F, 0x7F81817F, +0x7F7F7F81, 0x81817F7F, 0x81818181, 0x7F81817F, 0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x817F817F, +0x81818181, 0x7F7F8181, 0x7F7F8181, 0x7F7F7F7F, 0x81818181, 0x81817F81, 0x7F7F7F81, 0x7F81817F, +0x81817F7F, 0x7F818181, 0x817F8181, 0x817F8181, 0x817F8181, 0x7F81817F, 0x7F7F7F81, 0x7F7F8181, +0x817F8181, 0x81818181, 0x7F817F7F, 0x7F818181, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, 0x817F817F, +0x8181817F, 0x7F7F817F, 0x7F818181, 0x7F818181, 0x7F7F8181, 0x817F7F81, 0x7F7F8181, 0x7F817F7F, +0x817F7F81, 0x81817F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F817F, 0x7F7F817F, 0x81817F81, 0x7F817F7F, +0x7F7F817F, 0x7F7F817F, 0x7F817F7F, 0x81818181, 0x7F817F81, 0x81818181, 0x81818181, 0x7F818181, +0x817F7F7F, 0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x817F8181, +0x7F81817F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, +0x7F7F817F, 0x817F8181, 0x81817F7F, 0x81818181, 0x8181817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, +0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F817F, 0x7F7F7F7F, +0x81818181, 0x81818181, 0x81817F81, 0x817F817F, 0x8181817F, 0x817F7F7F, 0x7F7F7F7F, 0x817F817F, +0x8181817F, 0x7F7F7F7F, 0x7F7F7F81, 0x8181817F, 0x7F81817F, 0x817F817F, 0x817F817F, 0x817F817F, +0x7F817F81, 0x81817F7F, 0x7F81817F, 0x7F817F81, 0x7F817F7F, 0x81818181, 0x7F818181, 0x817F7F7F, +0x81817F7F, 0x817F7F7F, 0x817F7F81, 0x7F7F7F81, 0x7F81817F, 0x817F8181, 0x7F81817F, 0x7F81817F, +0x7F7F7F7F, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x81817F7F, 0x8181817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F81817F, 0x817F8181, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F81, +0x817F8181, 0x817F7F81, 0x7F7F8181, 0x7F81817F, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x81817F81, +0x7F7F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F817F, 0x8181817F, 0x7F817F81, 0x7F7F7F81, +0x7F7F7F81, 0x7F817F7F, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x81817F81, 0x7F817F7F, +0x7F817F81, 0x7F818181, 0x817F8181, 0x7F817F7F, 0x817F817F, 0x817F7F81, 0x81818181, 0x7F817F7F, +0x7F817F81, 0x7F818181, 0x7F7F7F7F, 0x81818181, 0x817F7F81, 0x817F8181, 0x817F8181, 0x7F7F7F7F, +0x817F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x7F7F7F81, 0x8181817F, +0x7F7F8181, 0x817F7F81, 0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x817F817F, 0x7F7F7F81, +0x81818181, 0x81817F7F, 0x8181817F, 0x81817F7F, 0x81817F7F, 0x81818181, 0x7F81817F, 0x817F817F, +0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x8181817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x817F8181, +0x7F817F7F, 0x7F817F7F, 0x81818181, 0x7F817F7F, 0x817F8181, 0x817F7F7F, 0x7F81817F, 0x7F7F817F, +0x7F7F7F7F, 0x81817F81, 0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x7F818181, 0x7F818181, 0x81818181, +0x817F8181, 0x81817F81, 0x7F7F817F, 0x817F7F81, 0x817F817F, 0x817F8181, 0x8181817F, 0x81818181, +0x817F8181, 0x817F7F81, 0x7F7F817F, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x7F817F81, 0x7F7F8181, +0x7F7F8181, 0x81818181, 0x817F7F7F, 0x81818181, 0x8181817F, 0x817F8181, 0x8181817F, 0x7F7F7F7F, +0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F8181, 0x817F7F7F, 0x817F817F, 0x81817F7F, 0x7F817F81, +0x7F7F817F, 0x7F817F81, 0x7F818181, 0x7F7F8181, 0x817F817F, 0x817F8181, 0x81818181, 0x7F818181, +0x81817F81, 0x7F817F81, 0x7F7F8181, 0x7F7F8181, 0x817F8181, 0x7F81817F, 0x7F818181, 0x81817F7F, +0x817F7F81, 0x81817F81, 0x817F8181, 0x7F817F81, 0x7F817F81, 0x81817F7F, 0x7F7F7F7F, 0x7F817F81, +0x7F7F8181, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x7F81817F, +0x7F7F7F7F, 0x81818181, 0x7F7F8181, 0x817F8181, 0x8181817F, 0x81817F81, 0x817F8181, 0x81818181, +0x81818181, 0x817F817F, 0x7F7F7F7F, 0x81818181, 0x817F8181, 0x817F8181, 0x7F81817F, 0x81817F7F, +0x7F7F817F, 0x7F817F7F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x7F817F7F, 0x7F7F8181, 0x817F7F81, +0x7F81817F, 0x817F8181, 0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x81817F81, 0x81817F81, 0x7F7F817F, +0x7F81817F, 0x817F817F, 0x7F817F81, 0x817F7F7F, 0x817F817F, 0x817F7F81, 0x7F818181, 0x7F817F7F, +0x7F818181, 0x817F7F7F, 0x817F817F, 0x7F7F817F, 0x7F818181, 0x7F7F817F, 0x7F818181, 0x7F817F7F, +0x817F8181, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, +0x7F7F7F81, 0x81818181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x8181817F, 0x817F7F7F, 0x7F817F7F, +0x81818181, 0x817F8181, 0x7F7F7F81, 0x817F8181, 0x8181817F, 0x7F817F81, 0x7F817F7F, 0x7F817F81, +0x81818181, 0x817F7F7F, 0x81818181, 0x7F7F8181, 0x817F817F, 0x7F7F817F, 0x81818181, 0x7F7F7F81, +0x7F7F817F, 0x7F818181, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x8181817F, 0x817F7F81, +0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, 0x817F817F, +0x7F817F7F, 0x8181817F, 0x7F7F8181, 0x817F817F, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F818181, +0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x8181817F, 0x81818181, +0x817F817F, 0x7F7F8181, 0x7F817F81, 0x81818181, 0x7F81817F, 0x817F817F, 0x81818181, 0x7F7F817F, +0x7F7F817F, 0x81817F81, 0x817F7F81, 0x8181817F, 0x8181817F, 0x817F7F7F, 0x7F818181, 0x7F81817F, +0x7F7F7F81, 0x817F8181, 0x7F7F8181, 0x7F817F81, 0x8181817F, 0x817F817F, 0x7F817F81, 0x81818181, +0x7F817F7F, 0x817F7F81, 0x7F818181, 0x7F7F8181, 0x7F817F81, 0x817F817F, 0x7F7F817F, 0x8181817F, +0x7F817F81, 0x817F8181, 0x7F7F8181, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, 0x817F817F, 0x81818181, +0x7F818181, 0x817F7F81, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F817F, +0x817F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x7F817F81, 0x817F817F, +0x81818181, 0x7F7F817F, 0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x81818181, 0x7F817F7F, 0x7F81817F, +0x7F81817F, 0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x7F81817F, 0x7F81817F, +0x7F7F8181, 0x81817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x817F817F, +0x7F7F817F, 0x81818181, 0x81818181, 0x7F817F81, 0x817F8181, 0x817F7F7F, 0x817F8181, 0x81818181, +0x817F7F7F, 0x817F7F81, 0x81817F81, 0x7F818181, 0x7F81817F, 0x817F7F81, 0x817F817F, 0x7F7F7F81, +0x7F817F81, 0x7F818181, 0x817F817F, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F817F, +0x7F817F81, 0x8181817F, 0x81818181, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F817F, +0x81818181, 0x7F817F81, 0x81818181, 0x817F817F, 0x7F817F7F, 0x81817F7F, 0x817F7F81, 0x817F817F, +0x7F817F7F, 0x81817F81, 0x7F7F8181, 0x81818181, 0x7F7F7F81, 0x81818181, 0x7F818181, 0x817F7F7F, +0x81817F81, 0x817F7F7F, 0x81818181, 0x8181817F, 0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x81818181, +0x81817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x817F7F81, 0x8181817F, 0x7F817F81, +0x7F7F7F7F, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, 0x817F8181, 0x817F8181, 0x81817F81, +0x7F7F7F81, 0x81817F81, 0x7F7F7F7F, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x7F7F7F7F, 0x7F817F7F, +0x7F7F7F81, 0x81817F81, 0x8181817F, 0x8181817F, 0x7F7F7F81, 0x8181817F, 0x7F7F8181, 0x81817F7F, +0x8181817F, 0x7F7F817F, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x81817F7F, 0x7F7F8181, +0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x7F817F7F, 0x7F817F81, 0x8181817F, +0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F817F7F, 0x81817F81, 0x81817F7F, 0x7F818181, 0x7F817F81, +0x81817F7F, 0x7F817F81, 0x817F817F, 0x81818181, 0x81817F81, 0x817F817F, 0x817F7F7F, 0x817F7F7F, +0x817F8181, 0x7F81817F, 0x81817F81, 0x81817F81, 0x7F817F7F, 0x817F8181, 0x817F7F81, 0x7F7F8181, +0x817F8181, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x8181817F, +0x817F8181, 0x7F817F7F, 0x817F817F, 0x817F8181, 0x81817F7F, 0x7F817F81, 0x817F8181, 0x7F81817F, +0x81818181, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x81817F7F, 0x7F817F7F, +0x7F7F817F, 0x7F7F8181, 0x817F817F, 0x7F7F817F, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, 0x8181817F, +0x817F817F, 0x7F7F7F81, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F81, +0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x81817F7F, 0x7F7F8181, 0x7F7F8181, 0x817F817F, 0x7F7F7F7F, +0x7F7F817F, 0x7F7F7F81, 0x7F818181, 0x7F817F7F, 0x7F7F817F, 0x81818181, 0x817F8181, 0x817F817F, +0x7F817F81, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F818181, 0x81818181, 0x7F817F7F, 0x7F817F7F, +0x7F81817F, 0x7F7F817F, 0x81818181, 0x817F817F, 0x817F7F7F, 0x7F7F7F81, 0x81818181, 0x7F81817F, +0x7F7F8181, 0x7F7F7F81, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x817F8181, +0x7F7F817F, 0x7F81817F, 0x81818181, 0x81817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F818181, +0x7F818181, 0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x817F8181, +0x817F7F81, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x81818181, 0x817F817F, 0x7F7F8181, +0x817F7F81, 0x8181817F, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x7F818181, 0x817F7F7F, 0x817F7F7F, +0x817F817F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x81818181, 0x817F8181, 0x7F7F817F, 0x7F81817F, +0x7F7F8181, 0x7F7F8181, 0x7F818181, 0x817F817F, 0x81818181, 0x81817F81, 0x81817F7F, 0x7F7F7F81, +0x7F818181, 0x81818181, 0x7F818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F7F7F7F, +0x817F7F7F, 0x7F7F817F, 0x7F817F81, 0x81818181, 0x7F7F7F81, 0x81818181, 0x817F817F, 0x8181817F, +0x817F8181, 0x817F7F81, 0x817F8181, 0x817F7F7F, 0x7F818181, 0x7F818181, 0x81817F7F, 0x81817F81, +0x7F7F8181, 0x7F818181, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F81, 0x7F7F8181, +0x817F8181, 0x8181817F, 0x81817F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x81818181, 0x7F7F8181, +0x81818181, 0x7F7F7F81, 0x7F818181, 0x7F7F8181, 0x817F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x817F7F81, +0x817F8181, 0x817F7F7F, 0x7F7F817F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x7F7F817F, 0x817F7F81, +0x81817F81, 0x81817F7F, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x7F7F817F, 0x817F817F, 0x7F81817F, +0x81817F7F, 0x817F817F, 0x7F81817F, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F818181, +0x7F7F7F7F, 0x817F7F81, 0x81817F81, 0x7F817F81, 0x81818181, 0x81817F7F, 0x7F817F81, 0x7F7F7F7F, +0x7F7F7F81, 0x81818181, 0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x81817F81, 0x7F818181, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x817F8181, 0x81818181, 0x7F817F81, +0x7F7F817F, 0x817F817F, 0x81817F7F, 0x817F7F7F, 0x81817F81, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, +0x81817F81, 0x81817F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, 0x817F8181, +0x81817F7F, 0x817F8181, 0x81818181, 0x817F817F, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x7F817F7F, +0x7F7F817F, 0x817F817F, 0x817F8181, 0x8181817F, 0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x81817F7F, +0x81817F7F, 0x7F7F7F81, 0x7F7F8181, 0x817F7F81, 0x7F7F7F81, 0x7F81817F, 0x81818181, 0x81818181, +0x8181817F, 0x817F7F7F, 0x81817F81, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x7F817F81, 0x81817F7F, +0x7F81817F, 0x817F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F7F, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F7F, +0x7F7F8181, 0x817F7F81, 0x7F7F7F7F, 0x817F7F81, 0x7F81817F, 0x817F7F81, 0x817F7F81, 0x81818181, +0x817F817F, 0x817F817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x7F7F7F81, +0x7F7F817F, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, 0x817F7F7F, 0x81817F7F, +0x81818181, 0x8181817F, 0x81817F81, 0x7F818181, 0x817F8181, 0x7F818181, 0x817F8181, 0x81818181, +0x7F7F7F81, 0x81817F7F, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x817F817F, +0x7F7F817F, 0x8181817F, 0x7F81817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x7F817F81, 0x81818181, +0x817F7F81, 0x81818181, 0x7F81817F, 0x81818181, 0x7F817F81, 0x7F7F7F81, 0x7F7F8181, 0x7F817F81, +0x7F817F81, 0x8181817F, 0x7F81817F, 0x817F817F, 0x817F817F, 0x81817F81, 0x817F817F, 0x81817F81, +0x7F7F8181, 0x81817F7F, 0x7F817F81, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, 0x817F817F, 0x817F7F81, +0x81817F7F, 0x817F7F7F, 0x7F7F8181, 0x817F7F81, 0x817F7F81, 0x7F818181, 0x8181817F, 0x7F7F7F81, +0x817F8181, 0x7F7F817F, 0x817F8181, 0x7F81817F, 0x7F81817F, 0x81817F7F, 0x7F7F7F7F, 0x817F7F7F, +0x8181817F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x81817F81, 0x81817F81, 0x81818181, 0x8181817F, +0x817F817F, 0x7F817F7F, 0x817F817F, 0x7F7F7F7F, 0x8181817F, 0x817F817F, 0x817F817F, 0x7F817F81, +0x8181817F, 0x8181817F, 0x7F7F8181, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x81818181, 0x7F817F81, +0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x817F7F7F, 0x7F81817F, 0x7F818181, 0x817F8181, 0x7F81817F, +0x7F817F7F, 0x8181817F, 0x817F8181, 0x817F817F, 0x817F817F, 0x81817F81, 0x8181817F, 0x7F817F81, +0x7F7F817F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x81817F81, +0x817F817F, 0x81817F81, 0x8181817F, 0x7F817F7F, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F817F81, +0x7F817F81, 0x817F8181, 0x7F7F8181, 0x7F7F817F, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F817F81, +0x817F8181, 0x81818181, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F818181, 0x817F8181, 0x817F8181, +0x817F8181, 0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F81817F, 0x81818181, 0x7F7F7F7F, +0x7F818181, 0x817F817F, 0x817F7F81, 0x817F7F81, 0x8181817F, 0x817F7F81, 0x81818181, 0x817F7F81, +0x81817F7F, 0x7F7F7F81, 0x7F817F7F, 0x7F7F8181, 0x7F7F8181, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, +0x7F7F7F7F, 0x7F81817F, 0x81817F81, 0x7F818181, 0x7F81817F, 0x817F817F, 0x7F7F7F81, 0x7F7F817F, +0x7F7F8181, 0x817F7F81, 0x817F7F7F, 0x7F817F7F, 0x7F81817F, 0x817F7F81, 0x8181817F, 0x81817F81, +0x8181817F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F7F, 0x81818181, 0x817F7F7F, 0x7F7F817F, 0x7F817F81, +0x81817F81, 0x7F7F7F7F, 0x7F818181, 0x7F818181, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x81818181, +0x81818181, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, 0x817F7F81, +0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F7F, 0x81818181, +0x81818181, 0x7F817F7F, 0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x7F81817F, 0x8181817F, 0x81818181, +0x7F817F7F, 0x81818181, 0x81818181, 0x81817F7F, 0x7F818181, 0x7F7F7F81, 0x81817F7F, 0x7F817F81, +0x817F8181, 0x7F817F81, 0x817F7F7F, 0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F817F, +0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, 0x81817F7F, +0x7F817F81, 0x7F81817F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x81817F81, 0x7F817F7F, 0x7F817F81, +0x81818181, 0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F7F81, +0x817F7F7F, 0x81817F7F, 0x7F7F817F, 0x817F8181, 0x7F817F7F, 0x81818181, 0x817F8181, 0x817F817F, +0x7F818181, 0x7F7F7F7F, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x7F817F7F, 0x7F7F7F81, 0x817F7F81, +0x817F7F81, 0x7F7F7F7F, 0x817F8181, 0x817F8181, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x817F7F81, +0x7F7F817F, 0x8181817F, 0x81818181, 0x817F817F, 0x7F7F7F81, 0x7F81817F, 0x7F817F81, 0x817F7F81, +0x7F818181, 0x7F7F7F81, 0x81817F81, 0x7F817F7F, 0x81818181, 0x817F7F7F, 0x7F817F81, 0x817F8181, +0x81817F81, 0x7F81817F, 0x7F7F8181, 0x81818181, 0x81817F7F, 0x8181817F, 0x7F81817F, 0x81817F7F, +0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x81818181, 0x817F817F, 0x817F7F81, +0x7F7F817F, 0x817F7F81, 0x7F7F817F, 0x8181817F, 0x8181817F, 0x8181817F, 0x7F817F7F, 0x817F8181, +0x81818181, 0x817F7F7F, 0x817F817F, 0x81818181, 0x7F81817F, 0x7F7F8181, 0x817F7F7F, 0x817F8181, +0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x7F7F7F7F, 0x81817F7F, 0x81818181, 0x7F7F817F, +0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x817F7F81, 0x817F7F7F, 0x7F81817F, +0x8181817F, 0x817F8181, 0x7F7F7F81, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F818181, +0x8181817F, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x7F818181, 0x8181817F, 0x7F7F817F, 0x81817F7F, +0x7F7F817F, 0x7F817F81, 0x817F8181, 0x817F7F7F, 0x817F817F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, +0x7F81817F, 0x817F7F81, 0x7F818181, 0x81817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x81818181, +0x81818181, 0x7F81817F, 0x817F7F81, 0x7F817F81, 0x817F817F, 0x817F817F, 0x817F8181, 0x81818181, +0x817F8181, 0x817F7F7F, 0x81817F7F, 0x81817F7F, 0x81817F81, 0x81818181, 0x7F7F8181, 0x81817F7F, +0x7F7F7F81, 0x7F81817F, 0x81817F81, 0x7F7F817F, 0x81817F7F, 0x81817F81, 0x81818181, 0x7F7F7F7F, +0x81817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x8181817F, 0x817F8181, 0x817F7F7F, 0x7F7F7F7F, +0x81817F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x817F7F81, 0x7F818181, 0x817F7F81, 0x81817F81, +0x7F7F8181, 0x7F7F817F, 0x81817F7F, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F818181, 0x7F7F817F, +0x7F7F7F81, 0x817F7F81, 0x7F817F7F, 0x7F818181, 0x8181817F, 0x7F7F8181, 0x81818181, 0x817F8181, +0x7F817F7F, 0x7F81817F, 0x81818181, 0x817F8181, 0x7F81817F, 0x817F7F81, 0x81818181, 0x7F817F81, +0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, 0x81818181, 0x817F8181, 0x7F7F7F7F, +0x817F7F7F, 0x81818181, 0x81818181, 0x81818181, 0x7F7F8181, 0x7F7F817F, 0x81817F81, 0x817F7F81, +0x7F81817F, 0x7F7F8181, 0x7F7F7F81, 0x7F817F7F, 0x81818181, 0x7F7F7F7F, 0x81817F7F, 0x7F7F7F7F, +0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x7F817F81, 0x817F817F, 0x7F817F81, 0x7F7F7F81, 0x7F817F7F, +0x817F8181, 0x7F7F8181, 0x7F7F817F, 0x7F817F81, 0x81817F81, 0x81817F81, 0x817F817F, 0x7F818181, +0x81818181, 0x817F817F, 0x817F7F81, 0x81818181, 0x817F7F7F, 0x7F7F8181, 0x7F817F81, 0x8181817F, +0x7F7F7F81, 0x7F817F81, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x7F818181, 0x7F818181, 0x817F7F81, +0x7F7F7F7F, 0x81818181, 0x7F817F7F, 0x8181817F, 0x81818181, 0x81817F7F, 0x81818181, 0x7F818181, +0x81817F81, 0x7F81817F, 0x7F817F7F, 0x7F817F81, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, +0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x7F81817F, 0x81818181, 0x7F7F7F81, +0x7F7F8181, 0x7F818181, 0x817F7F81, 0x7F818181, 0x817F817F, 0x7F817F81, 0x7F81817F, 0x7F817F7F, +0x7F817F7F, 0x81817F7F, 0x81817F81, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x7F817F7F, +0x817F817F, 0x7F7F8181, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, +0x7F7F817F, 0x7F817F81, 0x81817F7F, 0x81817F81, 0x7F81817F, 0x81818181, 0x7F817F7F, 0x8181817F, +0x817F8181, 0x7F7F7F81, 0x817F7F81, 0x817F817F, 0x817F8181, 0x7F818181, 0x7F81817F, 0x7F7F8181, +0x7F81817F, 0x7F81817F, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x8181817F, 0x7F818181, +0x7F7F817F, 0x81818181, 0x817F7F81, 0x7F817F81, 0x8181817F, 0x7F81817F, 0x817F8181, 0x7F7F8181, +0x81818181, 0x7F7F817F, 0x7F818181, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, +0x817F7F81, 0x7F81817F, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x7F7F817F, 0x7F818181, 0x7F817F81, +0x817F7F81, 0x7F818181, 0x81818181, 0x817F8181, 0x81817F7F, 0x7F817F81, 0x7F7F7F7F, 0x817F7F7F, +0x7F7F817F, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x7F818181, 0x7F81817F, 0x81818181, +0x7F818181, 0x817F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F8181, 0x81818181, 0x81817F81, 0x7F818181, +0x81817F81, 0x817F8181, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x817F817F, 0x7F817F7F, 0x7F7F8181, +0x817F7F81, 0x817F8181, 0x7F817F81, 0x7F818181, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x7F81817F, +0x7F818181, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, 0x817F7F7F, 0x8181817F, 0x81818181, 0x7F7F7F81, +0x7F817F81, 0x7F818181, 0x7F7F817F, 0x7F817F81, 0x7F7F7F81, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F81, +0x7F817F81, 0x7F818181, 0x7F817F81, 0x7F7F7F7F, 0x7F81817F, 0x8181817F, 0x817F7F7F, 0x7F7F8181, +0x81817F7F, 0x81817F7F, 0x7F818181, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x817F8181, 0x817F8181, +0x7F818181, 0x7F81817F, 0x8181817F, 0x7F7F817F, 0x81818181, 0x7F7F7F81, 0x81818181, 0x7F7F7F7F, +0x817F817F, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x7F818181, 0x817F7F81, 0x7F7F817F, 0x817F8181, +0x7F817F81, 0x817F8181, 0x8181817F, 0x81817F7F, 0x7F817F81, 0x7F7F8181, 0x7F7F8181, 0x7F818181, +0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x7F7F7F7F, 0x817F817F, 0x7F7F8181, +0x817F7F7F, 0x7F817F81, 0x81817F81, 0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x7F81817F, 0x7F817F81, +0x7F7F7F7F, 0x817F7F7F, 0x7F817F81, 0x817F817F, 0x81817F81, 0x81817F7F, 0x7F817F81, 0x7F7F7F81, +0x7F7F7F7F, 0x8181817F, 0x817F7F81, 0x7F81817F, 0x7F81817F, 0x81817F7F, 0x8181817F, 0x81817F7F, +0x7F817F81, 0x7F818181, 0x817F817F, 0x81817F81, 0x7F7F8181, 0x817F7F81 + +output0 = +0x02524C20, 0xB9B1FEA2, 0xC1BAB7E5, 0xEF5714CB, 0x7DE6A64D, 0xA05F9DC9, 0x0747D1E3, 0x3B20BC86, +0x6FCBDB0F, 0xF2FB7A23, 0x79D5E062, 0x5BF4E7C3, 0xD4A68A37, 0x07B4A6AD, 0x37E911F9, 0x7FE7B30A, +0xBBC284A2, 0xD38D6136, 0x25FAB76B, 0xBEBBF534, 0x9A88F9DB, 0xE37FD52D, 0x691DD493, 0xED2F738C, +0x89A96EA0, 0xD981246A, 0x17CC820E, 0x07E3B463, 0xC9FC2590, 0x7475A33C, 0xA5151BB4, 0x1F7E759E, +0x9554F964, 0xD0FA01F4, 0xD31774D2, 0xEB73A9F6, 0x8C9FBCB1, 0xF83010FB, 0x1909E09F, 0xC46023EB, +0x02AEDC62, 0xC6352CC7, 0x674BDC6D, 0xE17CD747, 0x4E25B0B3, 0x4BFF6B17, 0x12C9AAA3, 0xC2BC91CD, +0x44BE23A2, 0x8A72A157, 0x6E0DAD1F, 0x6CA69A09, 0xB55B582E, 0x01818B31, 0x5CA5CAB6, 0x1917AB24, +0x38F98BCD, 0x01917487, 0x05906FDD, 0x760AFCBA, 0x19671085, 0x64E3546E, 0xEC10F922, 0x3CF286CA, +0x68E273EA, 0xF1001325, 0x5DCB3B49, 0xE9547370, 0x65D26AE6, 0xF621256C, 0x25D6D99C, 0x7862EBA0, +0x43365DB0, 0x4DBF06C5, 0x92FCAA02, 0xB0FD58FA, 0x910E80A6, 0x93D24A67, 0x6E39B144, 0x3D46D6F6, +0xEDC55081, 0x33CD70C7, 0xC74B6E8E, 0x91AA27B9, 0x55B3542D, 0xEBF8046A, 0xB9ABDB94, 0x97FC38A8, +0xD5837B4D, 0x764B1809, 0xFBE2096A, 0xC23887AC, 0x2A45029B, 0xCBB7DF70, 0x674654E1, 0x0C6A06BD, +0xB3E8853E, 0x03FCC4CE, 0x26806F2E, 0x2CEB35B0, 0x10538B03, 0x94B059B8, 0xA95E7FFA, 0x48AD3D0A, +0xEB9091E1, 0x972E31EF, 0x5EBC6F8F, 0x947FF108, 0xCB3123FA, 0xFEE1D939, 0xF3DC5C49, 0xA92927AE, +0xF49BB8D0, 0xAA59F730, 0x4A66D1CD, 0x030E1ADF, 0x238D5B19, 0x96F861F1, 0x915424E4, 0x9127880C, +0x8E779839, 0x87375FCE, 0x61FB3D79, 0x96B1EE83, 0x47BF6667, 0x19E7D408, 0x7E91137F, 0x0E4AD8E8, +0xDABD2E45, 0x9B60873F, 0xD0294A65, 0x2A38A862, 0x59DD046D, 0x9832BB79, 0xA5870DB6, 0xB3F1CC48, +0x7E9A8132, 0xEEA2E4BC, 0xF23ED87B, 0x550E011F, 0x9620E0C0, 0xE7CF0834, 0xDEE69623, 0x6184D512, +0xD3D55728, 0xFA7711D4, 0x9C77B0F9, 0x8A26462B, 0xB3F5C8D5, 0x1123246D, 0x78F36272, 0x940EE0F9, +0x757BF240, 0x7EE2B6D0, 0xD40FD5A1, 0xAB4205CA, 0x96E6B758, 0xAC5F4294, 0xC9268C66, 0xB48DC535, +0x3CF6ED4C, 0xF187EFED, 0x7A09B08D, 0x8709EFCE, 0x267B2468, 0x0015D770, 0xDF1B90BF, 0xA03DAD85, +0x2633012E, 0xE5437125, 0x58B79AFF, 0xB929C532, 0x6D890DC9, 0x89A59AD2, 0x2BB99316, 0x41B5B0EB, +0x7304B295, 0xB37F6708, 0x2F84A68E, 0x3637D79A, 0xDD36687B, 0x904BF7B6, 0x6A2CF453, 0x733DED54, +0x5DF48BAA, 0xC3FCC99F, 0x8E3BE1DB, 0x61D9CF2D, 0xB7DC202B, 0xA959FF95, 0x860D0F14, 0x4008C478, +0xD9325A51, 0x27A29D4C, 0x308FE6D4, 0x7A1AA889, 0x5BD38393, 0xCBFA5D + +basegraph= +1 + +z_c= +320 + +n_cb= +21120 + +q_m= +4 + +n_filler= +688 + +e = +21592 + +rv_index = +0 + +code_block_mode = +1 + +iter_max = +20 + +expected_iter_count = +3 + +op_flags = +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v7813.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v7813.data new file mode 100644 index 0000000000..c656fd3e4a --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v7813.data @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x7F817F81, 0x7F81817F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x817F8181, 0x817F7F7F, 0x7F817F81, +0x817F7F7F, 0x8181817F, 0x8181817F + +output0 = +0x8C4DEB9F, 0x52 + +basegraph= +2 + +z_c= +7 + +n_cb= +350 + +q_m= +2 + +n_filler= +30 + +e = +44 + +rv_index = +0 + +code_block_mode = +1 + +iter_max = +8 + +expected_iter_count = +6 + +op_flags = +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data new file mode 100644 index 0000000000..ddebf7bee1 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data @@ -0,0 +1,74 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x81817F81, 0x817F7F7F, 0x7F817F7F, 0x7F817F7F, 0x8181817F, 0x817F817F, 0x817F817F, 0x7F818181, +0x7F817F7F, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x81817F7F, 0x8181817F, 0x81818181, +0x817F8181, 0x7F7F7F81, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, +0x7F7F7F81, 0x817F8181, 0x7F818181, 0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x7F817F7F, 0x7F81817F, +0x7F818181, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x7F81817F, 0x817F7F81, 0x81817F81, 0x817F817F, +0x7F7F8181, 0x817F7F81, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x7F7F817F, +0x8181817F, 0x817F8181, 0x7F817F81, 0x817F8181, 0x8181817F, 0x817F8181, 0x7F817F81, 0x8181817F, +0x7F7F8181, 0x7F7F817F, 0x7F81817F, 0x81817F7F, 0x7F7F8181, 0x8181817F, 0x7F818181, 0x81817F81, +0x7F7F817F, 0x7F7F8181, 0x7F817F81, 0x7F81817F, 0x817F7F81, 0x81818181, 0x7F817F81, 0x7F7F7F7F, +0x7F817F7F, 0x81817F7F, 0x817F7F7F, 0x7F818181, 0x7F7F817F, 0x81817F81, 0x8181817F, 0x7F81817F, +0x8181817F, 0x817F8181, 0x7F817F7F, 0x817F817F, 0x81818181, 0x7F81817F, 0x817F817F, 0x81817F81, +0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x81818181, +0x81817F81, 0x817F7F7F, 0x817F7F81, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x817F817F, 0x7F7F817F, +0x81817F7F, 0x7F7F817F, 0x817F8181, 0x817F8181, 0x7F81817F, 0x817F817F, 0x817F7F7F, 0x81817F81, +0x81817F7F, 0x8181817F, 0x817F7F81, 0x81817F81, 0x7F7F817F, 0x7F7F8181, 0x7F7F817F, 0x81817F81, +0x81817F7F, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x8181817F, 0x81818181, 0x7F817F7F, 0x7F7F8181, +0x7F7F7F81, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x81818181, 0x8181817F, 0x7F81817F, 0x7F818181, +0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x817F7F7F, 0x7F81817F, 0x7F7F7F7F, +0x7F818181, 0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x7F7F8181, 0x7F7F8181, 0x8181817F, 0x7F7F817F, +0x7F81817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, 0x7F7F8181, 0x817F8181, 0x817F7F7F, +0x7F7F817F, 0x817F8181, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x81817F81, +0x7F7F817F, 0x8181817F, 0x817F817F, 0x7F7F7F7F, 0x7F818181, 0x7F7F817F, 0x7F818181, 0x817F7F81, +0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x81817F81, 0x7F817F81, 0x81818181, 0x7F7F8181, 0x817F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x81818181, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, 0x7F818181, 0x817F8181, 0x817F817F, 0x7F7F817F, +0x7F817F81 + +output0 = +0x76332859, 0x417B1254, 0xEC8A8CFE, 0xE7EFCD06, 0x43C5BDA2, 0x2EACD776, 0x6CD515AC, 0x6D6E04AC, +0xBC2D9F85, 0xD3643553, 0xD0C8DF8E, 0x235B434A, 0xD7AB7643, 0xA4D9C420, 0x372FA858, 0xF813CE10, +0xE0C238F6, 0x07853FD4, 0xE04E40F2, 0x0EE765A9, 0x6EEAFCBC, 0xA7059C68, 0xFBBC + +basegraph= +2 + +z_c= +72 + +n_cb= +3600 + +q_m= +2 + +n_filler= +0 + +e = +804 + +rv_index = +0 + +code_block_mode = +1 + +iter_max = +8 + +expected_iter_count = +3 + +op_flags = +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8568.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8568.data new file mode 100644 index 0000000000..0b95e4e0fa --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8568.data @@ -0,0 +1,255 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x7F7F7F7F, 0x7F7F7F7F, 0x8181817F, 0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x81818181, +0x7F818181, 0x817F817F, 0x81818181, 0x7F7F7F7F, 0x7F81817F, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, +0x7F817F7F, 0x817F8181, 0x7F818181, 0x817F817F, 0x8181817F, 0x7F7F8181, 0x8181817F, 0x817F7F7F, +0x7F7F817F, 0x7F7F817F, 0x81818181, 0x81817F81, 0x7F7F7F81, 0x7F81817F, 0x7F818181, 0x7F818181, +0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x7F818181, 0x7F81817F, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, +0x81817F81, 0x817F817F, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F817F7F, 0x817F817F, 0x7F7F7F81, +0x7F7F817F, 0x817F817F, 0x81818181, 0x7F81817F, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x7F7F8181, +0x7F818181, 0x7F81817F, 0x7F81817F, 0x81817F7F, 0x817F7F81, 0x7F818181, 0x7F817F81, 0x7F818181, +0x81817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, 0x817F8181, 0x7F817F7F, 0x7F7F7F81, +0x7F7F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, 0x817F7F81, 0x817F7F81, 0x81818181, +0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F8181, 0x817F8181, 0x7F81817F, +0x817F817F, 0x7F817F81, 0x7F7F8181, 0x7F817F81, 0x7F7F817F, 0x7F817F81, 0x81817F7F, 0x817F817F, +0x81818181, 0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F7F7F81, 0x817F8181, 0x817F8181, 0x7F81817F, +0x7F7F817F, 0x817F817F, 0x7F7F817F, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x7F817F81, +0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F8181, 0x7F7F7F7F, 0x817F8181, 0x7F7F8181, 0x81818181, +0x81818181, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F81817F, 0x817F7F81, +0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F817F7F, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, +0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x817F817F, 0x7F818181, 0x817F7F81, 0x817F817F, 0x8181817F, +0x817F7F81, 0x7F7F7F7F, 0x7F817F81, 0x81818181, 0x817F7F81, 0x81817F81, 0x817F7F81, 0x7F817F7F, +0x817F8181, 0x7F7F7F81, 0x7F817F81, 0x8181817F, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x7F818181, +0x7F7F7F81, 0x7F817F81, 0x81818181, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x817F817F, 0x7F818181, +0x817F817F, 0x81817F7F, 0x81817F81, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x81818181, 0x81818181, +0x8181817F, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x7F818181, +0x7F817F81, 0x7F817F7F, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F817F, 0x817F8181, +0x817F817F, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x81817F81, +0x7F7F7F81, 0x8181817F, 0x7F7F817F, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x81817F81, 0x7F7F7F81, +0x81818181, 0x7F7F8181, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x7F81817F, 0x817F7F81, +0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x817F7F81, 0x817F8181, 0x7F7F8181, 0x81818181, 0x817F817F, +0x817F7F7F, 0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x7F7F7F81, 0x7F818181, 0x7F7F817F, 0x81818181, +0x817F8181, 0x7F817F81, 0x7F7F7F81, 0x7F817F7F, 0x81817F81, 0x7F81817F, 0x817F7F7F, 0x7F7F8181, +0x817F7F7F, 0x7F7F817F, 0x7F818181, 0x817F7F81, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x81818181, +0x81817F7F, 0x7F7F7F7F, 0x81817F81, 0x7F817F81, 0x817F8181, 0x7F818181, 0x7F7F7F81, 0x81817F81, +0x7F818181, 0x7F817F7F, 0x8181817F, 0x8181817F, 0x7F81817F, 0x8181817F, 0x7F7F817F, 0x81817F81, +0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x817F7F7F, 0x81817F81, 0x81818181, 0x7F818181, 0x81818181, +0x7F81817F, 0x8181817F, 0x817F8181, 0x81818181, 0x81818181, 0x7F7F7F7F, 0x7F7F7F81, 0x817F817F, +0x7F7F7F7F, 0x817F7F7F, 0x817F8181, 0x7F817F7F, 0x817F8181, 0x81817F81, 0x817F817F, 0x817F817F, +0x817F7F7F, 0x7F817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F8181, 0x81818181, +0x8181817F, 0x81817F7F, 0x817F8181, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x7F81817F, +0x7F817F81, 0x81818181, 0x7F7F8181, 0x81818181, 0x7F7F817F, 0x81817F7F, 0x817F7F7F, 0x81818181, +0x7F818181, 0x817F7F81, 0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x817F7F7F, 0x817F817F, 0x7F7F8181, +0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x7F81817F, 0x81817F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F8181, +0x8181817F, 0x7F817F81, 0x7F818181, 0x7F7F817F, 0x7F818181, 0x7F7F817F, 0x81818181, 0x7F7F7F81, +0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, 0x81818181, +0x7F7F8181, 0x8181817F, 0x7F81817F, 0x81817F81, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F8181, +0x7F7F7F81, 0x7F817F81, 0x8181817F, 0x7F7F817F, 0x81817F81, 0x817F7F81, 0x81818181, 0x8181817F, +0x817F7F81, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x7F818181, 0x817F817F, 0x7F81817F, 0x817F8181, +0x8181817F, 0x81817F7F, 0x817F7F81, 0x81817F7F, 0x817F7F7F, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, +0x7F7F7F81, 0x7F7F8181, 0x7F7F8181, 0x7F817F7F, 0x8181817F, 0x817F8181, 0x817F817F, 0x81818181, +0x81817F7F, 0x817F7F81, 0x7F81817F, 0x81818181, 0x81818181, 0x7F817F7F, 0x7F81817F, 0x7F7F7F81, +0x7F7F7F81, 0x7F817F81, 0x7F818181, 0x817F7F7F, 0x7F7F817F, 0x8181817F, 0x7F817F81, 0x7F817F81, +0x7F817F81, 0x81818181, 0x817F8181, 0x7F817F81, 0x817F7F81, 0x7F7F8181, 0x7F7F817F, 0x8181817F, +0x81817F81, 0x81817F7F, 0x7F7F8181, 0x81817F81, 0x817F7F81, 0x817F8181, 0x7F818181, 0x817F7F7F, +0x817F817F, 0x817F8181, 0x7F7F817F, 0x8181817F, 0x7F817F7F, 0x81817F81, 0x7F817F81, 0x8181817F, +0x817F8181, 0x7F7F817F, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, +0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x817F7F7F, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x7F7F8181, +0x817F7F7F, 0x817F8181, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F818181, +0x7F817F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F81817F, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x81818181, +0x7F818181, 0x817F7F7F, 0x817F7F81, 0x81818181, 0x81817F81, 0x817F8181, 0x7F7F7F81, 0x7F81817F, +0x7F818181, 0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x81818181, 0x817F7F7F, +0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x817F817F, 0x7F817F7F, 0x81817F81, 0x7F81817F, +0x817F7F81, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F817F7F, 0x7F818181, +0x7F7F8181, 0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x817F817F, +0x817F7F7F, 0x7F818181, 0x81817F81, 0x817F817F, 0x81818181, 0x817F7F81, 0x817F7F7F, 0x7F7F817F, +0x7F7F8181, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x81817F7F, 0x8181817F, 0x817F8181, +0x817F817F, 0x81818181, 0x7F7F817F, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x817F7F7F, +0x817F817F, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x7F818181, 0x7F7F8181, 0x8181817F, 0x7F817F7F, +0x7F7F7F7F, 0x7F81817F, 0x7F817F81, 0x817F7F7F, 0x817F7F81, 0x8181817F, 0x81818181, 0x817F7F81, +0x7F81817F, 0x7F817F7F, 0x7F817F7F, 0x81818181, 0x81817F7F, 0x7F81817F, 0x81817F7F, 0x81818181, +0x7F7F7F81, 0x817F817F, 0x7F7F8181, 0x7F817F81, 0x817F817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F817F, +0x7F7F7F81, 0x7F818181, 0x7F817F81, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x817F8181, +0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x81817F7F, 0x81817F7F, 0x81817F81, 0x81817F81, 0x8181817F, +0x817F8181, 0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x7F81817F, 0x7F818181, 0x81817F81, +0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x81817F81, 0x7F7F8181, 0x7F818181, 0x817F817F, 0x7F7F7F81, +0x7F818181, 0x7F817F81, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x817F7F7F, 0x8181817F, 0x81817F7F, +0x7F818181, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, 0x8181817F, +0x7F818181, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, +0x7F7F7F81, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x7F818181, 0x7F817F81, 0x7F7F7F7F, +0x7F818181, 0x7F7F7F7F, 0x81817F81, 0x7F818181, 0x817F8181, 0x81817F81, 0x817F7F81, 0x7F7F8181, +0x7F7F7F81, 0x817F817F, 0x7F817F81, 0x7F818181, 0x7F817F81, 0x81818181, 0x81817F81, 0x7F817F81, +0x7F7F7F81, 0x7F817F81, 0x81818181, 0x81817F81, 0x817F817F, 0x7F7F8181, 0x817F7F7F, 0x81817F81, +0x7F7F7F7F, 0x817F7F81, 0x817F817F, 0x7F817F7F, 0x7F81817F, 0x81817F81, 0x81818181, 0x7F81817F, +0x81817F81, 0x81817F81, 0x81817F7F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x817F7F81, 0x8181817F, +0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F817F7F, 0x7F817F81, +0x7F818181, 0x8181817F, 0x817F817F, 0x7F7F7F81, 0x81817F7F, 0x817F7F81, 0x8181817F, 0x7F818181, +0x7F7F8181, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x81818181, 0x817F8181, 0x81817F7F, +0x7F7F817F, 0x81817F7F, 0x7F818181, 0x7F817F81, 0x81817F7F, 0x81817F81, 0x817F8181, 0x8181817F, +0x81817F7F, 0x7F818181, 0x7F7F817F, 0x817F8181, 0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x7F7F817F, +0x817F8181, 0x8181817F, 0x7F7F8181, 0x7F817F7F, 0x8181817F, 0x7F817F7F, 0x817F7F81, 0x81817F7F, +0x8181817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x817F7F81, +0x81818181, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, 0x7F817F81, 0x817F7F81, 0x81817F81, 0x81817F7F, +0x7F81817F, 0x7F817F7F, 0x81817F81, 0x7F81817F, 0x7F81817F, 0x817F8181, 0x81818181, 0x7F817F81, +0x817F817F, 0x7F7F7F7F, 0x8181817F, 0x817F817F, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x7F818181, +0x7F7F8181, 0x7F817F7F, 0x817F817F, 0x8181817F, 0x81818181, 0x8181817F, 0x817F8181, 0x817F8181, +0x7F818181, 0x8181817F, 0x817F817F, 0x817F8181, 0x7F817F7F, 0x7F81817F, 0x7F817F81, 0x8181817F, +0x7F817F81, 0x7F81817F, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x81818181, 0x817F817F, 0x817F7F7F, +0x817F817F, 0x817F8181, 0x81817F7F, 0x7F817F7F, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x81817F7F, +0x817F817F, 0x81817F7F, 0x7F818181, 0x817F7F81, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x81818181, +0x817F8181, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x7F7F817F, 0x817F7F7F, 0x8181817F, +0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x7F81817F, 0x817F8181, 0x7F81817F, 0x81817F81, +0x7F817F7F, 0x81817F81, 0x8181817F, 0x8181817F, 0x81817F7F, 0x817F817F, 0x7F818181, 0x81817F7F, +0x817F7F7F, 0x8181817F, 0x7F817F7F, 0x7F81817F, 0x7F81817F, 0x817F7F7F, 0x81817F7F, 0x7F817F7F, +0x7F818181, 0x81817F81, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x81817F81, 0x7F7F8181, 0x817F7F7F, +0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, +0x817F817F, 0x7F7F817F, 0x7F81817F, 0x817F7F7F, 0x817F817F, 0x7F81817F, 0x81818181, 0x81817F7F, +0x81817F7F, 0x81817F7F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x81818181, 0x817F817F, +0x7F7F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F817F81, 0x817F8181, +0x7F7F817F, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x817F7F81, 0x7F7F817F, 0x7F7F8181, +0x8181817F, 0x81817F7F, 0x7F817F7F, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x81818181, 0x81817F7F, +0x8181817F, 0x817F7F81, 0x8181817F, 0x7F7F7F81, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x7F7F7F7F, +0x7F7F7F7F, 0x7F818181, 0x81817F81, 0x81817F81, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x817F7F81, +0x7F7F7F81, 0x81817F7F, 0x8181817F, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x7F817F81, 0x817F8181, +0x7F7F8181, 0x8181817F, 0x7F818181, 0x817F8181, 0x81817F81, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, +0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F81, 0x817F7F81, 0x7F81817F, 0x81817F7F, 0x81818181, +0x81817F81, 0x8181817F, 0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x81817F81, +0x7F7F7F7F, 0x817F7F7F, 0x817F7F81, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x817F7F7F, +0x81818181, 0x817F817F, 0x817F7F81, 0x81817F81, 0x817F7F81, 0x817F8181, 0x7F81817F, 0x7F817F81, +0x7F7F7F7F, 0x8181817F, 0x7F818181, 0x7F7F817F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F817F, +0x7F817F7F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x817F817F, 0x81817F81, +0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, 0x7F817F7F, +0x7F7F7F81, 0x7F817F81, 0x817F817F, 0x7F7F817F, 0x7F81817F, 0x81818181, 0x817F8181, 0x7F7F8181, +0x7F817F7F, 0x7F817F81, 0x81817F81, 0x8181817F, 0x81818181, 0x7F81817F, 0x7F817F81, 0x7F7F817F, +0x817F7F81, 0x817F7F7F, 0x817F7F81, 0x817F7F81, 0x81818181, 0x817F7F7F, 0x8181817F, 0x817F7F81, +0x81817F7F, 0x7F7F8181, 0x81817F81, 0x7F818181, 0x7F817F7F, 0x817F7F7F, 0x7F81817F, 0x7F817F81, +0x7F817F81, 0x817F817F, 0x81818181, 0x8181817F, 0x817F817F, 0x7F7F8181, 0x7F817F7F, 0x7F818181, +0x7F7F817F, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x81817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, +0x7F7F817F, 0x817F7F81, 0x817F817F, 0x7F81817F, 0x817F817F, 0x81817F81, 0x81817F81, 0x7F7F7F7F, +0x81818181, 0x817F7F7F, 0x7F7F8181, 0x7F7F8181, 0x7F81817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, +0x81818181, 0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x817F7F7F, 0x817F7F81, 0x817F8181, +0x7F7F7F81, 0x7F817F7F, 0x7F81817F, 0x7F817F81, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F7F, +0x81818181, 0x7F7F7F7F, 0x7F7F8181, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x81817F81, 0x8181817F, +0x7F817F81, 0x81817F7F, 0x817F817F, 0x7F817F7F, 0x817F817F, 0x7F817F7F, 0x7F81817F, 0x7F7F7F7F, +0x817F7F81, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, +0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, 0x7F817F81, 0x7F817F81, 0x7F81817F, 0x817F7F7F, +0x7F818181, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x8181817F, 0x7F81817F, 0x7F81817F, +0x817F7F81, 0x81818181, 0x817F817F, 0x817F7F81, 0x817F8181, 0x81817F81, 0x81818181, 0x7F7F7F7F, +0x7F7F817F, 0x7F817F81, 0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F818181, +0x817F7F7F, 0x7F818181, 0x8181817F, 0x81818181, 0x81817F7F, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, +0x817F817F, 0x7F817F7F, 0x8181817F, 0x81817F81, 0x7F817F81, 0x7F7F8181, 0x81817F81, 0x817F8181, +0x7F7F7F7F, 0x817F8181, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x817F8181, 0x7F818181, 0x7F818181, +0x7F817F7F, 0x7F7F8181, 0x7F817F7F, 0x817F7F7F, 0x7F817F81, 0x81818181, 0x817F817F, 0x7F7F7F81, +0x81818181, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F8181, +0x817F8181, 0x81817F81, 0x81817F7F, 0x817F7F81, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x7F7F817F, +0x7F7F817F, 0x817F7F81, 0x817F7F81, 0x817F817F, 0x7F7F8181, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, +0x817F817F, 0x7F817F7F, 0x7F7F8181, 0x7F81817F, 0x7F7F8181, 0x8181817F, 0x817F8181, 0x81817F7F, +0x817F8181, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, +0x7F7F817F, 0x7F7F817F, 0x817F817F, 0x7F817F7F, 0x7F817F7F, 0x7F817F7F, 0x7F817F7F, 0x7F817F7F, +0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x81817F7F, 0x817F817F, 0x81818181, 0x81817F7F, 0x7F7F7F7F, +0x817F8181, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, 0x817F7F81, 0x81817F81, +0x7F7F817F, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F7F817F, 0x81818181, 0x8181817F, 0x7F7F7F7F, +0x7F817F81, 0x817F817F, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x7F817F81, 0x817F7F81, 0x817F817F, +0x7F7F7F7F, 0x8181817F, 0x81817F7F, 0x817F8181, 0x817F7F81, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, +0x7F817F81, 0x81817F81, 0x817F7F7F, 0x81818181, 0x81818181, 0x7F81817F, 0x817F817F, 0x7F818181, +0x7F7F7F7F, 0x7F81817F, 0x7F817F81, 0x817F8181, 0x817F7F7F, 0x7F818181, 0x81818181, 0x8181817F, +0x817F7F7F, 0x7F7F817F, 0x81817F81, 0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F817F81, 0x7F7F817F, +0x817F817F, 0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F81817F, +0x7F7F817F, 0x817F817F, 0x817F7F81, 0x7F7F817F, 0x817F7F7F, 0x81817F81, 0x81817F81, 0x7F7F7F81, +0x7F7F7F81, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x7F7F8181, 0x817F8181, 0x7F7F817F, 0x7F818181, +0x7F817F81, 0x81817F7F, 0x7F818181, 0x817F7F81, 0x7F81817F, 0x817F7F81, 0x7F818181, 0x81817F7F, +0x7F818181, 0x817F817F, 0x7F7F7F7F, 0x7F818181, 0x81817F81, 0x7F7F7F81, 0x81818181, 0x7F818181, +0x7F7F7F7F, 0x7F817F7F, 0x7F817F81, 0x81817F81, 0x817F7F81, 0x817F7F81, 0x817F7F7F, 0x81817F7F, +0x7F818181, 0x7F817F81, 0x7F7F817F, 0x81817F81, 0x7F817F81, 0x8181817F, 0x81817F7F, 0x7F7F7F7F, +0x7F7F817F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x81818181, +0x7F817F7F, 0x7F7F7F81, 0x8181817F, 0x7F7F7F7F, 0x7F7F7F81, 0x817F817F, 0x81817F81, 0x7F7F7F7F, +0x817F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F8181, 0x817F7F7F, 0x81818181, 0x7F7F8181, 0x7F7F7F81, +0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x7F7F817F, +0x81818181, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x81818181, 0x817F7F81, 0x7F817F81, 0x81818181, +0x7F817F7F, 0x817F7F81, 0x8181817F, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x817F7F81, +0x7F7F7F7F, 0x7F817F7F, 0x817F8181, 0x7F818181, 0x817F7F81, 0x817F817F, 0x8181817F, 0x7F817F7F, +0x7F7F7F7F, 0x7F7F817F, 0x7F817F7F, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x7F818181, 0x817F7F81, +0x7F817F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x7F7F817F, +0x7F7F817F, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x7F818181, 0x7F818181, 0x7F7F7F81, 0x817F817F, +0x8181817F, 0x817F7F7F, 0x81818181, 0x7F81817F, 0x81817F81, 0x7F81817F, 0x81818181, 0x817F7F81, +0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, 0x81818181, 0x7F7F817F, 0x8181817F, 0x8181817F, +0x7F817F81, 0x817F7F7F, 0x8181817F, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x7F7F7F81, 0x817F7F7F, +0x817F817F, 0x81818181, 0x7F817F7F, 0x817F8181, 0x8181817F, 0x81817F7F, 0x81817F81, 0x7F7F7F81, +0x7F817F7F, 0x7F818181, 0x8181817F, 0x7F7F817F, 0x7F817F81, 0x7F7F8181, 0x7F7F8181, 0x8181817F, +0x81817F7F, 0x7F81817F, 0x81817F7F, 0x7F7F7F81, 0x7F81817F, 0x7F817F7F, 0x81818181, 0x7F7F7F81, +0x7F81817F, 0x7F81817F, 0x7F7F817F, 0x7F818181, 0x7F7F7F81, 0x81818181, 0x7F818181, 0x7F81817F, +0x81817F81, 0x817F7F81, 0x817F7F81, 0x81817F81, 0x81818181, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F81, +0x817F817F, 0x7F7F7F7F, 0x81817F7F, 0x81817F7F, 0x8181817F, 0x7F818181, 0x81818181, 0x817F817F, +0x817F7F81, 0x7F7F8181, 0x81817F7F, 0x817F7F81, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F818181, +0x7F817F81, 0x817F7F7F, 0x7F7F8181, 0x81818181, 0x7F7F817F, 0x7F817F81, 0x817F7F7F, 0x817F7F7F, +0x7F817F81, 0x7F817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x81818181, 0x81818181, 0x7F818181, +0x817F7F81, 0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x7F7F7F7F, +0x7F817F7F, 0x81817F7F, 0x7F81817F, 0x817F8181, 0x817F8181, 0x81818181, 0x7F7F8181, 0x7F7F7F81, +0x817F7F7F, 0x7F7F7F81, 0x81818181, 0x81817F81, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x7F7F8181, +0x81818181, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x817F7F81, 0x817F7F7F, +0x817F817F, 0x7F817F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, 0x817F817F, 0x7F81817F, 0x7F817F81, +0x7F817F7F, 0x817F8181, 0x817F7F81, 0x7F81817F, 0x817F7F81, 0x817F7F81, 0x81818181, 0x7F818181, +0x81817F7F, 0x817F8181, 0x81817F81, 0x7F817F81, 0x81818181, 0x7F818181, 0x7F7F817F, 0x817F7F7F, +0x817F7F81, 0x817F7F81, 0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x81817F81, 0x817F817F, 0x7F7F8181, +0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F817F, 0x7F818181, 0x817F817F, 0x817F817F, 0x817F7F7F, +0x817F8181, 0x7F818181, 0x7F7F8181, 0x817F8181, 0x817F8181, 0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, +0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x81817F81, 0x81817F7F, 0x81818181, 0x817F817F, 0x7F7F7F7F, +0x7F818181, 0x7F818181, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x8181817F, +0x817F8181, 0x7F7F7F81, 0x7F7F817F, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F817F7F, +0x817F817F, 0x817F8181, 0x817F8181, 0x7F7F817F, 0x7F81817F, 0x817F8181, 0x817F817F, 0x81818181, +0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x7F818181, 0x7F7F817F, 0x8181817F, 0x7F817F81, +0x817F7F7F, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x7F7F8181, +0x7F7F7F81, 0x7F7F8181, 0x817F8181, 0x817F817F, 0x81817F7F, 0x7F817F7F, 0x81817F7F, 0x7F7F8181, +0x8181817F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, +0x7F817F81, 0x81817F7F, 0x817F817F, 0x7F7F817F, 0x7F817F81, 0x7F7F7F7F, 0x817F7F81, 0x8181817F, +0x81817F81, 0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, 0x8181817F, 0x81818181, +0x817F7F81, 0x7F818181, 0x81818181, 0x81818181, 0x817F817F, 0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, +0x7F7F8181, 0x7F81817F, 0x817F8181, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, 0x7F81817F, +0x7F7F8181, 0x7F817F7F, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F817F7F, +0x7F7F8181, 0x817F817F, 0x7F81817F, 0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x7F7F7F81, 0x7F7F7F81 + +output0 = +0xB6D49CE2, 0x3E96B93F, 0xF02009F6, 0x2DF3D30D, 0x3B06C160, 0x646C69CC, 0x54439F0F, 0xCE0D12C3, +0x66E8BFD5, 0xA9D22B0C, 0xA9E7343B, 0x2B6EEF01, 0x6B6966C0, 0xB98FE144, 0xC3BF7BAD, 0x1B40DF1C, +0x973B12DC, 0x46E25E90, 0xB324ACCA, 0x5F0ED2B9, 0xBB4F + +basegraph= +2 + +z_c= +72 + +n_cb= +3600 + +q_m= +2 + +n_filler= +64 + +e = +6624 + +rv_index = +0 + +code_block_mode = +1 + +iter_max = +20 + +expected_iter_count = +6 + +op_flags = +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v9503.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v9503.data new file mode 100644 index 0000000000..7699ae3157 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v9503.data @@ -0,0 +1,1215 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_DEC + +input0 = +0x81818181, 0x7F818181, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x7F7F817F, 0x7F81817F, 0x7F818181, +0x8181817F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F817F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x817F7F81, +0x7F7F8181, 0x817F7F7F, 0x7F7F7F81, 0x8181817F, 0x817F7F81, 0x7F7F8181, 0x7F818181, 0x7F7F817F, +0x817F817F, 0x7F818181, 0x8181817F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x817F817F, +0x7F818181, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, +0x7F7F8181, 0x7F817F7F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F81, 0x81817F7F, +0x7F817F81, 0x81817F81, 0x7F81817F, 0x817F7F7F, 0x7F7F817F, 0x7F817F7F, 0x817F817F, 0x81817F81, +0x7F817F81, 0x7F7F817F, 0x7F818181, 0x81817F7F, 0x7F7F817F, 0x7F7F817F, 0x8181817F, 0x7F817F81, +0x7F7F8181, 0x7F7F7F81, 0x81817F7F, 0x817F8181, 0x81817F81, 0x817F8181, 0x7F817F81, 0x7F7F8181, +0x81817F7F, 0x7F7F7F7F, 0x81818181, 0x817F817F, 0x817F7F81, 0x7F817F81, 0x81817F7F, 0x817F7F7F, +0x7F7F8181, 0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x81817F81, 0x7F817F7F, 0x81818181, 0x81817F7F, +0x817F7F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F8181, +0x81818181, 0x817F7F81, 0x817F7F81, 0x81818181, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F81817F, +0x81818181, 0x817F8181, 0x81818181, 0x81817F81, 0x7F7F817F, 0x7F81817F, 0x817F817F, 0x817F7F81, +0x817F7F81, 0x7F817F81, 0x817F7F81, 0x817F817F, 0x81817F7F, 0x817F7F7F, 0x7F81817F, 0x81818181, +0x817F8181, 0x817F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x8181817F, +0x81817F81, 0x8181817F, 0x7F81817F, 0x7F817F7F, 0x817F7F7F, 0x81818181, 0x81818181, 0x81817F81, +0x81817F7F, 0x7F81817F, 0x7F81817F, 0x7F7F8181, 0x817F7F81, 0x81818181, 0x81818181, 0x817F7F7F, +0x7F7F817F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x7F7F817F, 0x81817F7F, 0x7F7F817F, 0x81817F7F, +0x81817F7F, 0x7F81817F, 0x81818181, 0x7F7F817F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F7F8181, +0x81817F81, 0x7F7F817F, 0x817F7F81, 0x817F7F7F, 0x7F817F81, 0x81818181, 0x817F7F7F, 0x7F7F7F81, +0x817F7F81, 0x81818181, 0x817F8181, 0x8181817F, 0x7F81817F, 0x7F818181, 0x817F8181, 0x7F7F7F81, +0x817F7F81, 0x7F7F8181, 0x817F8181, 0x7F817F7F, 0x81817F7F, 0x7F817F7F, 0x7F7F7F81, 0x8181817F, +0x817F817F, 0x817F7F81, 0x81817F81, 0x817F817F, 0x7F818181, 0x81817F7F, 0x7F81817F, 0x7F7F8181, +0x7F817F7F, 0x81818181, 0x8181817F, 0x817F7F7F, 0x7F818181, 0x7F817F81, 0x7F817F7F, 0x817F8181, +0x817F7F7F, 0x7F817F81, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F817F7F, 0x817F817F, 0x7F817F7F, +0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, 0x7F818181, 0x817F817F, 0x7F7F8181, +0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, 0x81818181, 0x817F817F, 0x817F8181, 0x7F817F7F, +0x7F7F817F, 0x7F7F7F81, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F7F, +0x7F81817F, 0x7F81817F, 0x8181817F, 0x7F7F7F7F, 0x7F818181, 0x7F7F817F, 0x7F817F81, 0x81817F81, +0x7F7F817F, 0x7F81817F, 0x81818181, 0x7F7F8181, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x7F817F81, +0x817F7F81, 0x817F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F7F, 0x817F7F81, 0x81818181, 0x7F7F7F7F, +0x7F7F7F81, 0x7F7F817F, 0x7F818181, 0x817F7F7F, 0x817F7F81, 0x81818181, 0x7F7F7F81, 0x7F817F7F, +0x7F81817F, 0x81817F81, 0x81817F7F, 0x81817F81, 0x817F8181, 0x817F817F, 0x817F817F, 0x817F7F7F, +0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x817F817F, +0x817F8181, 0x7F817F81, 0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x81817F81, 0x81818181, 0x817F7F7F, +0x7F81817F, 0x7F81817F, 0x81818181, 0x817F7F81, 0x817F8181, 0x7F81817F, 0x81817F81, 0x817F7F81, +0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x817F817F, +0x7F81817F, 0x7F81817F, 0x7F81817F, 0x817F817F, 0x7F817F7F, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, +0x817F7F7F, 0x7F81817F, 0x7F817F7F, 0x7F818181, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x7F817F7F, +0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x7F817F81, +0x81818181, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F81, 0x7F817F81, 0x81818181, 0x817F8181, 0x8181817F, +0x7F7F8181, 0x817F817F, 0x817F8181, 0x817F8181, 0x817F7F81, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, +0x817F7F81, 0x8181817F, 0x81817F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, +0x81817F7F, 0x7F7F8181, 0x7F7F817F, 0x7F817F81, 0x7F81817F, 0x817F7F81, 0x7F7F817F, 0x7F7F8181, +0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x817F817F, 0x81817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F7F, +0x81817F81, 0x7F817F7F, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x817F817F, 0x7F818181, 0x7F818181, +0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F817F81, 0x7F81817F, +0x817F817F, 0x81817F7F, 0x8181817F, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x7F7F7F81, 0x81817F7F, +0x7F7F7F7F, 0x8181817F, 0x817F8181, 0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F817F7F, +0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F81817F, 0x817F7F7F, 0x7F818181, 0x817F817F, 0x7F818181, +0x8181817F, 0x7F81817F, 0x81817F7F, 0x7F7F7F7F, 0x817F817F, 0x7F817F7F, 0x7F818181, 0x817F8181, +0x81817F7F, 0x7F817F81, 0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x817F817F, 0x817F8181, 0x817F7F81, +0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F8181, +0x817F8181, 0x7F7F817F, 0x81818181, 0x7F81817F, 0x7F818181, 0x81818181, 0x81817F81, 0x7F7F7F7F, +0x817F7F81, 0x81817F81, 0x8181817F, 0x7F7F817F, 0x817F8181, 0x8181817F, 0x7F817F81, 0x817F7F81, +0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x81817F7F, 0x7F817F7F, +0x817F7F81, 0x8181817F, 0x7F7F817F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, 0x7F817F81, 0x7F817F81, +0x7F7F7F81, 0x81817F7F, 0x8181817F, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x81818181, +0x8181817F, 0x817F817F, 0x81817F7F, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F818181, 0x8181817F, +0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x817F7F81, 0x7F7F817F, 0x7F817F81, 0x81817F7F, +0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x7F7F7F81, +0x7F818181, 0x7F7F8181, 0x817F8181, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F81, 0x81818181, 0x81818181, +0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x817F7F81, 0x817F817F, +0x7F7F817F, 0x7F81817F, 0x7F818181, 0x7F7F817F, 0x7F7F8181, 0x81817F81, 0x81817F81, 0x817F7F7F, +0x7F7F817F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x81817F7F, +0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x81818181, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x817F8181, +0x81817F7F, 0x7F7F8181, 0x7F7F7F81, 0x8181817F, 0x817F8181, 0x817F7F7F, 0x7F81817F, 0x817F7F81, +0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x7F7F817F, 0x7F7F7F81, 0x817F817F, +0x7F817F7F, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F7F, 0x7F817F7F, 0x81818181, 0x7F817F7F, +0x7F81817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x7F7F7F7F, 0x7F817F81, +0x81817F7F, 0x7F817F81, 0x817F7F81, 0x81817F7F, 0x81817F81, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, +0x8181817F, 0x817F817F, 0x7F817F7F, 0x81817F7F, 0x8181817F, 0x7F818181, 0x817F8181, 0x81817F7F, +0x7F818181, 0x81818181, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x7F818181, 0x81817F7F, 0x7F81817F, +0x81818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x8181817F, 0x7F817F81, 0x7F818181, 0x817F817F, +0x7F7F8181, 0x817F7F81, 0x81817F81, 0x817F817F, 0x81817F7F, 0x817F817F, 0x7F7F817F, 0x7F817F81, +0x7F817F81, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x7F81817F, 0x7F817F81, 0x7F7F7F7F, 0x817F7F7F, +0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x81818181, 0x817F7F81, 0x81817F81, 0x7F81817F, 0x81818181, +0x817F8181, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x8181817F, 0x7F7F8181, 0x7F818181, 0x81817F81, +0x81818181, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x81818181, 0x81817F81, 0x817F7F7F, +0x7F81817F, 0x7F7F7F7F, 0x817F7F81, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x817F7F81, 0x7F7F8181, +0x7F7F817F, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, 0x817F7F7F, 0x81818181, 0x7F817F81, 0x817F7F81, +0x817F8181, 0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F81817F, 0x817F817F, 0x817F7F7F, +0x817F7F81, 0x8181817F, 0x817F817F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F817F, 0x817F817F, 0x81818181, +0x7F7F817F, 0x817F7F81, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F7F8181, 0x7F81817F, 0x817F817F, +0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, +0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x7F818181, 0x7F7F7F81, 0x81818181, 0x817F7F81, 0x7F818181, +0x7F7F7F81, 0x7F81817F, 0x817F817F, 0x7F81817F, 0x81817F81, 0x7F817F7F, 0x81818181, 0x817F7F7F, +0x7F7F7F7F, 0x7F817F7F, 0x81818181, 0x81817F81, 0x7F7F8181, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, +0x817F817F, 0x817F8181, 0x7F81817F, 0x7F7F7F7F, 0x7F818181, 0x7F7F8181, 0x817F8181, 0x7F817F81, +0x8181817F, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x7F818181, 0x817F8181, +0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, +0x7F817F81, 0x81817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F81817F, 0x81817F81, 0x7F817F81, 0x817F8181, +0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x81817F81, 0x81817F81, 0x7F817F81, 0x7F7F7F7F, 0x81817F7F, +0x817F817F, 0x7F7F8181, 0x81817F7F, 0x817F817F, 0x817F817F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, +0x7F7F817F, 0x7F81817F, 0x7F7F7F81, 0x7F81817F, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x7F818181, +0x7F7F8181, 0x7F81817F, 0x7F818181, 0x7F7F7F7F, 0x817F8181, 0x817F7F81, 0x81818181, 0x817F8181, +0x817F8181, 0x7F817F7F, 0x7F81817F, 0x81818181, 0x817F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x817F7F81, +0x8181817F, 0x7F818181, 0x7F7F7F81, 0x817F817F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x8181817F, +0x817F7F7F, 0x81817F7F, 0x7F81817F, 0x81817F7F, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x7F7F817F, +0x81818181, 0x81818181, 0x7F818181, 0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x81817F81, +0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, +0x81818181, 0x81817F7F, 0x7F818181, 0x817F8181, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x7F7F7F7F, +0x8181817F, 0x817F7F7F, 0x81817F7F, 0x7F817F81, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x7F818181, +0x7F818181, 0x7F818181, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x7F7F8181, 0x7F818181, +0x8181817F, 0x817F8181, 0x81818181, 0x7F7F8181, 0x81817F7F, 0x7F7F7F81, 0x7F818181, 0x817F817F, +0x7F818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x7F817F7F, 0x7F7F817F, 0x8181817F, +0x81818181, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x817F7F7F, +0x817F7F81, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x817F817F, 0x7F7F8181, 0x81817F81, +0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F818181, 0x7F7F8181, 0x81817F81, 0x7F818181, 0x7F817F81, +0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, 0x81817F81, 0x7F817F81, +0x7F81817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, +0x8181817F, 0x817F7F7F, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F817F81, 0x817F817F, +0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x817F817F, 0x7F7F817F, 0x81817F81, 0x8181817F, 0x7F817F7F, +0x7F7F7F81, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x817F817F, +0x7F81817F, 0x817F7F7F, 0x817F8181, 0x817F8181, 0x8181817F, 0x7F7F817F, 0x7F7F8181, 0x81818181, +0x817F7F7F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F7F, 0x817F8181, +0x817F8181, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F7F7F81, +0x7F7F7F81, 0x817F8181, 0x8181817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F81, 0x81817F81, 0x8181817F, +0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x7F7F817F, 0x817F8181, +0x817F7F7F, 0x8181817F, 0x7F81817F, 0x7F7F7F81, 0x81817F81, 0x81818181, 0x81817F7F, 0x7F7F8181, +0x8181817F, 0x8181817F, 0x817F817F, 0x8181817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x81818181, +0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F81817F, 0x817F7F81, 0x81817F81, 0x7F818181, +0x7F7F817F, 0x7F7F8181, 0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, +0x817F817F, 0x7F81817F, 0x7F81817F, 0x81817F81, 0x7F817F7F, 0x7F7F817F, 0x81818181, 0x81817F7F, +0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x7F7F7F81, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, +0x7F7F7F81, 0x8181817F, 0x7F7F7F81, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x7F818181, +0x81817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x817F817F, 0x81817F7F, 0x81817F7F, 0x7F81817F, +0x817F7F81, 0x8181817F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F81, 0x8181817F, 0x7F818181, 0x81818181, +0x7F7F8181, 0x8181817F, 0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x817F7F81, 0x817F8181, 0x81817F81, +0x817F817F, 0x7F817F81, 0x7F817F7F, 0x81817F7F, 0x81818181, 0x8181817F, 0x7F7F817F, 0x7F818181, +0x8181817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, 0x7F81817F, +0x7F7F8181, 0x8181817F, 0x81817F81, 0x7F818181, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x7F817F7F, +0x817F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x7F7F7F7F, +0x817F8181, 0x7F7F817F, 0x817F8181, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x81817F7F, 0x8181817F, +0x81818181, 0x7F7F8181, 0x7F7F7F81, 0x7F81817F, 0x817F8181, 0x817F817F, 0x817F817F, 0x817F8181, +0x7F817F7F, 0x817F7F7F, 0x7F817F81, 0x7F81817F, 0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F81817F, +0x7F817F7F, 0x7F817F81, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x817F7F81, 0x7F81817F, 0x817F8181, +0x7F817F7F, 0x817F817F, 0x7F7F8181, 0x817F7F81, 0x81818181, 0x7F7F7F7F, 0x7F81817F, 0x7F81817F, +0x817F8181, 0x7F818181, 0x7F7F8181, 0x817F7F81, 0x81817F7F, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, +0x81817F7F, 0x7F81817F, 0x817F7F7F, 0x817F8181, 0x7F7F8181, 0x7F817F81, 0x81818181, 0x8181817F, +0x7F7F7F81, 0x81817F81, 0x7F817F81, 0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x7F817F81, 0x81818181, +0x817F7F81, 0x7F817F7F, 0x8181817F, 0x8181817F, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, +0x817F8181, 0x8181817F, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x817F817F, 0x817F7F7F, +0x7F7F817F, 0x7F817F81, 0x8181817F, 0x81817F81, 0x817F8181, 0x7F818181, 0x7F817F7F, 0x817F817F, +0x817F7F7F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F8181, 0x817F8181, 0x7F818181, +0x7F7F7F81, 0x817F8181, 0x817F817F, 0x817F817F, 0x7F7F7F81, 0x81817F7F, 0x817F7F81, 0x7F81817F, +0x7F7F8181, 0x8181817F, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x7F81817F, 0x817F7F81, 0x7F7F8181, +0x817F8181, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, 0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x81817F81, +0x7F817F7F, 0x817F7F7F, 0x817F8181, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, 0x817F7F81, +0x817F8181, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x817F817F, 0x7F7F7F7F, 0x7F817F81, +0x7F818181, 0x817F8181, 0x81817F81, 0x7F7F8181, 0x7F7F817F, 0x81818181, 0x7F7F8181, 0x817F8181, +0x8181817F, 0x817F817F, 0x81817F7F, 0x7F817F7F, 0x817F7F81, 0x81818181, 0x81817F81, 0x7F7F7F81, +0x817F817F, 0x817F817F, 0x817F7F81, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F81817F, 0x7F7F817F, +0x7F817F81, 0x817F7F7F, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x817F7F81, 0x7F818181, 0x817F8181, +0x817F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x81818181, +0x817F7F7F, 0x81817F81, 0x7F818181, 0x81817F81, 0x7F817F81, 0x817F7F81, 0x7F817F7F, 0x817F7F81, +0x7F7F8181, 0x7F7F7F7F, 0x81817F81, 0x7F817F7F, 0x7F7F817F, 0x7F7F817F, 0x817F7F81, 0x7F817F7F, +0x7F7F817F, 0x817F817F, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x7F7F7F81, 0x7F817F7F, 0x7F7F8181, +0x7F7F7F81, 0x7F818181, 0x7F818181, 0x817F7F81, 0x7F817F81, 0x817F7F7F, 0x7F7F817F, 0x7F817F81, +0x81817F7F, 0x7F7F8181, 0x7F7F8181, 0x7F7F8181, 0x81817F7F, 0x7F817F7F, 0x7F7F7F81, 0x7F818181, +0x8181817F, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x817F817F, 0x7F7F7F81, 0x81817F81, +0x7F817F7F, 0x7F7F817F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F7F8181, 0x8181817F, 0x817F817F, +0x81817F81, 0x7F818181, 0x817F7F7F, 0x817F7F81, 0x7F817F81, 0x817F7F7F, 0x7F7F7F81, 0x7F817F81, +0x7F81817F, 0x817F817F, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x7F818181, 0x817F7F81, 0x7F7F8181, +0x81818181, 0x817F8181, 0x7F7F7F81, 0x7F81817F, 0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x8181817F, +0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x81818181, 0x81817F81, 0x7F7F7F81, +0x81818181, 0x81817F81, 0x81818181, 0x7F817F7F, 0x7F7F817F, 0x81818181, 0x7F81817F, 0x7F7F7F7F, +0x817F7F81, 0x7F7F817F, 0x7F7F8181, 0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F817F81, 0x7F817F81, +0x81818181, 0x817F817F, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F8181, 0x7F7F7F7F, 0x81817F81, +0x817F7F7F, 0x817F7F81, 0x7F7F8181, 0x81817F81, 0x7F7F8181, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, +0x817F817F, 0x81818181, 0x7F818181, 0x817F7F7F, 0x7F818181, 0x7F817F81, 0x817F817F, 0x7F81817F, +0x7F818181, 0x81818181, 0x7F7F7F81, 0x817F8181, 0x81817F7F, 0x81817F81, 0x817F8181, 0x81817F7F, +0x7F7F7F7F, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F7F, +0x7F817F81, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, 0x817F8181, 0x8181817F, 0x81817F81, 0x7F818181, +0x7F7F817F, 0x817F7F81, 0x7F7F7F81, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, +0x81817F7F, 0x7F7F7F7F, 0x7F818181, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x81817F81, 0x817F817F, +0x817F7F7F, 0x817F7F81, 0x81818181, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x7F7F8181, 0x7F817F7F, +0x7F817F7F, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x81818181, 0x817F7F7F, 0x817F7F7F, 0x7F7F8181, +0x817F817F, 0x817F7F81, 0x817F7F81, 0x81818181, 0x8181817F, 0x7F818181, 0x7F7F7F7F, 0x7F81817F, +0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x7F818181, 0x7F81817F, 0x8181817F, 0x7F7F7F81, +0x81817F81, 0x81817F81, 0x7F7F8181, 0x81818181, 0x7F7F817F, 0x7F81817F, 0x81817F7F, 0x817F8181, +0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F818181, 0x817F817F, +0x817F817F, 0x81817F7F, 0x7F7F8181, 0x81818181, 0x8181817F, 0x7F817F81, 0x7F7F7F81, 0x7F818181, +0x817F817F, 0x817F8181, 0x7F7F8181, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x7F818181, +0x81817F81, 0x81818181, 0x7F7F817F, 0x81817F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, 0x7F818181, +0x7F817F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x81818181, 0x81817F7F, 0x817F8181, 0x7F818181, 0x81818181, +0x81817F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F7F7F, 0x817F817F, 0x7F7F8181, +0x7F818181, 0x8181817F, 0x7F818181, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x817F7F7F, +0x7F7F817F, 0x817F7F7F, 0x7F7F817F, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x7F817F81, 0x81817F81, +0x7F7F817F, 0x7F81817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, +0x7F7F8181, 0x81818181, 0x817F7F81, 0x7F7F7F7F, 0x7F818181, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F817F, +0x817F7F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, +0x7F7F7F7F, 0x81818181, 0x817F817F, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F817F81, 0x81818181, +0x7F81817F, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x7F7F8181, 0x817F8181, +0x817F8181, 0x7F7F817F, 0x7F7F7F81, 0x7F817F81, 0x7F7F817F, 0x81817F7F, 0x8181817F, 0x7F7F7F7F, +0x81817F81, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x7F7F817F, +0x81818181, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, 0x817F8181, 0x7F7F7F81, +0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x817F8181, 0x817F8181, 0x81818181, 0x81818181, 0x7F7F8181, +0x817F7F81, 0x7F818181, 0x7F7F8181, 0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x7F817F81, 0x7F817F7F, +0x7F7F8181, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x7F7F817F, +0x81817F7F, 0x7F818181, 0x7F818181, 0x8181817F, 0x81818181, 0x7F818181, 0x817F8181, 0x7F7F7F81, +0x7F817F81, 0x817F817F, 0x81817F81, 0x7F7F817F, 0x7F818181, 0x7F81817F, 0x81817F81, 0x817F7F7F, +0x7F7F8181, 0x817F8181, 0x817F7F81, 0x817F817F, 0x7F7F8181, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, +0x7F81817F, 0x81818181, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F7F8181, 0x7F7F8181, +0x817F7F81, 0x7F7F7F81, 0x817F817F, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x8181817F, 0x7F7F7F7F, +0x7F81817F, 0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x817F8181, 0x7F817F7F, 0x817F817F, 0x8181817F, +0x7F7F817F, 0x7F81817F, 0x81818181, 0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x7F7F7F81, 0x817F817F, +0x7F817F81, 0x817F7F81, 0x7F818181, 0x7F817F81, 0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, +0x817F8181, 0x7F7F817F, 0x817F817F, 0x8181817F, 0x817F8181, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, +0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x7F7F817F, 0x7F7F8181, +0x817F8181, 0x81818181, 0x81818181, 0x7F817F81, 0x817F7F81, 0x817F7F7F, 0x7F7F817F, 0x7F818181, +0x7F817F7F, 0x8181817F, 0x7F7F7F81, 0x7F818181, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F7F7F7F, +0x817F8181, 0x7F81817F, 0x7F817F81, 0x817F817F, 0x8181817F, 0x7F817F81, 0x81818181, 0x81818181, +0x7F817F7F, 0x81817F7F, 0x817F8181, 0x8181817F, 0x7F81817F, 0x7F818181, 0x817F7F7F, 0x8181817F, +0x7F7F8181, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, 0x7F7F7F7F, 0x8181817F, 0x7F7F7F7F, +0x7F817F81, 0x7F817F81, 0x817F8181, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, +0x817F817F, 0x817F8181, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, 0x817F817F, 0x817F7F7F, 0x7F7F8181, +0x7F7F7F7F, 0x7F818181, 0x81817F7F, 0x7F817F81, 0x817F817F, 0x81818181, 0x817F7F7F, 0x7F7F7F7F, +0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x8181817F, 0x81817F7F, 0x817F7F7F, 0x7F7F817F, +0x7F7F8181, 0x817F7F81, 0x817F7F7F, 0x7F817F81, 0x81818181, 0x7F817F81, 0x817F8181, 0x7F7F7F7F, +0x7F7F7F81, 0x7F7F8181, 0x7F817F7F, 0x7F81817F, 0x7F81817F, 0x81818181, 0x81817F81, 0x8181817F, +0x7F7F7F81, 0x817F7F81, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x81817F81, +0x817F7F81, 0x7F81817F, 0x817F817F, 0x8181817F, 0x7F7F817F, 0x817F817F, 0x7F817F81, 0x817F7F81, +0x81817F7F, 0x7F818181, 0x7F817F7F, 0x81818181, 0x7F818181, 0x7F7F7F7F, 0x7F81817F, 0x817F817F, +0x81818181, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F817F, 0x817F817F, 0x81817F81, 0x8181817F, +0x7F7F8181, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x81818181, 0x7F81817F, +0x7F817F81, 0x817F8181, 0x81818181, 0x817F8181, 0x7F817F81, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F7F7F81, 0x8181817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x817F8181, 0x817F7F7F, 0x7F818181, +0x817F817F, 0x8181817F, 0x817F7F81, 0x7F817F7F, 0x817F817F, 0x7F817F81, 0x7F7F8181, 0x7F817F7F, +0x7F817F81, 0x7F7F817F, 0x81818181, 0x817F7F81, 0x81818181, 0x7F817F81, 0x7F7F7F81, 0x8181817F, +0x81818181, 0x7F817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F817F, 0x817F7F7F, +0x817F8181, 0x8181817F, 0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F817F, +0x7F7F817F, 0x817F817F, 0x7F818181, 0x817F8181, 0x7F818181, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, +0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, +0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x81818181, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x81817F81, +0x817F8181, 0x817F817F, 0x81817F7F, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x81818181, +0x7F818181, 0x7F7F8181, 0x7F81817F, 0x7F817F81, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x817F7F81, +0x81817F81, 0x7F817F7F, 0x81818181, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, 0x817F7F81, 0x81817F81, +0x81817F81, 0x7F817F81, 0x817F8181, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x7F817F81, 0x7F818181, +0x7F81817F, 0x7F818181, 0x7F7F7F7F, 0x81817F7F, 0x7F817F7F, 0x7F7F817F, 0x7F818181, 0x8181817F, +0x817F8181, 0x7F818181, 0x7F81817F, 0x817F8181, 0x7F81817F, 0x7F7F7F7F, 0x7F818181, 0x817F817F, +0x81818181, 0x817F7F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F817F, 0x7F81817F, 0x81817F7F, +0x7F7F7F81, 0x7F817F7F, 0x81817F81, 0x8181817F, 0x817F817F, 0x817F7F81, 0x81818181, 0x817F8181, +0x7F818181, 0x7F7F817F, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x7F7F7F7F, 0x81818181, 0x817F7F7F, +0x817F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F8181, 0x7F818181, 0x7F817F81, 0x7F81817F, 0x7F81817F, +0x7F81817F, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x81818181, 0x8181817F, +0x7F818181, 0x7F7F8181, 0x7F818181, 0x7F7F8181, 0x7F817F7F, 0x7F7F817F, 0x817F817F, 0x7F7F8181, +0x817F7F7F, 0x7F7F7F81, 0x81817F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x81817F81, +0x7F817F81, 0x81817F81, 0x7F817F81, 0x81817F7F, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, +0x7F81817F, 0x7F817F7F, 0x81818181, 0x7F7F817F, 0x817F817F, 0x81818181, 0x7F7F817F, 0x7F81817F, +0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x7F7F8181, 0x81817F7F, +0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F7F7F, 0x81818181, 0x7F818181, +0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, 0x8181817F, 0x817F8181, 0x81818181, 0x7F818181, 0x7F817F7F, +0x7F7F7F81, 0x81818181, 0x81817F7F, 0x81817F7F, 0x7F7F8181, 0x81818181, 0x81817F7F, 0x7F817F81, +0x817F8181, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x817F817F, 0x7F817F7F, 0x817F7F7F, 0x817F817F, +0x8181817F, 0x8181817F, 0x817F7F81, 0x81817F81, 0x7F81817F, 0x817F7F81, 0x817F7F81, 0x81818181, +0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F7F7F7F, +0x81817F7F, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x7F7F817F, 0x8181817F, 0x81817F81, 0x81818181, +0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x81817F81, 0x7F7F7F81, 0x7F817F7F, +0x7F817F81, 0x7F7F8181, 0x7F817F81, 0x8181817F, 0x817F7F7F, 0x817F817F, 0x7F7F7F7F, 0x817F817F, +0x7F817F7F, 0x7F817F7F, 0x7F817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x81817F7F, +0x7F817F81, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x7F7F7F7F, 0x817F817F, 0x8181817F, 0x817F8181, +0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x817F7F7F, 0x81817F81, 0x81817F7F, 0x817F8181, +0x81818181, 0x81817F7F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x81817F81, 0x7F817F7F, 0x817F7F7F, +0x817F7F7F, 0x817F817F, 0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F7F7F81, +0x817F817F, 0x7F81817F, 0x817F7F81, 0x8181817F, 0x817F7F81, 0x817F8181, 0x81818181, 0x7F7F7F7F, +0x817F7F81, 0x7F817F81, 0x817F817F, 0x817F7F7F, 0x81817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, +0x817F8181, 0x81817F7F, 0x7F81817F, 0x81817F81, 0x81818181, 0x81817F81, 0x7F7F8181, 0x81818181, +0x81818181, 0x817F7F81, 0x81818181, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x8181817F, 0x817F8181, +0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, +0x7F817F7F, 0x8181817F, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x817F7F81, 0x7F7F7F81, 0x817F817F, +0x7F81817F, 0x817F7F81, 0x817F817F, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x81818181, 0x817F8181, +0x7F7F817F, 0x81817F7F, 0x817F8181, 0x817F817F, 0x817F8181, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F7F, +0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, 0x81817F81, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F81, +0x817F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F817F81, 0x817F8181, 0x7F818181, 0x817F817F, 0x7F7F7F7F, +0x817F7F7F, 0x81818181, 0x81817F7F, 0x7F818181, 0x817F817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, +0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x7F817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, +0x8181817F, 0x81818181, 0x7F81817F, 0x7F7F7F7F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x7F7F8181, +0x7F7F7F7F, 0x817F817F, 0x8181817F, 0x7F818181, 0x817F7F81, 0x817F8181, 0x7F7F8181, 0x817F8181, +0x7F7F7F7F, 0x7F818181, 0x817F817F, 0x817F7F7F, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, +0x7F7F817F, 0x817F817F, 0x8181817F, 0x817F817F, 0x7F7F817F, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, +0x817F817F, 0x8181817F, 0x817F7F7F, 0x817F817F, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, +0x817F817F, 0x81817F7F, 0x7F81817F, 0x81818181, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, +0x8181817F, 0x7F817F7F, 0x8181817F, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, +0x817F7F81, 0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x817F8181, 0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, +0x817F817F, 0x7F7F8181, 0x81818181, 0x7F817F7F, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x7F817F7F, +0x817F8181, 0x7F817F7F, 0x7F817F81, 0x7F817F81, 0x7F817F7F, 0x7F81817F, 0x8181817F, 0x817F817F, +0x81817F7F, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, 0x7F7F8181, +0x817F817F, 0x817F7F81, 0x8181817F, 0x7F818181, 0x8181817F, 0x7F81817F, 0x81817F81, 0x7F817F81, +0x7F817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x7F817F7F, +0x81817F7F, 0x817F8181, 0x817F8181, 0x81818181, 0x81818181, 0x817F7F81, 0x817F817F, 0x7F818181, +0x7F818181, 0x7F81817F, 0x81817F81, 0x81817F81, 0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x81818181, +0x7F817F7F, 0x81817F81, 0x7F817F7F, 0x7F817F81, 0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F7F817F, +0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F818181, 0x7F7F7F81, +0x817F8181, 0x817F817F, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x81817F81, 0x7F7F8181, 0x817F8181, +0x817F817F, 0x817F7F7F, 0x7F7F817F, 0x8181817F, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x81818181, +0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F817F7F, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x81817F7F, +0x7F817F7F, 0x7F817F81, 0x81817F81, 0x817F7F7F, 0x7F7F817F, 0x81818181, 0x817F7F7F, 0x7F7F8181, +0x7F7F817F, 0x817F817F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F7F8181, +0x81817F7F, 0x7F817F81, 0x81817F81, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x7F817F7F, 0x81817F7F, +0x81818181, 0x817F8181, 0x817F8181, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x81818181, +0x7F81817F, 0x817F7F7F, 0x81818181, 0x7F818181, 0x81818181, 0x81817F7F, 0x7F817F81, 0x7F817F81, +0x7F817F81, 0x7F7F7F81, 0x81817F81, 0x81817F7F, 0x817F8181, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, +0x7F7F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F81, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x7F817F7F, +0x81817F81, 0x7F7F817F, 0x7F7F817F, 0x7F817F81, 0x7F7F8181, 0x81818181, 0x7F817F81, 0x817F8181, +0x81817F81, 0x7F7F817F, 0x81818181, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x817F8181, 0x81818181, +0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x817F817F, 0x7F818181, 0x7F7F817F, 0x7F81817F, +0x817F817F, 0x7F7F8181, 0x7F817F81, 0x817F7F7F, 0x7F7F817F, 0x81817F81, 0x7F7F8181, 0x7F818181, +0x817F817F, 0x7F817F81, 0x7F81817F, 0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x8181817F, 0x817F817F, +0x7F817F7F, 0x7F7F8181, 0x7F818181, 0x81817F7F, 0x81817F7F, 0x8181817F, 0x817F8181, 0x817F817F, +0x7F7F8181, 0x817F8181, 0x81818181, 0x7F818181, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F817F, +0x817F7F7F, 0x7F7F8181, 0x7F817F81, 0x81817F81, 0x8181817F, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, +0x817F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F7F, 0x81818181, 0x817F7F81, 0x81817F7F, 0x7F7F817F, +0x7F7F8181, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, +0x8181817F, 0x7F818181, 0x7F817F7F, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, +0x817F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x8181817F, 0x81818181, 0x81817F81, +0x7F818181, 0x7F7F8181, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, 0x81818181, 0x7F81817F, 0x8181817F, +0x7F817F81, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x81817F81, 0x817F817F, 0x7F7F7F81, 0x81817F81, +0x7F7F8181, 0x7F817F7F, 0x81817F81, 0x817F8181, 0x7F817F81, 0x81817F7F, 0x7F7F8181, 0x7F818181, +0x7F81817F, 0x7F7F7F81, 0x817F7F7F, 0x817F8181, 0x81817F81, 0x7F817F7F, 0x7F7F7F7F, 0x7F817F7F, +0x7F81817F, 0x7F7F8181, 0x7F7F7F81, 0x7F817F81, 0x817F7F7F, 0x81818181, 0x7F7F8181, 0x7F7F8181, +0x7F7F817F, 0x7F818181, 0x7F817F81, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, 0x817F7F81, +0x7F818181, 0x7F817F81, 0x7F817F7F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, 0x8181817F, +0x7F7F7F81, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x7F817F7F, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F7F, +0x817F817F, 0x7F81817F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x81818181, 0x81817F81, 0x817F817F, +0x7F7F7F81, 0x7F7F7F81, 0x81817F7F, 0x817F7F7F, 0x81817F7F, 0x81817F81, 0x817F817F, 0x7F817F81, +0x7F7F7F7F, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x7F7F8181, +0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x7F818181, 0x7F817F7F, +0x81817F81, 0x817F7F81, 0x7F81817F, 0x81817F81, 0x8181817F, 0x8181817F, 0x81817F7F, 0x81817F81, +0x817F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x8181817F, 0x817F8181, 0x7F7F7F7F, 0x7F81817F, 0x7F81817F, +0x817F7F7F, 0x7F7F817F, 0x7F817F7F, 0x7F7F817F, 0x81817F7F, 0x81818181, 0x817F7F7F, 0x81817F7F, +0x8181817F, 0x817F8181, 0x81818181, 0x7F818181, 0x7F7F817F, 0x817F817F, 0x817F7F7F, 0x7F7F817F, +0x817F817F, 0x81817F81, 0x817F7F81, 0x7F818181, 0x7F7F8181, 0x8181817F, 0x817F817F, 0x7F7F8181, +0x7F7F7F7F, 0x81818181, 0x817F8181, 0x81817F7F, 0x817F817F, 0x81818181, 0x81817F81, 0x817F7F81, +0x7F7F8181, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x8181817F, 0x817F817F, 0x7F7F7F7F, +0x7F7F8181, 0x7F817F81, 0x81818181, 0x7F818181, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x817F8181, +0x8181817F, 0x7F7F8181, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x7F817F7F, 0x81817F7F, 0x81818181, +0x7F818181, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, +0x7F817F81, 0x81818181, 0x81818181, 0x7F817F7F, 0x7F7F8181, 0x817F7F81, 0x817F817F, 0x7F7F817F, +0x81818181, 0x81817F7F, 0x817F7F81, 0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x81818181, +0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x817F817F, 0x817F7F7F, 0x81817F81, +0x817F7F81, 0x7F81817F, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x81817F81, 0x817F7F7F, 0x7F818181, +0x81817F81, 0x817F7F81, 0x8181817F, 0x7F7F817F, 0x7F818181, 0x817F7F81, 0x817F7F81, 0x81817F7F, +0x7F7F7F7F, 0x81818181, 0x817F7F7F, 0x7F817F81, 0x817F8181, 0x817F817F, 0x8181817F, 0x817F7F7F, +0x817F8181, 0x817F8181, 0x81818181, 0x7F7F817F, 0x8181817F, 0x81817F7F, 0x7F7F8181, 0x817F7F81, +0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x8181817F, 0x817F7F81, +0x81818181, 0x817F7F81, 0x817F817F, 0x7F7F7F81, 0x7F817F7F, 0x81818181, 0x7F7F8181, 0x8181817F, +0x817F8181, 0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x7F7F817F, 0x7F7F8181, 0x7F817F81, +0x7F7F8181, 0x8181817F, 0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x7F7F7F7F, 0x81818181, +0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, +0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x817F7F81, 0x817F817F, 0x7F7F817F, 0x81817F7F, +0x817F7F7F, 0x7F817F81, 0x817F7F7F, 0x7F818181, 0x81818181, 0x817F7F7F, 0x817F7F81, 0x81817F7F, +0x7F81817F, 0x7F817F7F, 0x7F7F8181, 0x7F818181, 0x817F8181, 0x817F8181, 0x817F8181, 0x7F7F8181, +0x7F81817F, 0x7F817F7F, 0x7F817F81, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x81817F81, 0x7F7F817F, +0x7F81817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, 0x817F7F81, 0x817F8181, 0x7F7F817F, +0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x817F7F81, 0x81817F7F, 0x7F817F81, 0x8181817F, +0x7F818181, 0x7F7F7F7F, 0x81817F7F, 0x8181817F, 0x81817F81, 0x7F81817F, 0x8181817F, 0x7F817F81, +0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x817F7F7F, 0x81817F81, +0x81818181, 0x8181817F, 0x817F817F, 0x7F818181, 0x7F81817F, 0x81817F81, 0x7F7F817F, 0x817F817F, +0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x8181817F, 0x7F818181, 0x8181817F, 0x817F8181, 0x7F817F7F, +0x7F7F8181, 0x817F8181, 0x7F81817F, 0x81817F81, 0x817F817F, 0x7F818181, 0x81818181, 0x817F7F81, +0x7F81817F, 0x8181817F, 0x81817F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F817F, 0x817F8181, 0x81817F7F, +0x7F817F7F, 0x817F7F7F, 0x817F7F7F, 0x7F81817F, 0x7F81817F, 0x81818181, 0x7F7F7F7F, 0x817F817F, +0x7F7F817F, 0x7F818181, 0x7F7F7F81, 0x817F8181, 0x817F8181, 0x817F817F, 0x7F817F7F, 0x817F7F7F, +0x8181817F, 0x7F818181, 0x81818181, 0x817F817F, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F7F8181, +0x81817F81, 0x817F7F7F, 0x7F7F817F, 0x817F817F, 0x81817F81, 0x7F81817F, 0x817F7F81, 0x7F81817F, +0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F7F, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x817F817F, +0x8181817F, 0x7F817F81, 0x7F7F817F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, 0x81817F81, 0x817F8181, +0x7F7F7F7F, 0x817F817F, 0x7F817F81, 0x81817F7F, 0x817F7F81, 0x7F7F817F, 0x7F7F817F, 0x817F8181, +0x81817F81, 0x7F7F817F, 0x81818181, 0x817F7F81, 0x817F8181, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, +0x81818181, 0x817F7F81, 0x817F817F, 0x7F81817F, 0x81817F7F, 0x81818181, 0x817F7F7F, 0x817F7F7F, +0x81817F81, 0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, +0x817F7F81, 0x817F7F81, 0x7F817F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F7F81, 0x81817F81, 0x81818181, +0x7F817F81, 0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x817F817F, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, +0x7F7F7F81, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x7F7F8181, 0x817F817F, 0x7F818181, 0x817F7F81, +0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F81, 0x81818181, 0x7F81817F, 0x81817F81, 0x7F817F81, 0x81818181, +0x817F817F, 0x7F818181, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x81817F81, +0x7F7F7F81, 0x7F817F81, 0x7F7F817F, 0x817F817F, 0x817F8181, 0x817F8181, 0x817F7F7F, 0x8181817F, +0x7F81817F, 0x7F7F817F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x81818181, 0x81817F81, +0x817F7F7F, 0x81818181, 0x81818181, 0x7F81817F, 0x7F818181, 0x7F817F7F, 0x817F817F, 0x7F7F8181, +0x7F7F817F, 0x7F7F7F81, 0x817F817F, 0x81818181, 0x81818181, 0x817F7F81, 0x7F818181, 0x7F7F8181, +0x7F817F81, 0x7F817F7F, 0x81818181, 0x81817F81, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x7F817F7F, +0x7F7F7F7F, 0x81818181, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x7F817F81, +0x7F7F7F7F, 0x81818181, 0x7F7F8181, 0x81817F81, 0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x8181817F, +0x7F7F7F81, 0x817F8181, 0x8181817F, 0x7F81817F, 0x817F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F818181, +0x7F7F817F, 0x81817F7F, 0x7F7F7F81, 0x8181817F, 0x7F817F7F, 0x817F817F, 0x7F7F817F, 0x7F817F81, +0x817F7F7F, 0x7F817F81, 0x7F7F8181, 0x7F7F817F, 0x81818181, 0x7F817F7F, 0x81817F81, 0x81817F81, +0x7F818181, 0x7F818181, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x817F7F81, 0x81818181, 0x817F817F, +0x81817F81, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F817F81, 0x7F81817F, 0x817F7F81, 0x817F8181, +0x7F7F8181, 0x817F7F81, 0x7F7F817F, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x7F818181, 0x7F7F7F81, +0x7F818181, 0x817F817F, 0x7F818181, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x81817F7F, 0x7F818181, +0x7F817F81, 0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x7F7F817F, 0x7F817F81, 0x7F7F817F, 0x7F817F81, +0x7F7F7F81, 0x7F817F7F, 0x81817F7F, 0x817F7F7F, 0x7F81817F, 0x7F81817F, 0x7F7F817F, 0x7F817F7F, +0x7F817F81, 0x81817F81, 0x7F7F7F81, 0x817F817F, 0x7F817F81, 0x81818181, 0x817F8181, 0x7F817F81, +0x7F7F8181, 0x81817F81, 0x817F7F7F, 0x81817F81, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x7F7F8181, +0x7F818181, 0x7F818181, 0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F7F817F, 0x7F817F7F, 0x817F7F7F, +0x81818181, 0x7F817F7F, 0x81817F81, 0x7F81817F, 0x7F7F8181, 0x817F7F81, 0x817F8181, 0x7F7F8181, +0x7F818181, 0x7F817F81, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x81817F7F, 0x7F818181, 0x817F7F7F, +0x81818181, 0x817F7F81, 0x81818181, 0x7F817F7F, 0x817F7F7F, 0x81817F7F, 0x8181817F, 0x81817F81, +0x817F7F81, 0x81818181, 0x81817F81, 0x7F7F8181, 0x81818181, 0x7F7F8181, 0x7F7F8181, 0x81818181, +0x7F7F7F81, 0x8181817F, 0x81818181, 0x81817F7F, 0x7F7F7F81, 0x81818181, 0x81817F7F, 0x817F8181, +0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F817F81, 0x81817F81, 0x8181817F, 0x817F7F7F, +0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x7F7F817F, 0x81817F7F, 0x81818181, 0x7F817F7F, 0x817F8181, +0x817F8181, 0x7F7F8181, 0x81817F81, 0x81817F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, +0x7F7F817F, 0x81817F81, 0x81817F81, 0x7F817F81, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x81818181, +0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F7F8181, 0x7F818181, 0x7F7F817F, 0x7F817F81, +0x817F7F81, 0x7F817F7F, 0x81817F81, 0x817F817F, 0x817F817F, 0x7F817F81, 0x7F81817F, 0x81818181, +0x7F7F7F81, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x81817F7F, +0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x81817F7F, 0x817F817F, 0x7F7F817F, +0x8181817F, 0x7F817F81, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x8181817F, +0x817F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F7F81, 0x817F817F, 0x81817F7F, 0x7F818181, 0x7F7F7F81, +0x7F7F7F81, 0x7F818181, 0x817F817F, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x7F7F7F81, +0x7F817F81, 0x7F818181, 0x817F817F, 0x7F81817F, 0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x81818181, +0x7F7F7F81, 0x7F817F7F, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F81817F, 0x8181817F, 0x7F81817F, +0x817F8181, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x7F7F8181, +0x817F817F, 0x8181817F, 0x817F8181, 0x7F817F7F, 0x7F817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F7F8181, +0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x817F817F, 0x7F817F81, 0x8181817F, 0x7F7F817F, 0x7F7F7F7F, +0x817F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x817F817F, +0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x8181817F, 0x7F817F7F, 0x7F818181, 0x7F817F7F, 0x7F817F81, +0x817F7F81, 0x817F817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, +0x7F7F7F7F, 0x817F7F81, 0x81817F7F, 0x7F817F81, 0x7F7F8181, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, +0x81818181, 0x8181817F, 0x7F817F7F, 0x81818181, 0x81818181, 0x81817F7F, 0x817F8181, 0x817F7F7F, +0x7F817F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x8181817F, 0x8181817F, 0x7F818181, +0x8181817F, 0x7F818181, 0x817F8181, 0x817F7F81, 0x817F8181, 0x81818181, 0x81817F7F, 0x7F7F8181, +0x81818181, 0x81817F81, 0x7F7F7F7F, 0x8181817F, 0x7F81817F, 0x7F7F7F81, 0x7F817F7F, 0x81818181, +0x81817F81, 0x817F8181, 0x7F7F7F7F, 0x8181817F, 0x7F818181, 0x817F8181, 0x817F8181, 0x81817F81, +0x817F817F, 0x81817F81, 0x7F81817F, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, +0x817F817F, 0x817F817F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F817F, 0x81817F81, 0x81817F7F, 0x7F817F7F, +0x7F817F7F, 0x8181817F, 0x7F7F7F7F, 0x817F8181, 0x7F81817F, 0x7F817F7F, 0x8181817F, 0x81817F7F, +0x817F817F, 0x81818181, 0x817F8181, 0x8181817F, 0x7F7F817F, 0x8181817F, 0x7F7F7F7F, 0x7F7F8181, +0x8181817F, 0x7F817F81, 0x817F8181, 0x81817F7F, 0x817F7F7F, 0x81817F81, 0x817F817F, 0x817F7F7F, +0x7F7F817F, 0x7F7F817F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x7F7F7F81, +0x81818181, 0x7F818181, 0x8181817F, 0x7F817F81, 0x817F8181, 0x8181817F, 0x7F817F81, 0x81817F7F, +0x81817F7F, 0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F7F7F, 0x817F817F, +0x7F7F7F81, 0x8181817F, 0x7F7F8181, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, 0x817F7F81, +0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x81818181, 0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x8181817F, +0x7F81817F, 0x817F817F, 0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x8181817F, 0x817F7F81, 0x81817F7F, +0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x817F7F7F, 0x7F7F7F7F, +0x817F7F81, 0x7F817F81, 0x817F817F, 0x81817F7F, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, +0x7F81817F, 0x7F7F8181, 0x8181817F, 0x8181817F, 0x8181817F, 0x81817F81, 0x81818181, 0x817F7F7F, +0x81818181, 0x7F817F81, 0x817F8181, 0x7F818181, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x817F7F7F, +0x817F7F7F, 0x81818181, 0x7F81817F, 0x817F817F, 0x81818181, 0x7F7F817F, 0x8181817F, 0x7F7F817F, +0x7F818181, 0x817F817F, 0x7F7F8181, 0x817F7F7F, 0x81818181, 0x81817F81, 0x7F81817F, 0x817F817F, +0x81817F81, 0x7F81817F, 0x7F7F8181, 0x7F81817F, 0x817F817F, 0x7F7F8181, 0x81818181, 0x817F817F, +0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x817F817F, 0x7F817F7F, 0x817F7F7F, 0x8181817F, +0x81817F7F, 0x7F7F817F, 0x7F81817F, 0x7F7F817F, 0x81818181, 0x81817F81, 0x7F7F7F81, 0x817F817F, +0x7F7F7F7F, 0x7F81817F, 0x7F7F7F7F, 0x81818181, 0x81818181, 0x817F8181, 0x81817F81, 0x7F7F7F81, +0x81818181, 0x81818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, 0x7F7F817F, 0x817F8181, +0x7F7F7F81, 0x817F8181, 0x7F7F817F, 0x81817F7F, 0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, +0x81817F81, 0x8181817F, 0x7F7F817F, 0x7F7F817F, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F8181, +0x7F81817F, 0x81817F81, 0x81818181, 0x7F81817F, 0x7F818181, 0x7F7F8181, 0x81817F7F, 0x817F7F7F, +0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x817F817F, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x7F7F7F81, +0x8181817F, 0x81817F7F, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x7F818181, 0x7F817F81, 0x817F7F81, +0x81818181, 0x7F7F8181, 0x7F7F8181, 0x8181817F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F8181, 0x7F7F817F, +0x81818181, 0x7F7F817F, 0x81818181, 0x81818181, 0x7F817F81, 0x817F7F7F, 0x81817F7F, 0x81817F81, +0x81817F81, 0x817F8181, 0x7F81817F, 0x81817F81, 0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x81817F7F, +0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x817F817F, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, +0x817F8181, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x817F7F81, 0x7F7F8181, +0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x7F7F817F, 0x7F818181, 0x7F817F81, 0x817F817F, 0x817F7F7F, +0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x7F7F8181, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F7F, 0x817F817F, +0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x81818181, +0x81817F7F, 0x81818181, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, 0x81818181, +0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x817F8181, 0x7F7F817F, 0x81817F81, +0x817F817F, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x81818181, 0x817F8181, 0x81817F7F, +0x7F7F8181, 0x7F7F7F7F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x7F7F7F7F, 0x81817F7F, 0x81817F7F, +0x817F7F81, 0x817F8181, 0x81817F81, 0x8181817F, 0x7F7F8181, 0x7F818181, 0x7F7F817F, 0x8181817F, +0x81817F7F, 0x7F7F8181, 0x817F817F, 0x817F8181, 0x7F817F81, 0x81817F81, 0x817F7F7F, 0x7F7F8181, +0x81817F81, 0x817F817F, 0x8181817F, 0x7F818181, 0x7F7F7F81, 0x817F7F81, 0x8181817F, 0x7F7F817F, +0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F8181, +0x817F8181, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F81, 0x81818181, +0x817F7F7F, 0x81817F81, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F7F7F, 0x81817F7F, +0x81817F81, 0x81817F7F, 0x7F817F81, 0x8181817F, 0x7F81817F, 0x81817F7F, 0x7F7F7F81, 0x81817F7F, +0x7F7F7F7F, 0x7F7F817F, 0x817F7F81, 0x817F817F, 0x7F7F817F, 0x81817F7F, 0x7F817F81, 0x817F817F, +0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F81817F, 0x7F7F7F7F, 0x7F818181, +0x817F817F, 0x7F7F8181, 0x81818181, 0x817F817F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x81817F81, +0x81818181, 0x81817F7F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x8181817F, +0x7F817F81, 0x7F817F81, 0x7F818181, 0x817F7F81, 0x7F818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F8181, +0x817F7F81, 0x7F81817F, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x81817F81, +0x7F81817F, 0x81817F7F, 0x81817F81, 0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x7F7F817F, 0x81817F7F, +0x7F818181, 0x81817F81, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x81818181, 0x7F81817F, 0x81818181, +0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x817F7F7F, 0x81818181, 0x817F7F81, +0x7F7F8181, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x817F7F81, 0x817F7F81, 0x817F7F81, 0x817F817F, +0x817F817F, 0x7F817F81, 0x81818181, 0x817F817F, 0x7F818181, 0x81818181, 0x81817F81, 0x81818181, +0x7F7F7F7F, 0x7F817F7F, 0x7F817F81, 0x817F817F, 0x817F7F81, 0x7F817F81, 0x81818181, 0x7F7F7F81, +0x817F7F7F, 0x7F7F7F81, 0x817F817F, 0x7F817F7F, 0x7F818181, 0x7F7F7F81, 0x817F8181, 0x81818181, +0x81817F7F, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, 0x7F818181, +0x81818181, 0x7F7F7F81, 0x7F817F81, 0x8181817F, 0x7F817F7F, 0x7F817F81, 0x7F7F7F81, 0x81817F81, +0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F7F7F, 0x817F8181, 0x817F8181, +0x7F7F8181, 0x7F817F7F, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x8181817F, 0x8181817F, 0x7F7F817F, +0x817F817F, 0x7F81817F, 0x81818181, 0x817F817F, 0x7F7F817F, 0x7F817F81, 0x7F7F7F81, 0x7F818181, +0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x7F7F817F, 0x7F817F81, 0x817F7F81, 0x7F81817F, 0x7F81817F, +0x7F817F81, 0x7F818181, 0x8181817F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x7F817F7F, 0x7F818181, +0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x817F817F, 0x81817F81, 0x81818181, 0x7F7F8181, +0x81817F7F, 0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x817F817F, 0x7F7F7F7F, 0x817F8181, 0x7F7F8181, +0x817F8181, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x81817F81, 0x81818181, 0x8181817F, +0x817F8181, 0x7F818181, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, +0x7F7F817F, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, 0x8181817F, 0x817F8181, 0x817F817F, 0x7F817F81, +0x81817F81, 0x81818181, 0x8181817F, 0x7F7F817F, 0x81817F81, 0x817F8181, 0x7F7F817F, 0x7F7F7F7F, +0x817F7F81, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, +0x7F7F817F, 0x81817F7F, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x817F8181, 0x81817F81, +0x7F81817F, 0x7F7F8181, 0x7F81817F, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, 0x817F817F, 0x817F817F, +0x7F817F7F, 0x7F7F7F7F, 0x817F817F, 0x81817F7F, 0x817F8181, 0x7F81817F, 0x7F817F81, 0x7F81817F, +0x7F817F7F, 0x7F817F81, 0x81817F81, 0x81817F7F, 0x81817F81, 0x817F817F, 0x7F81817F, 0x7F817F81, +0x81817F7F, 0x817F817F, 0x817F7F81, 0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x81817F7F, 0x7F7F817F, +0x7F817F7F, 0x81818181, 0x817F8181, 0x817F7F81, 0x7F7F817F, 0x817F7F7F, 0x817F7F81, 0x7F818181, +0x7F7F7F81, 0x817F817F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x817F8181, +0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x7F7F7F7F, 0x8181817F, 0x817F8181, 0x7F817F81, 0x7F817F7F, +0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x7F7F8181, 0x81818181, 0x81817F81, 0x7F81817F, 0x81818181, +0x7F7F7F81, 0x817F7F7F, 0x81817F81, 0x7F818181, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x8181817F, +0x7F7F7F81, 0x7F81817F, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x817F8181, 0x7F7F8181, 0x7F818181, +0x81817F81, 0x7F817F81, 0x817F7F81, 0x7F81817F, 0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x817F7F7F, +0x7F7F7F81, 0x7F7F817F, 0x7F7F817F, 0x81817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, +0x7F7F817F, 0x81818181, 0x7F7F7F81, 0x8181817F, 0x81817F81, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, +0x7F817F81, 0x817F7F81, 0x81818181, 0x817F7F81, 0x81818181, 0x817F7F81, 0x81817F7F, 0x817F7F81, +0x7F7F8181, 0x81817F81, 0x7F817F81, 0x7F817F81, 0x7F818181, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F7F, +0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F817F7F, 0x81817F7F, +0x7F817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x7F7F7F7F, 0x81818181, 0x81818181, +0x7F7F7F81, 0x817F8181, 0x817F817F, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x7F7F7F81, +0x7F7F7F81, 0x81817F7F, 0x817F8181, 0x817F817F, 0x817F817F, 0x7F818181, 0x817F817F, 0x7F818181, +0x7F7F817F, 0x7F818181, 0x7F7F8181, 0x81817F81, 0x817F7F7F, 0x817F7F7F, 0x8181817F, 0x81817F81, +0x8181817F, 0x81818181, 0x81817F7F, 0x81817F81, 0x8181817F, 0x81817F7F, 0x817F7F81, 0x817F7F81, +0x7F817F81, 0x817F7F81, 0x81818181, 0x8181817F, 0x7F817F81, 0x7F817F81, 0x81818181, 0x81818181, +0x81817F81, 0x8181817F, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x81817F81, 0x81817F81, 0x7F7F7F81, +0x817F817F, 0x7F7F8181, 0x7F818181, 0x7F7F817F, 0x8181817F, 0x7F817F81, 0x7F818181, 0x7F81817F, +0x7F7F8181, 0x7F817F7F, 0x7F817F7F, 0x81818181, 0x817F8181, 0x7F817F81, 0x81818181, 0x81818181, +0x817F8181, 0x8181817F, 0x7F7F7F81, 0x81817F81, 0x817F8181, 0x7F7F7F7F, 0x7F7F817F, 0x8181817F, +0x81818181, 0x7F81817F, 0x7F817F81, 0x7F7F8181, 0x7F7F7F81, 0x81817F81, 0x817F8181, 0x7F81817F, +0x7F818181, 0x817F8181, 0x81817F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x817F8181, 0x7F817F81, +0x7F817F81, 0x81818181, 0x817F817F, 0x7F7F8181, 0x8181817F, 0x81817F7F, 0x817F7F81, 0x817F817F, +0x7F81817F, 0x817F817F, 0x81817F81, 0x817F7F7F, 0x817F7F81, 0x7F81817F, 0x81818181, 0x7F7F7F81, +0x7F7F817F, 0x7F818181, 0x7F7F8181, 0x817F7F81, 0x817F817F, 0x81817F81, 0x81817F7F, 0x817F7F81, +0x81817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F7F, 0x81818181, 0x7F7F7F81, 0x7F817F81, 0x817F8181, +0x7F7F817F, 0x817F8181, 0x7F817F7F, 0x81818181, 0x81817F81, 0x7F7F7F81, 0x8181817F, 0x7F81817F, +0x81817F7F, 0x81817F7F, 0x817F8181, 0x817F8181, 0x817F7F7F, 0x7F817F7F, 0x81818181, 0x81817F7F, +0x817F7F81, 0x817F8181, 0x7F817F81, 0x7F7F817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, +0x817F817F, 0x7F818181, 0x81817F81, 0x81817F7F, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F7F81, +0x7F81817F, 0x7F81817F, 0x7F7F817F, 0x81817F7F, 0x81818181, 0x817F7F7F, 0x7F7F817F, 0x817F8181, +0x8181817F, 0x817F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x7F817F81, +0x81818181, 0x7F817F81, 0x7F817F81, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x817F7F7F, 0x7F7F817F, +0x7F817F7F, 0x817F817F, 0x81818181, 0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, 0x7F7F8181, +0x7F7F7F81, 0x7F7F7F7F, 0x7F81817F, 0x817F8181, 0x7F818181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F8181, +0x7F818181, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, 0x7F7F7F7F, 0x817F7F81, 0x817F817F, +0x7F818181, 0x817F817F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x81817F7F, +0x7F817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F8181, 0x817F7F7F, +0x8181817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x817F8181, 0x817F7F7F, 0x81818181, 0x7F817F81, +0x81817F81, 0x81818181, 0x817F7F81, 0x7F817F7F, 0x7F818181, 0x7F817F81, 0x7F817F81, 0x817F7F7F, +0x817F7F81, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, 0x7F818181, 0x7F81817F, 0x7F817F7F, 0x7F817F81, +0x7F7F8181, 0x81818181, 0x7F7F8181, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F7F, 0x7F81817F, 0x81817F7F, +0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F817F81, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x7F7F8181, +0x81818181, 0x81817F81, 0x7F7F7F81, 0x7F817F81, 0x8181817F, 0x7F7F817F, 0x817F8181, 0x81818181, +0x817F7F81, 0x8181817F, 0x7F818181, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x81818181, 0x7F7F7F7F, +0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x81817F7F, 0x81818181, 0x7F7F8181, 0x7F817F7F, 0x7F81817F, +0x7F7F8181, 0x817F817F, 0x81818181, 0x81818181, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x817F817F, +0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F817F7F, 0x7F817F81, 0x81818181, 0x7F818181, 0x7F81817F, +0x7F7F817F, 0x81817F81, 0x7F817F7F, 0x817F817F, 0x7F818181, 0x81817F7F, 0x817F817F, 0x7F818181, +0x7F7F7F7F, 0x7F7F7F81, 0x817F817F, 0x7F818181, 0x817F817F, 0x7F81817F, 0x8181817F, 0x7F81817F, +0x81817F81, 0x7F818181, 0x7F818181, 0x81818181, 0x81818181, 0x817F817F, 0x8181817F, 0x7F7F7F7F, +0x817F7F81, 0x7F817F81, 0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x81817F81, 0x817F8181, +0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F7F81, 0x817F817F, 0x817F7F81, 0x7F7F7F7F, +0x817F817F, 0x817F817F, 0x7F7F8181, 0x7F818181, 0x7F7F7F7F, 0x7F817F7F, 0x7F817F81, 0x7F7F7F7F, +0x81818181, 0x7F7F817F, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x7F817F7F, 0x7F817F81, 0x81818181, +0x7F817F81, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F7F817F, 0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, +0x817F7F81, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x8181817F, 0x81817F81, 0x81817F81, +0x7F7F817F, 0x7F81817F, 0x817F8181, 0x7F818181, 0x817F817F, 0x81817F81, 0x8181817F, 0x8181817F, +0x817F817F, 0x81818181, 0x817F817F, 0x81817F81, 0x7F817F81, 0x817F7F7F, 0x7F818181, 0x817F8181, +0x81818181, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x7F817F81, 0x81817F7F, 0x817F8181, +0x817F817F, 0x81817F7F, 0x7F818181, 0x817F7F81, 0x817F7F81, 0x81818181, 0x7F81817F, 0x817F8181, +0x81818181, 0x817F817F, 0x7F7F817F, 0x817F7F7F, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x7F7F7F81, +0x7F817F7F, 0x817F7F81, 0x81818181, 0x81817F81, 0x8181817F, 0x7F7F817F, 0x7F81817F, 0x817F817F, +0x7F81817F, 0x817F7F81, 0x817F8181, 0x7F7F8181, 0x81817F7F, 0x7F817F81, 0x81818181, 0x817F8181, +0x7F818181, 0x817F8181, 0x817F8181, 0x817F8181, 0x7F817F81, 0x7F818181, 0x817F7F7F, 0x81817F81, +0x7F7F8181, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x81817F7F, +0x8181817F, 0x7F7F8181, 0x7F7F7F81, 0x817F8181, 0x7F7F8181, 0x7F7F8181, 0x7F7F7F81, 0x8181817F, +0x817F7F81, 0x7F7F817F, 0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x81817F7F, 0x817F8181, 0x7F7F8181, +0x817F8181, 0x7F7F8181, 0x7F817F81, 0x7F81817F, 0x81817F7F, 0x817F817F, 0x8181817F, 0x7F81817F, +0x817F7F7F, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x817F7F81, +0x8181817F, 0x817F7F7F, 0x7F7F817F, 0x7F7F817F, 0x81818181, 0x7F817F81, 0x7F81817F, 0x7F817F7F, +0x7F7F7F7F, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x817F8181, 0x81817F7F, 0x7F7F7F81, 0x81817F7F, +0x7F817F7F, 0x7F7F817F, 0x817F7F81, 0x81817F7F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x7F7F7F81, +0x7F7F7F7F, 0x7F7F817F, 0x81817F7F, 0x7F818181, 0x7F7F817F, 0x817F7F81, 0x7F7F7F81, 0x7F817F81, +0x8181817F, 0x817F817F, 0x817F8181, 0x81818181, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x7F7F7F81, +0x7F7F7F81, 0x7F7F7F7F, 0x81817F7F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F817F7F, 0x7F7F7F7F, +0x7F7F817F, 0x7F818181, 0x7F7F817F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x7F817F81, +0x7F7F7F7F, 0x7F81817F, 0x817F8181, 0x817F7F81, 0x7F7F8181, 0x7F818181, 0x817F7F7F, 0x7F7F7F81, +0x7F7F817F, 0x7F817F81, 0x81818181, 0x7F817F7F, 0x817F7F7F, 0x8181817F, 0x81817F81, 0x7F7F817F, +0x7F7F817F, 0x817F7F7F, 0x817F7F81, 0x81817F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, +0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F817F7F, 0x7F817F81, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, +0x81818181, 0x817F8181, 0x8181817F, 0x817F8181, 0x7F7F8181, 0x817F7F7F, 0x81818181, 0x817F8181, +0x817F8181, 0x7F817F7F, 0x7F7F8181, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x817F817F, 0x81817F81, +0x81817F7F, 0x8181817F, 0x7F818181, 0x817F8181, 0x7F7F8181, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F81, +0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F8181, 0x817F8181, 0x7F7F817F, +0x7F817F7F, 0x7F7F8181, 0x81818181, 0x81818181, 0x7F81817F, 0x817F8181, 0x817F7F81, 0x7F817F81, +0x7F81817F, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x7F818181, 0x8181817F, 0x7F7F8181, +0x817F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, 0x7F81817F, +0x81817F7F, 0x81817F7F, 0x7F81817F, 0x7F817F81, 0x817F8181, 0x817F817F, 0x81817F81, 0x81817F7F, +0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x7F7F817F, 0x81818181, 0x817F7F7F, 0x817F817F, 0x817F8181, +0x817F8181, 0x817F7F81, 0x7F817F81, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x817F8181, 0x81817F81, +0x7F7F7F7F, 0x817F8181, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x81818181, 0x7F817F7F, 0x817F7F7F, +0x817F7F7F, 0x81817F81, 0x81818181, 0x81818181, 0x81818181, 0x81818181, 0x817F817F, 0x7F7F7F7F, +0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x817F8181, 0x8181817F, 0x7F818181, 0x817F7F7F, 0x81817F81, +0x81818181, 0x7F818181, 0x817F8181, 0x7F817F7F, 0x817F7F7F, 0x7F818181, 0x7F7F817F, 0x7F7F7F81, +0x7F818181, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, +0x81818181, 0x7F817F81, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x817F7F7F, 0x81818181, 0x817F7F7F, +0x817F8181, 0x81818181, 0x8181817F, 0x7F817F7F, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x7F7F8181, +0x7F7F817F, 0x7F7F7F7F, 0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x81818181, 0x7F7F817F, 0x81817F81, +0x81818181, 0x817F8181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F8181, 0x81818181, 0x7F817F81, 0x8181817F, +0x817F7F7F, 0x81817F81, 0x7F817F81, 0x81818181, 0x7F817F81, 0x81818181, 0x8181817F, 0x7F817F7F, +0x8181817F, 0x7F818181, 0x8181817F, 0x81818181, 0x81817F81, 0x7F818181, 0x7F817F7F, 0x8181817F, +0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x7F818181, 0x817F817F, +0x817F7F81, 0x7F81817F, 0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F7F, +0x81818181, 0x7F81817F, 0x817F7F81, 0x7F7F8181, 0x817F817F, 0x81818181, 0x81817F7F, 0x7F817F7F, +0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x7F7F8181, 0x7F818181, 0x7F818181, 0x817F7F81, 0x8181817F, +0x817F817F, 0x7F7F8181, 0x81818181, 0x7F81817F, 0x7F818181, 0x7F81817F, 0x817F8181, 0x817F817F, +0x7F7F7F7F, 0x81818181, 0x7F7F817F, 0x817F7F81, 0x7F817F81, 0x7F817F7F, 0x8181817F, 0x7F818181, +0x817F817F, 0x817F7F7F, 0x81817F7F, 0x7F7F817F, 0x7F81817F, 0x7F818181, 0x7F81817F, 0x7F81817F, +0x7F7F817F, 0x81817F7F, 0x7F81817F, 0x7F817F81, 0x8181817F, 0x7F818181, 0x81817F81, 0x817F7F7F, +0x7F81817F, 0x7F818181, 0x7F818181, 0x7F7F817F, 0x81818181, 0x81817F81, 0x817F7F7F, 0x7F817F81, +0x817F7F7F, 0x81817F81, 0x7F7F7F81, 0x8181817F, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x817F8181, +0x817F7F81, 0x7F818181, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x817F8181, 0x817F817F, +0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x8181817F, 0x7F818181, 0x81817F81, 0x7F7F817F, 0x817F7F7F, +0x7F81817F, 0x81817F81, 0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x81817F81, 0x817F7F81, 0x817F8181, +0x81818181, 0x7F81817F, 0x7F817F81, 0x7F817F7F, 0x81817F81, 0x817F817F, 0x7F817F81, 0x7F818181, +0x7F818181, 0x8181817F, 0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x7F818181, +0x8181817F, 0x7F818181, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x7F7F7F7F, 0x7F81817F, +0x81817F7F, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x7F7F7F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, +0x7F817F7F, 0x817F817F, 0x7F817F7F, 0x81817F81, 0x7F818181, 0x7F7F8181, 0x7F818181, 0x817F817F, +0x7F817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x81817F81, 0x7F817F81, 0x817F7F7F, +0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x7F817F7F, 0x7F7F8181, +0x7F817F81, 0x817F7F7F, 0x7F81817F, 0x7F817F7F, 0x817F7F7F, 0x81817F7F, 0x8181817F, 0x7F817F81, +0x81817F7F, 0x817F7F7F, 0x817F8181, 0x7F818181, 0x81817F81, 0x7F7F817F, 0x7F81817F, 0x7F7F7F81, +0x8181817F, 0x7F818181, 0x7F7F817F, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x7F81817F, 0x7F818181, +0x7F7F7F7F, 0x817F817F, 0x81817F7F, 0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F818181, 0x7F81817F, +0x7F818181, 0x7F7F8181, 0x817F817F, 0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, 0x7F818181, +0x7F7F8181, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x817F8181, 0x817F8181, 0x81817F81, 0x7F81817F, +0x7F7F8181, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x7F7F7F81, 0x817F8181, +0x81817F81, 0x7F818181, 0x7F817F81, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, 0x7F7F817F, 0x7F7F7F7F, +0x817F7F7F, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x81818181, 0x7F81817F, 0x7F7F7F81, +0x817F8181, 0x817F7F7F, 0x817F817F, 0x7F7F817F, 0x81817F7F, 0x7F817F81, 0x817F8181, 0x7F817F81, +0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F7F817F, 0x817F8181, 0x7F817F7F, 0x7F7F817F, 0x817F7F7F, +0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x817F8181, +0x817F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x817F817F, 0x817F8181, 0x8181817F, +0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x81817F81, 0x817F8181, +0x7F7F7F81, 0x8181817F, 0x8181817F, 0x81818181, 0x7F7F8181, 0x817F7F81, 0x7F817F7F, 0x817F8181, +0x7F817F81, 0x7F818181, 0x81818181, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F817F7F, 0x7F7F817F, +0x7F7F7F81, 0x7F818181, 0x8181817F, 0x8181817F, 0x81818181, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F81, +0x817F817F, 0x7F817F81, 0x7F818181, 0x8181817F, 0x81817F81, 0x817F7F81, 0x81817F81, 0x7F7F817F, +0x817F8181, 0x7F81817F, 0x7F817F7F, 0x7F817F81, 0x817F817F, 0x81817F7F, 0x7F818181, 0x817F817F, +0x7F7F7F81, 0x817F817F, 0x8181817F, 0x7F7F817F, 0x7F7F7F81, 0x7F817F81, 0x7F818181, 0x817F817F, +0x817F817F, 0x81817F7F, 0x7F817F7F, 0x817F817F, 0x817F8181, 0x817F8181, 0x817F8181, 0x81818181, +0x817F7F81, 0x817F7F7F, 0x81817F7F, 0x81818181, 0x817F7F81, 0x817F8181, 0x8181817F, 0x8181817F, +0x81817F7F, 0x81817F7F, 0x81817F7F, 0x7F7F7F7F, 0x817F7F81, 0x81818181, 0x817F8181, 0x7F7F7F81, +0x817F817F, 0x7F817F7F, 0x7F7F817F, 0x817F7F7F, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x7F817F7F, +0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x81817F81, 0x7F81817F, 0x7F818181, 0x7F817F7F, 0x81818181, +0x81817F81, 0x81817F81, 0x7F7F817F, 0x81817F7F, 0x7F817F7F, 0x7F7F8181, 0x81818181, 0x8181817F, +0x7F81817F, 0x81817F7F, 0x7F7F7F81, 0x7F81817F, 0x817F8181, 0x81817F81, 0x81818181, 0x817F7F7F, +0x7F818181, 0x7F817F7F, 0x7F817F7F, 0x817F817F, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x81817F81, +0x817F7F7F, 0x8181817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, +0x81817F81, 0x81817F7F, 0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x81818181, 0x817F7F7F, 0x817F817F, +0x8181817F, 0x7F817F7F, 0x817F7F81, 0x8181817F, 0x817F8181, 0x7F817F81, 0x8181817F, 0x81818181, +0x7F7F7F81, 0x817F8181, 0x7F817F7F, 0x81818181, 0x7F818181, 0x81817F81, 0x817F7F7F, 0x817F8181, +0x7F818181, 0x7F818181, 0x7F818181, 0x817F817F, 0x7F7F7F81, 0x817F8181, 0x817F7F7F, 0x8181817F, +0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F817F81, 0x81818181, 0x817F7F7F, 0x817F8181, 0x81818181, +0x7F817F7F, 0x7F817F81, 0x817F7F81, 0x81818181, 0x7F7F8181, 0x7F817F7F, 0x7F817F7F, 0x817F8181, +0x7F7F817F, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x8181817F, 0x817F7F81, 0x81818181, 0x7F817F7F, +0x817F817F, 0x817F8181, 0x817F817F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F7F8181, 0x7F817F7F, +0x81817F7F, 0x817F817F, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x7F7F8181, 0x81817F81, 0x817F817F, +0x7F7F7F81, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F7F81, 0x817F7F81, 0x7F81817F, 0x81817F7F, +0x7F817F81, 0x7F818181, 0x81817F7F, 0x7F817F7F, 0x81817F81, 0x8181817F, 0x817F817F, 0x7F7F817F, +0x817F817F, 0x7F7F7F81, 0x817F7F81, 0x817F7F81, 0x7F817F81, 0x81818181, 0x81817F7F, 0x81818181, +0x817F817F, 0x7F817F7F, 0x81817F7F, 0x7F818181, 0x81818181, 0x7F818181, 0x81817F7F, 0x81817F81, +0x81817F7F, 0x7F818181, 0x817F8181, 0x7F7F7F81, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, +0x81817F81, 0x817F8181, 0x81817F81, 0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x817F817F, 0x7F7F7F7F, +0x81817F81, 0x7F7F817F, 0x817F7F81, 0x8181817F, 0x7F7F7F81, 0x81818181, 0x7F7F8181, 0x7F817F7F, +0x81817F81, 0x8181817F, 0x7F817F81, 0x7F817F81, 0x817F7F7F, 0x81818181, 0x7F7F7F81, 0x7F7F8181, +0x817F817F, 0x81817F7F, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x817F8181, 0x7F817F7F, +0x7F81817F, 0x817F817F, 0x7F7F817F, 0x817F8181, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F818181, +0x817F817F, 0x817F7F7F, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x81817F81, 0x7F81817F, 0x7F817F7F, +0x7F81817F, 0x7F7F8181, 0x8181817F, 0x81818181, 0x817F817F, 0x7F7F817F, 0x817F7F7F, 0x81818181, +0x7F817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F818181, 0x81818181, +0x81817F81, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x7F817F81, 0x7F7F7F7F, 0x81817F81, 0x8181817F, +0x7F7F8181, 0x8181817F, 0x817F817F, 0x7F7F8181, 0x81817F7F, 0x7F817F7F, 0x7F818181, 0x817F7F7F, +0x7F817F81, 0x7F817F7F, 0x7F818181, 0x8181817F, 0x7F7F7F7F, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, +0x817F8181, 0x7F81817F, 0x7F818181, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x81817F81, 0x7F7F7F7F, +0x7F7F8181, 0x817F7F7F, 0x8181817F, 0x7F7F7F81, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, +0x8181817F, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x7F7F8181, 0x7F7F817F, +0x81817F7F, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x81817F7F, +0x817F7F81, 0x7F7F7F81, 0x7F818181, 0x817F817F, 0x817F7F81, 0x817F7F7F, 0x817F817F, 0x7F817F7F, +0x81817F81, 0x7F7F817F, 0x7F817F81, 0x81818181, 0x817F8181, 0x817F7F7F, 0x81818181, 0x7F7F817F, +0x8181817F, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x81817F7F, 0x81818181, 0x7F817F81, 0x817F7F81, +0x817F8181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F81817F, 0x8181817F, +0x817F817F, 0x7F817F81, 0x7F817F81, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F7F8181, 0x7F7F8181, +0x7F818181, 0x817F817F, 0x7F7F817F, 0x7F817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x7F818181, +0x81817F7F, 0x817F7F81, 0x81817F81, 0x81817F81, 0x81817F81, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, +0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F817F81, 0x817F817F, 0x81818181, +0x7F7F7F81, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x81817F7F, 0x8181817F, +0x81817F81, 0x817F8181, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x817F7F81, 0x7F818181, +0x817F8181, 0x817F7F7F, 0x817F7F7F, 0x81817F81, 0x7F81817F, 0x817F7F81, 0x7F7F817F, 0x8181817F, +0x81818181, 0x7F7F7F81, 0x81818181, 0x81817F81, 0x817F7F81, 0x7F817F7F, 0x81818181, 0x81817F81, +0x7F7F7F81, 0x817F8181, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, +0x7F817F7F, 0x817F7F81, 0x817F817F, 0x81817F81, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F7F, 0x817F8181, +0x7F817F7F, 0x7F7F7F81, 0x817F7F7F, 0x817F7F81, 0x7F818181, 0x817F7F7F, 0x7F818181, 0x817F817F, +0x81817F7F, 0x8181817F, 0x7F81817F, 0x7F81817F, 0x81817F7F, 0x817F817F, 0x8181817F, 0x817F8181, +0x7F7F7F7F, 0x7F818181, 0x817F817F, 0x817F8181, 0x817F817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, +0x7F7F7F81, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x7F817F81, 0x81818181, 0x8181817F, 0x7F817F7F, +0x7F7F8181, 0x817F8181, 0x81817F7F, 0x81818181, 0x7F818181, 0x817F817F, 0x7F818181, 0x81817F81, +0x817F7F81, 0x7F7F8181, 0x7F817F7F, 0x817F7F81, 0x81817F81, 0x81817F81, 0x81817F81, 0x7F7F8181, +0x817F8181, 0x81817F7F, 0x7F817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, +0x7F81817F, 0x81817F7F, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x7F7F817F, 0x817F7F7F, 0x7F7F8181, +0x81818181, 0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x817F7F7F, 0x7F7F817F, 0x7F81817F, +0x81817F7F, 0x817F7F7F, 0x8181817F, 0x817F817F, 0x81817F7F, 0x81817F7F, 0x817F8181, 0x81817F7F, +0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x81818181, 0x817F817F, +0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x81817F81, 0x81817F7F, 0x817F8181, 0x817F817F, 0x817F8181, +0x817F7F7F, 0x8181817F, 0x81817F81, 0x817F8181, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, 0x7F817F7F, +0x81818181, 0x817F7F81, 0x817F8181, 0x7F7F817F, 0x817F817F, 0x7F7F7F81, 0x81818181, 0x817F7F7F, +0x7F817F81, 0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x81817F81, 0x7F818181, 0x817F817F, +0x7F818181, 0x817F7F7F, 0x81818181, 0x817F7F7F, 0x81818181, 0x817F817F, 0x7F7F7F7F, 0x8181817F, +0x7F7F817F, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x817F7F81, 0x817F8181, +0x7F81817F, 0x81817F81, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, 0x7F7F8181, 0x817F7F81, 0x817F817F, +0x7F817F7F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x81817F81, 0x817F7F81, 0x817F8181, +0x81817F7F, 0x817F7F81, 0x817F7F7F, 0x7F81817F, 0x81817F7F, 0x817F8181, 0x7F817F7F, 0x7F7F7F7F, +0x7F817F81, 0x817F8181, 0x817F8181, 0x7F7F7F81, 0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F7F, +0x817F8181, 0x817F8181, 0x81818181, 0x81817F7F, 0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F81, +0x8181817F, 0x81817F81, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x7F81817F, 0x817F7F81, 0x81817F7F, +0x81818181, 0x7F817F81, 0x81818181, 0x81817F7F, 0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x817F7F81, +0x7F7F817F, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x81818181, 0x7F7F7F81, 0x8181817F, 0x7F818181, +0x817F8181, 0x7F817F81, 0x7F81817F, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x81817F81, 0x8181817F, +0x7F7F7F7F, 0x7F7F817F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F7F7F81, 0x7F7F817F, +0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, 0x81818181, +0x7F7F7F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x7F7F7F7F, +0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x7F817F7F, 0x817F8181, 0x8181817F, 0x7F81817F, 0x7F7F7F81, +0x817F8181, 0x7F7F7F81, 0x81817F81, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x81817F81, 0x8181817F, +0x817F817F, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x7F817F7F, 0x817F7F7F, 0x817F7F81, 0x7F817F81, +0x81817F81, 0x817F7F81, 0x7F7F7F7F, 0x817F8181, 0x8181817F, 0x817F7F7F, 0x7F818181, 0x7F818181, +0x7F7F8181, 0x7F81817F, 0x817F8181, 0x7F817F81, 0x7F817F81, 0x817F8181, 0x817F817F, 0x7F7F817F, +0x7F7F8181, 0x81818181, 0x817F7F7F, 0x7F818181, 0x81818181, 0x8181817F, 0x81818181, 0x7F81817F, +0x7F7F7F81, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, 0x817F7F7F, 0x7F818181, 0x7F81817F, 0x81818181, +0x7F7F7F7F, 0x817F8181, 0x7F7F8181, 0x7F817F81, 0x817F817F, 0x7F818181, 0x817F8181, 0x7F818181, +0x817F7F81, 0x81817F7F, 0x817F8181, 0x7F818181, 0x7F7F817F, 0x7F7F7F7F, 0x7F818181, 0x7F817F81, +0x7F818181, 0x8181817F, 0x7F81817F, 0x7F7F7F7F, 0x7F817F7F, 0x817F8181, 0x817F7F81, 0x7F81817F, +0x7F817F7F, 0x817F7F81, 0x817F817F, 0x7F818181, 0x817F817F, 0x8181817F, 0x7F81817F, 0x81817F81, +0x8181817F, 0x8181817F, 0x7F81817F, 0x7F81817F, 0x7F7F8181, 0x7F7F8181, 0x81818181, 0x81818181, +0x817F7F81, 0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x7F7F7F81, 0x8181817F, 0x7F7F7F7F, 0x817F8181, +0x7F817F7F, 0x7F7F817F, 0x81817F81, 0x7F818181, 0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F817F7F, +0x81818181, 0x7F7F7F81, 0x81817F81, 0x81817F7F, 0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, +0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x81818181, 0x7F817F7F, 0x7F81817F, 0x7F817F81, 0x81817F81, +0x7F7F8181, 0x7F817F81, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x817F7F7F, 0x817F817F, 0x817F8181, +0x817F7F7F, 0x81817F7F, 0x7F81817F, 0x7F81817F, 0x817F7F7F, 0x81818181, 0x817F817F, 0x7F7F7F7F, +0x8181817F, 0x817F817F, 0x7F818181, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x817F817F, 0x81818181, +0x8181817F, 0x7F7F817F, 0x7F818181, 0x817F7F81, 0x81817F7F, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, +0x7F818181, 0x7F7F7F81, 0x81817F81, 0x81817F81, 0x7F81817F, 0x817F817F, 0x7F7F7F81, 0x7F7F7F81, +0x7F817F81, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F7F817F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, +0x7F817F81, 0x81817F81, 0x81817F7F, 0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x81817F7F, 0x817F7F81, +0x7F81817F, 0x817F7F7F, 0x7F7F817F, 0x7F817F81, 0x8181817F, 0x81818181, 0x7F81817F, 0x7F7F8181, +0x817F817F, 0x7F817F7F, 0x817F8181, 0x817F7F7F, 0x7F7F7F81, 0x817F817F, 0x81817F81, 0x7F81817F, +0x7F817F81, 0x7F7F817F, 0x7F817F7F, 0x817F7F81, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x817F7F81, +0x81817F7F, 0x81817F7F, 0x8181817F, 0x7F818181, 0x7F7F8181, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, +0x81818181, 0x7F817F7F, 0x81818181, 0x81817F7F, 0x7F817F7F, 0x7F81817F, 0x7F7F8181, 0x817F8181, +0x8181817F, 0x7F7F7F81, 0x817F817F, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F81, 0x8181817F, 0x7F7F7F81, +0x7F817F81, 0x81817F7F, 0x7F7F7F7F, 0x81817F81, 0x7F817F81, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, +0x7F7F817F, 0x7F7F817F, 0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x7F7F8181, 0x81817F7F, 0x7F81817F, +0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x817F7F7F, 0x817F7F81, 0x817F7F81, 0x817F8181, 0x81818181, +0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81817F81, 0x81817F81, 0x7F81817F, +0x817F7F81, 0x7F817F81, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x7F818181, 0x81817F7F, 0x817F7F81, +0x7F7F817F, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x8181817F, 0x817F7F81, 0x7F7F817F, 0x7F817F81, +0x81817F81, 0x81818181, 0x817F7F7F, 0x817F817F, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x81817F81, +0x7F7F8181, 0x817F7F81, 0x817F817F, 0x817F8181, 0x817F8181, 0x81817F7F, 0x817F7F81, 0x7F817F7F, +0x81817F81, 0x7F81817F, 0x7F817F81, 0x817F8181, 0x7F7F817F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, +0x81817F7F, 0x817F8181, 0x7F818181, 0x81818181, 0x817F7F81, 0x7F81817F, 0x81818181, 0x7F817F81, +0x817F8181, 0x817F7F7F, 0x7F817F7F, 0x7F817F81, 0x7F7F8181, 0x7F817F7F, 0x7F7F7F7F, 0x817F8181, +0x7F81817F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, 0x7F817F7F, 0x7F81817F, 0x7F7F817F, 0x7F7F7F81, +0x81817F7F, 0x8181817F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x81818181, +0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x7F817F7F, 0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x81817F81, +0x81817F81, 0x7F81817F, 0x7F818181, 0x7F818181, 0x81818181, 0x81817F81, 0x7F7F8181, 0x7F81817F, +0x817F8181, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, 0x81817F7F, 0x7F7F7F7F, +0x7F7F817F, 0x81818181, 0x81818181, 0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x817F7F7F, 0x7F817F7F, +0x817F8181, 0x81818181, 0x7F81817F, 0x817F7F7F, 0x7F818181, 0x81818181, 0x8181817F, 0x7F818181, +0x7F817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x817F8181, 0x7F7F7F81, 0x817F817F, 0x81818181, 0x81817F7F, +0x817F8181, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x81818181, +0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x817F817F, 0x7F7F7F7F, 0x817F8181, +0x7F818181, 0x817F8181, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x7F817F81, +0x817F817F, 0x81818181, 0x817F8181, 0x81817F7F, 0x817F7F81, 0x7F817F81, 0x81817F7F, 0x7F81817F, +0x7F7F817F, 0x81817F7F, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x8181817F, 0x7F7F7F81, 0x81817F81, +0x81817F81, 0x817F817F, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x7F7F817F, +0x817F817F, 0x8181817F, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x817F7F81, 0x7F7F817F, 0x817F7F81, +0x7F7F7F81, 0x7F7F817F, 0x817F7F81, 0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F7F817F, 0x7F7F8181, +0x817F7F81, 0x817F7F7F, 0x81818181, 0x7F7F817F, 0x817F817F, 0x81817F81, 0x7F817F7F, 0x7F817F81, +0x7F7F8181, 0x7F817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F81, 0x817F8181, 0x81817F81, 0x81817F81, +0x81818181, 0x817F817F, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, +0x7F817F7F, 0x7F81817F, 0x7F817F81, 0x81817F81, 0x81817F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, +0x7F7F7F81, 0x7F817F81, 0x817F7F7F, 0x7F7F7F81, 0x81818181, 0x81818181, 0x7F7F7F7F, 0x817F7F81, +0x7F7F7F7F, 0x817F8181, 0x817F7F7F, 0x7F7F7F81, 0x817F8181, 0x7F818181, 0x817F7F81, 0x81817F7F, +0x7F817F81, 0x7F7F8181, 0x8181817F, 0x7F7F8181, 0x8181817F, 0x817F817F, 0x81817F81, 0x7F817F81, +0x7F818181, 0x7F81817F, 0x81818181, 0x81817F81, 0x7F817F81, 0x81818181, 0x7F7F7F7F, 0x7F81817F, +0x7F7F7F81, 0x7F817F7F, 0x8181817F, 0x81818181, 0x81817F81, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, +0x81817F7F, 0x7F7F817F, 0x81817F7F, 0x7F817F7F, 0x7F7F7F7F, 0x817F8181, 0x817F7F7F, 0x817F817F, +0x817F7F7F, 0x7F818181, 0x7F817F81, 0x81817F81, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F7F, +0x81818181, 0x81817F7F, 0x817F8181, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, +0x817F7F81, 0x7F81817F, 0x81817F81, 0x81817F81, 0x81817F81, 0x8181817F, 0x7F81817F, 0x817F817F, +0x81817F81, 0x7F7F7F81, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x81817F81, 0x81817F81, +0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F817F, +0x81817F81, 0x7F81817F, 0x81818181, 0x817F7F81, 0x7F817F7F, 0x81818181, 0x8181817F, 0x7F818181, +0x7F817F7F, 0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x7F81817F, +0x817F7F7F, 0x81817F81, 0x81817F81, 0x7F818181, 0x7F818181, 0x7F7F7F7F, 0x7F818181, 0x7F7F8181, +0x7F81817F, 0x817F817F, 0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, +0x8181817F, 0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F8181, 0x7F817F7F, 0x817F817F, 0x81818181, +0x817F7F7F, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x7F817F81, 0x817F8181, 0x81817F7F, 0x7F7F817F, +0x7F817F81, 0x8181817F, 0x817F817F, 0x8181817F, 0x7F817F7F, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, +0x81817F7F, 0x81818181, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F8181, 0x81817F7F, +0x7F818181, 0x81817F81, 0x817F8181, 0x817F7F7F, 0x817F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F81, +0x81818181, 0x81817F7F, 0x81817F81, 0x7F7F8181, 0x817F8181, 0x817F817F, 0x7F818181, 0x81817F81, +0x81818181, 0x81818181, 0x7F7F8181, 0x7F817F7F, 0x817F7F81, 0x817F8181, 0x7F7F817F, 0x81817F7F, +0x7F817F81, 0x7F818181, 0x817F7F81, 0x7F7F8181, 0x81817F7F, 0x8181817F, 0x817F7F81, 0x81817F7F, +0x7F7F7F81, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x817F7F81, 0x817F7F81, +0x817F7F7F, 0x81818181, 0x7F817F81, 0x817F7F7F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x7F81817F, +0x81817F81, 0x817F8181, 0x817F817F, 0x81817F7F, 0x81818181, 0x81818181, 0x817F8181, 0x817F817F, +0x7F7F817F, 0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x8181817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F7F81, +0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x81817F7F, 0x817F8181, +0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, 0x8181817F, +0x817F7F81, 0x81818181, 0x817F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F818181, 0x7F7F817F, 0x7F817F7F, +0x81818181, 0x81817F7F, 0x7F7F8181, 0x817F817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F81, +0x7F7F7F81, 0x817F8181, 0x817F8181, 0x81818181, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, 0x7F817F81, +0x7F7F7F7F, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x81817F7F, 0x817F7F81, 0x817F817F, 0x81817F7F, +0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x817F8181, 0x7F81817F, 0x817F7F81, 0x7F818181, 0x81818181, +0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F7F81, 0x8181817F, 0x81817F7F, 0x81818181, 0x817F7F81, +0x7F81817F, 0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x7F818181, 0x817F7F81, +0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x817F817F, 0x7F818181, +0x7F817F7F, 0x7F7F8181, 0x7F81817F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x817F7F7F, 0x8181817F, +0x7F817F81, 0x7F818181, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F817F7F, 0x817F817F, +0x817F7F81, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F7F8181, 0x7F7F8181, 0x7F818181, 0x7F7F817F, +0x8181817F, 0x8181817F, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, +0x817F7F7F, 0x7F7F8181, 0x817F7F81, 0x817F7F7F, 0x81818181, 0x81818181, 0x81818181, 0x7F7F7F81, +0x7F7F7F7F, 0x7F81817F, 0x7F81817F, 0x8181817F, 0x7F817F81, 0x7F818181, 0x817F8181, 0x8181817F, +0x7F7F7F7F, 0x7F818181, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x8181817F, +0x7F7F817F, 0x81817F81, 0x81818181, 0x7F81817F, 0x81817F81, 0x7F7F8181, 0x81817F7F, 0x7F7F7F81, +0x81818181, 0x817F8181, 0x81818181, 0x817F7F81, 0x81818181, 0x81818181, 0x817F8181, 0x817F8181, +0x7F7F7F81, 0x817F7F7F, 0x7F818181, 0x81817F7F, 0x81817F81, 0x817F8181, 0x817F8181, 0x817F7F7F, +0x7F7F7F7F, 0x81817F81, 0x81817F7F, 0x7F817F81, 0x81817F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F817F, +0x7F817F7F, 0x7F7F7F7F, 0x7F817F81, 0x817F817F, 0x817F8181, 0x817F8181, 0x7F7F817F, 0x7F7F7F81, +0x7F818181, 0x81817F7F, 0x817F8181, 0x817F7F7F, 0x7F81817F, 0x7F7F817F, 0x817F8181, 0x7F7F7F7F, +0x7F818181, 0x7F7F8181, 0x7F81817F, 0x817F7F7F, 0x81818181, 0x817F8181, 0x817F8181, 0x81817F81, +0x817F7F81, 0x7F817F81, 0x8181817F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, 0x8181817F, 0x7F818181, +0x81818181, 0x817F8181, 0x7F817F81, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x81818181, 0x7F7F7F81, +0x7F81817F, 0x7F7F7F81, 0x817F817F, 0x81817F7F, 0x817F817F, 0x7F81817F, 0x81817F81, 0x817F817F, +0x81817F7F, 0x817F8181, 0x817F7F81, 0x81817F7F, 0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x7F7F8181, +0x7F818181, 0x817F7F81, 0x7F7F7F7F, 0x817F8181, 0x81818181, 0x817F817F, 0x81818181, 0x7F7F7F7F, +0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F7F7F, 0x7F818181, 0x81818181, 0x817F7F81, +0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x81817F81, 0x7F818181, 0x7F7F8181, 0x7F818181, 0x81817F7F, +0x7F817F81, 0x8181817F, 0x7F7F7F7F, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x7F818181, +0x817F7F81, 0x7F817F81, 0x817F8181, 0x81817F7F, 0x7F817F81, 0x817F7F81, 0x81817F81, 0x7F817F7F, +0x81817F7F, 0x81818181, 0x817F7F81, 0x81818181, 0x81817F81, 0x817F7F7F, 0x81817F81, 0x7F81817F, +0x7F7F8181, 0x817F7F81, 0x817F817F, 0x817F8181, 0x7F81817F, 0x7F7F7F81, 0x7F817F81, 0x7F81817F, +0x8181817F, 0x7F7F817F, 0x817F817F, 0x81817F81, 0x81818181, 0x7F7F8181, 0x7F7F8181, 0x7F817F81, +0x8181817F, 0x81818181, 0x817F817F, 0x81818181, 0x7F7F8181, 0x817F7F7F, 0x7F7F817F, 0x7F7F8181, +0x7F7F7F7F, 0x817F7F81, 0x817F817F, 0x8181817F, 0x7F7F817F, 0x7F818181, 0x817F7F7F, 0x817F7F7F, +0x7F818181, 0x81817F81, 0x7F818181, 0x7F7F7F7F, 0x81817F81, 0x7F81817F, 0x81817F7F, 0x817F7F7F, +0x7F7F8181, 0x7F7F817F, 0x7F817F81, 0x817F817F, 0x817F8181, 0x7F817F81, 0x7F7F7F81, 0x7F7F8181, +0x81817F7F, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x7F817F81, 0x81817F81, 0x81818181, 0x817F817F, +0x7F7F8181, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, 0x7F817F7F, +0x81817F81, 0x7F818181, 0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x817F7F81, 0x7F81817F, +0x817F7F81, 0x7F81817F, 0x817F7F81, 0x7F818181, 0x81817F81, 0x81817F7F, 0x817F7F81, 0x7F817F81, +0x7F81817F, 0x817F7F81, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, +0x7F7F7F7F, 0x81817F7F, 0x817F817F, 0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x7F817F81, +0x7F817F7F, 0x7F81817F, 0x7F7F817F, 0x7F7F8181, 0x7F7F817F, 0x8181817F, 0x7F81817F, 0x7F7F7F81, +0x7F81817F, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x817F8181, 0x817F7F81, 0x7F818181, +0x7F7F7F7F, 0x81817F81, 0x7F7F817F, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x7F7F8181, +0x81818181, 0x817F8181, 0x81817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x81817F7F, 0x817F7F7F, +0x817F817F, 0x7F7F817F, 0x81817F81, 0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, +0x81818181, 0x7F7F817F, 0x81818181, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x81818181, 0x7F818181, +0x7F817F7F, 0x817F8181, 0x81817F81, 0x7F818181, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F7F, 0x817F817F, 0x817F817F, 0x81817F7F, 0x81817F81, 0x7F7F8181, 0x7F7F7F7F, +0x817F7F81, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, 0x7F818181, 0x7F818181, +0x817F8181, 0x7F817F7F, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x81817F81, 0x7F818181, 0x7F7F8181, +0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x7F7F7F7F, 0x817F8181, 0x817F8181, +0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x817F7F81, 0x8181817F, 0x81818181, +0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, 0x817F817F, 0x7F817F81, 0x7F817F81, 0x7F817F7F, +0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x81818181, 0x81818181, 0x817F7F7F, 0x817F8181, 0x7F7F8181, +0x81817F81, 0x7F7F817F, 0x8181817F, 0x7F7F817F, 0x81818181, 0x7F81817F, 0x817F817F, 0x817F817F, +0x7F7F817F, 0x7F81817F, 0x7F7F817F, 0x7F817F81, 0x8181817F, 0x81817F7F, 0x81818181, 0x7F81817F, +0x7F818181, 0x7F817F7F, 0x7F817F81, 0x8181817F, 0x81817F81, 0x8181817F, 0x817F7F81, 0x7F817F7F, +0x817F8181, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x7F818181, +0x7F7F7F81, 0x7F818181, 0x8181817F, 0x81817F7F, 0x7F818181, 0x7F817F81, 0x817F7F81, 0x7F7F7F7F, +0x7F818181, 0x7F7F7F81, 0x81818181, 0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x8181817F, 0x7F7F8181, +0x7F818181, 0x817F8181, 0x7F818181, 0x8181817F, 0x81817F7F, 0x817F8181, 0x81818181, 0x7F7F8181, +0x817F7F81, 0x81818181, 0x817F817F, 0x7F81817F, 0x8181817F, 0x817F817F, 0x7F7F817F, 0x7F7F7F7F, +0x8181817F, 0x7F81817F, 0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F81, 0x817F7F81, +0x817F8181, 0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x7F817F7F, +0x817F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x7F817F81, 0x7F7F8181, 0x817F817F, 0x7F817F7F, +0x81818181, 0x7F7F7F81, 0x7F817F81, 0x7F7F8181, 0x8181817F, 0x817F7F7F, 0x7F817F81, 0x81818181, +0x81818181, 0x7F7F817F, 0x7F81817F, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F8181, 0x7F7F8181, +0x81818181, 0x817F7F81, 0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F7F, +0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x817F817F, 0x7F81817F, 0x81817F81, 0x817F8181, 0x7F7F817F, +0x8181817F, 0x817F7F81, 0x81817F81, 0x8181817F, 0x7F818181, 0x817F8181, 0x81818181, 0x7F817F81, +0x817F8181, 0x81817F81, 0x7F81817F, 0x7F818181, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x7F7F8181, +0x8181817F, 0x817F7F81, 0x81817F81, 0x7F7F7F81, 0x7F7F7F81, 0x817F8181, 0x81818181, 0x7F81817F, +0x7F7F8181, 0x817F8181, 0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x8181817F, 0x7F7F817F, 0x7F7F7F7F, +0x7F7F7F81, 0x7F81817F, 0x7F817F81, 0x7F7F8181, 0x7F7F7F7F, 0x817F7F7F, 0x7F817F7F, 0x817F8181, +0x7F7F7F81, 0x7F817F81, 0x817F8181, 0x817F817F, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x817F7F81, +0x81817F81, 0x7F817F81, 0x7F7F817F, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x7F7F817F, 0x81818181, +0x7F81817F, 0x7F7F8181, 0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F81, 0x817F8181, 0x817F817F, +0x817F817F, 0x7F817F7F, 0x7F7F8181, 0x7F817F7F, 0x8181817F, 0x7F7F8181, 0x81818181, 0x7F817F81, +0x7F7F7F81, 0x81817F7F, 0x817F817F, 0x81818181, 0x7F817F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, +0x7F7F8181, 0x81817F7F, 0x7F81817F, 0x81817F81, 0x7F7F8181, 0x817F8181, 0x817F817F, 0x817F7F7F, +0x7F7F817F, 0x817F8181, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x7F817F7F, +0x7F7F7F7F, 0x7F81817F, 0x7F7F7F81, 0x81817F81, 0x7F7F7F81, 0x7F817F7F, 0x817F817F, 0x81817F7F, +0x7F81817F, 0x81818181, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, +0x817F7F7F, 0x7F7F8181, 0x817F7F81, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F818181, +0x7F7F817F, 0x81818181, 0x7F7F7F7F, 0x8181817F, 0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x817F817F, +0x7F7F8181, 0x7F7F8181, 0x81818181, 0x7F7F817F, 0x81817F7F, 0x7F817F81, 0x7F817F81, 0x81817F81, +0x817F7F7F, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x817F7F81, 0x817F7F7F, 0x7F817F7F, +0x81817F81, 0x817F817F, 0x817F8181, 0x7F7F7F7F, 0x81818181, 0x7F7F817F, 0x7F7F817F, 0x7F7F817F, +0x817F8181, 0x817F8181, 0x81817F81, 0x7F7F8181, 0x8181817F, 0x817F8181, 0x7F7F7F7F, 0x817F8181, +0x7F81817F, 0x7F7F7F81, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x7F817F81, 0x817F7F7F, 0x817F817F, +0x7F7F8181, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F817F81, 0x817F7F81, +0x8181817F, 0x81818181, 0x7F818181, 0x817F7F7F, 0x817F7F81, 0x817F817F, 0x7F81817F, 0x8181817F, +0x817F817F, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, +0x7F7F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x7F817F81, 0x7F7F817F, +0x817F7F81, 0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F7F, 0x81818181, +0x817F817F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x8181817F, 0x7F817F7F, +0x7F7F817F, 0x7F7F8181, 0x8181817F, 0x7F817F81, 0x81817F81, 0x7F7F7F81, 0x817F817F, 0x817F7F81, +0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x817F7F81, 0x7F817F81, 0x817F8181, 0x81817F81, 0x81817F7F, +0x8181817F, 0x81817F7F, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x81817F81, +0x7F818181, 0x81817F81, 0x7F7F8181, 0x7F81817F, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x817F8181, +0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x81817F81, 0x81818181, 0x8181817F, +0x7F818181, 0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x817F817F, 0x817F8181, 0x7F81817F, 0x7F7F817F, +0x817F7F81, 0x7F818181, 0x8181817F, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x81817F81, 0x7F7F8181, +0x817F817F, 0x7F7F8181, 0x7F818181, 0x817F8181, 0x7F7F7F81, 0x81817F7F, 0x817F7F81, 0x7F817F81, +0x7F817F7F, 0x7F817F81, 0x81817F7F, 0x81817F7F, 0x817F817F, 0x81817F81, 0x7F7F8181, 0x7F818181, +0x7F81817F, 0x7F7F8181, 0x7F7F817F, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x817F7F7F, 0x817F817F, +0x81817F7F, 0x81817F7F, 0x7F81817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F8181, 0x7F818181, +0x7F817F81, 0x817F7F81, 0x81818181, 0x7F818181, 0x8181817F, 0x7F7F8181, 0x81817F81, 0x7F817F81, +0x8181817F, 0x817F817F, 0x817F8181, 0x7F7F7F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, +0x7F81817F, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x7F7F7F7F, +0x7F817F7F, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, +0x7F7F817F, 0x7F817F7F, 0x81817F7F, 0x7F7F8181, 0x81818181, 0x81817F81, 0x817F817F, 0x7F7F8181, +0x817F8181, 0x817F817F, 0x7F818181, 0x81818181, 0x81817F7F, 0x81818181, 0x7F7F7F81, 0x7F7F8181, +0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x7F7F817F, 0x7F818181, +0x8181817F, 0x817F7F81, 0x7F818181, 0x7F7F8181, 0x7F7F7F7F, 0x817F817F, 0x7F817F7F, 0x817F7F81, +0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x7F81817F, 0x7F817F81, 0x7F817F7F, +0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, +0x817F7F7F, 0x7F818181, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x817F817F, +0x7F7F7F81, 0x81818181, 0x81817F81, 0x7F7F8181, 0x81817F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F81817F, +0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x81817F81, 0x817F7F81, 0x7F81817F, +0x817F817F, 0x81818181, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x8181817F, 0x81817F81, 0x7F818181, +0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, 0x81817F7F, 0x817F7F81, 0x817F817F, 0x7F7F817F, 0x7F818181, +0x7F817F81, 0x7F7F7F81, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x7F81817F, 0x7F817F7F, 0x81817F81, +0x7F7F8181, 0x81817F7F, 0x7F7F7F7F, 0x81817F81, 0x7F7F8181, 0x817F817F, 0x7F7F817F, 0x81817F81, +0x7F7F7F81, 0x81817F81, 0x81817F81, 0x8181817F, 0x8181817F, 0x81817F81, 0x7F7F817F, 0x817F7F81, +0x7F7F8181, 0x7F7F8181, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F7F81, +0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F81, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F7F, +0x81817F7F, 0x7F817F81, 0x7F81817F, 0x7F818181, 0x8181817F, 0x7F817F7F, 0x817F7F81, 0x817F8181, +0x81818181, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x7F81817F, +0x7F7F7F7F, 0x81817F81, 0x81818181, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F81, 0x8181817F, 0x7F817F81, +0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, 0x817F817F, 0x7F7F8181, 0x817F7F7F, 0x7F7F8181, +0x7F817F81, 0x7F7F817F, 0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x7F7F817F, 0x817F7F7F, 0x8181817F, +0x7F7F7F7F, 0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F817F81, 0x8181817F, 0x81817F81, 0x7F7F8181, +0x8181817F, 0x7F7F817F, 0x81817F81, 0x81818181, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F817F7F, +0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x817F8181, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x7F81817F, +0x7F7F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x81818181, 0x7F817F7F, 0x8181817F, 0x7F817F7F, +0x81818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x7F817F81, 0x7F7F817F, +0x817F7F7F, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F7F, 0x81817F81, 0x81817F81, +0x817F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F81817F, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x7F7F8181, +0x7F7F7F7F, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x7F7F8181, +0x817F817F, 0x81817F81, 0x81817F81, 0x81817F81, 0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, +0x817F7F81, 0x81818181, 0x8181817F, 0x817F8181, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, +0x81817F81, 0x7F81817F, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x817F817F, +0x81818181, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F8181, +0x81817F81, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, 0x817F7F7F, 0x81817F7F, 0x81817F81, 0x817F7F81, +0x81818181, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x817F7F81, +0x7F7F8181, 0x817F817F, 0x817F7F81, 0x817F817F, 0x81817F81, 0x817F7F81, 0x7F817F7F, 0x817F817F, +0x7F81817F, 0x81818181, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x817F8181, +0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, 0x817F7F81, 0x7F7F8181, 0x817F8181, 0x81817F7F, +0x7F818181, 0x817F8181, 0x817F817F, 0x7F7F8181, 0x8181817F, 0x8181817F, 0x817F7F7F, 0x7F7F8181, +0x8181817F, 0x817F8181, 0x817F7F81, 0x7F817F81, 0x7F818181, 0x7F81817F, 0x81818181, 0x817F7F7F, +0x7F7F7F7F, 0x81818181, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, +0x81818181, 0x7F7F7F81, 0x81817F81, 0x817F8181, 0x7F817F7F, 0x81817F81, 0x8181817F, 0x7F7F7F81, +0x7F818181, 0x7F7F817F, 0x7F7F7F81, 0x81817F7F, 0x81817F7F, 0x7F818181, 0x81818181, 0x817F8181, +0x7F817F7F, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x817F8181, 0x817F8181, 0x81817F81, 0x817F817F, +0x7F7F817F, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F817F, 0x817F8181, 0x817F7F81, 0x817F7F7F, 0x7F7F8181, +0x7F7F7F7F, 0x817F817F, 0x81817F7F, 0x7F7F817F, 0x81818181, 0x7F7F8181, 0x7F817F7F, 0x7F817F81, +0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x7F818181, 0x7F818181, 0x81817F7F, 0x8181817F, 0x817F7F81, +0x8181817F, 0x817F7F81, 0x7F7F817F, 0x7F817F81, 0x817F7F81, 0x81817F81, 0x81817F81, 0x817F817F, +0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F817F, 0x7F81817F, +0x8181817F, 0x7F817F81, 0x7F7F817F, 0x817F8181, 0x817F817F, 0x7F818181, 0x817F7F7F, 0x7F7F8181, +0x7F7F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x817F8181, 0x7F817F81, 0x8181817F, +0x7F818181, 0x817F7F81, 0x7F7F7F7F, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x81817F7F, 0x817F7F7F, +0x81818181, 0x81818181, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x81817F7F, 0x7F7F8181, 0x7F817F81, +0x7F7F7F7F, 0x8181817F, 0x817F817F, 0x7F7F8181, 0x817F817F, 0x817F7F7F, 0x7F7F7F81, 0x81817F81, +0x817F7F7F, 0x817F8181, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F818181, 0x7F7F7F81, +0x7F7F7F7F, 0x817F817F, 0x7F7F8181, 0x81818181, 0x817F817F, 0x817F7F81, 0x817F7F7F, 0x817F8181, +0x7F817F81, 0x7F818181, 0x7F7F817F, 0x7F81817F, 0x81818181, 0x817F7F81, 0x81817F7F, 0x7F7F7F81, +0x7F7F817F, 0x7F818181, 0x817F8181, 0x817F7F81, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x81817F7F, +0x7F818181, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x81817F7F, 0x817F8181, 0x81817F7F, 0x817F7F7F, +0x7F7F817F, 0x7F7F8181, 0x81818181, 0x7F81817F, 0x7F7F7F7F, 0x7F817F81, 0x81817F7F, 0x817F7F7F, +0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, 0x817F8181, 0x7F818181, 0x81817F7F, 0x7F7F8181, +0x817F7F81, 0x8181817F, 0x817F8181, 0x7F817F81, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F81817F, +0x7F7F7F81, 0x7F81817F, 0x81818181, 0x7F817F7F, 0x817F8181, 0x81817F81, 0x7F818181, 0x7F817F81, +0x7F817F81, 0x817F7F7F, 0x7F817F81, 0x7F7F8181, 0x817F817F, 0x817F8181, 0x8181817F, 0x81817F81, +0x817F817F, 0x7F7F817F, 0x81817F7F, 0x7F817F81, 0x817F817F, 0x817F8181, 0x7F7F7F81, 0x817F8181, +0x7F7F7F7F, 0x81817F7F, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, 0x7F81817F, 0x817F7F7F, 0x81817F7F, +0x817F7F81, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x817F817F, 0x817F7F7F, +0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, 0x817F817F, 0x7F81817F, +0x81818181, 0x7F817F81, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x7F817F7F, +0x817F817F, 0x81818181, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, +0x7F817F7F, 0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x7F81817F, 0x7F81817F, 0x7F7F7F7F, 0x817F8181, +0x81817F7F, 0x7F7F817F, 0x7F817F81, 0x817F817F, 0x817F8181, 0x817F8181, 0x7F817F81, 0x7F818181, +0x7F7F7F7F, 0x7F81817F, 0x7F818181, 0x817F8181, 0x817F7F81, 0x7F81817F, 0x817F817F, 0x7F817F81, +0x7F817F7F, 0x7F81817F, 0x817F817F, 0x81817F7F, 0x7F7F7F7F, 0x817F817F, 0x7F817F7F, 0x7F7F8181, +0x81817F81, 0x7F7F7F7F, 0x81818181, 0x817F817F, 0x81818181, 0x7F817F7F, 0x81817F81, 0x7F7F7F7F, +0x81818181, 0x7F81817F, 0x81818181, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F7F, 0x7F817F7F, 0x817F7F7F, +0x817F8181, 0x7F818181, 0x81818181, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x7F81817F, 0x7F7F8181, +0x81818181, 0x7F818181, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x817F8181, 0x7F818181, +0x81817F7F, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x7F7F8181, 0x817F8181, 0x81817F81, 0x817F817F, +0x7F817F81, 0x7F7F8181, 0x817F817F, 0x7F81817F, 0x7F818181, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, +0x7F81817F, 0x81817F7F, 0x81818181, 0x7F818181, 0x7F817F7F, 0x7F7F817F, 0x817F7F7F, 0x81817F81, +0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F817F, 0x7F81817F, 0x817F8181, 0x81818181, 0x81817F7F, +0x817F8181, 0x7F817F7F, 0x7F817F7F, 0x8181817F, 0x81817F81, 0x7F7F7F81, 0x81817F81, 0x7F7F7F81, +0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x817F7F7F, 0x817F817F, +0x817F7F81, 0x7F818181, 0x817F817F, 0x7F7F7F81, 0x7F7F817F, 0x817F7F81, 0x81817F7F, 0x81818181, +0x817F817F, 0x7F7F8181, 0x817F7F81, 0x8181817F, 0x81817F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F817F, +0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, +0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, 0x8181817F, 0x7F7F8181, +0x81817F81, 0x817F8181, 0x7F7F7F81, 0x81818181, 0x817F7F81, 0x8181817F, 0x817F8181, 0x81817F7F, +0x817F7F7F, 0x7F818181, 0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x8181817F, 0x7F7F817F, 0x8181817F, +0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x8181817F, 0x817F7F7F, 0x817F7F81, 0x7F817F7F, 0x7F818181, +0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x817F817F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x817F817F, +0x7F7F7F81, 0x7F7F817F, 0x7F817F81, 0x7F81817F, 0x7F817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, +0x817F817F, 0x817F7F7F, 0x817F8181, 0x7F818181, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, 0x817F8181, +0x817F7F81, 0x7F7F7F81, 0x8181817F, 0x817F817F, 0x8181817F, 0x817F7F7F, 0x7F81817F, 0x81817F7F, +0x7F7F817F, 0x817F8181, 0x7F7F7F81, 0x81817F81, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, +0x7F7F8181, 0x817F817F, 0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, +0x817F817F, 0x7F7F8181, 0x7F817F7F, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, 0x7F817F81, 0x7F81817F, +0x7F817F81, 0x7F818181, 0x81818181, 0x8181817F, 0x7F7F7F81, 0x817F7F7F, 0x81818181, 0x7F7F8181, +0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x817F8181, 0x7F818181, 0x7F7F817F, 0x817F7F7F, 0x7F7F7F7F, +0x817F7F81, 0x817F7F7F, 0x817F817F, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x817F7F81, 0x7F81817F, +0x817F7F81, 0x7F817F7F, 0x7F817F7F, 0x7F7F817F, 0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x81818181, +0x81817F81, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, +0x81817F7F, 0x7F81817F, 0x7F7F817F, 0x817F7F81, 0x7F81817F, 0x817F8181, 0x7F7F7F81, 0x7F817F81, +0x7F7F7F81, 0x81817F81, 0x7F818181, 0x81817F7F, 0x817F817F, 0x817F7F81, 0x7F7F817F, 0x8181817F, +0x817F817F, 0x817F817F, 0x817F817F, 0x7F817F7F, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x7F7F8181, +0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F81, 0x817F8181, 0x7F7F7F7F, 0x7F7F8181, +0x7F7F817F, 0x7F818181, 0x7F817F81, 0x81817F7F, 0x817F817F, 0x7F817F7F, 0x817F7F7F, 0x81817F81, +0x7F817F81, 0x817F7F7F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x81817F7F, 0x81817F81, +0x7F817F7F, 0x7F7F7F7F, 0x7F818181, 0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x817F8181, +0x7F817F7F, 0x81817F7F, 0x817F8181, 0x817F817F, 0x817F8181, 0x7F7F8181, 0x7F817F7F, 0x81817F7F, +0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x7F817F81, +0x7F81817F, 0x81817F81, 0x81817F81, 0x7F7F7F81, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x81817F81, +0x7F817F7F, 0x7F7F817F, 0x81817F7F, 0x7F7F7F81, 0x817F817F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F8181, +0x817F817F, 0x817F8181, 0x7F7F7F81, 0x81817F7F, 0x817F8181, 0x7F7F8181, 0x7F7F817F, 0x817F7F7F, +0x7F817F81, 0x817F817F, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x7F817F7F, +0x81817F7F, 0x7F818181, 0x817F8181, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, 0x8181817F, 0x81817F81, +0x8181817F, 0x7F817F7F, 0x817F817F, 0x817F7F81, 0x81818181, 0x7F817F81, 0x7F81817F, 0x7F817F81, +0x817F7F81, 0x7F817F7F, 0x7F81817F, 0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F818181, +0x817F7F81, 0x7F7F8181, 0x817F8181, 0x8181817F, 0x81818181, 0x7F818181, 0x7F7F7F7F, 0x7F7F817F, +0x7F818181, 0x81818181, 0x817F7F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, +0x817F817F, 0x7F817F7F, 0x8181817F, 0x7F7F8181, 0x7F817F81, 0x817F7F7F, 0x8181817F, 0x81817F81, +0x7F81817F, 0x7F817F81, 0x81817F81, 0x81817F81, 0x81818181, 0x81818181, 0x81817F7F, 0x7F817F81, +0x7F7F7F81, 0x817F817F, 0x81817F7F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x7F81817F, +0x8181817F, 0x81817F81, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x817F7F7F, 0x8181817F, 0x7F7F817F, +0x81818181, 0x7F81817F, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x817F7F7F, 0x817F7F7F, +0x7F817F7F, 0x7F7F7F81, 0x7F818181, 0x817F817F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x7F7F817F, +0x817F7F7F, 0x817F8181, 0x7F817F7F, 0x7F81817F, 0x7F7F817F, 0x81817F7F, 0x81817F81, 0x7F81817F, +0x7F7F817F, 0x7F7F7F7F, 0x7F81817F, 0x817F817F, 0x7F7F7F7F, 0x8181817F, 0x7F7F8181, 0x7F7F8181, +0x817F7F81, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x817F7F7F, +0x81817F7F, 0x7F7F817F, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x817F8181, 0x7F7F817F, 0x81817F81, +0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x81817F7F, 0x7F7F8181, 0x817F7F81, +0x7F7F7F81, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x81817F81, 0x81817F81, 0x7F7F7F7F, 0x7F7F8181, +0x817F7F7F, 0x81818181, 0x7F818181, 0x7F7F817F, 0x817F8181, 0x7F7F7F81, 0x7F818181, 0x7F7F7F81, +0x7F7F7F81, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x8181817F, 0x81817F7F, 0x8181817F, 0x817F817F, +0x7F817F7F, 0x817F8181, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x81818181, 0x7F81817F, 0x7F7F7F81, +0x817F7F81, 0x7F818181, 0x7F81817F, 0x7F7F817F, 0x817F7F81, 0x7F817F7F, 0x817F7F81, 0x7F817F81, +0x81817F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, 0x81818181, 0x81818181, 0x7F817F7F, +0x7F817F81, 0x7F818181, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x81818181, 0x7F81817F, +0x81817F7F, 0x7F81817F, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x7F81817F, 0x7F817F7F, 0x817F7F81, +0x81818181, 0x81817F81, 0x817F8181, 0x8181817F, 0x817F817F, 0x81817F81, 0x7F81817F, 0x7F817F81, +0x817F817F, 0x7F81817F, 0x81817F81, 0x7F817F7F, 0x7F7F817F, 0x7F7F817F, 0x817F817F, 0x7F7F7F7F, +0x7F817F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x81817F7F, 0x817F817F, +0x7F81817F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x7F7F8181, +0x7F81817F, 0x817F8181, 0x81818181, 0x7F818181, 0x7F817F81, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, +0x7F7F817F, 0x817F7F81, 0x81817F81, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x7F818181, +0x7F7F817F, 0x817F817F, 0x7F7F8181, 0x81818181, 0x817F8181, 0x817F7F7F, 0x7F817F7F, 0x7F818181, +0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, 0x817F817F, 0x7F7F817F, +0x817F817F, 0x7F7F817F, 0x817F817F, 0x81817F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F818181, +0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x81817F7F, 0x7F7F7F81, 0x81817F7F, +0x7F817F7F, 0x8181817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, 0x7F817F81, 0x7F817F7F, 0x8181817F, +0x817F7F7F, 0x81818181, 0x817F7F81, 0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x8181817F, 0x7F7F7F7F, +0x7F817F81, 0x7F7F8181, 0x817F7F7F, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, +0x817F7F81, 0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x81817F81, +0x81818181, 0x817F817F, 0x817F7F81, 0x817F8181, 0x8181817F, 0x7F818181, 0x817F7F81, 0x7F7F817F, +0x7F7F817F, 0x8181817F, 0x817F7F7F, 0x7F7F7F81, 0x81817F81, 0x7F81817F, 0x7F817F7F, 0x7F7F7F81, +0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x7F7F817F, 0x7F818181, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, +0x7F817F7F, 0x7F7F7F81, 0x8181817F, 0x7F7F7F7F, 0x7F817F7F, 0x7F817F7F, 0x81818181, 0x817F7F81, +0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x81817F7F, 0x817F8181, +0x817F7F81, 0x817F817F, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x817F8181, 0x817F817F, +0x81817F81, 0x817F8181, 0x7F818181, 0x817F7F7F, 0x81817F7F, 0x7F818181, 0x7F817F81, 0x7F7F7F7F, +0x817F7F7F, 0x81818181, 0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x817F7F7F, 0x817F8181, 0x8181817F, +0x7F7F7F7F, 0x7F817F7F, 0x8181817F, 0x817F817F, 0x7F817F7F, 0x81818181, 0x7F7F817F, 0x7F7F7F7F, +0x7F818181, 0x81818181, 0x7F7F7F81, 0x81817F81, 0x81817F81, 0x7F81817F, 0x817F817F, 0x7F817F81, +0x81817F7F, 0x817F817F, 0x81817F81, 0x8181817F, 0x817F817F, 0x817F817F, 0x817F817F, 0x817F817F, +0x81817F7F, 0x81818181, 0x7F81817F, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F817F, 0x817F7F81, +0x7F818181, 0x817F7F81, 0x81817F7F, 0x817F817F, 0x81817F7F, 0x8181817F, 0x817F7F81, 0x7F7F7F81, +0x81817F81, 0x7F7F7F81, 0x81818181, 0x817F7F7F, 0x81817F7F, 0x7F817F7F, 0x7F818181, 0x81817F7F, +0x7F817F7F, 0x7F7F7F81, 0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, +0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, +0x817F817F, 0x81817F7F, 0x7F817F81, 0x7F817F81, 0x81817F81, 0x7F7F7F81, 0x7F817F81, 0x81817F81, +0x7F7F8181, 0x7F818181, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, +0x7F81817F, 0x7F817F7F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x81817F81, 0x7F7F817F, +0x7F817F7F, 0x8181817F, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x817F7F81, +0x7F81817F, 0x7F7F8181, 0x7F818181, 0x7F817F81, 0x817F8181, 0x7F818181, 0x817F817F, 0x81818181, +0x7F7F7F81, 0x7F81817F, 0x7F817F7F, 0x81818181, 0x817F8181, 0x7F817F7F, 0x7F818181, 0x7F81817F, +0x817F8181, 0x7F7F8181, 0x7F7F8181, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x817F7F81, +0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x817F817F, +0x81817F81, 0x7F7F8181, 0x7F81817F, 0x8181817F, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x817F7F7F, +0x7F818181, 0x81818181, 0x817F7F81, 0x7F818181, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x81818181, +0x8181817F, 0x817F7F81, 0x817F8181, 0x817F8181, 0x7F817F81, 0x7F817F81, 0x7F7F817F, 0x7F7F7F81, +0x81818181, 0x81817F7F, 0x81817F7F, 0x81817F81, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x81817F7F, +0x81817F81, 0x7F7F817F, 0x817F817F, 0x8181817F, 0x7F81817F, 0x81817F81, 0x7F817F81, 0x817F817F, +0x817F7F81, 0x81818181, 0x7F817F81, 0x81817F81, 0x817F817F, 0x81817F7F, 0x7F817F81, 0x7F817F7F, +0x7F7F7F7F, 0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x8181817F, 0x81818181, +0x81817F7F, 0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x81817F7F, 0x7F817F81, 0x81817F81, +0x7F7F8181, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x817F8181, 0x81818181, 0x81818181, 0x817F7F7F, +0x817F8181, 0x7F817F81, 0x7F817F7F, 0x7F818181, 0x81818181, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, +0x7F7F8181, 0x817F8181, 0x7F7F7F81, 0x7F817F7F, 0x7F81817F, 0x8181817F, 0x7F7F817F, 0x7F817F7F, +0x81817F7F, 0x817F817F, 0x7F7F7F81, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x81818181, 0x7F81817F, +0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x81817F81, 0x81817F81, 0x7F7F817F, +0x7F7F7F81, 0x817F817F, 0x81817F81, 0x8181817F, 0x7F817F81, 0x8181817F, 0x817F7F81, 0x81817F81, +0x7F7F817F, 0x817F7F7F, 0x81817F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, 0x7F81817F, 0x8181817F, +0x81817F7F, 0x81817F7F, 0x7F817F7F, 0x817F8181, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x7F817F7F, +0x817F7F81, 0x7F7F7F7F, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x817F8181, 0x81817F7F, +0x7F81817F, 0x7F817F81, 0x7F81817F, 0x81818181, 0x7F817F81, 0x817F817F, 0x7F817F81, 0x7F817F81, +0x7F7F8181, 0x817F8181, 0x817F8181, 0x7F7F7F81, 0x7F818181, 0x7F7F8181, 0x81817F7F, 0x8181817F, +0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x817F817F, 0x817F7F7F, +0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x8181817F, 0x81817F7F, +0x7F81817F, 0x7F817F7F, 0x817F7F81, 0x7F818181, 0x81817F7F, 0x7F817F81, 0x81817F81, 0x81817F7F, +0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F817F7F, 0x7F817F7F, 0x7F7F817F, +0x817F7F7F, 0x7F81817F, 0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x7F817F81, 0x817F8181, 0x7F7F7F81, +0x7F818181, 0x7F817F81, 0x817F8181, 0x7F818181, 0x817F817F, 0x7F817F7F, 0x817F7F81, 0x8181817F, +0x817F817F, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, 0x7F817F81, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, +0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x7F817F7F, 0x81817F81, 0x81818181, +0x7F817F81, 0x7F7F7F7F, 0x817F817F, 0x8181817F, 0x7F7F817F, 0x817F8181, 0x817F8181, 0x81817F81, +0x7F7F7F7F, 0x817F8181, 0x817F7F81, 0x7F817F81, 0x817F8181, 0x81817F7F, 0x7F7F7F7F, 0x7F817F7F, +0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, +0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x817F7F7F, +0x7F7F817F, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, +0x8181817F, 0x81817F81, 0x817F7F7F, 0x7F818181, 0x817F7F81, 0x7F7F8181, 0x7F7F817F, 0x7F81817F, +0x7F817F81, 0x7F81817F, 0x81818181, 0x817F7F81, 0x7F818181, 0x81818181, 0x81817F7F, 0x7F817F81, +0x7F818181, 0x7F7F7F81, 0x7F817F81, 0x81817F81, 0x817F8181, 0x817F817F, 0x8181817F, 0x7F7F8181, +0x81818181, 0x817F817F, 0x7F818181, 0x817F817F, 0x7F7F817F, 0x817F7F81, 0x817F8181, 0x7F7F7F81, +0x7F7F7F7F, 0x7F817F81, 0x81817F81, 0x81817F7F, 0x7F817F7F, 0x81818181, 0x817F7F7F, 0x7F818181, +0x817F8181, 0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x7F7F7F81, 0x8181817F, 0x817F7F7F, 0x7F7F7F81, +0x7F81817F, 0x7F818181, 0x817F7F81, 0x7F81817F, 0x817F8181, 0x817F8181, 0x7F81817F, 0x817F8181, +0x7F7F7F81, 0x81818181, 0x7F7F817F, 0x81817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x817F7F81, +0x817F8181, 0x817F7F81, 0x7F7F8181, 0x7F7F8181, 0x7F818181, 0x81817F81, 0x7F7F8181, 0x7F818181, +0x7F7F817F, 0x7F81817F, 0x817F7F7F, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, +0x7F817F7F, 0x7F7F7F7F + +output0 = +0x88CCED56, 0x1C072C76, 0xD4D23B69, 0x78C979BF, 0x60764BE3, 0x4470E86B, 0x20A46F84, 0xA0211B5C, +0xE1952001, 0xB77912DE, 0x52E8BA16, 0xE5BE8445, 0x95093ACF, 0xA8BE03D2, 0x49DBB5AB, 0xC3946403, +0x4DD44236, 0xC2833E65, 0x7288C53B, 0xD64FB75E, 0x7438C1EC, 0x71070BEC, 0xA40F8094, 0xABF43E46, +0x564487F5, 0x8435AC89, 0x2D98A4C3, 0x07CD13F4, 0xB44CEEA6, 0x2E00DD83, 0x12EF45EB, 0x01A047B8, +0xBC563FD5, 0xCA5C1136, 0x7AB9F2C8, 0xD62C59A9, 0x913DF674, 0xC900322A, 0xCF54042E, 0x6CAADB1E, +0x8077B98C, 0xBCB51468, 0x58339E5E, 0x1D176854, 0xF9E2D74A, 0x2994B28A, 0xD0E46263, 0xCD8A0FDB, +0x0119B915, 0x1E5433C9, 0xEA298A7D, 0x9EB4FC8D, 0xEF93B537, 0x6D441397, 0x6A4C8DB3, 0xB8E4AFE9, +0x1520BC1C, 0x8669961B, 0x5D484802, 0xC2793340, 0xB5FE7945, 0x43AC7CE2, 0xB74B70C1, 0xFCF56F87, +0x3E146A49, 0x0391D092, 0x672D2427, 0xDC91BB53, 0xEB24AC1F, 0xCE0D8E63, 0xF12F7ED8, 0xB3192024, +0x0697AE9C, 0x3415F178, 0xD8410FFC, 0xE34734DE, 0x6C6E6BF1, 0xDCD211C3, 0xBF6B0B87, 0xA1624F47, +0x3524BC4D, 0x4B4A1891, 0x8691223C, 0x12EB2DA4, 0x0B51F616, 0x31276F0E, 0x86CB4D17, 0x15CA0F9B, +0xEB989F98, 0x1141D335, 0x442C699F, 0x82E9758B, 0x267E6D4D, 0x71BAC54A, 0x2FBCBD52, 0xA0966795, +0xEB08B437, 0x1A9899A0, 0x26484B82, 0x3AEE43A8, 0xC409BE45, 0xCF8C6EC9, 0x098DE63F, 0xC3BEA60B, +0xCB7A5B6A, 0xCBF2A44B, 0x31E9FA4C, 0x34FD7E88, 0xA3C5AF89, 0xF13C8E2B, 0xC01C79FA, 0x622B9FD8, +0x692D4C4F, 0x712BC24C, 0x16FBD6C3, 0x7B1BBC38, 0x63F1E328, 0x6F4B + +basegraph= +2 + +z_c= +384 + +n_cb= +19200 + +q_m= +2 + +n_filler= +56 + +e = +36936 + +rv_index = +0 + +code_block_mode = +1 + +iter_max = +20 + +expected_iter_count = +3 + +op_flags = +RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v11835.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v11835.data new file mode 100644 index 0000000000..e27ff6eccb --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v11835.data @@ -0,0 +1,41 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0x44FB08C0, 0x661CCC + +output0 = +0x1BACEE95, 0x613ECD04, 0xC0 + +basegraph= +2 + +z_c= +10 + +n_cb= +500 + +q_m= +6 + +n_filler= +44 + +e= +66 + +rv_index= +0 + +code_block_mode= +1 + +op_flags= +RTE_BBDEV_LDPC_RATE_MATCH + +expected_status= +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v2342.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v2342.data new file mode 100644 index 0000000000..619b29be55 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v2342.data @@ -0,0 +1,151 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +# Origin : FEC5g_DL_1/2342 + +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0x02524C20, 0xB9B1FEA2, 0xC1BAB7E5, 0xEF5714CB, 0x7DE6A64D, 0xA05F9DC9, 0x0747D1E3, 0x3B20BC86, +0x6FCBDB0F, 0xF2FB7A23, 0x79D5E062, 0x5BF4E7C3, 0xD4A68A37, 0x07B4A6AD, 0x37E911F9, 0x7FE7B30A, +0xBBC284A2, 0xD38D6136, 0x25FAB76B, 0xBEBBF534, 0x9A88F9DB, 0xE37FD52D, 0x691DD493, 0xED2F738C, +0x89A96EA0, 0xD981246A, 0x17CC820E, 0x07E3B463, 0xC9FC2590, 0x7475A33C, 0xA5151BB4, 0x1F7E759E, +0x9554F964, 0xD0FA01F4, 0xD31774D2, 0xEB73A9F6, 0x8C9FBCB1, 0xF83010FB, 0x1909E09F, 0xC46023EB, +0x02AEDC62, 0xC6352CC7, 0x674BDC6D, 0xE17CD747, 0x4E25B0B3, 0x4BFF6B17, 0x12C9AAA3, 0xC2BC91CD, +0x44BE23A2, 0x8A72A157, 0x6E0DAD1F, 0x6CA69A09, 0xB55B582E, 0x01818B31, 0x5CA5CAB6, 0x1917AB24, +0x38F98BCD, 0x01917487, 0x05906FDD, 0x760AFCBA, 0x19671085, 0x64E3546E, 0xEC10F922, 0x3CF286CA, +0x68E273EA, 0xF1001325, 0x5DCB3B49, 0xE9547370, 0x65D26AE6, 0xF621256C, 0x25D6D99C, 0x7862EBA0, +0x43365DB0, 0x4DBF06C5, 0x92FCAA02, 0xB0FD58FA, 0x910E80A6, 0x93D24A67, 0x6E39B144, 0x3D46D6F6, +0xEDC55081, 0x33CD70C7, 0xC74B6E8E, 0x91AA27B9, 0x55B3542D, 0xEBF8046A, 0xB9ABDB94, 0x97FC38A8, +0xD5837B4D, 0x764B1809, 0xFBE2096A, 0xC23887AC, 0x2A45029B, 0xCBB7DF70, 0x674654E1, 0x0C6A06BD, +0xB3E8853E, 0x03FCC4CE, 0x26806F2E, 0x2CEB35B0, 0x10538B03, 0x94B059B8, 0xA95E7FFA, 0x48AD3D0A, +0xEB9091E1, 0x972E31EF, 0x5EBC6F8F, 0x947FF108, 0xCB3123FA, 0xFEE1D939, 0xF3DC5C49, 0xA92927AE, +0xF49BB8D0, 0xAA59F730, 0x4A66D1CD, 0x030E1ADF, 0x238D5B19, 0x96F861F1, 0x915424E4, 0x9127880C, +0x8E779839, 0x87375FCE, 0x61FB3D79, 0x96B1EE83, 0x47BF6667, 0x19E7D408, 0x7E91137F, 0x0E4AD8E8, +0xDABD2E45, 0x9B60873F, 0xD0294A65, 0x2A38A862, 0x59DD046D, 0x9832BB79, 0xA5870DB6, 0xB3F1CC48, +0x7E9A8132, 0xEEA2E4BC, 0xF23ED87B, 0x550E011F, 0x9620E0C0, 0xE7CF0834, 0xDEE69623, 0x6184D512, +0xD3D55728, 0xFA7711D4, 0x9C77B0F9, 0x8A26462B, 0xB3F5C8D5, 0x1123246D, 0x78F36272, 0x940EE0F9, +0x757BF240, 0x7EE2B6D0, 0xD40FD5A1, 0xAB4205CA, 0x96E6B758, 0xAC5F4294, 0xC9268C66, 0xB48DC535, +0x3CF6ED4C, 0xF187EFED, 0x7A09B08D, 0x8709EFCE, 0x267B2468, 0x0015D770, 0xDF1B90BF, 0xA03DAD85, +0x2633012E, 0xE5437125, 0x58B79AFF, 0xB929C532, 0x6D890DC9, 0x89A59AD2, 0x2BB99316, 0x41B5B0EB, +0x7304B295, 0xB37F6708, 0x2F84A68E, 0x3637D79A, 0xDD36687B, 0x904BF7B6, 0x6A2CF453, 0x733DED54, +0x5DF48BAA, 0xC3FCC99F, 0x8E3BE1DB, 0x61D9CF2D, 0xB7DC202B, 0xA959FF95, 0x860D0F14, 0x4008C478, +0xD9325A51, 0x27A29D4C, 0x308FE6D4, 0x7A1AA889, 0x5BD38393, 0xCBFA5D + +output0 = +0xADE67AA9, 0x1CB4EBDD, 0x74E76684, 0xE3941FC7, 0x48DAC304, 0x1E2C198D, 0xFE88B908, 0xEC21A3DE, +0xBF314AB7, 0x634E3DCB, 0x0DA84E23, 0x58B1B22B, 0x02B837A0, 0x8B04BF38, 0xFB8DB526, 0x1BFF82E9, +0x4226C4D0, 0xF7A9950E, 0x6DA4D0B2, 0x38E15395, 0x94C1A379, 0x243ED666, 0x3E7255B3, 0x7DB378DB, +0xA3CE1377, 0xE0137291, 0x42DB50AC, 0xEB2D0A13, 0xCA55944A, 0x223DF8E0, 0xB800D1CF, 0xAA2E7577, +0x50153EC5, 0x5E3C8557, 0x63DDEC8F, 0x49A256F8, 0x41ABFD56, 0xEB76A4D7, 0x4F4E9C7C, 0x3508DA39, +0x530F9DA0, 0xFFD20E32, 0x395F7963, 0x1C48B3F7, 0xD3BC29C7, 0x4D6ED90F, 0xC1C9EF58, 0x9B9D4A13, +0x417BF36E, 0x1BB5FDD8, 0x72793F28, 0x2F297FA5, 0x204AA988, 0x28317636, 0x87878EC8, 0x33024F9D, +0xE651388E, 0x560ACA6E, 0xEC3D0B64, 0xCB515AAE, 0xE42B9ECD, 0x2AE2B0D1, 0xCD659A28, 0x8BD5E4D8, +0x0D618DD6, 0x14CF8DB1, 0xE9F82BB6, 0x558C50A4, 0xA9809F8C, 0x15646823, 0x6037DB27, 0x26A0ABAA, +0xF8DC4AC6, 0x533494C9, 0x7BF60155, 0x7BB16D05, 0x89F7A1BA, 0xCB069606, 0x6572D71A, 0x001917EB, +0xD353913B, 0x128F78BD, 0x83BCE2A3, 0xE0065266, 0x9E7E608F, 0x25889472, 0x184ADD42, 0xD42B429B, +0x7A8D861F, 0x54C97AB8, 0xB8B04229, 0xDF3DE03A, 0xB97E311E, 0xBB2A1FF8, 0x53AC8D5B, 0x1825B5DC, +0x9843DD95, 0x0214EAA6, 0x3B1CF504, 0xD3BE316F, 0x9B1D3C64, 0x8EF4A268, 0xFACBC9AD, 0xDCC6033F, +0xF801E3D1, 0x92F3E3A1, 0x1EC121AC, 0xA6747F20, 0x6ACC34EF, 0x0F641DC0, 0x42CAB9C3, 0xE04036DD, +0x97739381, 0x9843A304, 0x929E9AB7, 0x600E057F, 0x892D5F1F, 0x0F718281, 0xD345AA58, 0xF39215C4, +0xBCAB0B51, 0x1EBEA1B0, 0x68885471, 0xB39AD728, 0x2FF70470, 0x80D01FE5, 0xB41A95C0, 0x01DB8079, +0xA4C9F364, 0x41860F1A, 0xEBE24F2B, 0x086BFFF0, 0x7B66DE40, 0xFFF665D6, 0x18324792, 0x1D253106, +0xC41B9BF0, 0xC79347BA, 0x6949A396, 0x279E7A4A, 0x4029B533, 0xE8B382E2, 0x89783E24, 0x3D945C74, +0x49BD75D8, 0xBAD731A0, 0x48B4AFAB, 0x4383B903, 0x8A6966A6, 0x170B9958, 0x58307AB6, 0x3B627463, +0x0B981BEA, 0xD8E9A038, 0x723219E7, 0x4F6E5470, 0xE4F3CF92, 0x37AACC8A, 0xA4E46500, 0xE44DDA39, +0x68690180, 0x33143C47, 0x9A6EE438, 0x5FA00F23, 0xD2CEE248, 0x46090D1A, 0xDE5491AE, 0x417D853E, +0xC607B731, 0x79D7DCCF, 0x13200C03, 0x07CAB5E9, 0xB59525EA, 0xE47B66A5, 0xB125AAAB, 0x20CCFE07, +0x82F1F4E8, 0xCF44BD2B, 0xC462D58D, 0x60A6A73B, 0x0D0CA712, 0xFE342922, 0x15123217, 0x7A02E89D, +0x49B44659, 0xB9F3AE54, 0xAFC472BC, 0x79AF1A6D, 0x7430BA59, 0xEA13F81C, 0x33592D7D, 0x1EF1E1DC, +0xF51FF0C8, 0x80F7B07E, 0xC1536EBB, 0x586CB41D, 0x10AF823C, 0x390EA571, 0x7D54C302, 0xA049ECBE, +0x368C3981, 0x38B72BEE, 0x833C5F98, 0x2E18D066, 0x5742B0D2, 0xA8F5F0B8, 0x9144935D, 0x7392A908, +0x3175DBC0, 0x29AA2F7C, 0xF53FED73, 0xFE41236B, 0x091E47EC, 0xD2195647, 0xCAAEA8B5, 0x0ED9750E, +0xF5027456, 0xF1838780, 0x16FFE8EE, 0xA21568C6, 0xC5E4FCAF, 0x27C24C4B, 0x3DE89E8E, 0x5464ADC6, +0x865C8493, 0x41032697, 0xD5F82075, 0x49167AF7, 0xED1AA45C, 0xA6B20018, 0xB1776BA9, 0x9F2129B6, +0x611C417D, 0x3B72E8B6, 0x1AA7DB22, 0xF4ADF40E, 0xA24B8EFB, 0xF25C5F9D, 0xE52C047E, 0x3B8C9A26, +0x4C0760E4, 0x73027C0E, 0x1F5977D8, 0x6CAF979D, 0xEF39719F, 0x70129F6A, 0x0CC821CD, 0x9853AE70, +0xC3EB24E5, 0xE4EED628, 0x9F904579, 0xFD680398, 0x2C84DF92, 0xF92DA147, 0xB2F7C7C3, 0x59052EB6, +0x4DF89375, 0x275D0C58, 0xBE32DA96, 0x7A3C4C7F, 0xC5C2B02F, 0x651B2665, 0x36E5DC9B, 0x98B1F08B, +0x175A5AE0, 0xBEC258CA, 0xDDF6B687, 0x49E3DBE6, 0x07C1C780, 0x63E3B861, 0x05FDAAEC, 0xFA7C38A4, +0x5EE93618, 0xF8B78C2B, 0xBB5035B7, 0x7E297AC8, 0x6CC27636, 0x30D44C50, 0xECB1065B, 0xB00AB96E, +0x87B3C67E, 0x0AA61403, 0xF514C18B, 0xDBF3CEEB, 0x62ACA4C1, 0x9A0D1691, 0x07E3DF50, 0xC42070E8, +0x98F349F7, 0xC1556162, 0x6F7D7109, 0xF6C7B215, 0x73748B4E, 0xAF9F5BFF, 0xDD1B8AE6, 0xA9C710AA, +0x5965A4DA, 0x762A0F38, 0xD42C7578, 0xBA69C66D, 0x2CCABCB7, 0x932E7065, 0xD6F3F37E, 0x729F1412, +0xE5EAEB07, 0x1C2D7291, 0x07E5E6C9, 0xCA16EED5, 0xD488558D, 0x235C11EB, 0x579B8BCA, 0xAC352250, +0x858BD553, 0xECCBE50A, 0x370421F0, 0xA66CD423, 0x1424CB84, 0x286FBE65, 0xDFF5A1E9, 0x71ABB615, +0xAE331217, 0xE8E333A5, 0x99044B7D, 0x26264E30, 0x35A7FEA1, 0x3E933B79, 0x4151D8A3, 0x672D78D6, +0xC586C999, 0xEFFEFF6F, 0xD1EC082A, 0x0EB38797, 0x85F77710, 0x5FEAE876, 0x78FBE4E2, 0x6284663A, +0x6E54B0AF, 0x5C107AF7, 0x24005DF7, 0xA994E2EC, 0xAFDDB6FF, 0x79019A53, 0xE1B8A123, 0x997B7B95, +0x9BFC63E3, 0xEAEEB40C, 0x14AECFE6, 0xC29A3F38, 0x21833356, 0x6B65DAAC, 0x9AEADA3F, 0x16582D82, +0xD6E7B8EC, 0xEE67A365, 0x3F33FD50, 0xABD603DC, 0x0DA08D72, 0x69E01AFD, 0x4862B58E, 0xE1DFCA98, +0x5FE11079, 0x40992E48, 0x0589689B, 0xE836FACC, 0x87FFD4D6, 0x9F5DF070, 0x6BC69520, 0x5CF6F087, +0x66523DC9, 0x54D0EEA3, 0xDD820FC2, 0x663BFA8E, 0x2561E952, 0xA82EDAB8, 0x3FC1092B, 0x8591A2C1, +0x0E9E67EF, 0x4A334D9C, 0x867BB16F, 0xB6A1713F, 0xED8D7EFE, 0xF2926C44, 0xD2E97512, 0xE8301103, +0x3DD30957, 0xEFB71B3F, 0x4AE801D5, 0x8F75F730, 0x0C34FBC9, 0x7A60C668, 0x77908ED9, 0x963C0DE4, +0x5279E29C, 0x6759B153, 0x747E5E7B, 0x4C510BE5, 0x32BE2132, 0x54B361E0, 0xCB4D9616, 0x3C404BA4, +0x4BA0E910, 0x05F06AD1, 0xAE3FBC5C, 0x82CB03B4, 0xF0EC45FF, 0x9888791B, 0xDE4B9813, 0xF83B4090, +0x3CC4BA28, 0x7CFE8854, 0x9CA7BC9D, 0x0E41843E, 0xF92535F6, 0xF19CC699, 0x0821CBF4, 0xF15F3F82, +0xCF6CC14C, 0xF27DA57E, 0xB8DB8982, 0xFC7E263D, 0x63C36111, 0x61587ABA, 0xB87CB18D, 0x2C806A64, +0xD8DFFF2C, 0xC8540E77, 0x1A340B85, 0xB6FBA97F, 0x77A1958D, 0x419648E8, 0x80A65729, 0xC3EC1141, +0x3909010F, 0x84F8C534, 0x2FEDE987, 0x83851AC8, 0xAE88B841, 0xE8284692, 0x3243F04B, 0x9C845E80, +0x4A7FC52E, 0xF6B1035A, 0x59E1C576, 0x21620CB8, 0xF047E16D, 0x079284B7, 0x00B6C955, 0xA7B19103, +0x7B9EB069, 0x733E2443, 0x489A6EAE, 0x7BB17B2C, 0x6AB4F848, 0xEFA299A2, 0xC464BE42, 0x36F27FC5, +0xE70CEAB2, 0x6FCB4031, 0x9C0A14C0, 0x682AA1A3, 0x36E7032C, 0x57BA22A8, 0x085288CE, 0xDE62ADD4, +0xC0138A07, 0x4A5576F5, 0xC0F33DE3, 0x919ECA7A, 0x14FFDE87, 0x362897AF, 0xD542F683, 0x86FBC0FC, +0x8CD6DD3E, 0x25832EDF, 0xC2C9EE74, 0xB244A89B, 0xFEAF2F44, 0x1D631217, 0x80BA2267, 0x097D3F4D, +0x406264AC, 0x0571B5FF, 0x55658770, 0xE12F6AA3, 0x666D9831, 0x37E17306, 0x88D926AB, 0xBB0CC6D9, +0xA857A201, 0xB24E5A82, 0xF259D2AE, 0xD09D0FAE, 0x87363A50, 0x583F1CC9, 0x653F73F3, 0x0D04970B, +0x64D1F222, 0xEF7E0E0B, 0x7F5D49DB, 0xAC4549D9, 0x707D1FCF, 0x3A151C06, 0xFE5DEC4A, 0xE3D6CCBA, +0x0AA3DA9B, 0x4665CBC5, 0xDF7BCD0F, 0x63DD0FF5, 0xC9C2A642, 0xB40B516D, 0xE259A165, 0xE2E454E1, +0x0A384EDD, 0x1287018F, 0x2A7A8DFD, 0xF854FCF1, 0x79CAA64E, 0x351AC522, 0xEE65C527, 0x7F160E51, +0xF465AF5C, 0xE671974B, 0xAF75CA8D, 0x47A5EC29, 0x5F93C8AD, 0x6420D4E9, 0xA5CA4610, 0x265F0BF4, +0x6622036C, 0xB542C8CB, 0xDFD1FA4F, 0x5869BE19, 0x14605EAE, 0xA438FEA7, 0x9523F5FA, 0xE18FCF2B, +0x5F11F7B1, 0x7A790EBA, 0xDBDD0005, 0x024E0D8B, 0xC387778B, 0x3C0F1274, 0xA722512C, 0xEAB3C2F3, +0x11B55F3A, 0x9C2DBBD6, 0xA76C80DC, 0xD63A5DD2, 0x320F7AF2, 0xA707544C, 0x889A3C58, 0x50CCA3B0, +0xD54FE248, 0x22EF12A3, 0xF618F564, 0x1D9266C8, 0x4E08FB46, 0x6D1D41EB, 0x5CFF2094, 0x116ECB97, +0x46FD4058, 0x38FBE5CC, 0xE008E8EF, 0x578FAF14, 0x3BEED1D9, 0x8C89B4CE, 0xFC0C33D7, 0x0913ECF8, +0x498D47D1, 0x5644A9B3, 0x6EA66735, 0xA0F3BA09, 0x948B258F, 0xFA8DE3BE, 0x2FB03145, 0x8D0B61B3, +0x42D6F53D, 0x031FD745, 0xFF86C938, 0xA32BB471, 0x50208969, 0x9F6909C9, 0x680C6D55, 0x13054044, +0xDFDEBEF7, 0x35600E83, 0xAFB26C47, 0xCAA86F9F, 0x5B5B65A7, 0x599DA0C3, 0x789EC931, 0x0163D6D4, +0xF7BBA271, 0x5A755052, 0xFA27CE77, 0xD66ED111, 0x7A5BD527, 0x1B26B948, 0xAA11725B, 0x4A6AC4AD, +0xDD8EA8DF, 0xF0C618D3, 0xF97999E5, 0x00C42C38, 0x8465BE06, 0x7B6912C9, 0x4AF1F070, 0x4F93EEB0, +0x19A400FC, 0x0F8A6744, 0x7FD642F2, 0x3AE8F32F, 0x84501DDA, 0xB39068C6, 0x2A5BE1A6, 0x08E231F0, +0xD52F4D13, 0x89326BE0, 0x3981DD90, 0xA986F547, 0xADF1B2E8, 0x6337CFB6, 0x595FCBC0, 0x2D774749, +0x1D6C5FF1, 0xF403CE90, 0x16792051, 0xCE248A7D, 0x43E76774, 0xA85ED14A, 0xCFBDEB69, 0xDF559AF6, +0xC3BF33D1, 0xF03BB486, 0x107D04B0, 0x9B9E9432, 0xE4873EC4, 0xFD7C2E89, 0xFA69FD26, 0xD04F8825, +0xB9C4FF1F, 0x30F0826C, 0x825A8A34, 0x5EBB4ADC, 0xA71C9FF5, 0xE90ECF8A, 0xFEF3270F, 0x25612AB6, +0xF8560C1F, 0x625A9ECE, 0x12B9B123, 0xA281D55C, 0x276F3B4A, 0x6CDE95D8, 0x7EE9F866, 0xDC769A4F, +0xC590E1F4, 0xEA845796, 0x013AFD9E, 0x6F8E1A4D, 0xBEDF18E1, 0x2CC567BD, 0x56CBAE9D, 0xF81716E8, +0x88834AAE, 0x1C67A0AE, 0xDDB4EB33, 0xF0F874E6, 0x4DE9C550, 0xCEAC73AD, 0x5C800FD8, 0x6A31B61A, +0xA8B3A501, 0x73639607, 0xC95BAE + +basegraph= +1 + +z_c= +320 + +n_cb= +21120 + +q_m= +4 + +n_filler= +688 + +e = +21592 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v7813.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v7813.data new file mode 100644 index 0000000000..6e1acf5a44 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v7813.data @@ -0,0 +1,43 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +# Origin : FEC5g_DL_1/7813 + +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0x8C4DEB9F, 0x52 + +output0 = +0x1A6D0FA6, 0x7017 + +basegraph= +2 + +z_c= +7 + +n_cb= +350 + +q_m= +2 + +n_filler= +30 + +e = +44 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v8568.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v8568.data new file mode 100644 index 0000000000..e9bacd1b83 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v8568.data @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +# Origin : FEC5g_DL_1/8568 + +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0xB6D49CE2, 0x3E96B93F, 0xF02009F6, 0x2DF3D30D, 0x3B06C160, 0x646C69CC, 0x54439F0F, 0xCE0D12C3, +0x66E8BFD5, 0xA9D22B0C, 0xA9E7343B, 0x2B6EEF01, 0x6B6966C0, 0xB98FE144, 0xC3BF7BAD, 0x1B40DF1C, +0x973B12DC, 0x46E25E90, 0xB324ACCA, 0x5F0ED2B9, 0xBB4F + +output0 = +0x8F1A7C00, 0x836CF0E5, 0x717CE52D, 0xEE86FB44, 0x21621E25, 0x58425AB5, 0xECA0F645, 0xAE9E63E6, +0x287D84BC, 0x9F19A401, 0xD68C4CA3, 0x354ACA5A, 0xD68D7FF8, 0xFAA84645, 0xCF0DBC28, 0x693C50F0, +0x9A3CD23C, 0x57E97520, 0x929BAF90, 0x8E2BA7D8, 0x5EF0FB8A, 0xFFE7B153, 0x9E164074, 0x4D06F0A2, +0x6BC68E5B, 0xB8274587, 0x69641DFC, 0xF5DC89A0, 0x4F8E741C, 0x1CB682DA, 0xEF36E914, 0x8BDEBA30, +0x4B6777E2, 0xEFBFD14C, 0x85F0DF67, 0x55DBD201, 0xCF29A01A, 0x862BD273, 0x1F43CFAF, 0x5CB128E9, +0x9C322654, 0xF8E4E47A, 0x0FCD1806, 0x0C7B6BC7, 0xF7B9748A, 0x6DE5D592, 0x0D119373, 0x5F7DC28C, +0x68F26F39, 0xAA47E18A, 0x479CDAAF, 0xE19DCBB3, 0xA72B475D, 0x2E781ED4, 0x4CBB910A, 0x5E5A5A1D, +0x2F668621, 0x86BD9FE1, 0xF1DC12E5, 0xB652E2C1, 0x2E0AC199, 0x059E43C4, 0x14F9B51E, 0x7DA378C5, +0x214E4D5F, 0x72ECE751, 0xF997A106, 0x3F362F62, 0x045DCA85, 0xAD27A58E, 0xB73B4390, 0xEB76C5D2, +0x58CE8B78, 0x73A1D1EA, 0x9705C8E4, 0x224703E8, 0xA0DE7885, 0x9CDBBEE0, 0xBAAFAE85, 0x1B5CFB8A, +0xF66B5209, 0x979335BB, 0x2AA6C7E2, 0x7E3958E7, 0xD39F8BC0, 0xD73BEA43, 0x24C74D3E, 0x9372C2D7, +0x49804670, 0xB3A983FC, 0xFA6DB662, 0x4E657550, 0xDDF757C2, 0xA7265DE7, 0x51BFA1A6, 0x63E1325D, +0x1FDBE953, 0x17348EDB, 0x6B6DC5C0, 0xE335772B, 0x32612617, 0xC13B63EB, 0x8C40891A, 0xF3566154, +0xF5345933, 0xAD9AB800, 0x4CF92B41, 0xF3B32673, 0x80577879, 0x19F8BB0E, 0xAD677483, 0x21B2EDC7, +0x3F96C8E2, 0x7B9211B7, 0x11909101, 0x6A9D9BF5, 0xC4A0E407, 0x5B013820, 0xD2102C31, 0xDC6F548A, +0xA4F6B72A, 0x79F19991, 0x6A21BE3C, 0x2E5CF7A5, 0xDCBB384B, 0xB05B5649, 0x1D61CCF1, 0x9DC122F3, +0x00CA6A82, 0xB7CECDF0, 0x605252A3, 0x0500B498, 0x61AA1618, 0x669788EF, 0xF0DB599F, 0x3ED04C4A, +0x17387F1E, 0xBDAC7B52, 0xEE7D1E0D, 0x58AF212C, 0x0CB064F8, 0x646239DB, 0x88CF9549, 0xD3C7C652, +0xB82109DB, 0x22225244, 0x305F8384, 0x9B4166D5, 0x704FA445, 0x956A0CA5, 0x89963D07, 0x5EF61FAB, +0xF71EAD06, 0xA47FB814, 0x86581A5C, 0xB81B9445, 0x4ECD608E, 0xE369E9A3, 0xFEB80EE5, 0x1399AB02, +0x30A74BEA, 0xCF08B948, 0xB0857028, 0xC81F8CD8, 0x64E13623, 0xAFF927F5, 0x592D7629, 0x7295DE02, +0xE98E2F04, 0x7407C828, 0x85EE9A47, 0xF9B6F671, 0x77F40DF0, 0x81CE7DA1, 0xB8732D5F, 0xC7AC742E, +0xF8623836, 0xE68F4E66, 0x18F29BB9, 0xF57E3350, 0x0E14399C, 0x114ACFA1, 0xFECFBDAA, 0xB0894694, +0xC8DF6D23, 0x7C71FB18, 0x91F00CF2, 0x6A45BC52, 0xFE99962D, 0x41FEBA3D, 0x5C1BB499, 0x51E50591, +0x04D9CDDE, 0x503FBB80, 0x2788B4EE, 0x82A545D8, 0x5F6DD45D, 0x7AE48BE2, 0x4C653419, 0x3C32D58C, +0x48788C71, 0x97A054A3, 0x7FC443B4, 0x805DFF9E, 0xA607D2C6, 0x02DA82C2, 0x884664C5 + +basegraph= +2 + +z_c= +72 + +n_cb= +3600 + +q_m= +2 + +n_filler= +64 + +e = +6624 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v9503.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v9503.data new file mode 100644 index 0000000000..7fc8c95437 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v9503.data @@ -0,0 +1,197 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +# Origin : FEC5g_DL_1/9503 + +op_type = +RTE_BBDEV_OP_LDPC_ENC + +input0 = +0x88CCED56, 0x1C072C76, 0xD4D23B69, 0x78C979BF, 0x60764BE3, 0x4470E86B, 0x20A46F84, 0xA0211B5C, 0xE1952001, 0xB77912DE, 0x52E8BA16, +0xE5BE8445, 0x95093ACF, 0xA8BE03D2, 0x49DBB5AB, 0xC3946403, 0x4DD44236, 0xC2833E65, 0x7288C53B, 0xD64FB75E, 0x7438C1EC, 0x71070BEC, +0xA40F8094, 0xABF43E46, 0x564487F5, 0x8435AC89, 0x2D98A4C3, 0x07CD13F4, 0xB44CEEA6, 0x2E00DD83, 0x12EF45EB, 0x01A047B8, 0xBC563FD5, +0xCA5C1136, 0x7AB9F2C8, 0xD62C59A9, 0x913DF674, 0xC900322A, 0xCF54042E, 0x6CAADB1E, 0x8077B98C, 0xBCB51468, 0x58339E5E, 0x1D176854, +0xF9E2D74A, 0x2994B28A, 0xD0E46263, 0xCD8A0FDB, 0x0119B915, 0x1E5433C9, 0xEA298A7D, 0x9EB4FC8D, 0xEF93B537, 0x6D441397, 0x6A4C8DB3, +0xB8E4AFE9, 0x1520BC1C, 0x8669961B, 0x5D484802, 0xC2793340, 0xB5FE7945, 0x43AC7CE2, 0xB74B70C1, 0xFCF56F87, 0x3E146A49, 0x0391D092, +0x672D2427, 0xDC91BB53, 0xEB24AC1F, 0xCE0D8E63, 0xF12F7ED8, 0xB3192024, 0x0697AE9C, 0x3415F178, 0xD8410FFC, 0xE34734DE, 0x6C6E6BF1, +0xDCD211C3, 0xBF6B0B87, 0xA1624F47, 0x3524BC4D, 0x4B4A1891, 0x8691223C, 0x12EB2DA4, 0x0B51F616, 0x31276F0E, 0x86CB4D17, 0x15CA0F9B, +0xEB989F98, 0x1141D335, 0x442C699F, 0x82E9758B, 0x267E6D4D, 0x71BAC54A, 0x2FBCBD52, 0xA0966795, 0xEB08B437, 0x1A9899A0, 0x26484B82, +0x3AEE43A8, 0xC409BE45, 0xCF8C6EC9, 0x098DE63F, 0xC3BEA60B, 0xCB7A5B6A, 0xCBF2A44B, 0x31E9FA4C, 0x34FD7E88, 0xA3C5AF89, 0xF13C8E2B, +0xC01C79FA, 0x622B9FD8, 0x692D4C4F, 0x712BC24C, 0x16FBD6C3, 0x7B1BBC38, 0x63F1E328, 0x6F4B + +output0 = +0x6ED462FE, 0x29726470, 0xE49C87C1, 0x6594725E, 0x64C81AE1, 0xA30C91C2, 0x5B4261AB, 0x7A44E3A4, + 0xACBD3DC8, 0x319AF530, 0xF3B21EC1, 0xAC180011, 0x26319FF9, 0x5946FBFD, 0x6F31959A, 0x571501D9, + 0xFB1F62B7, 0xF19F6C36, 0x43436C4A, 0x8CA5F436, 0x18AF91B4, 0xD86ED79F, 0x8732D29C, 0x6CE3B559, + 0x2DEA712F, 0x52C2E21A, 0x5C4E884C, 0xD2F50500, 0x2140E848, 0xABE47066, 0x8AE3FC46, 0xF0298999, + 0x829FE184, 0x51D53B6B, 0x7546D03C, 0xF1CB22DA, 0xB9D6F966, 0x85660A1F, 0xC1296566, 0xB2122E16, + 0x2AA38C25, 0xD7AF18FC, 0x489BDDC5, 0x93183097, 0x4C694A3C, 0x40B325F8, 0xEE05DAB2, 0xA6E0C990, + 0x839A7753, 0x0251D207, 0x5E1EC6B5, 0xED523076, 0xD985E23A, 0x8CA88259, 0xB0EFF6D4, 0xA9D7749B, + 0x32CA6F0E, 0xAAA84E97, 0x0F137B83, 0xE73C3175, 0xA3940FDA, 0xD878B121, 0xFFC8D2EC, 0x95CB65AC, + 0xB1CBE446, 0x73520449, 0x7D929F16, 0x69D1873C, 0x85640C01, 0xF2228024, 0x0A5E0461, 0x58B0933A, + 0xD37E2375, 0x36CEECEF, 0xE57A48F8, 0x4A35B5C9, 0x016A16A0, 0x6F9BCF30, 0xEB7C3BD0, 0xB1AF27FE, + 0x9C389360, 0xA91F2142, 0x51E618D3, 0x5F045697, 0x654C6A49, 0x2E38E30C, 0x9E8F1E63, 0xF1B25686, + 0xA0CDFB02, 0xDAEC605D, 0xED910B79, 0xA8E1A341, 0xAD6BD0A3, 0x03BABB0D, 0x4059355C, 0x5ECB8646, + 0xFDD9E0C6, 0x69106FD2, 0x47BF857E, 0x740F6313, 0xAB15E1FF, 0x94B21225, 0x600FEDF3, 0x1EF83A71, + 0xCE6956EE, 0xE538FC7D, 0x47520BE0, 0xA1A20CF2, 0xCB452B91, 0xEACB9E3C, 0xBA242A34, 0x13C81868, + 0xA58AB271, 0x724B350D, 0x95131286, 0xCF74DD61, 0x1D0CF41B, 0x38D046D2, 0xB709708D, 0x4D479AA8, + 0x3CBF6817, 0xDF115777, 0xBE69B850, 0x071A2B4C, 0xF3246B56, 0x2881CBA0, 0xAE158E87, 0x36538CB0, + 0xEF879197, 0xDBA9C1C7, 0x4EF7235A, 0x56120670, 0xC22DBEC7, 0x7071A05C, 0x376ADBD4, 0x5DD586FC, + 0xA638A621, 0x6D49A92A, 0x66F0C925, 0x023FC9DE, 0xF7CA1D36, 0xAF19A18B, 0x2A787792, 0x518938D7, + 0x25DE7B4A, 0xDEBD9010, 0x9683558D, 0x9C5694C7, 0x8B2558D0, 0x790CD121, 0x0A35C0D8, 0xCD4FBCED, + 0xB89F3275, 0x64A49655, 0xED7992A1, 0xAFB0A4D0, 0x29A9EB1B, 0x9244B2C0, 0x2CD88F45, 0x4AA1E98E, + 0x8E32CC3C, 0x8BE5DC7B, 0x759C8B24, 0x8AA119BE, 0x9CFEA065, 0x071F86FD, 0xB83F8181, 0x604FF2FB, + 0xAACDC394, 0x0BCC72F5, 0xE9C0CB19, 0x56EAE15F, 0xD33B8DEF, 0x01A1B007, 0xBED7C1A3, 0x18788E49, + 0xB565EA30, 0xC269F619, 0x1CF1B024, 0x067E9F59, 0x78E61AB4, 0x3D46CFBB, 0xE58E910B, 0x8E7ACF53, + 0x1EB9C15D, 0x4E3C43BF, 0xEF3D8F20, 0x5CC0A030, 0xE10AE4E7, 0xABE24941, 0x9A0C4046, 0x24E090CF, + 0x3248C414, 0xAF76560F, 0xCD1B106C, 0x70438AD4, 0x3463D8B0, 0xD85860FE, 0xFCDF0D57, 0xA2DBC09E, + 0x44C728C1, 0xD8FEE73E, 0xB1E6B4A5, 0xD0CC95CD, 0xCCEF186F, 0x70AC5D98, 0x57D21267, 0x8543F446, + 0x15C8EAA9, 0x0DD357D4, 0x4CE9C090, 0x4E91FADF, 0xE0658E27, 0xFF7AA5D6, 0x176ED723, 0x70D009CB, + 0x416ADBAA, 0x1C45865D, 0x105F3A0E, 0x14730450, 0xD0FA1AC9, 0xB76F268C, 0x7B075289, 0xA9455796, + 0x65E02F3E, 0xB74521F2, 0xF6CAA6C7, 0x94ABFDAD, 0x1E6D1087, 0xC25A9257, 0x87FAF9A4, 0x5184A0FA, + 0x240023D7, 0x7AE0ED45, 0x06E0A838, 0xBB018F31, 0x0FA836D5, 0x09CF6AEC, 0x9BC4F2B2, 0xAE92D5BA, + 0xE724036E, 0xE5606DDE, 0x631448F9, 0xFD59B782, 0xF17052E4, 0x66EA4C50, 0xF72C1768, 0x5C24ECEC, + 0x6B01B118, 0x89F8A3AB, 0x465FF462, 0xC3896A00, 0xFEC06004, 0xE2DFC70C, 0x3ACF338F, 0x1552E9D0, + 0x9F699B77, 0x60AC6D29, 0xBF47FD38, 0x826B0CA8, 0x0515A7AC, 0x1380A222, 0x7D054EA0, 0x3D1BCEC0, + 0x21AB6CF3, 0xA889E915, 0xF09D9756, 0x08BA519A, 0xCFFB6BD3, 0x7D5EF4F9, 0x34A0E942, 0x8569A327, + 0xFDDC5269, 0x60D8D543, 0x88B34B88, 0x50DEAA10, 0xD0563E1F, 0x80CD122B, 0xDC11607F, 0xCD9D7E05, + 0xC0F3510E, 0x414A7545, 0xB8211557, 0x103E6F53, 0x08A47672, 0x04D9C391, 0x3281F25C, 0x7526AAD2, + 0x3C89B43B, 0xBA767E59, 0xA2788EAC, 0x5EF9DF3D, 0x8F72BBE6, 0xC4B52A2B, 0xE81A80E9, 0xCD6B24D5, + 0x4F934751, 0xA3FCC2B5, 0x1C4FB12A, 0x7C363E45, 0x237CB63A, 0x1F26D6FD, 0xAAF3FE61, 0x48D3B3A8, + 0xA2A77A81, 0xADCF4AB4, 0xDF94F9B4, 0x465EA838, 0xCE4BA15C, 0x75826F5A, 0xD537E32C, 0x85F8FECD, + 0xD07CAB1C, 0x34F91310, 0xC40B36CA, 0xCCE0297E, 0xFB276610, 0x67DF82EC, 0x8BB58FAA, 0xCEA3BDC2, + 0x02B21D68, 0xCC1F8A6C, 0xF902AF4E, 0x271828EA, 0x9028298A, 0xB5BF0156, 0x5A3B3188, 0x6CCB6806, + 0xE2F3A4A2, 0x3B776BB9, 0x66D01790, 0x133F2414, 0x1445FE7D, 0x5CC79E5B, 0xB95FD30F, 0x50971FC5, + 0x8D6AFECA, 0x3FB2427C, 0xC1A980EC, 0x54C9F2AF, 0x0F509DF3, 0x1B950AA4, 0x1E5B1596, 0x93E974B9, + 0x71D51A0F, 0xC973F4DD, 0x79BF62A6, 0xC72F58F9, 0xCAD478D6, 0x0F7C36C7, 0x05D08481, 0x43958D67, + 0x93F11E1A, 0xDCDDCE62, 0xB457AC62, 0xD4A98268, 0xA793471A, 0x7AB637E0, 0x1B9BA86C, 0x456B5EF7, + 0xD2E75711, 0xF95E6BCD, 0xD3043467, 0x056F1621, 0x21D58D4E, 0x0C9EF57E, 0x96B645B1, 0xF5A80340, + 0xBD9A4C7A, 0x4D94A305, 0x59D0F9B4, 0x113F56F9, 0xE0A948B5, 0xBF982299, 0xA05D1EA1, 0xE9C50F8A, + 0xAF6B8F04, 0x6B05485E, 0x17DD458A, 0xFB819464, 0x5CE2F61F, 0xECF95F48, 0xA26CFBA2, 0x6A0FD00F, + 0xA7A2CB0F, 0xFE10768D, 0x4A258743, 0xBBF2C41A, 0xF519DBEE, 0x9DA676B6, 0xE89449C9, 0x3E13EBE5, + 0x4A4A42A5, 0x42663182, 0xDAAF85AB, 0xCC671BCB, 0x217491EE, 0xDCC9B6F2, 0xE1A3A7EA, 0x7B13F2F9, + 0xCFFCBC9F, 0x3D8FF387, 0x71ABA888, 0x2D3FE4C1, 0x081AB3DC, 0xBF21BA4B, 0x4ACE0F00, 0x6F5AB592, + 0xD328F08C, 0x542388E9, 0xE7A4157A, 0xE8532856, 0xE8DC528E, 0x3F2356AE, 0x76867882, 0xEC11E6D0, + 0x0C2DD257, 0x40A7C558, 0x354F885C, 0x2A2E0757, 0x6C0A6D95, 0xE0C23A09, 0xD1F32FF7, 0x7E27842E, + 0x3CDFD97E, 0x2F6807FB, 0xDBED07BD, 0xA039645B, 0x324B0955, 0x73620D27, 0x0C47D75F, 0x511BD37A, + 0xE80C4C44, 0xA3D77AFE, 0x058B503D, 0x391AC187, 0xD7425F0B, 0x93876765, 0x10CADF4C, 0xC4F3539A, + 0xF17B776C, 0x017BDEFA, 0x74F4651F, 0x65FBC1E5, 0xF55CC6B6, 0x1752401A, 0x85FB6434, 0xB8FD0F06, + 0x4D0D80FF, 0x0DD8438D, 0x1C5844B7, 0x31ECF66B, 0xF8A8B528, 0xA9BE0373, 0xC401C7FC, 0x3BA1FFF4, + 0x63946BBD, 0x82514893, 0x9CE303D6, 0x51EA2484, 0x054CACA2, 0x3F812B32, 0x0F3C603F, 0x4B3D86B6, + 0xD33F5950, 0x3340BFC0, 0x47CEB79D, 0x1CAB5D3C, 0x74897EB5, 0x1C320D6D, 0x8F0480D2, 0x1384331B, + 0x8363A7B3, 0xA5439504, 0x0E06AA80, 0x4BBFF55C, 0x470094F3, 0x8DE8E9AA, 0xABA72796, 0x4333B263, + 0x6FEF04EB, 0xF921C722, 0x9599B4C8, 0xBFEFF55A, 0xF89AA502, 0xDFE85218, 0x0EE15930, 0x8B2AA7F8, + 0xDDB03823, 0x7427A3C2, 0x8E4AF556, 0x66A9640E, 0x2EA271AE, 0xFC5BB50C, 0xDC50B432, 0xF78BB3D6, + 0xA06156DE, 0x5A7D7A40, 0x40BD74BF, 0x882CC19B, 0xDB2B6143, 0x5532686C, 0xA6D65320, 0x6AB5B32A, + 0x34129535, 0x9E41D92F, 0x3D86A085, 0xA27DE0C1, 0x6FFBEC11, 0x77A4BE81, 0xCE1DF886, 0x318E96BA, + 0x82C84B84, 0x40B9874F, 0x39F9F9A9, 0x21E0AACB, 0x237FC858, 0xFF700E2D, 0xA840518D, 0x5E5ED583, + 0x7B11CB4E, 0x99733B7F, 0xFFAAF7A9, 0xB8CB13B7, 0xE67AE45C, 0xFFDA2FC2, 0x47D08BD7, 0xD68BACF6, + 0xDAAE30ED, 0x95735CAF, 0xF896B165, 0x395BC94E, 0xADF803B0, 0x76B82F4D, 0xF312DD33, 0x0DD0A49D, + 0x0852B35E, 0x4DF14366, 0xBA01C779, 0x1415A8FA, 0xDC10F525, 0x1CE06D80, 0x953089E6, 0x933C3EE5, + 0xC18B1022, 0xFAD11D71, 0xA1EA92BF, 0x2AE61798, 0x63D0C0CF, 0x1CF8CA34, 0xDF748AFB, 0xF0FDE897, + 0x26FC4399, 0xE563FFC5, 0xE6AFE218, 0x5EE3254B, 0x76565E08, 0x70F5EFBE, 0xBD66AC9A, 0x90853CB1, + 0xA002CE55, 0xAFE263F4, 0x804DA5A5, 0xBB971F95, 0x775BDE46, 0xEDA15B5F, 0x3D5A2CFE, 0x6D9FE953, + 0xE84541F5, 0x6574FB29, 0xFD3ADC69, 0x1BAEDDED, 0xE3F810C2, 0x87CC8D7C, 0xDC23F894, 0x7635A6DC, + 0x294E131B, 0x62FA4471, 0x83D3870E, 0xF82B9324, 0x8A493E04, 0xA8FCDF75, 0x20583A80, 0x5A94424E, + 0x18CED906, 0xB417F24A, 0x47089341, 0x62A432C0, 0xFDC17DFD, 0x5B89C6D2, 0xC8C8ED37, 0xD44D38B1, + 0x9A6DFF2C, 0x7C5ECB65, 0x76814C50, 0xB3D56A33, 0x5DF124F8, 0xDB92A5D9, 0x210F2E0D, 0x50FFFF1B, + 0x1B7ECD90, 0x481ED2FE, 0x094DA8E8, 0xF111F8FA, 0xAC7872DF, 0x4B8FE240, 0xA7CF01FD, 0x72AFAF1B, + 0x27BE7F7E, 0xE5F42B34, 0x02807296, 0x325F9CF6, 0x97EE1C92, 0xD5E6F65C, 0x7EA2490F, 0x666E3451, + 0xB17E6A43, 0x1AFBE46E, 0x8D2B871B, 0xD52A1A9E, 0x41EBA711, 0x9D4B906B, 0xAEB5A2F6, 0x7EC530E7, + 0x063FC87E, 0x48830732, 0xE5EC2B25, 0xA17B0F26, 0x2C63A878, 0x7A1362A1, 0x68B4DE31, 0x6EC14B7E, + 0xE65C3B05, 0x8EB452EC, 0xB6DD94CA, 0x8DC592C5, 0x402EA8BE, 0x689F131B, 0xDA3A54D1, 0x41D264AC, + 0xAD150ECF, 0xD7750790, 0xBD46E2A0, 0x2DC97F87, 0x2476F6AE, 0x28F4778E, 0xB4B9E75A, 0xE5532AD6, + 0xE58A7485, 0xDFDD2553, 0x779D3F91, 0xD89F3033, 0x42BB4152, 0x2F6EFB01, 0xF72C43BB, 0xF1DB8663, + 0x5BA625E2, 0x17180017, 0x151F03B3, 0x7FDA9772, 0x1DEB2F8D, 0x178DE5EE, 0xDFF10ACA, 0x2DC29F2A, + 0xF2797346, 0xC298535D, 0xB56C1D35, 0x6389138B, 0x54B732AE, 0x3FAF9958, 0x3BFE3E52, 0xA311D83E, + 0x50E7B0BD, 0xC28F97B4, 0x8C1FAAB7, 0xD22BD453, 0x4E6A4D65, 0x626B6251, 0x1F547F6C, 0xEF8105A0, + 0xB7A062B6, 0xE1325CC7, 0x8207E7A2, 0xB0A9E0D6, 0x097B78C1, 0xC41D4176, 0x13DB573C, 0x5291E598, + 0xF4D1AFB4, 0xA93FE970, 0x673042D8, 0xCC98A35A, 0xCEBD4AE5, 0x47B8BB39, 0x5F8A294E, 0x37FDA881, + 0x9E81D5BD, 0x47691BD1, 0xFB92FBF8, 0x24AA898D, 0x0D0B5B29, 0xE5E11928, 0x7D356637, 0xC4525D0E, + 0x72AFE781, 0xEBE53FCD, 0xBCBB299C, 0xC40B26D3, 0x1C049A63, 0x4621C7F8, 0xD3337531, 0xF5CCAE80, + 0x5D3D0BB7, 0x2246BD17, 0xF158D4F9, 0xE5CB58A2, 0x07F5F1E1, 0x9D420346, 0x952C186B, 0x9DBB2227, + 0x203D1639, 0xC022D8AD, 0x7A91F3DD, 0x9326CB7B, 0x2971F3FA, 0x7EF8C14B, 0xB7B468DA, 0x840A9104, + 0x6F811C48, 0xC0DAC40B, 0x68D75281, 0xB7DCB2D8, 0x9A216C54, 0xEE710DB9, 0x54ADDAC6, 0xF6F71ECF, + 0x6F1E0D83, 0xDE5ECA0D, 0xEA40DE93, 0x962D60E7, 0x6B575E29, 0xFFCC6677, 0x0D879692, 0x728CBE24, + 0x9011B3F8, 0xAB260F9E, 0x5D71E2CA, 0x501F6613, 0x5F16EE75, 0x0D33E974, 0x8865BBE8, 0x10495EA6, + 0x393032AB, 0x6C7F4A61, 0xB685D152, 0x29D429A4, 0x24CA7E33, 0xCD26F3F2, 0x78D85078, 0x0BA90BA3, + 0x360CB744, 0xDF999168, 0xB60B3644, 0x39EED49A, 0x4A794E4A, 0x3B6715BF, 0x92D35DC9, 0xF640ADB6, + 0xFA96EF3D, 0x0DC22AD1, 0x48262E68, 0x6F620F37, 0x6B29E242, 0xC6FBEEB6, 0x3034A0D9, 0x122EF44F, + 0x7EEF61DF, 0xF3854D20, 0x0F84C1DB, 0x0DE504BF, 0x8AE763ED, 0x369AD35F, 0x8BA7B643, 0x44933BB5, + 0x49E96357, 0x4C7F9884, 0x2A5BF491, 0xBB8DCDC2, 0x3873C5F5, 0x0DB1AB26, 0x09FF188A, 0x93DE180D, + 0xBA757CAC, 0x06AFFBE6, 0x12B37F82, 0x150D3234, 0xC2C0AB1E, 0xC8B4D8F3, 0x65B7BB96, 0xBBF951B8, + 0xC4A03C44, 0x7E2FF9B6, 0x86592827, 0xECE0BE1B, 0x0DB32865, 0x5FC2CD73, 0x34AD2D16, 0x3B2057A7, + 0xC32C663F, 0xA85CD1EB, 0xEBD5BCF3, 0x439DC2FF, 0x93379CAE, 0x99273984, 0x3659A11F, 0xD5FF53BD, + 0x38704C43, 0x3D782532, 0xD7306729, 0x420E909F, 0x4840C5F3, 0xDA80DF8D, 0x53395E04, 0xEF690DCF, + 0xF9738931, 0xE91F7065, 0x5EB901A8, 0x176C6A2C, 0x25D062AE, 0xE4CCCB95, 0x93C87277, 0xF8FF911C, + 0xD7AE6706, 0xE704A40E, 0x38BCF64B, 0xDDFFF9FD, 0xD1BDE381, 0xA4313A0B, 0x48DDA520, 0xD064D1E3, + 0xDBFD61EC, 0x7EA87E9A, 0xF894AAFD, 0xB5565368, 0x2C34933D, 0xF0F50DE9, 0xF91EB25C, 0xE3EC3B8E, + 0x5E9409A7, 0xB2A9D39A, 0xB6B19F3F, 0xA6685DC9, 0xCAFC5B74, 0x4CC15F7F, 0x114E5709, 0x31B6E0EB, + 0x8CDAA5C4, 0xF5ABD631, 0x12A4A9C0, 0x969011BE, 0x9AB39E96, 0x0D406569, 0x8AE25103, 0x68474C26, + 0x9E8D006F, 0x9C8E4F0B, 0x314630FD, 0x2F30B254, 0xFE88FCF4, 0x941FBE2D, 0xC03B55A3, 0xEE474898, + 0xEC9B3BD2, 0xDDE00C4B, 0x7F192B54, 0xA25A0DC1, 0xDCF18F59, 0x55F674B4, 0xF6734A46, 0x92B7A7E2, + 0xCEDA18D8, 0x90EA738E, 0x7C98FEE8, 0xFC3DE7ED, 0x4075569F, 0x8989B676, 0x326B34DA, 0x52AC749C, + 0xAF71ACF8, 0xDC1F65F4, 0x408459F9, 0xD46B650F, 0xFAEDB779, 0xBC0C6EDB, 0xF68DB879, 0x40071FCD, + 0x2D01AC86, 0x7952D58A, 0x4F7A42BA, 0xD5C9306C, 0xFA7CC252, 0x48285F83, 0x51CD6BC3, 0x8212BC4D, + 0x53828B06, 0x8986B36F, 0x6E00951C, 0x6505074F, 0xAB3AF4CC, 0x12D92810, 0x44F4D0B5, 0x0D7DBCDD, + 0x152A5968, 0xA92C4ECA, 0x6795E17F, 0xD02C875E, 0xA4B5A04C, 0x2F0C4295, 0x72678451, 0x59B87A4C, + 0xB3AD2988, 0x7B717173, 0x6D0EC6EB, 0xF73B4FC7, 0x645D56E0, 0xBC73769E, 0x9A83ED5C, 0xCE5B332A, + 0x151A4D6C, 0xDEB26C33, 0xBA7CFEA9, 0x0FB2D875, 0xE0045E66, 0x9DB0072A, 0x5CFB3C42, 0x8C3FEFD5, + 0x4E7CB65C, 0x2905EC79, 0xA2F6C308, 0x296A6794, 0xB589571E, 0x4638BC8F, 0x964B8B40, 0xBE27615F, + 0x4E95C30C, 0x2B56A6A8, 0x4BC50BC3, 0x497BB78B, 0x8860A6CC, 0x80830DB7, 0x9D726E3A, 0xE63600FD, + 0x7A68F80B, 0x1C5CCCA0, 0x1784B6A4, 0xBCA7EF08, 0x425ABF74, 0x3663AD11, 0x72F2AEC0, 0xA4A940F0, + 0xBBC08817, 0x5C158691, 0x7C1ECC0E, 0x1818BB5B, 0x0DE17D9F, 0x350D4BB6, 0xAC21F0FB, 0xB913C7B0, + 0xE9DC26F6, 0x25B995C5, 0x0D2E9E6F, 0xD39C93A8, 0x1C775CED, 0xF1E69A7D, 0x0025310F, 0x782BBDF8, + 0xFD3E83E4, 0xB5DD602E, 0x1CD9044C, 0x2AFC3405, 0x79E32E1E, 0xB59B4A79, 0x4609271E, 0x1C5E4D7A, + 0xA74D0009, 0x319A07E9, 0xCAC3A6FF, 0x8B515C07, 0xE80FE11D, 0x1D59CF05, 0x38F946AE, 0x6324D94E, + 0x313D3FE8, 0x310AF64C, 0x3CDE2571, 0x0644DA97, 0xEADBF286, 0x7B5DACA1, 0x8D5D3A54, 0x1376A003, + 0x51774091, 0x562A7891, 0xC246A9FA, 0x82C1C05F, 0x0D662D24, 0xAEDDA534, 0x5A96ED06, 0x2C055326, + 0xB0F2F5B0, 0x21C1F0F6, 0x6C39F1DE, 0xDE48E8FE, 0xB5CD1538, 0xC4E356AC, 0x1B24FE63, 0xF36D1426, + 0xB8B827D2, 0x1576F620, 0x3F49589E, 0xC438975C, 0x64880EDA, 0x7C322884, 0xD3978FBD, 0x4787B61E, + 0x2E192772, 0x0584B589, 0x0EAAA684, 0x6D81DE51, 0x63717598, 0x08A48B4D, 0x2DF88EC5, 0xA647285C, + 0xFC81F7AE, 0x10E48D34, 0x963F5C91, 0x8F592492, 0xC79010B8, 0x8A6D4936, 0x4759E38B, 0xACFC5255, + 0x0C9D02B7, 0x1B52A34E, 0x3B0A60A1, 0x1DB4E220, 0x23DCD523, 0xEA42AD41, 0x9B3CB86B, 0x6C503824, + 0x41DC835D, 0x22A311A5, 0x7B7AD03E, 0x6AFA5972, 0x3E506D92, 0x04FED79C, 0xCE801EEF, 0x7BA17C52, + 0x3AFFBB6A, 0x96A23185, 0x74316B7B, 0x11D330F6, 0x8484E528, 0xB643261D, 0xCC076540, 0x9116E092, + 0x4B6D5634, 0xC9532DCB, 0x0CBBB981, 0xE8D8E41F, 0x7573408A, 0x684F202D, 0x9A92649E, 0xF2CF0C39, + 0xF6C540AE, 0x29368636, 0x6A5BD7FB, 0x5044B256, 0x35AEC028, 0x8C12E363, 0xE0A2FE6D, 0x9E8EB149, + 0x2ED1CF45, 0x54A9880B, 0x4E295354, 0x83730F2E, 0x279AD027, 0x7051921F, 0xC4E219AC, 0x8B540A9B, + 0x947E9DF5, 0x28B61847, 0xC4E32434, 0xF9227028, 0x3D489511, 0xD5A41195, 0xA03EE1BD, 0xD761441F, + 0x402F7502, 0x5AB68BEF, 0x5555B735, 0x5918623F, 0x983735E9, 0xE332F1B8, 0x48D83C28, 0x81318EE2, + 0xABB8AA53, 0x01F0C3CE, 0xB4291A62, 0x89344F27, 0x5FDEEA6C, 0xE6D22F86, 0x9988C7DC, 0x051A1432, + 0xE11867BC, 0xEFA49EEF, 0x48AADD79, 0x33633BF3, 0xA56B57B4, 0xA253AB9F, 0x7FC8340A, 0xAB73B132, + 0xF1DFB6CC, 0xC5F02EDA, 0x426782CD, 0xF6648D35, 0xB4AB88A0, 0x9BA7B785, 0x67C03341, 0x22612D33, + 0xD32ED490, 0xAAA56F6A, 0x37ECD8CD, 0x518E8140, 0x7390301C, 0xB33A9E62, 0x244220D4, 0xD88AE216, + 0x9752DEEA, 0xB8A22F50, 0xBFB221CB, 0xDB4D57A0, 0x02D39A0D, 0x8C311F00, 0x1192748C, 0xB9505446, + 0x469C1E7B, 0x3AEFF9A6, 0x7CD5ABE8, 0xD849E5F5, 0x1E2FB30A, 0x18879BD8, 0x6DDD966E, 0xC9BD4B8F, + 0xCEEBCCD9, 0x0D881346, 0x20 + +basegraph= +2 + +z_c= +384 + +n_cb= +19200 + +q_m= +2 + +n_filler= +56 + +e = +36936 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k40_r0_e17280_sbd_negllr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k40_r0_e17280_sbd_negllr.data new file mode 100644 index 0000000000..d98210ff6f --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k40_r0_e17280_sbd_negllr.data @@ -0,0 +1,57 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_DEC + +input0 = +0x7f007f00, 0x7f817f00, 0x767f8100, 0x817f8100, 0x81008100, 0x7f818100, 0x81817f00, 0x7f818100, +0x86007f00, 0x7f818100, 0x887f8100, 0x81815200, 0x81008100, 0x817f7f00, 0x7f7f8100, 0x9e817f00, +0x7f7f0000, 0xb97f0000, 0xa7810000, 0x7f7f4a7f, 0x7f810000, 0x7f7f7f7f, 0x81720000, 0x40658181, +0x84810000, 0x817f0000, 0x81810000, 0x7f818181, 0x7f810000, 0x81815a81, 0x817f0000, 0x7a867f7b, +0x817f0000, 0x6b7f0000, 0x7f810000, 0x81818181, 0x817f0000, 0x7f7f817f, 0x7f7f0000, 0xab7f4f7f, +0x817f0000, 0x817f6c00, 0x81810000, 0x817f8181, 0x7f810000, 0x81816981, 0x7f7f0000, 0x007f8181 + +hard_output0 = +0xa7d6732e, 0x61 + +soft_output0 = +0x7f7f7f7f, 0x81817f7f, 0x7f817f81, 0x817f7f81, 0x81817f81, 0x81817f81, 0x8181817f, 0x7f81817f, +0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x817f8181, 0x81818181, 0x817f7f7f, 0x7f818181, 0x817f817f, +0x81818181, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, +0x81817f7f, 0x81817f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f8181, 0x81817f81, 0x817f7f7f, +0x7f7f8181 + +e = +17280 + +k = +40 + +rv_index = +1 + +iter_max = +8 + +iter_min = +4 + +expected_iter_count = +8 + +ext_scale = +15 + +num_maps = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_SOFT_OUTPUT, RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, +RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN, RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data new file mode 100644 index 0000000000..3472c992fd --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data @@ -0,0 +1,643 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_DEC + +input0 = +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xCE000000, 0x2F00F6D9, 0xCC1AF942, 0x22F8F4E1, 0xBED8FAFF, 0x43DC19B5, 0x35E91CC0, 0x5B070D30, +0xF9DACDFD, 0x170121DA, 0x012AEF53, 0x39E7D90E, 0xD5FBEFDD, 0xCCF0FDC8, 0xD62B0D54, 0xEAE601BE, +0xE5001328, 0x0CF00DC7, 0x3EE0E4B8, 0xC2D8EB00, 0xBE1EEBF7, 0xCDF5E7E4, 0x4FDFF4FA, 0xF402DA2A, +0xFEFEE32B, 0xD62CDA55, 0x17DE0106, 0xF92411B5, 0x301B2142, 0xE50C09E3, 0x51030EDB, 0x48DB2A4C, +0x03E420BC, 0x1AE1DCF8, 0xB6EE0D3A, 0xC2FADF22, 0xBF211508, 0x3228E8AF, 0xE0170BEE, 0x26F8091F, +0xDBFA02D2, 0xC810FE19, 0xE4DE1005, 0x18FF0D29, 0xE723F04B, 0xFDF2F1E7, 0xCF05DBD3, 0x0412F616, +0x00DC234C, 0x1501EDD7, 0xD9EB4FED, 0x1C03BC2B, 0xE2FDF6D4, 0xE9EC10C4, 0x2426034D, 0xEDE33B45, +0x05DC2304, 0xEDE81411, 0x11E416BD, 0x03D1DAA8, 0x04F72431, 0x30F15718, 0xF3F33534, 0xED043AD3, +0x1CE8BC11, 0xEDE1EBF7, 0x242C0454, 0x0118D740, 0x07F3D01B, 0x0205D623, 0x15233E05, 0xF2EBE5ED, +0xED2D3BAC, 0xEBF83CD1, 0xFCF9D421, 0x0B0934E0, 0x0A09E1E0, 0x1AEB0EC4, 0xF8FEDF26, 0xFCE8D53F, +0x20E10846, 0xE327F5B1, 0x18E340F5, 0xF71ED0BB, 0x0EF5CBE3, 0xF4F11C36, 0x141BC343, 0xF4E7E5F1, +0x30205809, 0x10EAC713, 0x22DBB603, 0x250AFC1E, 0xE4F3BB1A, 0x2316FA12, 0xDEE105F7, 0x12FDC7D4, +0xFC212507, 0xDB290300, 0x1500ED00, 0x1EABBA27, 0xF14ECA2D, 0xF2D93625, 0x23F20502, 0xF0B9C8E6, +0xEAD83EE1, 0x0C331CFF, 0x23D205F5, 0x0EC61906, 0xF128C9EF, 0xEF3CC800, 0x0B9DCDED, 0xF3C2CC3C, +0x23EB04E9, 0x0B51CD13, 0xEADEC3D7, 0x222D06FB, 0xF0331904, 0x16C93F0C, 0xDAE5FE0F, 0x1F14B80C, +0x001B28ED, 0x3F3B67F3, 0xEEEDE9EC, 0x1CE94514, 0x1D4145EF, 0xD8BA5019, 0xFC06D41E, 0x17BDC0DF, +0x16D712E4, 0xE8041001, 0xEC2AEDDB, 0x11BE3803, 0xEBD2ECE5, 0xEF5A17F9, 0x2BFF52CD, 0xE958C126, +0xEE1A1531, 0x0EBF1BF2, 0x18BC401A, 0x2AC2521C, 0xEE4817EA, 0x07482E20, 0x141314E0, 0xF41DCD15, +0xDB10B40C, 0xC23700E9, 0x4221EB10, 0x4BE7E607, 0xEEF9DC0E, 0x62AC16DF, 0xE2E1C5D3, 0x27E4F70A, +0x3213020D, 0x4ABE0A14, 0xACC1DE1B, 0xD636D416, 0xDFAF020E, 0xCE230828, 0x2615F6FB, 0xEA1002EE, +0xD1351117, 0xB71C07F3, 0x03C9DF0C, 0x2B52DB0F, 0xD9AB02D7, 0xD20702D3, 0x48EEFB21, 0x3AE5E116, +0xE728EE0E, 0x33C50F00, 0x363EF5EC, 0xD4FBF217, 0xB00FFDDE, 0x2333281A, 0x3624040C, 0x02DB0E04, +0x3FDE27FD, 0x173716FB, 0xF20BEFF1, 0x3EF0191E, 0xB6B01719, 0x1BC7DD27, 0xE80AF3EE, 0x20BE101E, +0xF42EF8E6, 0x40531BF9, 0x4646172B, 0x44DA1E1D, 0xC7F5E503, 0xF3E8F0E4, 0xA4E2E5EF, 0x42B935F6, +0xEB1D1A1E, 0xE500ED0B, 0x2909F2CF, 0xCE0E0037, 0xD1320AA6, 0xEB01F9D9, 0x45E7ECC0, 0x4CFEE3D7, +0x0EE024B8, 0xD3F31B1A, 0xE846056E, 0xF522EFFB, 0x5F1AE443, 0xCAF93620, 0x2CE9F23E, 0xDDE604F2, +0x3BDDFC04, 0xC8EBEE13, 0xC11FF0F6, 0x18EBE9EC, 0xFAEEF1C7, 0xB6EFDDEA, 0xF8E123F7, 0x4EF4E1CC, +0x430C271C, 0x3BE01CB8, 0xABE813EF, 0xCAEED439, 0xC1FAF3D1, 0x4E2F1656, 0x11E4DB0C, 0xDAF816DF, +0x44E3FE0C, 0x2B1D1C0B, 0x3300FD28, 0xC320F4F9, 0x2A1DEB0A, 0xEA2502B4, 0x41061322, 0xC81518C2, +0x1F2510FD, 0xD1E1F7F7, 0xBD1906F1, 0xF3C9E55F, 0xB3D91A4F, 0x0D0D26CC, 0xBD071B20, 0x41141BC4, +0x2A1B19F2, 0x4902FDD5, 0xD6F9DE2E, 0x19190341, 0x09E80F11, 0x31FC1E2C, 0xEC1DF8F4, 0xCC0B14E2, +0x51DFF3B7, 0x1AF028C8, 0x0F0E0E37, 0x2B041A25, 0x1A03FD25, 0xC5030FD5, 0xBCFAED22, 0x9A1F1CB9, +0xCCE8C2F0, 0xEF1BF4BD, 0x21EC163C, 0xBAED07C6, 0x03F7E3D0, 0xC503DB2A, 0xC20C13E4, 0xD4F8EA30, +0x391B0544, 0x59F3EECB, 0xAD0A311D, 0xFE0C2C33, 0x250CDBE4, 0xC5E80341, 0x3B0914CE, 0xC0F2ED36, +0xC204182B, 0x3B0C16E5, 0xFFFF1429, 0xC316D8C3, 0xE408EB1F, 0x3713F4C4, 0xE4F2F01A, 0x0A280C01, +0xEC0FE318, 0xCB16153E, 0x5C04F2D4, 0x281F35F8, 0xE4D80051, 0x4E0A0CE3, 0xB107DB21, 0xD1DED9FB, +0x380AFACE, 0x50CC105C, 0xD9D80100, 0xF40ECCE6, 0xDADC03B4, 0x0AE5E243, 0x0C22E4FA, 0x08CD1F5A, +0xE2D1F7A9, 0x12CE39A5, 0xFFDDD7FB, 0x032C2BAC, 0xF1D9E700, 0x14003B28, 0xFC08D420, 0x08093131, +0xFEFFD7D7, 0xBB219348, 0x07DC2E4C, 0xDF0DB8CB, 0x22EB06EC, 0x0BE034F8, 0xF10FC819, 0x1623EEFA, +0x0D1DE6BA, 0xDA1AB142, 0x1C16F4EE, 0x27F500E2, 0x1137C85E, 0x1C0BF434, 0xF004C924, 0x02EBD9ED, +0x1BF943D2, 0xE7F80F30, 0xEFFE39D9, 0x2CFA5323, 0x04242DFB, 0xF420E347, 0x15F43C33, 0xE9F41134, +0x20EBB8C2, 0x0205D523, 0xECE03DB8, 0x10F3E935, 0x180BC11E, 0x12E2C7BA, 0xE70B4233, 0xEED8EAB0, +0x110E3936, 0xFEE327F5, 0x12E60017, 0xFE4026F3, 0xED26C518, 0xE5E9F2FF, 0x200C08EE, 0xEF1439E4, +0xE92010ED, 0xE1B80908, 0x18584021, 0x24FBFC31, 0x00AE2823, 0x040CDC2A, 0xDE34FBE5, 0x1439C30D, +0x0DB7E6EF, 0xE6090F21, 0xECAF3C20, 0x10DFE8D8, 0x0CC0CCF9, 0x15061318, 0x043723DD, 0xEA3A3DF0, +0xEC18C413, 0xFE2BD611, 0xE3BC45FE, 0x16FCC11D, 0x120E39DC, 0xEC00141B, 0x13F03B27, 0x24D2FC18, +0x0917E1FB, 0x113BEAEE, 0xE9FE11EE, 0x2C505427, 0x0D0B3529, 0x15E73E1E, 0x0FD91AF1, 0xDFF8B6FF, +0xF413CCE1, 0x1EEFB9EA, 0xDCD04C17, 0xCEC25AF8, 0x1AB2BE17, 0xD8BEAFDA, 0xE6CEBD19, 0xFCC42CF6, +0xDE19FA15, 0x250203F2, 0xA90042DB, 0x242A2F1A, 0x004D0401, 0x0B4C2825, 0xACB61DDD, 0x07422CDE, +0xCDFEDFE7, 0xAFF8F527, 0x35052820, 0x0B34F2DD, 0xD648E2F3, 0x3DDF02E0, 0xFE42EBF8, 0xC1F6251A, +0xBA0DE9E2, 0x442FE2E5, 0xD014E308, 0x2DB409EC, 0x50F8FADC, 0x264BD8E0, 0x2E0FFEDC, 0x1E2D051A, +0x0FD20AFB, 0xCE1CE7FA, 0x35CDF6F4, 0xFC49F3F4, 0x642FDCDF, 0x3625C507, 0xDF140FFC, 0xDB21F913, +0xC7D5FDF9, 0xCEE112FE, 0xD1D4F7F8, 0x5D410704, 0xD914CC19, 0xCCF800EC, 0xE3E00C1F, 0xCD05F408, +0xC952F4DD, 0x444EF02A, 0x1E15E526, 0xD73909ED, 0xFA1900EF, 0xFFB6210F, 0x06EB27DE, 0x0B5BDF13, +0x1B4F1D33, 0xCDF5F4D9, 0x00F40C1D, 0xC6031CDC, 0xF91C13F4, 0x061321C6, 0xBFDD2206, 0xEE13193C, +0xFF1C17BB, 0xA91E27F5, 0x25ECD13C, 0x0CF90321, 0xBA1FE5B8, 0x50151F3D, 0xE935285D, 0x330A10CE, +0x3EE6F542, 0xE80AEA1E, 0x45251103, 0xC014E3EC, 0x2D2C1854, 0x9F0E0536, 0x2E14C7C3, 0xECE50642, +0xE6E214F7, 0x1021F208, 0xBCDC19FB, 0x4B281BFF, 0x0CDFDEB7, 0x21E91CEE, 0xC22FF856, 0xA2F3EAE4, +0x5810CB18, 0xE416D03E, 0x25E3F40C, 0xF4180340, 0xFE0EE4C9, 0x433C2763, 0x38F11BE7, 0xE5FC11D4, +0x1E11F4C6, 0x491D0ABB, 0xC0E72140, 0xB226E84F, 0x122E26AB, 0xEAF116E7, 0xD5E4EE0B, 0xF4FB0323, +0xDCE61D42, 0x05F1FCE7, 0x0DDCDDB4, 0xF9E42000, 0x181610EE, 0xE1F246CA, 0xEDEDC53B, 0x14DEC5B6, +0x1E02F629, 0xDEE749F0, 0x1C02BDD7, 0x1EF3F5CB, 0x11E8C640, 0xFA272301, 0xF3FC352C, 0xFDD52553, +0x09191FF1, 0xDB11FEE9, 0xF7EB1FEE, 0xFFF9292E, 0x0A2032B8, 0x0C1BCDBC, 0xDDFFFBD9, 0x1BEABDEF, +0x19F84130, 0xECE5ECF3, 0x271302EB, 0xE7EB423D, 0x1E2146B7, 0x14E13CF7, 0x16FE112B, 0xEB211308, +0xDAD802B0, 0x0017D811, 0xFE26D901, 0x0D0ACBE2, 0xF2ED1A3B, 0xFBDED206, 0x18F0F1C8, 0xD1EFA9C6, +0xE5E1BDF7, 0x1514C314, 0xF9FCD1D3, 0x02EB2BED, 0x0EEB1BC2, 0x2427B5FF, 0x0B2233FA, 0xFE0FDBE8, +0xF7DDCE04, 0x03F42BE3, 0x0525D202, 0xF9B20021, 0xEF0FE926, 0xF505E318, 0xF7DF1F23, 0xEADF12F8, +0xF12C3807, 0xDF01FA04, 0x1D23F426, 0xF1231A05, 0x20F549FB, 0xE0F0F9E3, 0xDB67B418, 0xC6E5623F, +0x212AF90D, 0xE6C7BD02, 0x24CA4C11, 0xE249F6F1, 0xE8383F21, 0xFC212310, 0xF7561F07, 0x25C4032E, +0x070EDE14, 0x1437151A, 0xE93C4010, 0xF10CE615, 0xDB0D4D1C, 0xFAF6221B, 0xF5F3E21E, 0xE2470B1B, +0xE71BC01F, 0x07B0220C, 0xF311CAD8, 0xFF052816, 0x1DC20BDC, 0xE7BB40EB, 0xF5DEE21E, 0x013527FB, +0x0FF519F2, 0x1AE9BDE4, 0x2B0F53F0, 0x13C6C5E8, 0xF12636ED, 0x10BD38FE, 0xDD0606E4, 0xDA5C4FDE, +0x1329C5CC, 0x0DC8CA00, 0xD33956F0, 0x0700D711, 0x31B1DE02, 0x210C09D9, 0x0C2EF81B, 0xF5FFE406, +0x27C1E2DA, 0xCB1801E8, 0x38C70EF0, 0x0D1EF0EF, 0x142E1C0B, 0x0B00EB06, 0x5D441DD8, 0x1E4035E5, +0xFD3C0AE8, 0x3732DCEC, 0xC8B5F00A, 0xB9BF1023, 0x0AF22018, 0xC6DDE21A, 0x18EF1306, 0x1AC8F1E9, +0x1F020EF0, 0xEA0209DB, 0x41CFEEDA, 0x21E31AF8, 0x4BBD070A, 0xEECFDD1A, 0xD4DB15F8, 0x430FFC02, +0x15361A18, 0xCF17ECF1, 0xE42009EF, 0xC21CF4F8, 0x3DDFEAF3, 0x3E0916F9, 0xF028151F, 0x03CA1700, +0x983B26F1, 0xDE2AC112, 0x209FF9FD, 0x1935F7C6, 0xED18F1F3, 0xBFD0EA0F, 0xC5071908, 0x1F4E13DE, +0x17F00926, 0xF80DEE19, 0x4DF01FE6, 0xB7D2DB18, 0x0AF5E0F9, 0x4043E21D, 0x4AD517E5, 0xB0CFDE03, +0xFB22D90A, 0xDF5023F9, 0xDABDF828, 0x1911011A, 0xBDF30FE8, 0xCEAA1A1A, 0xB0D2F62D, 0x3AAC28F9, +0x42D6ED2D, 0xA83D1B02, 0x1831D1EA, 0xF11D10F7, 0x1D201AF5, 0x394F0C07, 0xB327F0D9, 0x3254DA01, +0xEBF40AD5, 0x26A413E4, 0x5113FECC, 0xD4F32915, 0xDDB3FD1A, 0xC0D2FB25, 0x02DEE7FB, 0xC33DDB05, +0x01021615, 0x0B1D27DA, 0xCBC2E2F6, 0x193CF3E9, 0x27E2F1EC, 0x5A1BFF0A, 0xE8CF320D, 0xBD4DF0F8, +0x0F291A26, 0x1817E7FF, 0xEFCB10F0, 0xD40CE9F3, 0x0606041B, 0xFABC2322, 0xE0E9DEE5, 0x1BD80710, +0xC015F301, 0x4718E8EE, 0x69D81E11, 0x19F6BF00, 0xF60F1E00, 0x3002E225, 0x29EA08C1, 0xF4EA00EF, +0x3910E5E7, 0xDB0B12E4, 0x2A3E0265, 0x3BE8FE11, 0xBBEFEEE9, 0x151BE2BE, 0x1E2314FB, 0x4C2DF754, +0xD5F823E0, 0x10200247, 0x01DB194D, 0x1B17D93F, 0x5806F42E, 0xFA19D040, 0x040BDF1D, 0xFCCB25A4, +0x39D9DC00, 0x2C0EEFE7, 0x20F3FDCB, 0xC2E70841, 0x3EEFEAE9, 0x32EDEAC5, 0xAC1BF70D, 0x0C15D4C3, +0x4CE7E5BF, 0x26F024E9, 0x061AFE0D, 0xDE13DEC5, 0x09DE0706, 0xFC0C1FE5, 0xD41CDC0B, 0xCC1DFBBB, +0xC6020CDB, 0xCD16133E, 0x3FF30CCC, 0x0B2D16AB, 0x3800E3D9, 0x3AFCF0DC, 0xE4FFED27, 0xFCF9F3E0, +0x05FF24D9, 0xE1F9DE2F, 0x391908F2, 0xC8F211CB, 0xEAEF003D, 0xDC1C040D, 0x25F74ECF, 0xE41F0CBA, +0xDF1708EE, 0xE016F83F, 0x1D124515, 0xF325344D, 0xE114F63C, 0x261FFEB9, 0x02F02739, 0xF12018F8, +0xD9124F3A, 0x1E1A45F3, 0x1504142C, 0xDDF506E3, 0xEAEAC113, 0xDE1AFB42, 0xF113C93B, 0x1721C207, +0xE3D4BB54, 0x070A2FCE, 0x0C0AE41D, 0xF90D3035, 0xE6DCF2B4, 0xFB15D4C3, 0xFE2425FC, 0x03002B28, +0xE50AF433, 0x07EC2FC4, 0x07E921EF, 0xFE09DAE1, 0xE21EF6B9, 0xF3E6360D, 0x17EE3F39, 0xE7FA0E22, +0xF5151DED, 0x1EF945DE, 0x0D1236EB, 0x0AFD32D6, 0x0928CFFF, 0xDCDAFD02, 0xFB272D00, 0xCE025B25, +0xEA0D3ECB, 0xE3E2BBF5, 0x06D32354, 0xF4DDCCB6, 0xE4002245, 0x213AB706, 0xECCCC3ED, 0x3CED9C0B, +0x15D23C14, 0x0BE7E3F9, 0x1FE70A0E, 0xF30D350F, 0x1928F01B, 0xD50AAE01, 0x120AC6E1, 0x0ED4C91E, +0xFFF7D804, 0x0D0CCA1F, 0x0433DBE4, 0xEA0DEFF5, 0x36FB5E1C, 0xEB11ECDC, 0x23C0FB17, 0xEBC63C17, +0x272800EF, 0xFC34D4FF, 0x0AB8E2F5, 0x01FB2AE0, 0x090630DD, 0xFE0AD522, 0x1B10BD1D, 0xDF520719, +0xF12436D5, 0x1D20BAFC, 0xE442BCF8, 0x05E0DDE6, 0x183FF1F8, 0xF816E118, 0xE3C9F4EE, 0xF2F51AF0, +0xFE5126E4, 0x1E31F7D7, 0xF9362F09, 0x15E43CF2, 0x0D3EE50C, 0xF74931EA, 0x23EEB621, 0x02B9DAE9, +0xDFE5B71F, 0xFD46D50D, 0x103E181F, 0xDF580717, 0x00C3EC31, 0x0CF714EC, 0x4ACCE41E, 0xF2E0DEF4, +0xB0431A08, 0xBD38D8E6, 0xEED6E510, 0x41B8EA02, 0xEC36E61F, 0xBEE9EBF3, 0xBE28E712, 0xF6051BFF, +0x2FE5E222, 0x2ADCFAF2, 0x3834FF04, 0x2AD1100D, 0xF4C502F8, 0x4DE7E414, 0x07A5DA10, 0xD1A92133, +0xB6ACFAD2, 0xCF51222C, 0xCD1BF8D7, 0x3F16F50E, 0xEEF4EA12, 0xA52F161D, 0xC4B3CE07, 0xB622EDDC, +0xDE2ADE06, 0x4FC8FB02, 0x6EDED9F1, 0xFC19B9F9, 0xD5B4DDF1, 0xDFC30423, 0xDFFBF9EA, 0x012C07DD, +0x12AF2805, 0x1A2EEAD6, 0xF8A1F207, 0xC0BA21CA, 0xFFDCE9E3, 0x36BFDA03, 0x05DD0E19, 0xF905DDFB, +0x32AEDF23, 0xFDFB09D5, 0x45D5DA23, 0x4B3E1CFD, 0x0905DDEA, 0xDFE2DE00, 0xB1FB07DD, 0x33EA2813, +0x02ECF5C3, 0xED0CD91B, 0x0D1BEABD, 0x4A17E5C0, 0xF707DFDF, 0xEE191F41, 0x19EC15C5, 0x4112F1EB, +0xD4F01AE9, 0xBF21FC06, 0x19DCE605, 0x2F0C10E4, 0x181FF947, 0xC00AEF1E, 0xF72EE8AB, 0x42F8E2E1, +0xA3EFE7C7, 0x31133514, 0x1EF608E2, 0x0DECF6EC, 0x0CECE5C5, 0x3DD31D54, 0xECE21545, 0xAE0CECE5, +0x49202B08, 0x0EFE2026, 0x13F41B35, 0x1B0BEB32, 0x1719F30F, 0xECDAF0FF, 0xECE9ECC0, 0xF212EC3B, +0x3DE8E6EF, 0x13F2EB1B, 0xB008EBE0, 0xBAE22845, 0x1A111DEA, 0xDBFC0EDD, 0x3F29FE50, 0xCDF817E0, +0x4B030CD5, 0xEADCDE05, 0xC31312C6, 0x272EEAA9, 0x340201DA, 0x17F400EF, 0xED1F1608, 0x24D24B55, +0xF4091DCE, 0xF51633C2, 0x03D32B56, 0x2325FA4D, 0xDEDA05FD, 0x01F72831, 0x04F12C19, 0x2716B1C3, +0x1B19F3C0, 0x10E2C909, 0x050C2233, 0x03F22519, 0x1C06F422, 0xE7D70EAF, 0x03D725AF, 0x13EC14EB, +0xF6F631E3, 0xF900DE28, 0x1FE2F7F6, 0xFBE9D2C1, 0xFBEFDDE9, 0xE110F7C8, 0x1C290C50, 0x27D9FFFF, +0x07E421BB, 0x3BE89CF0, 0xF50733D0, 0x2514B2EC, 0xF5EB1DED, 0x0619D241, 0x1FE8B840, 0xEEEA3B3E, +0xED1F1648, 0xFF15D73E, 0x0123D805, 0x0310D5E8, 0x010ED819, 0xECE53B43, 0x03E1D547, 0x01D9D6FF, +0xDFE3B745, 0x1C14443C, 0xDF0908E1, 0x03FE2ADA, 0x1306C5D2, 0xDD001004, 0x1F3AF818, 0x1A3BF3ED, +0x1EBC47EE, 0xF83E1F1B, 0xE21445EA, 0x2101B713, 0xE81AF126, 0x1930BFF3, 0x1533C408, 0xEDBFC60C, +0x060F2EE8, 0x06BDD11A, 0x04F524E4, 0xD94C001E, 0x0334DCDD, 0x06F1D30C, 0xFBDBD219, 0x0EBE1A03, +0x08D230E5, 0x250B4DFA, 0x0903311C, 0x14233C25, 0x1ABAF205, 0x30C5581D, 0x02FAD712, 0xDF2108DE, +0x02DDDB07, 0x1D47F606, 0x0EEF191F, 0x1B3AF2E9, 0xF9E52E12, 0xF0B1C8F4, 0x290CAF28, 0x0013D8E5, +0xE1B50AEC, 0x1A224322, 0xFDE8DB06, 0xF8A531EF, 0x0DD1CCCD, 0xE81AC007, 0x201048F3, 0x1800F1E8, +0x000BD8D9, 0xEC2A13E2, 0xF3EE3502, 0x282F0117, 0x08F8E006, 0xFE542620, 0x19E9C0D3, 0xDD140412, +0x1119C6EB, 0xF6C2E10E, 0x1EC50BEB, 0x15BD13ED, 0x143DC51B, 0xE5F2BE14, 0xF552E41A, 0xE10FF62A, +0x2A0B5218, 0xE33A0CE2, 0x02D7D612, 0xE1A7B800, 0xD8C10031, 0x0810E0E9, 0xD93AB0E8, 0xF8113011, +0x15B73C17, 0xFE46D520, 0xF6C51EE3, 0xD51A52ED, 0x1A0ABD0E, 0xFBF8DEE2, 0xE245BA20, 0x2225FB1E, +0xEC3A3CFD, 0x19340EEE, 0x08FE20F4, 0x1F154727, 0x05F8D213, 0x16F2EEE1, 0x22B6FA1A, 0xF404CCDF, +0xE22E4624, 0xFB3FDDFB, 0xE6F7BF17, 0xF0B6E71F, 0xF013E723, 0x17081114, 0x24EBFCE0, 0xFBE52DEC, +0xE9C310F3, 0x26F04E15, 0xF145E8E8, 0x122B17E2, 0x0D40CCFD, 0x43CA96E8, 0x421D0F00, 0x27DCE70B, +0x233B00FC, 0xCC44FAEE, 0xE0BC0BE3, 0x1BE7071C, 0x01C7F20F, 0xB29B28F0, 0xFB02DBC4, 0x32092326, +0xE648F5E2, 0x4707F2DF, 0xDF36E2E0, 0x1CC308F2, 0xBBA50DEB, 0x1DE71D34, 0xCE36F5F1, 0xCDF90AF2, +0x0FDE0CE0, 0xCF0C1906, 0xE0E509E4, 0xBC37F9F3, 0xDA06E510, 0x1FD3FDDF, 0xDB09F705, 0xF445031E, +0x24311CE2, 0x55EEFDF8, 0x3CEDD216, 0xAFF01516, 0xCA3D29E8, 0xCCAEF1EA, 0xE0F60CD5, 0x4CECF7E2, +0xDCD5DBEB, 0xAEC2FC02, 0x4825D7EA, 0x252D2004, 0x24F604FB, 0xD9D7051F, 0x1AF201FF, 0x3DE70EE6, +0x43BCEC0F, 0x43D8E5E4, 0x20EB1BFF, 0x2AAFF814, 0x021A02D8, 0xD80C26F2, 0xDB00001C, 0x2BF2FCE6, +0x181F0347, 0xAFE8F0F1, 0xE31D2A0B, 0xD015F4C2, 0xEF02072B, 0x361717EF, 0xFA25F2B3, 0xEEFADE22, +0xEE21EBF8, 0xD6F5EA1D, 0xBF160212, 0x03E6190F, 0x452126B7, 0x32D91DFF, 0x2D000A28, 0x25F205CA, +0xDEED043B, 0x36DCFA04, 0x13EAF112, 0x141915F1, 0xF2F0EC38, 0xBC20E6F8, 0x0BF2E519, 0xD0F11D19, +0xC7F6F932, 0xBFE2EFB9, 0xA4F919DF, 0xFFEACCEE, 0x3BDBDAFC, 0x2B1E1245, 0x5CEBFC14, 0xDB10CD18, +0xB718FE40, 0x0BE92012, 0x2414E2C5, 0x3B09FCE0, 0x17DF1306, 0x212F12A9, 0xC71407C4, 0x0901EFD7, +0x22EAE23F, 0xE7E805C1, 0xC6F21037, 0x4A111218, 0x1AEC22EC, 0x27E30EF6, 0x0C000134, 0x1BF10D37, +0xFD1F2A09, 0x1AEFF3E9, 0x160F3EC8, 0xEC173B3F, 0xE8F711E1, 0x050A22CD, 0x15263DB1, 0x07012127, +0x1D22BBB7, 0x34E3A5BB, 0x19210FB8, 0x17D41254, 0xD822B1FA, 0xE6DE0E06, 0x1519ED40, 0xDDE54CBE, +0x1EFC0BD4, 0xFE0D2A35, 0xE8EF40C7, 0x09E5E1F3, 0xF60631DE, 0xD6EDADC5, 0xE61A0FBE, 0x091C30BC, +0x0514DE3C, 0x1D1A45BF, 0x03E0DC08, 0xF4FE1C25, 0x1D260BFF, 0xF6FD3126, 0x1013C8EA, 0xFE18DB3F, +0xDF114916, 0x1806BF2D, 0x0E0535DC, 0xE5ED0DEB, 0x1EE445F5, 0x16DC12B4, 0x23FA4B2F, 0xFFD6DAAF, +0xECF714E2, 0x273D0066, 0x1B15F313, 0x1D0CF533, 0x17003E28, 0x1FD3F654, 0x00EFB117, 0x1C13BBD9, +0xF5C21D15, 0xF1CF3715, 0x244A0309, 0x09321FDD, 0xEFF81609, 0xE1ED091F, 0xFDFA2A16, 0xF742D022, +0xDCECB51B, 0x16FAEE14, 0x140C3C21, 0xEA0AED1B, 0x24E94CE2, 0x17E03F12, 0x1E01BAF9, 0xE82E4128, +0xEE311506, 0xF7FEE1F6, 0x0661DFD9, 0xDFB1FAC8, 0xFF282928, 0xEA3412FF, 0x104FC80C, 0x00ABD927, +0xEE32EA2D, 0x153B3D09, 0xFCB82DEC, 0xE9E8C021, 0x09BECEF0, 0xFCCA2D19, 0xDF09F90F, 0x013F2AE1, +0xFC44D4E9, 0xFD24D6E5, 0x1C0CF3FB, 0x2601021C, 0x1AB6BED9, 0x04B7DCDD, 0x102BC8E0, 0x09331EFC, +0xE8ACC1F5, 0x222E4BD4, 0xF715E1FA, 0x23484BED, 0xEB3913E0, 0xDFE4B711, 0x0C411B0D, 0x18FEE800, +0x42231127, 0x493B19FC, 0x39BCDE12, 0xFB46121B, 0x452DDDE2, 0xEA0DE3FB, 0x2109EF1A, 0x1B3CF81E, +0xE228F2EC, 0x48ADF6FF, 0xC2C0202C, 0x9F3FEB19, 0x192BC8E9, 0x2B0F0F04, 0x4F2DFD19, 0x1045D9FB, +0x0B3FE8E2, 0xF2FBE316, 0xBC0EE623, 0xB301E419, 0x1F2226D9, 0xBE0009FA, 0x27121A27, 0xF95002EA, +0x4714DED8, 0xBAE6E1ED, 0xC5191EF2, 0x3B2E14F1, 0xFB0FEC06, 0xDAB123E7, 0x3DDBFFD9, 0xC318ECFD, +0xDFD014EF, 0xB23D0608, 0x11E326EB, 0xC4CAE90B, 0xD847EC0D, 0xDFC3FFE2, 0x55BD0815, 0x17F9D3E5, +0x3EE91121, 0xF9C41712, 0x22AFE0ED, 0xCDE7FBD7, 0x1BC9F5F0, 0x0422F4F0, 0x200EDC06, 0xC3F700E6, +0x3B20EBF7, 0xD115EDEE, 0xC3ED08EA, 0x5AFEEC29, 0xC21F3247, 0x3315163E, 0xE330F659, 0xEAF5F5CC, +0x1716113E, 0x4CE611BF, 0xD517DBC2, 0xB2EF043A, 0x45DD25B5, 0xC0151E13, 0x131CE843, 0xFFE4EB44, +0x5FFB27DC, 0x381336EB, 0xB8EFF017, 0xECF720CF, 0x200B131D, 0x0622F805, 0xBA07DD30, 0xD9061FDE, +0x30EA013D, 0x40300858, 0x9AD917B2, 0x270FC1C9, 0x1209FFCF, 0x201716EE, 0x2A050723, 0x1BEF0239, +0xBF18F310, 0xA83719A0, 0xA9DDD105, 0xE70F3037, 0xDE0D0E1B, 0xE1D4F955, 0x0CF00AC8, 0xE80FE4C9, +0x1BE2100A, 0x40FB0EDC, 0xDD1A17BD, 0x4E1604C2, 0x5CE7270F, 0x2BF635E3, 0x00D80350, 0xFD0027DB, +0xDD22B54A, 0xEAE11247, 0xF705CE22, 0x01F2D736, 0x1D17443E, 0x1D0145D8, 0x18181111, 0x04FEDCDA, +0x01EAD7C3, 0x05DC23B5, 0x1FCFB959, 0x1A0A431E, 0xFCDC2CFC, 0xD61452EC, 0xECF23DCB, 0x31D6A652, +0x261BFE0D, 0x0CD73552, 0xEAFB11D3, 0x10291952, 0xF7F41F34, 0xEC1E3CF6, 0x180A41E2, 0x03FBDB23, +0x2026F9B3, 0x0C02E42A, 0x08F030C9, 0x0E19E70E, 0x0F1519C4, 0xDCE703F2, 0x100CC833, 0x0105272C, +0x01252903, 0x0DCCCB5C, 0xD21AAA0E, 0x2917AFC0, 0x1BEA0E3F, 0x2A1B52BE, 0xF2E8CAC0, 0x1DDDBB4C, +0x0215D73D, 0x0DF7E5E1, 0x08E230F5, 0x0EDFCA4A, 0x19FE0ED9, 0xE6EC42C4, 0xFB1D23F4, 0x22090632, +0xEA073F21, 0x06ED2115, 0x180BBFCC, 0xE6E20EF6, 0xE512F23A, 0xE21BF7F4, 0xF9F22E37, 0xF82B2F53, +0x1CF94421, 0x16D8C2B1, 0xD9F4FF1C, 0x23EC4B14, 0xF5F03339, 0xFE172B40, 0x1C2F0D57, 0x230A0632, +0xECDA3CFD, 0x1306C52D, 0x01D3D856, 0x1D2846FF, 0xF9D82150, 0x1B0CF31D, 0xEE03C626, 0x1AFFBED8, +0xD605AEDD, 0x2403FD25, 0x01EC28C3, 0xF1E1C8F7, 0x06E7D140, 0x09CF325A, 0xF2151AC3, 0xE7F8F120, +0x0A2BE353, 0x23E5FBBD, 0x1C1645C1, 0xF716D011, 0xF6ED1D15, 0xFB2123B7, 0xE2070A2E, 0x16F7C2E0, +0xE6100D18, 0xFB19D440, 0x2FF15619, 0x1F0FB938, 0x0101272A, 0xF8F42F35, 0xF3DFE649, 0x21E549F4, +0x0D430000, 0x400EE51B, 0x452E181A, 0xF1411DFB, 0xF4DC1919, 0xF247E3FC, 0x33141AE1, 0xF81CF515, +0x3115200D, 0x3FCFF713, 0xE9DA17F6, 0x0BF31102, 0x17D1E3E5, 0x0E9712FA, 0x2EAFE6C0, 0x5900F928, +0x50D8CE27, 0xCDACD9FF, 0x41BB0B2B, 0x2AC9181E, 0x13E1020F, 0x0708EC08, 0x09D220E1, 0x1EC0E206, +0x1F2BF6E9, 0xD23809FD, 0x46D3FBF0, 0xF617E2FB, 0xF4F61EEF, 0x31D71BE2, 0x1AD4F7FE, 0xB534F103, +0xDE15DD0C, 0xC7FBFA12, 0x1931F0DC, 0x4AD8F1F7, 0x4937DEFF, 0xF908210F, 0x35D121E0, 0xECCC0EFA, +0x34CBEDF5, 0x062A0CF3, 0xE4B12103, 0xD73DF427, 0xDCE8FE15, 0xB4FC04F0, 0x0B06DC23, 0x16391D22, +0x23051310, 0xE6FCFADC, 0x1C95F2DB, 0xE3DE0DBD, 0xDB270A05, 0xB4EEFC00, 0x1845DD16, 0x0149F11D, +0xC6D52621, 0x1E34EE03, 0x17D20AF4, 0xA10611FA, 0x20F937DE, 0x5D17F8DF, 0xA00435EF, 0x3ECEC7DC, +0xF9D8EB0A, 0xFC332200, 0x1DE9DBF5, 0x2E580CEE, 0x3E1AF9D1, 0xC64715F2, 0xD7CB121F, 0xEFF400F2, +0x084CEAE4, 0x064DE0DD, 0x2B10DE25, 0xC1FB0218, 0xD4F8EADE, 0x32D6FBE1, 0x0F65F602, 0xEC32E83C, +0xD2F613F5, 0xC526F9E1, 0xF0F51302, 0xF5B017E3, 0xFA0FE4D7, 0xFACBDFE8, 0xC0F222F2, 0xD630E81A, +0xD6DEFEF8, 0x33A602F9, 0xC826F633, 0x10E51002, 0x0308E9F3, 0xE011251F, 0xBAEAF8EA, 0x26F21E12, +0x0000021A, 0xE00E08CB, 0xE0ED0715, 0xE71CC0F4, 0x0A1ECE0A, 0xDB260303, 0xE7E2BEF5, 0xDDE705F0, +0xDA0BFEE3, 0xF6D83250, 0xF4FA1CD3, 0x2805FFDC, 0x1DDBBAB4, 0x1611C218, 0x18E13F09, 0x1C1D0DF5, +0xDC25B403, 0x2BF6AE32, 0x180F4136, 0x39FC61D3, 0xF3DE1BFA, 0x1AD94100, 0xE8F8BFDF, 0x0826E0FE, +0x1AE142B8, 0xF80F20C8, 0x0116D9EE, 0x22E84BF1, 0xEB22C3B6, 0xEE01EBD7, 0x0EE8CA10, 0xD8FA00D1, +0xEB073DD1, 0x1EE3BBBB, 0x12EFC639, 0x3708A121, 0xDFDB49B3, 0x28D85000, 0x0C003429, 0x000D28CA, +0x12D1C6A9, 0x0D061B2D, 0xEBDCC304, 0xEF05C8D4, 0xDACD02A5, 0xF3F7CAE2, 0xE5144313, 0xFC222B4A, +0x23F4B51C, 0x18270FFE, 0xEDDC3CB4, 0xE9213F49, 0x1EF309CB, 0xE3E5BB44, 0x0AF6E333, 0xE1EF473A, +0x080DD036, 0x0FEB38EE, 0xFE0629DE, 0xDAFCB224, 0x0DF9CB21, 0x07D3DFAC, 0x06F822D0, 0x1E1ABAF1, +0x00F32835, 0xE00AF71E, 0x08E2D009, 0xE003F9D5, 0xD5F2AECA, 0xF4EFCCEA, 0x0B0E33E5, 0x0D271A00, +0x1232EB59, 0x07DBDFB4, 0xD2ECAAED, 0x17FC40D4, 0xDAEB0313, 0x07E8E010, 0x07F5201E, 0x13173CC1, +0xDBDCFDFD, 0x24ECFBC3, 0xF2D9E6FE, 0x420695DE, 0xFC172C11, 0xDF0F06C9, 0xF413CC3C, 0x1B11F217, +0xE01148C7, 0x1EEEBA3B, 0xDDDCFCB3, 0x24E1B4F6, 0xF4DA3303, 0xF1FC192C, 0xEAFC11D4, 0xEAD41354, +0x22ED06EC, 0x23090000, 0x0BE7FBE1, 0xE0BFE4F0, 0xF2C4F818, 0xE5BEE6EC, 0xDD3E0DE7, 0xEB360516, +0xFBC6ECF2, 0xFCEC23EE, 0x0A20DD13, 0x12211FF8, 0xF23A1706, 0xCC36E6EF, 0x1C26F5F2, 0x2F05F303, +0xF540FA23, 0xFE4FE3E9, 0x23CED927, 0x18C2FA0A, 0xD1A411EA, 0x1A4306CB, 0x474E0EE6, 0x21331FDB, +0x2C33070B, 0xC60804F6, 0x515A12DF, 0xE8FDD7CE, 0xD7171126, 0x1043FF11, 0x48F8E81C, 0xCF48E021, +0xF9CA09E0, 0x2B26210F, 0x1F10FD02, 0xC9ECF8E7, 0xF9D30FED, 0x33222205, 0xC44E0A05, 0x41381425, +0xCEC21811, 0xCFFFF5EA, 0xC0E7F727, 0xF5481810, 0xE247E3E1, 0x11150AE0, 0x40C116EE, 0xFDEC18E9, +0xCF0F2415, 0x46E5F6E6, 0x430D1DF3, 0x11EEE61A, 0xA45017EA, 0xF1BBCB28, 0x35DC19E3, 0xECBC0CFB, +0x3631ED1D, 0x202C0EF8, 0xE7D2F8FC, 0x441910FA, 0xBED4E4F2, 0xCE3DE6FD, 0xD8CB0B15, 0xDE3C01F2, +0xD7F1F914, 0xFDCE00E7, 0xBDEF240A, 0x2CC5E616, 0x1C16FCED, 0xE805F412, 0xE4F11023, 0x14110DE8, +0xE2ED1418, 0xD7F7F6EC, 0xF8E9001E, 0x18C3E111, 0xAA4BF1EA, 0x2BB02DDE, 0xEB18FDD9, 0xEECFED11, +0xAEF8E9F7, 0xB0D129E0, 0x1952D9FA, 0x07D40ED6, 0xB13EDF03, 0xC74C28E9, 0xD7DB12DC, 0x0B11FFFD, +0xCEFC1D17, 0xC34CF623, 0x4A011523, 0x0410DDDA, 0xF2072317, 0x33101B21, 0x35F7F4E7, 0xF2CBF3E0, +0xAACDE6F4, 0x00002F0B, 0xE51344C5, 0x1211E938, 0x091EE1F6, 0x26CD02A4, 0xE028F84F, 0x2522B206, +0x1BFDF3D5, 0x0C23CC06, 0xE809C031, 0x19D30F54, 0x1B0DBD1C, 0x2EE256F5, 0xE11A080E, 0x17DF11B8, +0x16E4C20C, 0xEECA3B5F, 0x05EA2D11, 0x140AC432, 0xE0F6481D, 0xE024094B, 0x16F6121D, 0x14083C20, +0x200A481F, 0xE1F308E5, 0xFB0623D1, 0xDE1EF946, 0xEE211606, 0x15EC3D13, 0xF402E4DA, 0xF1D8E700, +0xE6D0F358, 0xEEF9C621, 0xE3F3BB36, 0x0A171E3F, 0x0D0ACBE1, 0x09071F21, 0x04DDDDB5, 0x051422C4, +0x07F2211B, 0xFD1BD5F3, 0xEFFE3926, 0x261602C1, 0xF40F3438, 0xEE07EB21, 0xF4DA1CB2, 0x241EFCBA, +0x2600B2D8, 0x11DC174C, 0x1A0542D4, 0xDF1349C6, 0x19E10F47, 0x09131F16, 0x010A27E2, 0x0A12E2C5, +0x01E229F5, 0xE3090AE1, 0xDEFEB629, 0x150E1319, 0x221D050B, 0xE3F4F6CD, 0x21F6071D, 0x23FC4C24, +0x1312C6EA, 0x12F01738, 0xEFFF3AD7, 0x1FFD48D5, 0x1C0B0CE4, 0xF5F71C30, 0x03F725E0, 0x0D38349F, +0xEB0614DE, 0xFB03DCD5, 0xEAC9EDA2, 0xDEF8B6E1, 0xDD0B0532, 0x17ECC2C3, 0x27E1FEB9, 0xEF14EA14, +0xF9FC2F2C, 0x160AC232, 0x1C0445DD, 0xE92311FB, 0x06162F3D, 0x03F12538, 0x0AFE1E26, 0x06E72141, +0xE1E6F841, 0x3221A5B7, 0x00E6D70D, 0xF8F8E030, 0x24FF4CD8, 0xFB02DCDB, 0x162313FB, 0xEAF1C2CA, +0x190CBFCC, 0xEFF4E834, 0x60370000, 0x25C139F2, 0xF731FCEA, 0xF734E009, 0xF10AE00B, 0xD2C81AE2, +0x26590710, 0x1ACE0231, 0xF41D0EF5, 0xD62BE4F6, 0xEF340303, 0x0AB9EA0C, 0xBA251EE1, 0xCE6BE204, +0xC1530A42, 0xC411E82A, 0xD4CD15E9, 0x35D4040C, 0xBEBE0C04, 0x01D4E7E5, 0xE9CAD9FD, 0x58F1EFF2, +0xAC46D1E6, 0x21DED4E2, 0x2C240706, 0xE0330304, 0x4931F80B, 0xF44C2109, 0xB74A1DDB, 0x2AC320DE, +0xBC2D02EC, 0x07EEE4FB, 0x2DCB20E9, 0xC910FBF4, 0xAF52F217, 0xD720D72B, 0xDBCC02F8, 0x1342FDF3, +0x26B315E7, 0x3D450325, 0xC7C0151E, 0xE9471219, 0x42E4111F, 0x4AA3E60B, 0x5537DF36, 0xB4E92E0F, +0xDCFEDC10, 0x18F1FCDA, 0xBFFA10E7, 0xD706E721, 0x2BD20022, 0x16500305, 0x4CC2EF29, 0xD71F2417, +0x20120009, 0xE7EC08EA, 0xE520F1EC, 0x42C8F3F8, 0xF23A19F0, 0x34111BEE, 0xCBF00DE8, 0x02F50DE8, +0xC3F0DA1C, 0x67CC1518, 0x09463FF4, 0xFCF7E11D, 0x01F6DC20, 0x2F1D27E1, 0x2816F9F4, 0xAA1800EE, +0x2E592DF0, 0xF4DC07CE, 0xCF49E504, 0xD33BF6E0, 0x17040514, 0xC445EE25, 0x4C33EB1D, 0xBB39250C, +0x4BAFE310, 0x58F8222A, 0xDD34CF1F, 0x4CCBFBF4, 0x32FDDC0D, 0xCF230ADC, 0x2D13F7FC, 0x49D6FA15, +0x09E2E002, 0x4425E20A, 0x170D1C02, 0x47DDF0E4, 0x2A441F05, 0xC0B502E4, 0x40B71823, 0xCFEE19DF, +0xD34A0917, 0xE7370521, 0x0000F1F1, 0x1CFDBD25, 0x1B080D30, 0xC61F61F7, 0x05122C3A, 0xDEF606CF, +0xF805D023, 0xD91D50F6, 0x1E0D0AE6, 0xE111F7E9, 0x1B1F42F7, 0xE9221106, 0xF7101EC8, 0x061C2FBD, +0xE8E711F2, 0xFB0E2335, 0x0DFDE6D5, 0x10E7E742, 0xF1FFE62A, 0x04F424CC, 0xF82B1F54, 0x10F8E821, +0xF40B1C33, 0xE2F3BA1B, 0xFBFBD32C, 0xF6E531BD, 0x12F7171E, 0x13073BDF, 0xDDEFFAC8, 0xDC1DFB0B, +0x0D00E4D9, 0x120AC7E2, 0xFEE1D546, 0xD9EFFEEA, 0x1EF0F737, 0x021225E9, 0xD4DE54FA, 0xF3FC1B2D, +0xF80DD1CC, 0x1EE1470A, 0x01E6D7F2, 0xE1E6F70D, 0xF9F0DEE9, 0xFB14D2C5, 0xE603F2D5, 0xD82750FF, +0x011AD941, 0xE2040A23, 0xE425BD4C, 0xFC28DC01, 0x22D94BFF, 0x0AE6E242, 0x16EDC2C5, 0xD90B011C, +0x050AD232, 0xDB114E18, 0xF2EB3512, 0x1AE642F3, 0xCFF1A7E7, 0xF220C9F8, 0x171FC148, 0x0735225D, +0xF2FF1926, 0x14D914FF, 0x0DFC36DC, 0x191BF00E, 0xE50CF3CB, 0x07F5221C, 0x2305FAD4, 0x1FD9094F, +0x25FFB4D6, 0x170FC1CA, 0x0FF3C91A, 0x02E82BF0, 0xDFEA07ED, 0xECE9143F, 0xE2E44645, 0xF2F6E71E, +0x26FAFE21, 0xFD17DB3F, 0xF0F6181E, 0xF818D0F0, 0xDD24B5B5, 0x00E8D8BF, 0xFE08DA20, 0x1104C6DC, +0x22FCB5D4, 0xE5FFF3D7, 0xE4CEF5A6, 0xF1EBE6EC, 0xEC06EBD3, 0xF5E91DC1, 0xE70540D4, 0xFC1A2D0E, +0x08E7E10F, 0xFAFE22D9, 0x06F82130, 0x09E80000, 0xF4F51F10, 0x49EE1CE2, 0xEEFADF17, 0x44ECE9DE, +0x0ECEE415, 0x354C1AF6, 0xCC020DDC, 0x50100C25, 0x1F362818, 0xCCB6090D, 0xE5C30C21, 0xFDDA0DEC, +0x350DDA01, 0x131A0C1A, 0x1AAB15F2, 0x2B590DD2, 0xC4A80331, 0xC517EC30, 0xCED3EEEF, 0xCC44F505, +0xF40DF5E3, 0xE2341BE5, 0x20C50AF3, 0xF9D308ED, 0xE345DF06, 0x3DF10CE4, 0x203D15E6, 0x1F4BF8EB, +0x1D37F8DD, 0xFEDC0BF1, 0xC14726FC, 0x0EDD1820, 0xCC221A05, 0xC1CB0D06, 0xC1CAE90C, 0x45EC180F, +0x9A3AE3EB, 0x15D23EED, 0xABCDEE06, 0x5EB52DF4, 0x19D33523, 0x0C41F1FB, 0xE8F8E4E8, 0xCD24F01F, +0x1239F604, 0xE6EA1611, 0xF23E0E11, 0x14F01A16, 0x450F14E8, 0x44BD1DE8, 0x3DE3E41C, 0x13E316F5, +0xEABEECF6, 0xEE00121B, 0x3AEEEB28, 0xE33AED15, 0x229AF5ED, 0xBF26FAC1, 0xE7351A02, 0xA6D80FF3, +0x5303CEFF, 0xCF082ADB, 0xB7BFF6E1, 0x3521E0E6, 0x07120DFA, 0x25E9E0EA, 0xB423FDEE, 0x0E012305, +0x1DF21B28, 0xCE1AF6E6, 0x2AF50AF2, 0xF80602E4, 0x0AB71FDF, 0x1F2A1E21, 0x0316F8FE, 0x0F4F2512, +0xEBCE1A27, 0xC0B3EC0A, 0x23E818DA, 0xEB0AFBEF, 0x164F13E3, 0xCDE61326, 0xC4DF0BF3, 0xBE3C14FA, +0x51E8E714, 0x10F2D710, 0xD3DB191B, 0xEA1F06FD, 0x344311F7, 0x21D60C1A, 0x301207FE, 0x2FF3F9EA, +0xEED1F9E4, 0xD335EAF9, 0xFA0505F3, 0x4B62DDDD, 0xD130DC3A, 0xD1D60708, 0x21D508FD, 0x4112FAFE, +0xEE431816, 0xAE0BEAE4, 0x03E0D51D, 0xD0AEDC07, 0x092BF72A, 0x07C92003, 0x20BDDEF1, 0xDC45F9E5, +0xCC1905E4, 0x0AE50CF2, 0x53D41E0D, 0xC928D505, 0x48B90F00, 0xF9CCDF1F, 0x3D4D21F4, 0xCB0B15DB, +0xF0050D1D, 0xE1F2E8DE, 0x36E5091A, 0x3EF20E0C, 0xD8E6161A, 0x241D00F3, 0xC1E7FD0C, 0xCFB8EA0F, +0xE33CF6DF, 0xF1AA0CEB, 0x45F11A2E, 0x3BFDE3E7, 0x28971425, 0x2DDC00BF, 0xE9DFFC03, 0x05B6EE07, +0xF1DE23DD, 0xB6E01807, 0x1F31DDF7, 0xEB390A0A, 0xD44B13F0, 0x11E2FC22, 0x5021E80A, 0x072E28FA, +0xEEBBDF07, 0xEC30E9E3, 0xD2F2EDF8, 0x3AE8061B, 0x4CB6EF10, 0xCBD2DC23, 0x302F0D07, 0xB73308FA, +0xAFE821F6, 0xD63FD6F0, 0x4CF20216, 0xBFEC23E6, 0x17DB19ED, 0xC9E8EF03, 0x3A34F10F, 0x404711F3, +0x1814181E, 0xEF17F1EB, 0x551F17EE, 0xD7D62E09, 0xF519FFFD, 0xFC16E4F1, 0x28E62412, 0xDD2600F2, +0xFD220501, 0x5DE52407, 0xB9B6CC0E, 0x180220DE, 0x27351026, 0xFA13010D, 0x050222EC, 0x2BE0DDDA, +0xCEB2FC08, 0x0CD00A27, 0xC3FBE509, 0xF6F51422, 0xEEAC1EE3, 0x10CFEAD5, 0x1FDBE9F7, 0x47C20AFE, +0x3AC8E2E9, 0xC80DEEEF, 0xECD9F1E5, 0x0FCEEC00, 0x1F2CE70B, 0xE5BCF8FC, 0x37B10DE4, 0x4200F1DA, +0xFB081A27, 0x385C231F, 0xC7210FCB, 0xFEF610F9, 0x26E30000, 0xEBF8132F, 0x051ADEBF, 0xEDE13CBA, +0x1819C0BF, 0xFE0F2AE7, 0xFC1D24F5, 0xDBE90311, 0x02F02918, 0x190FF037, 0x1CE10B46, 0x0AD0CF58, +0x170410DD, 0xF72231FA, 0x1D15BBED, 0x16053EDD, 0x0A1D1D45, 0xF412E316, 0x191510EE, 0xE3DE0BF9, +0x10113838, 0x02D92AB2, 0xFF07D7E0, 0x21ECF83C, 0xEDEBC4C2, 0xE8EDC13B, 0xF9042025, 0xDB35B4A4, +0x1AE3BF45, 0xFEEB2514, 0xEDFAC522, 0x0B08E3E0, 0x13F2151A, 0xF3D7E551, 0x1D110BE8, 0x25170312, +0x19C9F1A2, 0xEA0C1234, 0xE3FBF52D, 0xF3DC1BFD, 0x11F518CC, 0xFDF92521, 0xF61E31F6, 0xE0EA47EF, +0x09E6E142, 0x09F8E031, 0xDDF9B52F, 0xDAE34EBA, 0x160111D8, 0x1524C34C, 0xF01C170C, 0xDDE14BB9, +0xE7EEC0EB, 0x34005CD8, 0x17E1C2F7, 0x0F1B1943, 0xFD11DCEA, 0xD5EF5417, 0x08D73052, 0x1CDAF4B2, +0x162AED52, 0xFBE9D3EF, 0xF31C1CBC, 0xF225CA03, 0xEB231405, 0x13FFEC2A, 0xDAF4B135, 0xDC21FDB8, +0xDBF90420, 0x0F23184B, 0xE40945E1, 0xFE03DBD4, 0xDF1B48BE, 0x0CE01C49, 0x1200C728, 0xEFF016C7, +0xFC12D43A, 0x0AE9CDC1, 0x15101318, 0xDFE949C1, 0x2314B6C4, 0xFADF2349, 0xFCE4D5F4, 0x1EFA462E, +0x03DEDBFA, 0x19230F05, 0x210D061B, 0xFF2327FB, 0xDA21B207, 0x1302ECD6, 0xEF14E93D, 0xE4010D27, +0xEEE7E942, 0x1B1DF30B, 0x1A180D3F, 0xFF17DAC1, 0x0000F2FA, 0xB1351ADD, 0x4FE626F3, 0x2A12D80E, +0x1434FEEA, 0x36F2EC0D, 0x42C6F2E7, 0xB8C1E512, 0xE23821E9, 0x0E3B0AF0, 0xFC3E1BEE, 0xB631DB15, +0x0623DDF8, 0xD81B2306, 0x28B5FFF3, 0xEF270023, 0x1718E9FF, 0x33EB110F, 0x30F0F5ED, 0x1426F8E7, +0xC727ECFD, 0xB34010FF, 0x3CFFDBE9, 0x44141326, 0x5EA2E4EC, 0x3325CBC9, 0xD8130BFC, 0x0C1E0016, +0xF92EE4F7, 0x1109DEFA, 0x2632E9E0, 0x520EFEF6, 0x342ED619, 0x3229F4F9, 0x0D0DF700, 0x1D111BE5, +0x15BC0C18, 0xA728ED1B, 0x54283000, 0x47C32B00, 0xCAEE1FEB, 0x11EEF2E9, 0xC00C1717, 0xB215181C, +0x030CDA13, 0x480325E4, 0xEDCAE126, 0xD8D915F2, 0x23DAFF01, 0x16240503, 0x374AED04, 0x2904F1DE, +0x3D3DFF25, 0xB3CF1516, 0xDE0A25F8, 0x3306F9E2, 0xCDB9F622, 0xBCD0F5E0, 0xEC291DF8, 0xA8DE14FE, +0x07FC2F06, 0xCB3CE0DC, 0xFBC4F213, 0x2ED0DE15, 0x35DEFB08, 0x38C8F305, 0xCF36F010, 0x3ACE0A0E, +0xEC3A1209, 0x2152EDEF, 0x40440729, 0xCC04E91C, 0x0C56F424, 0xB04A1C2E, 0x28CAD721, 0xCDD8FF0F, +0xCC1CF400, 0xE6BDF3F3, 0x0F020E1C, 0xFBFD19D9, 0x3DC12326, 0x00D8EA17, 0xCB2ED900, 0x5008F3FA, +0xEF2B28DF, 0xA726E9FE, 0xEAF5CFFD, 0x3FE4EEE3, 0x3F27180B, 0x3C47EA01, 0xC8B5EBE0, 0xBEC1F023, +0xD7231A16, 0xE15501FA, 0x40AAF82E, 0x4511E72D, 0xF8DAE317, 0x20030000, 0x0BF7E232, 0x0BF1CDE6, +0xCFF25835, 0xFAE12DF7, 0xCFEAA613, 0x22FFF928, 0xE8E93FC1, 0xE327BAFE, 0x1E030A24, 0xDFDFFAF8, +0x06F2D3E6, 0x00FED8D6, 0xE7DFF2F8, 0x10FB39DD, 0xDBD74CB0, 0x072BDEAE, 0x1EE90A11, 0x26DB4DFD, +0x16E8EEC0, 0x17FEC126, 0xEB03C4DB, 0xFCF924D0, 0xDBD8FC00, 0xE510F3E9, 0xEBF6C4E2, 0xFF2127F8, +0x0DE335F6, 0xE1E7B840, 0x1724C203, 0x0D23E5FB, 0xFD1ADB0F, 0x2C0C5434, 0x22EEFBC6, 0xDB130316, +0x1EE60A0F, 0x27E94F3F, 0xF7E21F46, 0xF1D837FF, 0xECFB3B22, 0x330FA638, 0x0CE21CF7, 0x22FFB728, +0x281AB042, 0xF714CE13, 0x11E0C707, 0x11D9E9FE, 0xD9EBFF3E, 0xF8043023, 0x1C15BCC3, 0xCAC95DA0, +0x13ECEB15, 0xDFEDB73B, 0x201CF8BD, 0xF033185B, 0x160B12CD, 0x01092631, 0x0E06192D, 0x0E001BD8, +0xEC0FEC37, 0xE4E143B9, 0xDD2405B4, 0x1EDAF501, 0xEFFF16D6, 0xD8F70130, 0xF1EF3738, 0xFBEB2E3D, +0x1F0147D6, 0xFAF52EE4, 0x00D92800, 0xE31B440D, 0x02112617, 0xF1DCE6B4, 0x17E3C144, 0xE117B9C1, +0x10F1E719, 0x0C15E3EE, 0xE315F53C, 0xE5260D4E, 0x02F8DB31, 0xEA14EF3C, 0x4B178DC1, 0xDC070320, +0x0F1CC8F4, 0xEAFB122D, 0xE71042C8, 0xEBE8EC40, 0x0EEDE6C5, 0xEDEF1618, 0xFFDE2AFA, 0x260B4DCE, +0xF3D9E600, 0xF816DFC2, 0xEA26EE4E, 0x14F23CCA, 0xD51AAD43, 0x0000133C, 0xFF5116EB, 0xCEF7D9D7, +0x3EFCF7E2, 0xE13E16DC, 0x39D5F7EA, 0x583312FD, 0x3FEB2FF6, 0x35B3E9EE, 0xDD01F424, 0x26230528, +0x5EB4FFFB, 0xB91E3623, 0x0AE11E09, 0xF6201F09, 0x4CC6E208, 0x1CBA2413, 0xC4370D1E, 0xD1001310, +0x35150627, 0x122AF4ED, 0x0BF71502, 0xC618E3E1, 0xF202ED10, 0xF2C31A25, 0xB3F71BEB, 0x2312DB1F, +0xC20804EA, 0x11FAEBDF, 0xA8DE18DE, 0x28113006, 0xE9CC0016, 0x4021120C, 0xEFC41908, 0xEB51E9EB, +0x331113D7, 0x5ACBF5E8, 0x10C431F4, 0x0927E914, 0xB403E0FE, 0xFBE925DA, 0x1B24DD10, 0xB43B0CFB, +0xE7C52413, 0xB94A0F13, 0x1DD7E1DE, 0xE5D10A01, 0xAE560C07, 0x290E292E, 0xF3F3001B, 0x5A131B1B, +0xB4E0CE15, 0xBAE6DDF7, 0xC801E20D, 0xEEC61028, 0x16F1EB11, 0x2FC5EEE6, 0x4D2FF814, 0x2DB526FA, +0x15B105DD, 0x2932EDD9, 0x0FD1FEF6, 0x2DD719F9, 0x29F30601, 0x3AFFFFE5, 0x44BFEFDA, 0xA437E5E8, +0x0E38350F, 0xDF07E510, 0x06AA0821, 0x0052222E, 0xEFEB27D5, 0x1ED11814, 0x0B0E0908, 0x2DA11D1A, +0xEB3405C9, 0x161C140C, 0xC2FBEF0D, 0x02E8E923, 0xD5BADAF1, 0x24C303E3, 0x374F04EA, 0xE8F10FD8, +0x21B01118, 0xB536F8D9, 0x3BF1DDF2, 0xFD0012E6, 0x2F4FDB28, 0x0D2CF826, 0xBEBC1C04, 0xC64C1A1B, +0xC62911DB, 0xF3AAEEFF, 0x40D5E52E, 0xA21C18FC, 0x18ED36F3, 0x00000F15, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 + +hard_output0 = +0x7FE75E62, 0xB98D686A, 0x16FBEDEE, 0xB22861F2, 0x0A1180B7, 0x666C4407, 0x1D4C462A, 0xB81A3416, +0xC6948E41, 0x3CCAE97E, 0x55352D5A, 0x85474DAC, 0xB8DBF013, 0xB9AF7B16, 0xEABEE865, 0x1EB02EF7, +0xBDE86A3E, 0x24EDAAC9, 0x88A3D4B9, 0x8CA15C44, 0x42487190, 0xF4BF8BFF, 0x05EA0214, 0x4708DC42, +0x222993B3, 0x24AAA18B, 0x4D49B2EA, 0xBBA8E2B3, 0x40426630, 0x5676818F, 0x1B79CC4B, 0x1595A8CD, +0x9088385F, 0x351D2A23, 0x0EDC4446, 0x8F17D03E, 0xEA8B3464, 0x8799E718, 0x79E11F5A, 0xE771403F, +0x38C65263, 0xA969930A, 0x59942FBB, 0x74138F31, 0x80518035, 0xB42D7BE0, 0x0C4A7E00, 0x4ACA8CB5, +0x76C89CCB, 0xB56F2806, 0x1C8CF4E5, 0xA192BBF1, 0x1139DA94, 0x46B1C7C9, 0x8B630748, 0xA882704B, +0x69DA8BE2, 0xF2508EA5, 0x05E4AEAF, 0x5AA0A9C8, 0x6177DDCE, 0x8D06A0E1, 0xECD023CA, 0x34FC0800, +0x5AE69AAD, 0xFE8E2F72, 0x5ED3DC49, 0x8B46EB93, 0xC0C3D55F, 0xAC8C8B89, 0x54A20A93, 0x81F6659B, +0x412B7086, 0x09D572AB, 0x85891AB0, 0x96DC6C57, 0xD7117C38, 0xFBA06F16, 0x9EAAFCE5, 0x44AD2185, +0x618D398E, 0xD9AC89E7, 0x031F1D0B, 0xE7D05975, 0x9E500DF3, 0x06BFEF20, 0x42888C91, 0xD6AF7FA6, +0xC839E4C7, 0x0E7B7724, 0x48693BD9, 0xD17B6519, 0x48004F1A, 0xF5A147D5, 0x521C8AD6, 0x26E19AE7, +0xAA17116F, 0x7196631D, 0x89643E51, 0x8CE6B02E, 0x128B9CF6, 0x2F45C206, 0x4EB6C731, 0xCFB17835, +0xCFE85026, 0xA4B9B9B0, 0xD2C152AC, 0xA4F89035, 0x79ED0C5F, 0xBC030479, 0x51D91130, 0x570C019C, +0x4E0306B7, 0x27978CCD, 0x5F8DA612, 0x33C121FE, 0x4407BB22, 0x6FF06E2F, 0x5D7F378B, 0x491B9A93, +0xA0BDE688, 0x0EA89618, 0xE91C3661, 0x27C69F6D, 0xC46463FD, 0x67649FE9, 0x8F6E077F, 0x4D456A5F, +0x396B7218, 0x0C26C824, 0xA4E8FD71, 0xDCA1C865, 0x6F1CC581, 0x97C974D3, 0x38D0F6FC, 0x04190419, +0xED8C7FC5, 0x794BA619, 0x0090798D, 0x3044F72D, 0xBB77EEEF, 0xF9BCFDE1, 0x2C1580F7, 0xC0292305, +0x86827E71, 0x356C7D12, 0xA84DBECC, 0xCA53E3D9, 0x236E73F0, 0x9FD2AFBA, 0x652E7A66, 0x744A1147, +0xBFE9AF5B, 0x59F2552F, 0xBD77D3C0, 0xCD726524, 0x1D56A0FB, 0x85207831, 0xB6F1861B, 0x369CF946, +0x71CA18BD, 0x5EE3F7CF, 0x2C3FC902, 0x4301214D, 0x53A64F16, 0x2956B34F, 0x3DF40618, 0x41A36C68, +0xF7BB2B5F, 0x0C5CD46D, 0x3E4354AC, 0xC29AFEF7, 0xC1A310AF, 0xFFEF128F, 0xBE1C8D14, 0x8B123664, +0x854B7E00, 0xAE175861, 0xE4067FE2, 0xA264F00A, 0x988634EF, 0xEC9E38E7, 0xFE2968A6, 0x2B30719D, +0xFE3DC88D, 0x09E222C8, 0x6B4F1B50, 0x436C7137, 0x161DFE10, 0xA68C403E, 0x12A2856F, 0xAAB8DFF0 + +k = +6144 + +e = +10376 + +iter_max = +8 + +iter_min = +4 + +expected_iter_count = +8 + +ext_scale = +15 + +num_maps = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_CRC_TYPE_24B, +RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN + +expected_status = +OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_low_snr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_low_snr.data new file mode 100644 index 0000000000..8ff71aac42 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_low_snr.data @@ -0,0 +1,643 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_DEC + +input0 = +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x16000000, 0x081112e9, 0xcd2d1fac, 0xf9fdf4db, 0x110edf1a, 0x0dd9e84f, 0xdbe9e611, 0x0fde0206, +0x43df19f9, 0x071ee4f7, 0x1f1322c5, 0xd4e5f6f3, 0xe3fafcde, 0xd002f52a, 0x4427f801, 0xbadce403, +0xce101dc9, 0x09fff729, 0xd5f91f2e, 0xf3f0fee8, 0x4f061cde, 0x4a2b2753, 0x1d24dffb, 0xd3040bdb, +0xcaf2fbe6, 0x1cd9f350, 0x00fff42a, 0x49d02759, 0x4005de2d, 0xd3fb1923, 0x36cbfc5c, 0x020a0de1, +0x39072621, 0x3b0defe5, 0xb4ebec13, 0xddee2416, 0x24f206e5, 0xd1e1fcb9, 0x0e150713, 0x21f6191f, +0x0d0bf9e3, 0xf0061bd2, 0xae2717ff, 0x0de9d740, 0x13031a2b, 0x4c0215d6, 0x4534dc5c, 0xa1f41c1c, +0x001b3842, 0xeaf83ecf, 0x2519b4be, 0x1d220afb, 0x05162312, 0xee00ea29, 0x25ef4d39, 0x0cc03398, +0x08f5e0ce, 0xb7e68f43, 0x14f7ec31, 0xe7f5f11e, 0xfd29d6ae, 0x0af133c9, 0x03fdd5db, 0x0bca1d5f, +0x00172840, 0x061add0e, 0x0516ddee, 0xe10cf735, 0x1709101f, 0xdf0908d0, 0x06fe2dd6, 0x18ed11c6, +0xd315ac14, 0x06f0d3c8, 0x1ed9474f, 0xef223806, 0x28f3ffe5, 0x0eeb1aee, 0x080de0cb, 0x29f452e4, +0xdbd702b0, 0x041b2cbd, 0x1df30b34, 0x1927f102, 0x2010b719, 0xf0fde8d5, 0xe9eaef3e, 0xf10b36ce, +0xdff4fa1b, 0xfd0cd5e4, 0x04f923d0, 0x110f3936, 0x06fe2e26, 0x00e42844, 0x11e839c0, 0x13ecea13, +0xf621e349, 0xff332600, 0xe604f1f5, 0x0533d425, 0xf240c9f5, 0x0b5933e8, 0xdf1bf931, 0x02c929f2, +0xeee6eb0f, 0x12a2160f, 0xfdde26ca, 0xf016c8f9, 0xdd03b5ee, 0xe2ee09da, 0xfdf4db17, 0xdb0603e4, +0xffda2821, 0xf6f9cefd, 0xd5ca5421, 0x12f03af2, 0x182f0fe9, 0x10423808, 0x0c19e41a, 0x27af02f0, +0xfc14d42a, 0x08c9d114, 0x274700f2, 0xe8c110e1, 0x0e0f19e9, 0xeb58c3e7, 0xe20fbbd1, 0xe52e0e1a, +0xf145e607, 0xe316bc1d, 0xe3e04511, 0xd93c0009, 0x27db01ed, 0x0a30cd03, 0x23434af8, 0xe13f09e6, +0xe4d00de9, 0x07202208, 0xdb3ffd07, 0x0955cfea, 0xeae8112c, 0x041324f1, 0x1011e815, 0xf6d01f17, +0xe5eb0cf9, 0x17be00ee, 0xa2dbeee6, 0xb2e73603, 0x08ebda0f, 0x250fe0ed, 0xe61a0218, 0xf1dbf2f3, +0x420b18fd, 0xa1e9e5e4, 0xd9e1caf0, 0xe7cffe08, 0xeba8f009, 0xc45213d0, 0x20a1ed29, 0x28fa0737, +0x1ad900dd, 0x1bc10dfe, 0xab360c18, 0x023bd3f1, 0xacfd2514, 0x4d382c25, 0xf25adbf1, 0x1eda1a32, +0xf11e0902, 0x23a5e70a, 0x1f32fcce, 0x0ef0f8f5, 0x2029e6e9, 0xdfda0701, 0x1860fafe, 0xd8e5f139, +0x5612010d, 0xf2572d15, 0xba23192f, 0x2ac1e2fb, 0xe91e02e8, 0x44d2100b, 0x08f9e307, 0x5edddfe0, +0x240fc906, 0xc1c3fbe7, 0x0f231614, 0xaa111806, 0x1e2d2eea, 0xc6ba0a06, 0xedc9121e, 0x1ffc150e, +0xd11b0a23, 0xe800f80d, 0x2f27f101, 0x06110638, 0xd01fdef8, 0x15ee0717, 0xba0e131a, 0xcde51f43, +0xd21df6bc, 0x051006c8, 0x2616ddc3, 0x3ef8fee0, 0xf3cde9a4, 0x3bd81b4f, 0x25001229, 0xf6eb023e, +0xd81ee3b9, 0x1cecff14, 0x29fef4d9, 0x9f2d0255, 0x121e38f5, 0x18eb16c2, 0x271a1041, 0xf7f700cf, +0x28f3e1e4, 0x49e90011, 0x4b0fde1a, 0xd9e723f1, 0x0de402bd, 0x261f1b0a, 0xbe0afe1e, 0x0823e606, +0x3d041f2c, 0xf1f21436, 0xec1ae7f1, 0x02ebebc3, 0x52f1da1a, 0xc9e5d60d, 0xa9dc0e04, 0xc504d22d, +0x09fd1325, 0x3706e02e, 0x26dc0f4b, 0x2012fe3b, 0xeef109e7, 0xb509161f, 0xf01dde45, 0x13d51853, +0xc823ebfb, 0x2d23f0fc, 0xcbf6fbcd, 0xd505f22d, 0xee0afd1e, 0xa6e615bd, 0xa020ce07, 0x411937c0, +0xbcd318ab, 0x2a1d1cf5, 0xc400ff28, 0xe32014f7, 0x2bf30b1b, 0x0e03fc25, 0xe1e41bf3, 0x2f1b0943, +0x06060721, 0xc601de26, 0xd3faee2e, 0xe51c05bc, 0x0411f4c8, 0xcfe7dcbf, 0x2d12083a, 0x0bedfb3a, +0x0efc1d2c, 0xca1f1909, 0x13f80e30, 0x3a21eab7, 0x3c2b1252, 0xf2e4140b, 0x2527e5b1, 0x2ffe03d6, +0x44e4f90b, 0xcf21e449, 0xd8e9f6c2, 0xeef8001f, 0xfb151513, 0x48f9de22, 0x2ad6e0ad, 0xe63602a3, +0xdae50e0d, 0xe3e5ff0c, 0xc721f449, 0xa0d5efac, 0xe70039d8, 0xc7f71031, 0x2b22eefa, 0xe5fb04d3, +0x0021f2f9, 0x2bce28a5, 0xdffefa00, 0x1af642e2, 0x1d190bf1, 0xecf515cd, 0x0af4cf34, 0xf406cbd1, +0x08ebd013, 0x14173b40, 0xe40e0bca, 0x29ff51d9, 0xd303abda, 0xe303f5d5, 0xf6facddf, 0xecef3cc8, +0x1324ecb4, 0xd213563c, 0xe00ff91a, 0xef121639, 0xf5d2cdaa, 0x1914f013, 0xe80f3fe8, 0xe31c0bbc, +0xe3d5bcad, 0xe610be38, 0xe72df155, 0x1cef44c7, 0x13ccc5a3, 0xe1e20909, 0xecf2c337, 0xf2fd35da, +0xe5cd435b, 0xdc1304c5, 0x050722d2, 0x121fea46, 0x36f8a1e1, 0x1223c6fb, 0x18040fd4, 0xef1517ee, +0xf8e32ff5, 0xf22cc953, 0xfe04d7dc, 0x10e7390e, 0x1ef4091b, 0xdbf2fde6, 0x1afa432e, 0x2211b5e8, +0x211eb8ba, 0xff1529c4, 0xdaea004e, 0x11e539ed, 0x13b4eaf2, 0xe10af7db, 0x11e9c81e, 0x1eeef6f0, +0x17b73fea, 0x09c61fde, 0xeefdebef, 0xd92fffdc, 0xd7e05007, 0xfe42d9f8, 0xd2feaae6, 0xf3001cd9, +0xee12c727, 0xe5d90cea, 0x2c21ac01, 0xe3de0b08, 0x265703fa, 0x1a410d30, 0x2f1f5719, 0xe742bff6, +0xfc2e23e5, 0x2746b105, 0x262efe1d, 0xe43ff4fb, 0xf01018e9, 0xd9014e18, 0xef043927, 0x23fb0524, +0x27094e23, 0x19ce41e1, 0xf70a200b, 0x1daff5e3, 0x274eb22a, 0xf612cd26, 0xf903df17, 0xe3f1ba25, +0xe45bbc18, 0x062a2132, 0x11bfea01, 0xf4fe34e7, 0x0637ddda, 0xede0c510, 0x02022509, 0xfbbf2c26, +0xeda8c619, 0xecb0edd0, 0xeb00d0d8, 0xf054edf7, 0x0356182c, 0x5fd3252e, 0xd74e3805, 0xc2100026, +0xe4161517, 0xf106f412, 0x26f219df, 0x440bfde5, 0x1b031d1d, 0xe6c4f325, 0xd349f213, 0x2b0605df, +0x4bdbfcdf, 0xe32e23fd, 0x49460a07, 0xcff022e3, 0xf9c2f617, 0xdfbc2116, 0xed2f071b, 0xd6a91406, +0xc33bfe2f, 0xc623eb12, 0xc2d0ee06, 0x243aeb07, 0x1fe8fb13, 0xffc409f0, 0x1ed6d814, 0xde4bf602, +0x31dcfb22, 0xf5da0afd, 0x0afd1e03, 0x1cc01fdc, 0xf82bf4e8, 0xcccce003, 0xfb0f0df4, 0xd2ff23e8, +0x0845fbd9, 0x16e821e2, 0xe5c5eef0, 0x14bbf4ec, 0x1cefeb1d, 0xffcd0de9, 0x5bbad90b, 0x0630331d, +0xf826dd09, 0xc62c2001, 0x00ed12fc, 0x16e8eb40, 0xf3e4120c, 0xc105e52d, 0xca181610, 0xb9e0f149, +0xfc011f28, 0xfc17233f, 0xc5f12318, 0xea1dedbb, 0x37e91240, 0x47d9f0b2, 0x19271e01, 0x09240ffb, +0x1edd1f4b, 0x02240ab3, 0xf3e6d90e, 0xfd03e425, 0xb12325b5, 0xb92cd9ac, 0xcee71e41, 0x47fa0bdf, +0x0fcb1fa3, 0xd406e7de, 0x31defcfa, 0x300af71e, 0xfa0608dd, 0x10e922c1, 0xb2f3e936, 0xf336265e, +0x0610e517, 0x16e72242, 0xab23134b, 0xbaddd34b, 0x1afee225, 0xfc100d38, 0x44e6dcbe, 0x02ede4c4, +0xbe19da41, 0x2ff1e6c9, 0xea14f8c3, 0xc21bed0d, 0xac1017e8, 0x35202df8, 0xd9f10dca, 0x03fc02dc, +0xf2e425bb, 0x29efe5e9, 0x3ce10046, 0x09153000, 0x0b061d2e, 0x1f1a0abe, 0xfb18d2c0, 0x0008d730, +0xf3071b30, 0x17dfeff9, 0xc5d09da8, 0x23d7fbaf, 0x07e921ee, 0x16e4ee45, 0x1624c304, 0x01f828d0, +0x20ddb8fb, 0x030325d5, 0x0424d5fc, 0x0216dac3, 0xe5040c23, 0xd71552ec, 0x28ef00e9, 0x16de13fb, +0x1520edb8, 0x0416db12, 0xdeee07c7, 0x07fc20d4, 0x08fadf2e, 0xf0f639ce, 0x30f0a7e8, 0xef0d39e6, +0x210d071c, 0xf2f235cb, 0x05192242, 0xd6095130, 0x2605ff2d, 0x19f8bf30, 0x1320eb48, 0xfbd72e51, +0x01d92701, 0xe127f601, 0xdc0a051f, 0xfdf1dc37, 0x0b0bce1e, 0x09ff1f29, 0x1507c3df, 0xf7e3e1bb, +0xdb204df8, 0x11e517bd, 0x3004a7dc, 0x0d1300cc, 0xf42134ea, 0xe9b9c1f8, 0x1fbef720, 0x07bcdfe5, +0xeccf3ce5, 0x17301109, 0xf2b4e6f7, 0x1258c723, 0xdaf84dd0, 0xd507ae1f, 0x011d2a22, 0xfd3f25f5, +0xfd4edb17, 0xf9cadf26, 0x144dc3f1, 0x09003124, 0xec503b27, 0xfed1d628, 0x0ffbc9f8, 0xf2e619de, +0xf832dff1, 0xf3d034f5, 0x1dea0b09, 0xe80e0fef, 0xf1dd38e6, 0xf8fce104, 0xde1f07db, 0x06ccdef7, +0x24554b0c, 0xcde0a6d2, 0xe2e0baf8, 0xeae6ef09, 0xe31b440f, 0xe5c6f3f2, 0xf447ccee, 0x1944f2e1, +0xe33fbb1b, 0xebad3eea, 0x0b1de32b, 0x0d24e50c, 0x18e711fc, 0x2830b110, 0x14413cf8, 0xe7e7f219, +0x1c49bc0e, 0x0734e0df, 0xe255f50c, 0x540045d2, 0xe3c0d3e3, 0xef0ff518, 0x34c017e6, 0x052af517, +0xff4e2402, 0xc4eadada, 0x00d3ed12, 0x4bc727fa, 0xaaf62211, 0x28e1d21e, 0x530a00f7, 0xfd40d5e1, +0x0dafdbe8, 0x2b0de5d6, 0xc722fce5, 0xca241007, 0xe1eb0efc, 0xfa63f8ee, 0x28dfdec5, 0x07420107, +0xccf6dfe7, 0xcb1df4e1, 0xd9def40b, 0x47ef0105, 0x1041e0e9, 0xe849e919, 0x27f10fdf, 0xef2c02e7, +0xe74fe805, 0x4cb7f2d9, 0xe7ee2521, 0xee430f17, 0x5b09161b, 0xdce2cd1f, 0x2343050a, 0xc22c05e5, +0x5ae7eafc, 0x9749cef1, 0x4dea4221, 0x0e2726ee, 0x24a8e6ff, 0xcc5afcd0, 0xbcd2f432, 0xf514e306, +0xbd0ee414, 0xc4dbe41b, 0x310a1302, 0x090cf8e2, 0xd5dce11d, 0x1c13fdfb, 0xeacbf515, 0xc5eeeef3, +0x3027eee9, 0x29420701, 0xc01700e6, 0xc4b7e910, 0xaaebec21, 0x129fd2ee, 0x2ec5eac7, 0x0eecf9ec, +0xe10b1aec, 0x57b3f7e3, 0x3939d1db, 0xcf42f012, 0x163ef719, 0xd5111217, 0xe92203e9, 0xf13eef05, +0xece5e6ea, 0x3301ecf4, 0xfff6f527, 0x39ded9e2, 0x110deffa, 0x262fe91a, 0xb7bd0207, 0x39d8dfe4, +0x0a2e1101, 0x2adf1ef9, 0xe52ffef9, 0xb70ff307, 0x1cdd22e7, 0x2b3bf4fb, 0xe4eb02ec, 0xd80bf4ed, +0xfebaff1d, 0xcd12271e, 0xfeee0aea, 0xc70726e9, 0x0f4fefdf, 0xd9b6e6da, 0xf5d300df, 0xccbc1dfa, +0x34270de4, 0xf0d3f400, 0xc649e7fb, 0x18deeede, 0x4d0f0600, 0x2bdf2549, 0x1f07fe21, 0xf0e6f60f, +0x0c1b1743, 0x0f0a1b1d, 0x46efe7e9, 0x0ae6e242, 0x0ff61f33, 0xae21e84a, 0x500ad6e2, 0xfcddd74b, +0x4a17ddc2, 0xe9d9dd4f, 0xc7241205, 0xb9e8110f, 0xda111ec7, 0x37e1fe46, 0x39f3f1e5, 0x000512d2, +0x0e05d92d, 0xfeec193c, 0xf519daf0, 0x1e291d52, 0x362bf652, 0xbce9f311, 0x30fae5d2, 0xe6fcf7db, +0x36ec0fc4, 0xddfa0f23, 0xf1f605e3, 0x1ed1e857, 0xb9def6b6, 0xc0091ee0, 0xcff1e8ca, 0x3fe5090d, +0xf3edea15, 0x23111b16, 0x0207fbd2, 0x1d2cdbac, 0xbdf6f6cd, 0x1a311ba8, 0x420af2cd, 0x1bde1ab7, +0xc512f217, 0x0fe3edbc, 0x1afe19d6, 0x200bf1e3, 0x100900c8, 0xfe1a29f2, 0x12c51663, 0xdfe606f2, +0xf7ea1f12, 0xf841df96, 0xe2f50a33, 0xe9f5efcd, 0x13fdeb25, 0x2524044d, 0x0d1a35be, 0xfaee23c7, +0xf0043824, 0xda200108, 0x04f225c9, 0xe101f7d6, 0xf30dcb36, 0x07fb22dd, 0xd1fba92c, 0xdf03f824, +0xd0efa8e9, 0xf5dd1d05, 0xfe332a5c, 0xf4221bb6, 0xe5ddbdb5, 0x1401c3d9, 0xfc12d33a, 0x1b14bd3b, +0xddf2fb36, 0xf0e13709, 0x12d9c601, 0x0cf7cce1, 0x1b06bc22, 0x22d6b7ae, 0xf7291eae, 0x15f81321, +0x1a04f2db, 0xe425f404, 0x05f32435, 0x060f2218, 0x0bd93250, 0x26f9fd20, 0xfe2fd5aa, 0x121deb45, +0xf6e731bf, 0xf90c2e1d, 0xe9dbc2b3, 0xfb0edd36, 0x1500b93e, 0x281db01e, 0x061ddff5, 0x2712fe0a, +0x0f461ae9, 0xe32f0b1f, 0xed691507, 0xf61d32bf, 0x0d24e5f5, 0xfae422fd, 0x03d126f4, 0xee0ac6f9, +0xd8a4b11e, 0xebf51335, 0x15f7c31e, 0x07fd22e1, 0xe40a0cdb, 0xdd04b5e3, 0xd1f25825, 0xec033de6, +0x12fee925, 0x292051da, 0xdff54af7, 0x34d0a4e3, 0xf53de209, 0xedeceb14, 0x0f4cca13, 0xe3340b25, +0xf023e90c, 0xf6be32fa, 0x2254fae7, 0x07c1212b, 0x31015816, 0x1bd24227, 0x1438edf9, 0x151f3df0, +0x02d1270a, 0x0fffc9f9, 0x0d4235da, 0xf638e2e6, 0x241ffc0f, 0x1d380b08, 0x1a93bdf0, 0x1b4f44bb, +0xfe57da26, 0x24c8fbd1, 0x1112c711, 0x1f3ef6eb, 0x00173116, 0x100311f8, 0xf2dfe7db, 0x292ce5f8, +0x46e1fffb, 0x45c71ef7, 0x2bc31c11, 0x4abcfceb, 0x00e0dd1c, 0x202628f9, 0x42f2f801, 0x0bb41b1a, +0x0d16e225, 0xd2f11a12, 0xf6ec06e6, 0x13ef1deb, 0x48c51617, 0x09ff1f13, 0x314b1f28, 0x1ecf0823, +0xf9adf6f7, 0xd4da222a, 0xef0f0501, 0xe146e8e8, 0xfe4308e1, 0x4803dbe5, 0x21bc2025, 0x0fc5f9e4, +0xd341e813, 0xa9d9fae6, 0xaaf5d1ff, 0xb546d2e3, 0x12e2221f, 0xbee715f6, 0xd325e60f, 0x1adc05fd, +0xf533f3fb, 0xf3d0e3f6, 0xcb11e5f7, 0x33fb0ce9, 0xa3be0b23, 0x29b8351a, 0x312f0120, 0xebbb0afa, +0xc31a12e3, 0x0c47150d, 0x21c21be2, 0xe1570715, 0x19e0082e, 0xc8f2f800, 0x2a0b11cd, 0xcd3001a8, +0x2f1e0bf7, 0x1909071f, 0x1c15f2ed, 0x4612f53b, 0x40021d27, 0x3108e821, 0x0c1108c7, 0xcd0d1ce4, +0xe51c0b44, 0xb4ebf412, 0xf1dddc04, 0xd6f7e6e1, 0xc32efe56, 0xfd10ea18, 0xdb2eda55, 0x48ff0329, +0xe2fce12c, 0xd5f9f5df, 0x2cda04fe, 0xdf0dfdcb, 0xc5e70741, 0xdf16eec2, 0x3ce1faf7, 0xcc0eec35, +0xfa28f450, 0xf1e72210, 0x451de7f5, 0x4dfde324, 0xfdf3db35, 0x31eadc3d, 0x391c09bc, 0xcc09ee1f, +0xdaf90dd1, 0xf6e1ff09, 0x22f8e1d0, 0xe70efae5, 0x13faf02e, 0x271e15ba, 0x03df0007, 0x11ff2627, +0xb8e9173f, 0x38ecdfec, 0xc4ed0f3b, 0xe4d91402, 0xd5010c29, 0x050400d3, 0x1e01ba26, 0xe3390b60, +0xe11d0a0c, 0x2adaaefe, 0x1222e906, 0x0ff6e7ce, 0xebeb3cc4, 0xfd082b31, 0xf52a1e52, 0xf1dde7b4, +0x0ee8e6c1, 0x0c2ae352, 0x0df3cbca, 0x131bebf2, 0x23214bf9, 0xd6f5ad1c, 0x21fff8d6, 0xe3e00a48, +0xf00119d8, 0x03d02ca7, 0xf1fcc92c, 0x0c0b1b1c, 0xf4daccb1, 0x131ac50f, 0xd6295250, 0xe4f6f3e2, +0xe9f91221, 0xe6e0be49, 0xdcebb5c3, 0x1f1bf8f3, 0x27f6b2e3, 0x1a1c0e45, 0x0504d224, 0x0918e20f, +0xe4dabb4f, 0x0a001d27, 0xec193b42, 0x08e9d1c2, 0x0c09e51e, 0xff28d700, 0x0d0ae5cf, 0x0704202c, +0xfce0d408, 0x0c0b341e, 0x27ee00ea, 0x1206c7d1, 0x1000e9d8, 0xf8000830, 0xe334f5e1, 0x0bc81ef4, +0xeed33b10, 0x280050fb, 0x02d1d928, 0x0e3be608, 0xdc130412, 0xf6ffceea, 0x03142a28, 0xfeea2aec, +0xfdc4d613, 0xf1151aed, 0x1425c4ee, 0xfdd0db04, 0x10df1807, 0x0af7cd07, 0x20c108e2, 0xf61bce17, +0xe6e6f10e, 0x03d0da0e, 0x20edf808, 0x37dc60eb, 0x1bfd0e04, 0x18b73f24, 0xe8f91021, 0x0ed31ade, +0x1fe50afc, 0x07e020f3, 0x0c2ccb07, 0xedd91405, 0xf700e202, 0xdce903d9, 0xf4b31c12, 0xfcbbd425, +0x08d431e2, 0x1f00b905, 0xd04158d9, 0xd2acabe8, 0x18e911d3, 0xedca3c12, 0xe467bb0f, 0xd9c350c2, +0x00c12816, 0x082220e9, 0xfe692bfa, 0xfc322cc0, 0x0d1ae5f5, 0x1de446f2, 0xe136b80d, 0xf2001af2, +0x1be3bdd8, 0x013e29f4, 0x272301ea, 0x0a021f04, 0x22d1b5da, 0xedafecfa, 0xf958d0d8, 0xb1f48ad1, +0xf816d01b, 0xe7caf2ee, 0xf7e11ef1, 0x0ae31df7, 0x0feb180b, 0xece61513, 0x3f10670e, 0x0baa1c17, +0xf233e6d2, 0xce46a7f5, 0xe6c642e2, 0x033225ee, 0x0b3de20a, 0x00f7d814, 0xf8cccf20, 0xe2ee0bf4, +0xd93601ea, 0xefdf3a0e, 0x2202fb07, 0xe5c70c25, 0x01da29ee, 0xf8182101, 0xdef7b610, 0xeb0aed1e, +0x0017d8e2, 0x2fa4a9ef, 0x0c25cd35, 0x05f62304, 0x08e7e01f, 0xe11409f2, 0xf5e81ded, 0xeefeeb10, +0xfe122b25, 0xe9153f16, 0xe34f44ed, 0x1cca0c27, 0xf3dbcb0e, 0x08c231fc, 0xe2cfea00, 0xf031f5f7, +0xc7e91809, 0xdfe5ef10, 0x1234fa0e, 0xee28ea0c, 0xc6061700, 0xccb8eede, 0xed190b20, 0x21441510, +0xb1e007e5, 0xe1c7d9f9, 0xcacbf611, 0x3acb0f0c, 0xd7e4110d, 0x41c2010c, 0xef0418ea, 0xffc917dc, +0xc7e4270f, 0x40e3eff5, 0xaf4c19f6, 0x413f28db, 0x2e12e616, 0xd1e6fbeb, 0x1008f80f, 0x070719e0, +0xbdebdfde, 0x16f31b12, 0x2e1c12e6, 0x41eafaf4, 0xccc7e6ef, 0x26ff0bef, 0xc201fed9, 0xe733ead8, +0x373cf10a, 0xfdd5f213, 0xe1dcdcfc, 0xa9400904, 0xe432d018, 0x15340c0a, 0xcd3aedf4, 0x24210cef, +0x02d90407, 0x43c827ff, 0x27341c11, 0x1226fef4, 0x192cebfe, 0x280cf204, 0x96ff00e4, 0xb5dd4204, +0x1a2adc52, 0x1bf00ec8, 0x1d07f320, 0x09ed0a15, 0xb5e3200a, 0x12f7de1f, 0xe915eaee, 0x3bf11219, +0x3df1ec19, 0xe3ecec13, 0x1ce6f543, 0x0d18f4ef, 0x21ea1a13, 0xc8f507ce, 0x22e511be, 0x0b1cfaf3, +0xcfe8e3f0, 0xc104f6dc, 0x301817f0, 0xb825084d, 0x3fe920c2, 0xeff3171a, 0xc7e01809, 0x2efc10d3, +0xb602f92b, 0xdecb215c, 0x0d13053c, 0x3908e5d1, 0xb5efefc7, 0x44e0dcb9, 0xe8161def, 0x1de8f040, +0x2f140b3c, 0xc5ec07ec, 0xd403ed25, 0x0aeefce9, 0xd412e23b, 0xf4f804e0, 0xf218e5c1, 0xca17e612, +0xc5050ed3, 0x1afc142b, 0x2e2c0dab, 0x39ecfb13, 0x1de6100e, 0xf81ef4ba, 0xf600211d, 0x12c03968, +0xe8f90f2e, 0xfbe42c44, 0x260bfee3, 0x051b22be, 0xe50842df, 0xfef6d632, 0x130514d3, 0xe6def24a, +0x09213107, 0xdfddfa05, 0x0418d310, 0xf00739d1, 0x0afa1ed3, 0x1bfff4d7, 0xfddc2b4c, 0xf1e0c9b8, +0x04e1d4f6, 0xd423acb5, 0x320c5b1b, 0x160eefcb, 0xe11347ec, 0xedfc16d4, 0x10f8c7e0, 0x220e4ae6, +0xf0f5c834, 0x272002f8, 0xdf0df9cb, 0xe02ff8a9, 0xd7df5106, 0x152512b2, 0x02fe2bd6, 0x1707112f, +0x2519b2bf, 0x051e2eba, 0x0bdbcefd, 0xf1eae8c2, 0x08dee007, 0x02142b3c, 0x001628ef, 0xe21fb9f6, +0xe0e9f7c1, 0x31ed593c, 0xe4ff442a, 0x16e1c247, 0xe6e3be0b, 0xdbfc0324, 0x001110c7, 0xda2affe8, +0x05b6d302, 0xf94a2023, 0xe5350dde, 0x1ee0f60d, 0x282a00f8, 0x28ba50ff, 0x08e5211f, 0xf1f8190d, +0xd5abad20, 0x16fbc22c, 0xf8cc1fdd, 0xda1efe0d, 0xeb0ec3f5, 0x014c26e7, 0xf0e118dc, 0x1d11bb08, +0xe4bc44e8, 0xd4d0541d, 0xe43a44f8, 0x28445112, 0xdae0fde5, 0x13e3c6f8, 0xe11b09f4, 0x2ad2520d, +0xef59eafb, 0x1dcaf530, 0xde4d06f2, 0xf617e325, 0xf3c5e512, 0xf4b1cc13, 0xf91d2128, 0xd8affff4, +0xe54d43d8, 0x1a060fdc, 0xe7c3be22, 0x2441b415, 0xf3171a19, 0x180ff011, 0x30e4a919, 0xfaed2ff4, +0xd54253ec, 0xe7df0e1a, 0x232afa08, 0xe9f7effe, 0x1cb5f31f, 0xf4083422, 0xdfd4b620, 0x2223fc00, +0xddcf06fb, 0x6cc004f8, 0x041c4418, 0x4b04230d, 0xc6f92225, 0xf61aee22, 0xba001d0d, 0x06c3e2d9, +0xd5c2dd15, 0x240ffde9, 0x405a0319, 0xe3a01731, 0xde3c0b37, 0x2206faeb, 0x27fcfb22, 0x33af00dc, +0x3ba60a29, 0x2cc913cd, 0x4ef505f1, 0xccbbda1c, 0x203df4e2, 0xe407f815, 0x1a15f321, 0x18d30eed, +0x2d1f10fa, 0x3c47fb09, 0x3cf9eb1e, 0x4cf114e0, 0x0caadde6, 0x594ee5d2, 0x1ed6d026, 0x2229f602, +0x18f4faff, 0xddf5f0e4, 0xaf07fae3, 0xdc0fd8df, 0x14c3fce7, 0xf2d2edea, 0xb106e6fb, 0xdb0ada22, +0xc6bdfce1, 0xcdf111e4, 0x1dcf0ae7, 0x27c4f6f7, 0xe5e5ffeb, 0x20380d0c, 0x4b3e070f, 0x322300e9, +0xede80a0f, 0x65f7ebe0, 0xcbddc306, 0x572b0d53, 0xb0082f2f, 0x5d0729e0, 0xbf0f3537, 0x18c2199a, +0x57e3110c, 0x4512d23b, 0x18f01e17, 0xf9f3f11a, 0xc6f1df37, 0xeae1ef47, 0x0df111c9, 0x19fce6d4, +0xd3f90fd2, 0x08f70520, 0x15f4e0cc, 0xefff12d8, 0xaee6ea0f, 0xc1db2afd, 0x1cdaeab3, 0xbe0bf433, +0xe6e01b47, 0x5503f125, 0x30fbd422, 0x3723f7b4, 0xcb1510c3, 0x09fdf4d5, 0xeeee1e39, 0x0ae7ebc0, +0x02d81d00, 0xbc33db5a, 0xc501e429, 0x12e0edb8, 0x03f1eac8, 0xf0eb25c4, 0x09e4e7bd, 0xd71de0f6, +0xc8ee0017, 0xdf00f0d9, 0x4209f8e2, 0x3100e6d8, 0xe2190942, 0xd5070921, 0x0b0c02e3, 0xee00e4c7, +0xf5eaceef, 0x2011f7e9, 0xdf1106c7, 0xfede29fa, 0x1c1f0d0a, 0x1f0d08e6, 0x0d2ccc54, 0xf6e61df3, +0x121f1647, 0x1610c3c8, 0xded7b6af, 0x1ef8f61f, 0xf9172ef0, 0x391f60f7, 0xf3ebcced, 0x273050a9, +0x1305ebd3, 0x16221206, 0x12e5c6f4, 0x0006d822, 0xecfa152f, 0xf9f92f2e, 0x1fe2470b, 0x2425fc4e, +0x33285cb1, 0x070430d3, 0xe421bd48, 0xede1c5b9, 0xf4ea1c12, 0xe1c809a1, 0xfa05d223, 0xedf83a2f, +0xc4259d03, 0x1f180810, 0xdb10fee8, 0x11daeab2, 0xec2614fe, 0xb31e74ba, 0x14143b14, 0x07ff2fd7, +0xfb23d305, 0x25fffcda, 0xe7dbbefe, 0x13e43abc, 0x070c301c, 0xff0726d1, 0x16dc3eb3, 0x04ee2dc6, +0xdeff05d7, 0xf8dfd0fa, 0xde13fb15, 0x0b1acebe, 0xe2f1f6e6, 0xee1d3a0b, 0x3003572b, 0xf9d32fab, +0x0420ddb8, 0xcef05919, 0xd126a9b2, 0xdac9fda1, 0xe0ee083a, 0x30e259ba, 0xecf1ed19, 0xd0da58fe, +0x071f2e46, 0xe2da4602, 0xf3cecba5, 0xd8e20045, 0x18d6ef53, 0x11dbe9b3, 0x1819c00e, 0x09f930e0, +0xf2183640, 0x250bfd1e, 0xcae3a2bb, 0x17d13fa8, 0xefe6c8bf, 0x1ff8f620, 0xfaee22c7, 0x0afdce25, +0xd9010029, 0x1727c2ff, 0xf2221bf9, 0xd8e10147, 0x0726224d, 0xe0ea4811, 0x1a2e0ea9, 0x0d3635a3, +0xf0f1e7e8, 0x0c0234d9, 0x0ef8c920, 0xecf4151d, 0xe817c112, 0x0e0637dd, 0xddf305cb, 0x16e2ef0b, +0xf1c10000, 0xfd2ce717, 0x092ada04, 0xb929e202, 0x2902e1ff, 0xcecaff25, 0xd23c09f2, 0xee2107eb, +0xd9c0e908, 0xd3bc0018, 0xb3bc051d, 0x29ab261b, 0x0b0bff2c, 0xdf5ae41c, 0xe6ef07cf, 0x2ea10fea, +0x1db5fac8, 0x083a0cde, 0x4ff5e1ee, 0x4643281c, 0x08dee1e6, 0x1a0e1ffa, 0x2a30f11b, 0x0b4a02f8, +0xe1f5e321, 0xf5eaf71e, 0x21e3e312, 0xccfffaf6, 0x3932f5d8, 0xe3efeff5, 0x314df518, 0xbdc709db, +0x1336e5ef, 0xeb2bec0d, 0xc4a6ec02, 0xe3b2eccf, 0x33210b27, 0x1a2b0a08, 0xb536f304, 0x51f7def2, +0xa946d6e1, 0x0f1fd2e2, 0xd5cee6f8, 0xe60303f5, 0xdc25f225, 0xab360303, 0xd9aa2c0f, 0x30f9ffd2, +0x611ff8e0, 0xc6fa3909, 0x33241323, 0x023ff505, 0xc3f827e8, 0x1601ebdf, 0x35d91228, 0x0cf70d01, +0xbc271ce1, 0xbae8e400, 0xed09e310, 0x13ec16e2, 0xbffb1513, 0x3452e724, 0xff010cd7, 0x53ddd9d8, +0x18da2cfc, 0x3b28f102, 0x1ae1ed00, 0x051c0ff7, 0xe16b23f4, 0xfb4f0844, 0x091fdcd8, 0xbea1e109, +0xbcdc1a36, 0xd908e5fc, 0xd7f301e1, 0xbd1d02e5, 0x2319e5f4, 0xed0cfbf0, 0xed46eae5, 0x3442ebe2, +0x0323f4e6, 0xd62a25fb, 0xbec7fd03, 0x3841e6ee, 0xd3cc1018, 0x4d06faf4, 0x31422521, 0x15b1f8e7, +0x354b12d9, 0xe3ca0dde, 0x1fd30cf1, 0x25ddf705, 0xf5e8fdfb, 0x0a121df0, 0x5bc81e17, 0xd8e8cdef, +0x000000f1, 0xdfec4a13, 0x0d1e1cba, 0x0ff918d1, 0x00de274a, 0x07242105, 0xe5030cd4, 0xe0f40734, +0xee02ead7, 0x15dc3d4d, 0x0de3cc46, 0xe817f1ee, 0xfbe3d40b, 0x0d09cbe2, 0xd22256b6, 0x1904bf2d, +0xea17ee10, 0xe019f842, 0x15ebc33d, 0x39ef6217, 0xe6f8f1df, 0xf1001ad8, 0x1cf90dde, 0x19e40fbc, +0xe9e6ef0e, 0x0103d72a, 0xeffe3929, 0xf7d83151, 0x11273901, 0x28fdb0dc, 0x07f22f36, 0xddddb505, +0xe0e3f8ba, 0xf3dc354d, 0xe613f1eb, 0x09f4e2e3, 0xe70df1cc, 0x28d950b1, 0x001128e9, 0xfe312658, +0xf624cdb5, 0xee1217eb, 0x1ac04268, 0xd414ab15, 0x0d191b0f, 0x0e021b26, 0xe10cba1b, 0xfc09d4cf, +0x1b2b0c53, 0x0be8343f, 0x04d92c01, 0x01f4d733, 0x0d01cad8, 0x16f2121b, 0xddebfbc4, 0xdff2fa37, +0x1dea0bee, 0x1b0cf4cd, 0x2ff7a9cf, 0x13da15fd, 0x35fb5c2d, 0x0b0fcd36, 0x0e19ca40, 0xef1e380b, +0x0303d5db, 0x02fdda24, 0xe30845e0, 0x14fc1424, 0xeef115ca, 0x04e5d40e, 0xde2bfaad, 0x2ddaaaff, +0xf2e91a3e, 0xd51e530b, 0xdde405f3, 0xd908b11f, 0x0fe0c807, 0xecf0c318, 0x20064723, 0xf814d03c, +0xe9081120, 0xe0f808cf, 0xdbf4b235, 0xfdf225e6, 0x10da19fd, 0x170fef19, 0xedc53a64, 0xea133e16, +0x1725effd, 0xe4fbbcdc, 0x0208dadf, 0x1ff50933, 0xf706d0d2, 0x0901cfd6, 0x130515d2, 0x1e1e0909, +0xe01247e9, 0xbe3f0000, 0x35dbe517, 0xdfcd0d03, 0xff29f9f5, 0xb0c0d900, 0x30eed8e7, 0xdabff816, +0xaa4203e7, 0xd9f62f19, 0x5453ff1d, 0xdbd32bd6, 0xec07fd06, 0xeedd14df, 0x462debfc, 0x173e1d04, +0xe423efea, 0x4f6cf505, 0xd701da45, 0xb13602d9, 0xa2fd28f3, 0xeec7c9dc, 0xfae21610, 0xd4c9de0a, +0xd5db04f0, 0x1503fd03, 0x0360eddb, 0x2abf2639, 0x34fdfde7, 0x462bf5dc, 0x3c1f1e04, 0x1d04ec09, +0xbdd20cdd, 0x1c561a06, 0xfb1d0c2e, 0x19b824f6, 0xd1f4f120, 0xbe23061b, 0x1dcb1bfb, 0x22f10cf4, +0xc5f8fa18, 0x5227ec20, 0x33d1d501, 0x03caf6f8, 0xd3fc260d, 0xb9150523, 0x5811e114, 0x211bd0e8, +0xcd1d08f2, 0x44c2f50b, 0xf3d6e417, 0x0535e5ff, 0xfbccddf2, 0xc102def4, 0xf5d01825, 0xfb27e207, +0xeff62300, 0x3a1417e1, 0x17b6efec, 0xddd9ef23, 0x2ddefb02, 0x0a2bfbfb, 0xfb561e03, 0x2ceedd2e, +0x17f50416, 0xc4f3efe3, 0xb9e2ece5, 0xe3e71f0b, 0x47e5f4f1, 0xebdbe1f3, 0xe4e514fc, 0xfc280c0d, +0xfdbb2501, 0x0508251c, 0x0d0add1f, 0xcb201b1e, 0x2e480df9, 0xf3f2061f, 0xc7181b19, 0xe42310f0, +0x32b3f4fc, 0xe5c70b26, 0x1ceef3ee, 0x3def0d16, 0x2309ec18, 0x3544fb1e, 0x5050f3e5, 0x000d29d9, +0xef5b271a, 0x57b0ea33, 0xecc6d0d7, 0xd619ecee, 0xc60101f2, 0x3954efd9, 0xf2db11d4, 0xf7b31afc, +0x433d20da, 0x0000e515, 0x06f5d234, 0xdef0b6c8, 0xed1dc4f4, 0xe8fef126, 0xe215bb3d, 0x14fcedd5, +0x0deb1aed, 0xe528f2b0, 0xe0e84840, 0xdd1ab542, 0xe91ec10b, 0xe11ff648, 0xbf0968e0, 0x0ddccab5, +0x0b1ae30e, 0xe6020ed7, 0x07f42f33, 0xf4e91cef, 0xfbe9d3c0, 0x24e4fb44, 0x12fa162f, 0xe9063f21, +0x01f6d931, 0x22f806df, 0x1d04f423, 0xdffc4923, 0xe4eff3c8, 0x190af11e, 0x18f4111c, 0x170311da, +0x16f73e20, 0xdbcb04a2, 0x0dfc1bdc, 0xedf43a1d, 0x10cfc8a6, 0xfb402d68, 0xf2273500, 0x21fc4a24, +0xfae2d345, 0xe7001028, 0xeaf1ed36, 0x00f329e6, 0x0d1234c6, 0xdf27f8ff, 0xecf8eb20, 0x09f432e5, +0x0bfacdde, 0xeffbe9de, 0x14e73c40, 0x2007f821, 0xe005b9dc, 0xeafe3eda, 0x0701d0d7, 0x29015027, +0xe9fdee24, 0xe31ff408, 0x24244db4, 0x03f5dcce, 0xf3151c3c, 0xf5da1e01, 0xe01b0843, 0x02db2b4c, +0xdcf34c35, 0x07f620e1, 0xf40e1b19, 0x0cffcc27, 0xf9112ec8, 0x3c0e9bca, 0x1615123e, 0xf7ddcf04, +0xfe0326da, 0x2a26524d, 0x09031fd4, 0xe6dc0dfd, 0xfbf32ecb, 0x18121115, 0x231d050a, 0x011a2abe, +0xfc0bdc34, 0x0a0632d1, 0xe3dabbb2, 0xeee2c60a, 0x11eae9ee, 0x031ad6bd, 0xf6131e3a, 0x0d22cbb6, +0x13103c18, 0xf5161c3e, 0xf01ae8f2, 0xf306e42d, 0xed04c623, 0xf1211a08, 0xdbf34d34, 0xe9e6eff2, +0xd90db1cb, 0x0aedcf3b, 0x3f110000, 0x2dffe818, 0x20fbfbda, 0x08fc07dd, 0xd6182025, 0x9d27fff0, +0xb5e63c01, 0x295323f2, 0x06d401d5, 0xa0ee22fd, 0x15ec3816, 0xba24ed14, 0xe13be1fb, 0x39360aed, +0xb60f10f3, 0x15e2dee7, 0x174aedf6, 0x1146ee22, 0xee16171e, 0xed1d1512, 0xd7fdec0b, 0x110200db, +0xfb5116db, 0xf50923d8, 0xd7bae3e1, 0xc960021e, 0x14400e38, 0x33d01419, 0xc737f407, 0xdc6011f0, +0xebfd05c8, 0x120ced25, 0x0845e9e4, 0xfaf620e3, 0x394923e1, 0x5217efde, 0xc1c8d6ef, 0x030fe810, +0xf418db19, 0x0ff3e510, 0x0ec7e71c, 0xfbaae5ef, 0x27c823d2, 0xc3c6ff0f, 0x0ed0ecef, 0xbbd11b07, +0xb8411cf8, 0x42e6e1e7, 0xafcee50e, 0x29bdd8f7, 0x4cf6ff1b, 0xefe2dc1e, 0xc518e9f5, 0xc313ec10, +0x0ccfea14, 0xba27e309, 0x0c9ae201, 0x19d31bc3, 0x4aec0e06, 0xfa0e23ec, 0xeac5211b, 0xe9281313, +0xdd711101, 0xed41fab7, 0xbb2f14e7, 0xd6a1e4fa, 0xb6b3fec9, 0xd0b32324, 0xcbdbf8db, 0x4fb60cfc, +0x3503d9df, 0x06c3f225, 0xd2c7de15, 0xbefff9ef, 0x0aec1ada, 0xbe401eec, 0xc92fe519, 0xb6bf0ff9, +0xddbcde1a, 0x2047fb1b, 0xcbbaf91f, 0xa7fdf3e2, 0x30eed025, 0x435b07e9, 0x2efc1b34, 0x0ac70723, +0xbefce311, 0x4ca719dd, 0x1d04db31, 0xead20a24, 0x2a5b12fa, 0xc613ffce, 0xb52c12ea, 0x03bd23fc, +0xc9b9dc1b, 0xd0e40e1f, 0x000007f4, 0x0cde354a, 0xd2dcaafc, 0x21d908fe, 0x1bf5f3ce, 0xe40d0d1a, +0xcd06a42f, 0x0fe7180f, 0xda0c4e35, 0xfe28db00, 0x13efc5e9, 0x08032024, 0xff35275d, 0x22eeb639, +0xeb2bc3ad, 0xe9ec3e14, 0x2523fd06, 0x06f3d1cc, 0xdb2903b0, 0x0fdfc8f9, 0x18e50ff4, 0x0efbcb2e, +0x11fae8d3, 0x33e4a545, 0xe22af6ae, 0x1f10ba38, 0xe30bf633, 0x0c06e322, 0x0eeb1b3e, 0x09f1cf18, +0x10ef1939, 0xe9f21036, 0xee17e9c2, 0x1aec0f13, 0xeff4ea1c, 0x16dbedb4, 0x03eb253d, 0x1400c5d9, +0xfd00db28, 0xdcda03b2, 0xcdff5a28, 0x0bd6ceae, 0x24f8fbd0, 0xfdecd5c4, 0xdfe4faf3, 0x0cedccec, +0x0807e030, 0xf6213208, 0xebdfc208, 0xf312cbea, 0x1d21ba49, 0x03f02517, 0xda0e4ee6, 0x14ed3dea, +0x090ae132, 0xfdefd5c7, 0xe019f9f2, 0xf4121dc7, 0xe7febfda, 0x27ee0116, 0x18fbbf23, 0xff04d625, +0x252d4eab, 0x271d000c, 0xf8ed3116, 0x2009f831, 0x1b17bd3f, 0x201209c6, 0x2af95220, 0xee0816d0, +0xd6e352bc, 0x240f04e6, 0xf21d19f6, 0xf41b1cf3, 0x171b3ff4, 0x0c26cd4e, 0xfe05d6d4, 0x021dd7f5, +0x22cf4a59, 0x14efec39, 0x1c0abbce, 0x12d3c655, 0xe8fb4023, 0x07e82fc1, 0xdae6b30e, 0x1d0af5e1, +0x27f0ffc8, 0x01ed29eb, 0xe625be02, 0xdfe2490b, 0xf11c1945, 0xca21a1f9, 0xe91810c0, 0x20190842, +0xf1fec929, 0xe2e9b9ef, 0xe814c0c4, 0x6d0c0000, 0x14d0451b, 0x11aeebf8, 0x393d16d6, 0xa9dbeeec, +0xdbf7d103, 0xa45e0320, 0x1ab1cbc9, 0x0b25f2d9, 0xbf111e02, 0x2b2e1818, 0xb2000305, 0x1608dbd8, +0x210e1220, 0xfdf1fa1b, 0x2d9e2519, 0x01d0fcc7, 0xd5b8d9f8, 0x08d603df, 0xce25e0fe, 0xea000a03, +0x234b12d9, 0xe72ffa23, 0xedf00efa, 0x361614e9, 0x2c3a0e13, 0xe114fd11, 0x2a3a0915, 0xbfe3fdef, +0xd95a180b, 0xbd20fece, 0xbd391c07, 0x610de4ee, 0xbb0d38e4, 0xee08e4e5, 0x10fe1720, 0x2f0fe8d9, +0xc92af919, 0xdf24f001, 0x64f0f9fc, 0x1551c317, 0xccf61229, 0xbd39f41e, 0xe9ece511, 0xf9f21214, +0x1dc5e01a, 0x3ac00aec, 0xbf1012e8, 0x2f00e8e8, 0xdffc07d9, 0x1477f9dc, 0x0c301450, 0xfb0d1cf9, +0xd92ddd1b, 0x43df0006, 0xcc541cf9, 0x0de40d2d, 0x043c1b0b, 0x48ec24eb, 0xcc27e0eb, 0x2ea1f401, +0x02e00536, 0xec2c25f7, 0x380dec04, 0xe9faf01c, 0xb01b10de, 0x41f527f3, 0x31a6191c, 0xdfeef6ce, +0x4632f916, 0x2a2c1ef6, 0xff17fefb, 0x3fc2d9ef, 0xc3e717eb, 0xe70915f2, 0xc7110fe1, 0xe9caf0e9, +0x3a26eff2, 0x44361301, 0x40f11b0e, 0xedc81818, 0x09d8ebf1, 0x2013e2ff, 0x35ccf8eb, 0xaa2c0ef4, +0xb033d2fd, 0x03dd280b, 0xd0d926fa, 0x4203f7ff, 0xcff31a25, 0xe8cef7e5, 0x403ef00a, 0x0bd8e817, +0x30251d00, 0xaa10f8fd, 0x3ea7d218, 0xa708e9ce, 0xdde231e0, 0xc3e5040a, 0xeda7140d, 0xb51715cf, +0xd2dc22f0, 0xedb70603, 0xfc19ecdf, 0xb2e2ddf1, 0x1e06d90b, 0x28ee0a21, 0xb3c90117, 0x21212510, +0x31b8f8f8, 0xeae0f8df, 0x48bbeef7, 0xd20e20e2, 0xd029f9e6, 0xdd01f9ff, 0x0726fa27, 0x3a0edf01, +0x160ced1a, 0x1cb412e3, 0xd24c0b23, 0x01b50624, 0xe1e526dd, 0x321ef7f3, 0x200e0af5, 0x362bf819, +0x04130efd, 0x1af72315, 0xc7f3f31f, 0x2ad8f0e4, 0x47f1fe00, 0xa9411fe6, 0x0be92ee7, 0x1f2be4ef, +0x14c30804, 0x5c1214ea, 0xf1cd34ea, 0x5535e7f5, 0x3410d30e, 0xfa2e0c18, 0x4218defa, 0xbcbd19f0, +0xe6fd1c1c, 0xf5fe0eda, 0xf5e0e426, 0xb1041d08, 0xbf06da24, 0xc0d41823, 0xcfaae8fc, 0x25b0f82e, +0xd9d5fc29, 0xc8ccff02, 0xf04cf00b, 0x32d0e725, 0xda090af9, 0x5604ff1f, 0x2fef2edd, 0xdce2f818, +0x1fd30409, 0x4c300afb, 0xe018dcf8, 0xb54308f1, 0x281fdde5, 0xc202fff8, 0x3ca11525, 0xc241ecc9, +0xc06d15e7, 0xc11ce8bb, 0xf51a180c, 0xb43b1cf2, 0xcd2b2413, 0xefd3f4fc, 0x3e30e8fb, 0x43df1708, +0xd44ae4fa, 0xe912fd22, 0xeb16eee9, 0xe1aa12ee, 0xe2be0a2e, 0x24f90a19, 0x02b1fbdf, 0x4f33d9d9, +0x1fe4280c, 0x0336f60c, 0x09bc250e, 0x2b36e11d, 0xf2fffd0e, 0xfd33e727, 0xd2ecdb0c, 0xebdc0614, +0x16ec13fb, 0x2427ee15, 0x0a5d03ff, 0x2f0a1e36, 0x08e20000, 0xe0eaf813, 0xfe1c2bf5, 0x300c57cc, +0x13e8c510, 0xe2e50a43, 0x0cdd35fa, 0x040f2c37, 0x0001d828, 0x4404932d, 0xdaddfe4c, 0x012d29ab, +0xee1ec6ba, 0x1b0ef236, 0x16f6121e, 0xd4faab2d, 0xe9e5eef3, 0xe80d4035, 0xe5f642ce, 0xd8010028, +0x141d3c0c, 0xe7110fe9, 0x14eac5ee, 0xed1c3af3, 0xd616523f, 0xdef7facf, 0xf2e01b47, 0x2211fa16, +0x290cb033, 0x29e05007, 0x300d58e5, 0xf82b30ad, 0xf01c370d, 0xd4ebadc4, 0x080c1fe5, 0x1324eb4c, +0xec13c5eb, 0x08fbcfdc, 0xe8ff4029, 0x08e920ee, 0x02fddb2b, 0xf20ce6cd, 0xe6184140, 0xfd1624c2, +0x27f0b0e8, 0x1b15423d, 0x151c3d0b, 0x21e0f9f7, 0x16e1c148, 0x11161812, 0x0b0e3435, 0x07fb20dd, +0xe30045d7, 0xebecc33c, 0xe10b471d, 0x1ceb0cc3, 0xf020e809, 0xf412e53a, 0xe905c124, 0x2eef56c7, +0x10dbc804, 0x13181541, 0x0913cfc5, 0x0be3cef4, 0x34ed5dc5, 0xff10da37, 0xd827ff4f, 0x11d81701, +0x13e81540, 0xcddd5a04, 0x090ce233, 0x22db49fd, 0x3d09651f, 0xf5edcc3b, 0x25224c06, 0xf7c8e15f, +0x190dc0e4, 0xf81fe009, 0x08272fb1, 0xec11c417, 0xefe7e9f2, 0x13e1eab9, 0xe6fdf325, 0xf1f01918, +0x0c27cb01, 0x0e0d36e6, 0x1a0bbf1c, 0x1122c649, 0x0020d9b8, 0x2120f9f9, 0xd50f531a, 0xdbeeb416, +0xf0fdc9d5, 0x1ee20bf6, 0x24ebfcec, 0xebf1c31a, 0x00003030, 0xd1570709, 0x5a3707d1, 0x482033f1, +0xfb262008, 0xb8fddcfd, 0x33301fdb, 0x39fff4f8, 0xf9ac11d8, 0x0115e0d4, 0x0401d814, 0xda3323d8, +0xc72803f5, 0x0bba1100, 0x48e11de2, 0xe81f1f09, 0xfe3af00a, 0xd105da12, 0xacc1fa23, 0x1bc92d16, +0x05f90cf1, 0x49f52421, 0x35e6211d, 0xe52f0df3, 0xdf50f3f9, 0xf6c3f9d8, 0xf3df1e15, 0xc45e1bf8, +0xf9c6ebcb, 0x07ec2111, 0xace8dfed, 0xc606d311, 0x3f161223, 0x3e071712, 0x5e3ae9de, 0xdef5c912, +0x34fcfae2, 0xd0e9f525, 0x0431f9ee, 0xc2bdddf6, 0x0aee161b, 0x0827e217, 0xdf322001, 0xcfbd06f5, +0xe0daf71c, 0xde3bf802, 0xe11c0613, 0x013ff7f3, 0x1df1d917, 0x46ecf419, 0x40d41e15, 0xd22618fb, +0xa1360702, 0x1d25c8f3, 0xe0310a04, 0x0939f8f7, 0xe8a51e11, 0x1fbe10cd, 0x4126091b, 0x3c2ee6fe, +0xdae21406, 0x2624fff6, 0x37380205, 0xb4db0ff1, 0xfddd2504, 0xe51eda05, 0x09c1f30a, 0x15f420e9, +0xb138ed1b, 0x26142811, 0xc41e0315, 0xba1eedf7, 0xe3ce1e0a, 0x9cef0b0a, 0xfbe2c4e9, 0x370f23f6, +0xc4f9f019, 0xdb5fece0, 0x140f03c8, 0x1ec115e6, 0xbecd0be8, 0xd1cce60b, 0xc3b007f4, 0xe9ca1628, +0x1adbf00e, 0xbdbc0efc, 0xc930e51d, 0xb42cf2f9, 0xc2a723fc, 0x35fa17cf, 0x539b0edd, 0xfaffd63d, +0xe4b62228, 0xe3fc0d22, 0x4ab40a24, 0x3a0cdd24, 0x13bc121c, 0x15e30000, 0xfcee2c3a, 0xf7f2e1e7, +0x1528c2b0, 0xe51c0df4, 0xdc03fbdc, 0xffe12af8, 0x1c294451, 0xfc18db10, 0x1f0048d8, 0xdc06032f, +0x0bdee2fa, 0x04162cef, 0x09e7d0c0, 0x0c24e34b, 0xbddc6bb4, 0x09f72032, 0xe11d4746, 0x0bf2e4e6, +0x2122fab5, 0xd60653d3, 0x30dda84a, 0xfded2b3a, 0x1de80b10, 0x08ead13f, 0xd3055522, 0x2610fe37, +0x34fc5cd4, 0x1fecf614, 0x0cf41ce4, 0x16f7ed1f, 0xe6150e12, 0x0c00e427, 0x11ee3917, 0x0eee363a, +0xe3de0cfa, 0x24054c23, 0x2efb5623, 0x27d00058, 0xe71441eb, 0x231b4bbc, 0xf3141c3d, 0xb9f66f32, +0xd3ecab3c, 0xeb04122d, 0x1a1ebef7, 0x0c0fcce6, 0xeae81240, 0x14ec3c3c, 0x41ea9711, 0xfeded64a, +0x00ccd95c, 0x22fef926, 0xec063b2d, 0xeae93f3f, 0x1ffff827, 0x25264cb3, 0x180a101e, 0xdcfc0523, +0xf1dbe7b2, 0xfbe424f4, 0xe9053ed3, 0xdafc4ddc, 0xea23c2b4, 0xf2fe1a26, 0x252403fd, 0xfd0e2537, +0xd01b59f3, 0x101be80d, 0xd9dd4fb5, 0x1edf0a08, 0x27e702bf, 0xd9f400cc, 0xf914d214, 0x1debf53e, +0x1524ee05, 0x121f3a0a, 0x01dcd604, 0x3901a029, 0x1dfef629, 0x11dc1804, 0x23f00538, 0xfd1124c8, +0x32215a07, 0xf7173112, 0xdc0e4dc9, 0xe00008d8, 0x1c1dbc0b, 0x200c09cc, 0x0805e0dc, 0x14e03bb8, +0x2bf3ac36, 0x2f0aaacf, 0xeadc124c, 0xff16d8ee, 0x01f3da1a, 0x0000163b, 0xfaf213ed, 0x0a08221a, +0xcebf1f20, 0x46dd0a1a, 0x3fcd1e05, 0xe7cee8f5, 0xf23410f6, 0xedf0e50b, 0xef42ec17, 0x08fdeae6, +0x975ce0db, 0xca19bf34, 0x241b0df0, 0x27bd04f2, 0xf8f8001b, 0xccbfdfe0, 0xf607f4e6, 0xec4ce3e0, +0x17d614db, 0xdfd0effd, 0xf751fa07, 0xc7081fd8, 0x225011e0, 0x16e7fbd8, 0x2af71210, 0xef32fd1e, +0xf5e9ea0a, 0x11f2e411, 0x26cceae5, 0x4e00fff3, 0x724f2728, 0x29ea4a26, 0x1aca00ee, 0x460df30e, +0x201c1ee4, 0x46dff7f3, 0xd3d41ffa, 0x3beb04fc, 0x4401ed14, 0xd3b3e4da, 0xc03cfb25, 0x1c1de7eb, +0xcccc0bf4, 0x2ae10df5, 0x402802f7, 0x0117e901, 0xc201d9f0, 0xf7fc15d9, 0xfedc2024, 0x24c82503, +0xc1fafdef, 0xfef2e9de, 0xd4c1da1a, 0xaff104e8, 0xc12a29e6, 0xb625e8fd, 0xd7c72204, 0xb5c4ffef, +0xcd45dd15, 0x25330a1d, 0x3ff0030b, 0xa9b2e917, 0x25c12fd9, 0xc23a0218, 0xd2bfea11, 0xe3170518, +0x282a0aee, 0xda0300ff, 0xfeb6fe26, 0xebd5db22, 0x1ce6edfd, 0xe4d4f5f2, 0x16f2f404, 0x26c8ee1a, +0xe2e9feef, 0xa8fbf5ee, 0x01073123, 0xe843d920, 0x1416f0e6, 0x0b24ebed, 0x5123e204, 0x0000d7fa, +0xbd290000, 0xbef21bfe, 0x19eee7e7, 0x0000f1e9, 0x00000000, 0xfa490000, 0x17e0df22, 0x000012f7, +0x00000000, 0xbadc0000, 0x0f3fe1fd, 0x00001a17, 0x00000000, 0x31c60000, 0x09ee0000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 + +hard_output0 = +0xcddb5769, 0x627f0a91, 0xbcf446fb, 0xc930d133, 0xdd7b82f0, 0xbd591856, 0xb73094b3, 0x32436132, +0xac268fdc, 0xeeb03845, 0x0087cc79, 0xd372eb62, 0xb595a1bd, 0x511605f7, 0xa428b83f, 0xfb9380a8, +0xe43c2efb, 0x0a04017a, 0x674608a3, 0xc2464812, 0x208bc693, 0xb03d0580, 0xdc62b803, 0xc2808805, +0xccaf7f16, 0x848dacef, 0xedf69b49, 0x222d2bd9, 0x78ffa7a5, 0x749cb755, 0x9f4abc69, 0xa27f3a72, +0x9652d070, 0x8a83be54, 0xa9820b7f, 0x8b00e52a, 0xb02159e4, 0xeddabc6a, 0x47b69064, 0xf161d47f, +0xc243b0df, 0xebb2ac39, 0x4fd6cddb, 0xc0d38ba3, 0xd9ddef17, 0x8c638875, 0xa132cfef, 0x5893a4f6, +0x1a29ce5f, 0x9072f3eb, 0x486bda03, 0xf5250cda, 0xdc10edbc, 0x392e6b7f, 0x4664de06, 0xfde2f3f2, +0x37c7d442, 0x32b60d29, 0xbcb7c8ff, 0xa1542cd0, 0x91b36e18, 0x231f9e19, 0x97cbc4a6, 0x51ceb1df, +0xc02dedf8, 0x4bfd9728, 0x569deda7, 0xc0790501, 0x132e47b0, 0xb8229185, 0x81cbe103, 0xa30dbf5f, +0x72c54db6, 0x4abdbdf7, 0x557d21d3, 0x3b75be17, 0xf540476b, 0xc48d78e1, 0x767d44ec, 0x87dc6193, +0x7a4c52fc, 0x306c3548, 0xa66e51b3, 0xfc627273, 0x5f349268, 0xf5e74974, 0x232388b6, 0x01d8e49e, +0xbf29f75f, 0x378a9d02, 0x59a45656, 0x46fb25b1, 0x75219b62, 0x4f0d6f71, 0x220c6763, 0xdde47b70, +0x8c0dce8f, 0x3e3db100, 0xabad4262, 0x800eddcb, 0x32416450, 0x61d260ce, 0x6e2a0fac, 0x73cdb847, +0xeee01947, 0xe5a3a37f, 0xa710e211, 0x98ecaa36, 0x69197474, 0x6e73e13f, 0xb2100f2e, 0x7714b2fd, +0xec3d81cb, 0xc50e5194, 0x5c69a3d8, 0xce0bdc13, 0x08e7df1c, 0x5fb014a5, 0x75b5801e, 0xf57d3b75, +0xac5dd149, 0xa5096b77, 0x4b5da0af, 0x656506d3, 0x3823d675, 0x3840530c, 0x1c0980ba, 0x3bd4150f, +0x3df8c0f8, 0xa2834aa4, 0x479ea855, 0x4f4557b5, 0x15d730db, 0xe6809738, 0x0aec8f7d, 0xf5e2188e, +0xa9a0fac7, 0x785c3166, 0x049dd244, 0x72cada2a, 0x5655bab3, 0xff73ca65, 0xb3dc51f1, 0x259f555b, +0xdaa1933d, 0x0f716b8f, 0x1e29bde6, 0xbe8bf3a9, 0x908b5a60, 0x667636c0, 0xfce80b0b, 0xcf43d154, +0xfffc60f5, 0x324b1632, 0x1609e45b, 0xf8e09aed, 0x1a01f6ee, 0x013cea78, 0xdd89ba42, 0xfe5bca8f, +0x894e3aef, 0xda292f76, 0x457a93bd, 0x73a9c254, 0x7b5ca9d1, 0x947355ba, 0xb8a797c8, 0x3b5e97f4, +0x946889ec, 0xd49316a3, 0xa5383830, 0x55f63bbf, 0x47b3a4ca, 0x415bd007, 0x1227c60a, 0x3610fab0, +0xa68c75fc, 0xa1441c62, 0x68a02596, 0x6d083d07, 0xceeb9057, 0x915054bc, 0x6f2c7fa8, 0x62be6166, +0x963703a3, 0x5af6e614, 0x5bc3e4f0, 0xf517a95e, 0x408a2bfd, 0xab7fe7a8, 0x37aac030, 0x9956f2f5 + +k = +6144 + +e = +10376 + +iter_max = +8 + +iter_min = +4 + +expected_iter_count = +8 + +ext_scale = +15 + +num_maps = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_CRC_TYPE_24B, +RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN + +expected_status = +OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_posllr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_posllr.data new file mode 100644 index 0000000000..fe4f5eefd2 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_posllr.data @@ -0,0 +1,645 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_DEC + +input0 = +0x81814e1f, 0xba81fb11, 0xc4554696, 0xe17e9454, 0x427f8119, 0xa8b355f1, 0x244ba17f, 0x1c816fa1, +0xc94f5bcc, 0xb5b97fbb, 0x634b8e81, 0x815a6cc1, 0x7f6bb016, 0x2f7249d6, 0x604664f0, 0x31817f81, +0x6fa66b81, 0xd49763f6, 0x777fa4f1, 0x81aa6da8, 0xf0fea881, 0xaccfbfd0, 0x7f81e582, 0x7f58a2d6, +0xa77f430e, 0xf47f50f1, 0x997f42f2, 0xd7814f81, 0x037fe14d, 0x81f98125, 0x2d813e55, 0x7f81f0dc, +0x7f7f8181, 0xc37c723a, 0xbc7a3364, 0x8193817f, 0xe381066d, 0x7fcab836, 0x2481eea2, 0x567f5968, +0xa07d720c, 0x7fa13343, 0x7f35636d, 0x7f817f78, 0x383d2a69, 0x7f860e2a, 0xca78797f, 0x7f7fe912, +0xc95a8141, 0x770c9c4e, 0x81e2817f, 0x811b3f81, 0x745f1104, 0x13817e31, 0xb681a63a, 0x8101482a, +0xbe81818d, 0x8c8181fa, 0x2133de57, 0x8147677f, 0x8a098d7f, 0xd429f1ee, 0x284fc81f, 0x7f5c16d7, +0xded34e7f, 0x3d60812e, 0xdf817f89, 0x2f33793c, 0x2f7f9961, 0x8181221e, 0x847f59d1, 0x9281a681, +0x89503793, 0x01817ff0, 0x183a53ba, 0xc99622f6, 0xbc819881, 0xa7ea2ec8, 0x787f957f, 0x26819378, +0x1e4e4ba1, 0x8bf18138, 0x3adc2c81, 0x3a7d8187, 0x7f22ae8e, 0x307c81d7, 0x7f53a881, 0xc281819f, +0x38fd2090, 0xdd810a00, 0x74ff7fa2, 0x7fb2f27f, 0x7f9b8211, 0x55d69e44, 0x8d2cd44c, 0x5610c676, +0x7f815b81, 0xa2811e3d, 0x93135d81, 0x92797f73, 0x8a8192b3, 0xa48a7f66, 0x7f7e4a10, 0x242dfd81, +0x7fe8b481, 0x810fb0e4, 0xde390fa7, 0xbb5a7f81, 0x65ad3b19, 0xa96a96a2, 0xf681817f, 0xb6a4eba2, +0x0d81017f, 0x5369080e, 0xfbd1c781, 0x879d7f7f, 0x81818181, 0x7f1d061c, 0x8aa731fd, 0x4386a67f, +0xba445581, 0x5b81975f, 0x467f7f7a, 0xc85db95e, 0x6f587240, 0x29a07904, 0x7f7f7574, 0x815dbeb2, +0x81771181, 0x7f54e8c3, 0xc6586fd6, 0x3c6d835a, 0x86b4ed95, 0x7faa72fb, 0x7f7e7fd5, 0x154f81e3, +0x7c4881b4, 0x0c164a37, 0x7ffdbf69, 0x7f7d43f6, 0x5f47da8a, 0x3236d20f, 0x65818181, 0xa37fcf7f, +0x7f8116cb, 0xf6947f50, 0x66ab65b1, 0x6d688a6f, 0x537f6bf0, 0x5c864ddc, 0x06a98181, 0x455854c2, +0x9a6c49ad, 0x129d3c29, 0xe94c327f, 0x7d40247f, 0x9681bc7f, 0x7f288120, 0x81a43b40, 0x08d81689, +0x457f815d, 0xc27f9ae7, 0x7f819655, 0xdabf8181, 0xf4c07f81, 0x6410e8cc, 0xce4d8181, 0x19b13059, +0x8181bf99, 0xf2819620, 0x7fc37f4e, 0x7f8efe81, 0xb25a3e8b, 0x7fbbdb22, 0xba7f8181, 0x8135d42f, +0x817f6836, 0xc381a056, 0x7381547f, 0x1e407f13, 0x9b917f7f, 0x4e526d9b, 0x9323737f, 0x7a20429b, +0xac6b14a8, 0x3568e8d7, 0xbe621a97, 0x7fbca13b, 0x2dbda9dc, 0x32af4ddd, 0x6e4f978e, 0x10ed8172, +0x81e76681, 0x7f427fc4, 0x7fab7f81, 0x2c7ffd81, 0xea817f7f, 0xa62fcf2c, 0x8144bfb7, 0x7ffc93a0, +0x79e9b564, 0x6c449d46, 0x987f8481, 0xee118173, 0x867f0c0a, 0x81819347, 0xb8ddbf82, 0x5c6866b8, +0x82b48881, 0x5c817fdd, 0x7f6605e0, 0x4181bc81, 0x736b51a4, 0xcd5a7fd2, 0xf939a42b, 0xcd817faf, +0x5e1b1fa6, 0x7c818ef7, 0x070c47cc, 0x8e5981d1, 0xe661d182, 0x54deb54e, 0x7fba81f4, 0xc1712e73, +0xb6885086, 0xae9759e2, 0xb12b814e, 0xf5ae9e41, 0x16c736f6, 0xa981c3e2, 0xb06c7f29, 0x497f95b8, +0xcb3de381, 0x7f7524e3, 0xdcf88147, 0x811e81f9, 0xab7a9c7f, 0x816223d8, 0xf97fe22f, 0xe5cf814e, +0x744f6312, 0xc797e05a, 0x279b237b, 0x622b01b9, 0x37818181, 0x8174e3ab, 0xfa5a69ff, 0x62cc787f, +0x81944e7f, 0xc87f7f2f, 0x30839f54, 0x8122090f, 0xf8e98181, 0x28815f40, 0x0262424b, 0x7fc3ccd0, +0xdf7f7fe2, 0x0c264dfa, 0x5d954581, 0xfb188181, 0x6b810d33, 0x1c7fbee7, 0x8141c17f, 0x7f768155, +0xbd207f27, 0x794079d7, 0xf34bd97b, 0x7f7f5026, 0xb46c9782, 0x7f81574e, 0x81817f27, 0x75267f6d, +0x4a7fe97f, 0x7f879ee0, 0x25f8d63f, 0xd481a3c5, 0x747ffd0d, 0xb33530e2, 0x813f5881, 0xbb8181dd, +0xa2da462a, 0x817f8c0d, 0xd0f061f8, 0x117bda34, 0x1897f8b7, 0x2e477f50, 0x8181814b, 0x7faa1181, +0x6ee68168, 0x811a98e2, 0xdcb2b784, 0xa20a7fb7, 0x41445681, 0x0bffeefc, 0x02817f9d, 0x743071cf, +0x387695bd, 0x847ffb4a, 0x0a287f56, 0xf9b4d4d3, 0x2a7fa481, 0xe3eb2e9b, 0x327f91f4, 0xec3981d2, +0x6681f83c, 0xe675722e, 0x426ac913, 0x4b6154a6, 0x5c30816f, 0x817c8155, 0x277fa781, 0x8dd8a9a3, +0x48c609a0, 0x4bca47bf, 0x7f3f6d81, 0xea497fb3, 0xc181507f, 0x81bf1ffe, 0x8e818916, 0x6ba83d7f, +0xb8547f62, 0x5881670e, 0x7f6281fb, 0x6e7f9250, 0xa7bc817f, 0xb19450aa, 0x7f7f9d58, 0x20f69c1e, +0x7f45815d, 0x817f9319, 0x7a5496b0, 0xb85e8950, 0x72c9337f, 0x81781aba, 0xfecdaf28, 0xe2195ab5, +0x7fbb0ec7, 0x7f7ff8a7, 0xab818181, 0x978f2e6e, 0x7fc38121, 0x18945319, 0x264a8181, 0x93b1dc81, +0x630ed781, 0xe27f8e14, 0xc17f5b93, 0x7081fe2d, 0xbb9ac790, 0x7f81ba5c, 0x7f812f32, 0x68bd4f7f, +0x81217f81, 0x88b87f26, 0x285e7f3e, 0x29817828, 0x747f7f81, 0x159eaacd, 0x8d02b252, 0xa98881e7, +0x817f1681, 0x367fbd38, 0x8a8441e3, 0x81447f1f, 0x8165424b, 0x811676ee, 0x81a48122, 0x4b02ea7b, +0x5c267f38, 0x8195acd2, 0x7f7fb581, 0x9eae092d, 0xab12457f, 0x96f8dc31, 0xa89fd810, 0x222b7f7f, +0x1dd67f65, 0x873a81e0, 0x0e7fd97f, 0x81a83d97, 0x8106d381, 0x7f817f0c, 0x8104d4f9, 0xbb81677f, +0x01be7f39, 0x297297ab, 0xc2f01b81, 0x9dd57f81, 0x81ff692f, 0x7fc28115, 0x077f547f, 0x717fcf81, +0x3d81ed83, 0xff6f7fff, 0x7f50f95c, 0x5650a753, 0x81817f09, 0x963b7057, 0x7f817f60, 0x987fa099, +0xf6207f7e, 0x4c814e98, 0xcd27b681, 0x41bd2ebd, 0x340172b2, 0xbc151ec1, 0xf3b403d2, 0x817f6c81, +0x7f2f3218, 0x26f2ea5d, 0xcc59bd8a, 0xef857f52, 0xe37bc195, 0x7f2a2e13, 0x7381a51a, 0x31e14c60, +0xc2e23fc6, 0x8113f40c, 0x9b2d7f81, 0xf6e1147d, 0x813c7fe1, 0x9a9d7f3f, 0x7fb939ac, 0x573181ad, +0x608a317f, 0xb486b9ee, 0xe67fb10b, 0x62817f8b, 0x7f7f9775, 0x81e6819d, 0x7f6f0f61, 0x4ffd8158, +0x81ae56d2, 0xbe4aa4f7, 0x6c515581, 0x435d8326, 0x7f0e2a95, 0xc28d81e1, 0x357fa0cf, 0x2b9f7f11, +0xd491057f, 0xbc7bddd7, 0xe5b57f34, 0xfba68549, 0xb491d2e3, 0x4fb61f49, 0x81bd3e3c, 0xdd9848f3, +0x81810561, 0x67f5fbdd, 0x8c4dc25b, 0x2ab47f67, 0x68137f5e, 0xcfe53817, 0xa7679d31, 0x501213b4, +0x7f7f1390, 0xbefeccd8, 0x30fe9044, 0x7fd6812d, 0x813cf0e6, 0xccb82825, 0xfa78ec58, 0x024b90e4, +0xba25ec7f, 0xc43b50ff, 0x7f7f3e4d, 0x64c38181, 0x81ed1dba, 0xd58b7f64, 0x0b81311f, 0x03563b7f, +0x817fb491, 0x81e895c7, 0x817f7fb0, 0x1681a581, 0x7f998a50, 0x489b81a9, 0x81bc81a2, 0x3d9e7fde, +0x7c7c6381, 0x817447ec, 0x6e7fc32b, 0x7fab86c6, 0x95b44181, 0x3a7f756c, 0x81458168, 0xc4787fd3, +0x731cda81, 0x73127f03, 0xc9077fcf, 0xc37f9c2e, 0x27817f7f, 0xc4361507, 0x7f9b3581, 0x9d357f2d, +0x7f81166c, 0xb87f815f, 0xb2604f95, 0xc44b5591, 0xcfb8078b, 0x7481e64b, 0x8152a679, 0x53fa387f, +0xfa7f3f79, 0x7f5b5fe5, 0x1e625d7d, 0x1081ad93, 0x7f5019fe, 0x3d8145a7, 0x629f9918, 0xc1ab3742, +0x7f66c057, 0x9cb048dd, 0xeb6e859b, 0x8e5fb72c, 0x94d8f5a4, 0xa381280d, 0x67737de6, 0x45817f81, +0xf055c17f, 0x6a0aafff, 0xdb818cc6, 0x81fc60dc, 0x20377f4c, 0x7feac6de, 0x72e78c7f, 0xdf532124, +0x81d33356, 0x8881bcf9, 0x95817f32, 0x612eae3b, 0x7b186965, 0x50b77f63, 0x718181b3, 0x42d8b481, +0x88edaf7f, 0xa3cd25f6, 0x7fdd7f81, 0x7fb79681, 0x7f786e7f, 0x7fbb41c9, 0xd2618121, 0x1cacc6d3, +0x7fe2a0dc, 0x819e1a46, 0x563081e1, 0xb18d77b1, 0xb4817f7f, 0xa97f81fa, 0x2e81157f, 0x31e67fa4, +0x5b814281, 0x98b18124, 0x7f0a3540, 0x49d508d1, 0x2693bc71, 0x3aeb81ca, 0x817fc081, 0x6674b9e7, +0xa1217f23, 0x517f81f1, 0x7fc4ef26, 0x2914ef7f, 0xa9ff7a19, 0x7f7f0ce2, 0x1b485e45, 0x7f70af0d, +0xd6812a71, 0xc95fc63d, 0xa57f03c8, 0x9dbe7f81, 0x7c978192, 0x81a22306, 0x96447f2f, 0x7faf2728, +0xc2a494ad, 0xd5c7813a, 0xa02b7bb8, 0x3bc04eed, 0x997fa97f, 0x7768d0d0, 0x8a84817f, 0x8f1102c6, +0x7f8115be, 0xfb7f7869, 0x7ff25de8, 0x6745f276, 0x0f23b585, 0x52933552, 0x7fab5340, 0xeb4c403f, +0x7f5465ec, 0x77b0a942, 0x6b67297f, 0xc86a7133, 0x7f8f177f, 0x869e28f4, 0x7a7fb066, 0x81a3b865, +0x5d7fba81, 0x815fd7ae, 0x60817ff7, 0xa633a381, 0x45813981, 0xade1ccd7, 0x814981a6, 0xaa93770a, +0x7f83b4dd, 0xc0967f1a, 0xed7f3764, 0x53772ea8, 0x5a81f453, 0xaff56f92, 0x81067f5f, 0xf596ef1f, +0xd520de7c, 0x81b2bdc8, 0x7f8130dd, 0xfb7f8c41, 0x99816bf6, 0x695a60e3, 0x7f7f817f, 0xed987f26, +0x8f818166, 0x417fecfc, 0x99ec379b, 0xaf7e7f7f, 0x360dd75f, 0x787f44f6, 0x81837dfb, 0xd481a681, +0x81819d17, 0x8781322c, 0x7f7fac0b, 0x0fca7f3c, 0x40b5e37f, 0xf27f2ebc, 0x41c19a41, 0xa6c1d381, +0x066de9ec, 0x32b8a8bc, 0xdac61ba5, 0x812d817f, 0x87b9821c, 0x817f7920, 0x7f557fbc, 0x81738181, +0x918fb098, 0x81ab890a, 0x81b881bf, 0x7f7fc57c, 0xcdbde77f, 0x7f5f7f3a, 0x36e59a81, 0x19a6818f, +0xea7fd850, 0x20606e2b, 0x927f9c22, 0xd27f819f, 0x3c4f7f73, 0x168176ce, 0xf0687f81, 0xec5f7faa, +0x23aa789e, 0x2de996b5, 0x7fd07f7f, 0x9785c156, 0x1eaa3235, 0x9781ea6f, 0xb2de74fb, 0x815a98d6, +0x8cb77f92, 0xbba85fa1, 0x61afcac8, 0x81817f64, 0x8149865f, 0xa251b7ee, 0xec7f8181, 0xf8ad7f84, +0x5c8142bf, 0x212981f2, 0x7fc9e381, 0x37338e67, 0x7f3099c6, 0x4fcdb7d1, 0x0381c0fd, 0x778181e4, +0xe7702cfb, 0x61c21e43, 0x3f987f81, 0x3a0b815c, 0x7d12b8c2, 0x70097f0a, 0x7f244d63, 0x2d81187f, +0xd87f6f7f, 0x7d267f2c, 0x8eaf2486, 0x87d8013d, 0x85367f7f, 0x81817f85, 0x0a067081, 0xc96f952c, +0xf3c14485, 0x227f4330, 0x60ec8124, 0x41f181f5, 0xdb6b7fce, 0x819467cf, 0x81bc7fd4, 0x2c7a7f7f, +0x936ade53, 0x7f81d04a, 0xc4817f81, 0x7fdd78dd, 0x81d3a47f, 0x917fade5, 0x6c81510e, 0x5b16fd74, +0xbe987f81, 0x7fb17404, 0x7fb8e8f7, 0x7fb381e6, 0xc479b081, 0x5c81eee7, 0xb19b0e81, 0xa381d4df, +0x81bacf5b, 0xa67fb9a6, 0x817f11a0, 0x8d565870, 0xce818181, 0x7f4aec3f, 0x813ab981, 0x1b495a42, +0xab7f928d, 0x8106014f, 0x47c3e57f, 0xc418f11e, 0xc9149f6c, 0x1a7f1e25, 0x7f3f2d81, 0xcd5e462d, +0xa8d57f7f, 0x812481db, 0x7f697f97, 0x69cdb891, 0xc31fc20d, 0xdc812b31, 0x57e37f81, 0xa09681aa, +0x7f817f88, 0x1ae385f8, 0x81607f7f, 0xfb752e65, 0xd8dd8141, 0xb17f50a9, 0xb8737ffd, 0x1f7f815b, +0x7f9a9e69, 0x06448b38, 0x8109a225, 0xb69e064b, 0x9881537c, 0x59dee4d8, 0x89c6a692, 0x0e817b7f, +0x81816b97, 0x5de37fd1, 0x7f2c7ca9, 0x81784402, 0x29bd477f, 0x81a07ffe, 0xe822df7b, 0x7f29813c, +0x6d81cd81, 0x1a811bd2, 0x6b2c7f26, 0x7881a08f, 0x7fd0e88e, 0x27f87fce, 0x8181a67f, 0x7f7f5558, +0x81668133, 0x8181bfca, 0xc3792d58, 0x2b7f2d7f, 0xa3d09230, 0x9fa56824, 0x7fd5ce7f, 0x251b3cbd, +0x7f818117, 0x7fac9e26, 0x7fde26f6, 0x4b7f837f, 0x1fd52b94, 0x067f6698, 0x70817f7d, 0xdd9658c1, +0xe5a99465, 0xa59cdc55, 0xc1c2c7ad, 0x147fb081, 0x234cc657, 0x7f7fcc0f, 0x7f3d8150, 0x41b68131, +0x7ff58184, 0x90a57f2b, 0xdd9d9b7f, 0xc4518163, 0x428aa37f, 0xe866ef52, 0x7f6c3644, 0xa09d3b50, +0xf2c4adad, 0xc87ecb45, 0x7f70bace, 0xd5697f2d, 0x297349a8, 0x6bc11cc9, 0x8cdd0ed3, 0x7f53646b, +0x8129b9b8, 0xce65a8d3, 0x20208181, 0x817f5272, 0x6ad11bf4, 0xc58151e3, 0x361572c9, 0x81acd996, +0x6e819466, 0x7e7fbd3f, 0x70bb9ffb, 0x818b810a, 0x879a7f15, 0x8c884edb, 0x9028ae45, 0x81d8f525, +0xaaa781b9, 0xaf1a0108, 0xe2817f73, 0x24b67f8b, 0xf08fd77b, 0xd21a265f, 0x7f3930ba, 0x5f5d9287, +0x66218181, 0x7fd219f3, 0x6f44f09e, 0xbcc58157, 0x7f71b94d, 0x817f81c5, 0x877f6064, 0x81647f81, +0xe5ba2e34, 0x889f8722, 0x27819f0e, 0x7f4c0eed, 0x2d7f79b6, 0x81b1813c, 0x647f3d2b, 0xe92b68be, +0x81375804, 0x6798c04b, 0x2b596e7f, 0x78c97f7f, 0x812c367f, 0x7f468112, 0xa352d785, 0x3806f2a4, +0x6886a9a9, 0xa31540ea, 0x5ab2478d, 0x9f5be57f, 0x9ab06481, 0x1586279b, 0x86267f81, 0xb3a50944, +0x788a485c, 0x838d4c30, 0x8ad44b53, 0x923fb39a, 0x95035381, 0x81817ff2, 0x7f44d5eb, 0xf17f8164, +0x39d117c0, 0x37ea75f4, 0x81927387, 0x817f0623, 0x909f7f0a, 0x997f7f19, 0xc1983b18, 0x60937f6b, +0x8829c381, 0x8e6bf066, 0xfb7781ab, 0x43408e7f, 0x7f7f811d, 0x33eb81d0, 0xb86459a9, 0xadba7fe7, +0xc1967f48, 0xfd0284bd, 0x4bef335d, 0x1b7f5f81, 0xa2c2c237, 0x81b0816a, 0x42ee5c7f, 0x7f009323, +0xb7ced44c, 0xd90958e2, 0x3af8aae8, 0x7fb82e90, 0x989a7f7f, 0x14a22c68, 0x60ef7dc6, 0x7fb9ad00, +0xf9e3c69d, 0x5e3bafbe, 0x81178a81, 0x92c4df02, 0x159d7fb6, 0x812b8103, 0x616f9df5, 0xb9a1df61, +0x454b3944, 0x98931fbe, 0x4aae7061, 0x9572a681, 0x8178a8a8, 0x81fe821f, 0x817f7f6f, 0x7f787f2c, +0xe584ff82, 0x7b7f5637, 0x9e815970, 0x517d8181, 0x97faba7f, 0xcfe3ce17, 0x9181f55f, 0x857f5f3b, +0x81b17fbc, 0x7f1d7fbc, 0xae7356c3, 0xe4f77f8b, 0x4695f639, 0x8ddaec55, 0xa5d4a381, 0x7f7fa418, +0x4d818145, 0x3881723b, 0x7f507f7f, 0xa5357fca, 0x81dbdc3b, 0x0b187f28, 0xb0325181, 0x09dd795f, +0x2c39b28c, 0x9ac18118, 0xda52b681, 0xa3819da8, 0x7f884525, 0xba0d7ffe, 0x50ce81ad, 0x60e70e69, +0x110b81ee, 0x8181871e, 0x7fe07f81, 0x8d1c4dde, 0x67649db7, 0x6e4669c2, 0x818144a4, 0x7f6c9cb7, +0x51b57f81, 0x36aec300, 0x7f7f8141, 0xc5eca67f, 0x14ac7892, 0x7f35e9c2, 0xa1fe9a81, 0x6a867f7f, +0x767f817f, 0xc447c4bf, 0x067fedca, 0x8c024b57, 0x7ee5707f, 0x52589b51, 0x0f81b28f, 0xae7f00a7, +0x5244c5ca, 0x9671812e, 0xf0631d15, 0xb4aba1b8, 0x7f9a3488, 0x81b485b8, 0x392f2d7f, 0xed7fad81, +0x6055a4e1, 0x60f300c7, 0x7feb817f, 0xd1e0917f, 0x544ca57f, 0xd23d7e0d, 0x8110c8c2, 0xbc24a615, +0x3d817f33, 0xbdabcdfa, 0x5ac3817f, 0x81817fc0, 0x81817f76, 0x837e43d9, 0x7f817581, 0x5da96bcb, +0x3e1c888f, 0x7f7fa6f5, 0xb769907f, 0x8eb43d8e, 0x3a7f3e81, 0xd5845510, 0xd07f5a54, 0x14816ab2, +0x8126c62d, 0xbeda8f5c, 0xa0007fa8, 0x818d7281, 0xad72917f, 0x49c2f650, 0x87969baf, 0x7f53e975, +0xe78de481, 0xe5083e96, 0xb635812c, 0xafdf4bb9, 0x26ac8101, 0x82b0a109, 0x7f8101b8, 0x607fc7cc, +0xc3b1892f, 0x7d0dd911, 0x396d8195, 0xcb84b67c, 0x3f7d3681, 0x43a07f25, 0xd020297d, 0xb7d65b81, +0x455a99e2, 0x509e4611, 0x817f81e0, 0x81da81a8, 0x8147b5c1, 0xbc81a5df, 0x489c6781, 0x8150a908, +0x4fc0e681, 0x814b8163, 0x11457f8b, 0x9a77db7f, 0x81fa0681, 0x7f867010, 0x852b87c5, 0x3d8253dc, +0x91165c42, 0xc6ac7422, 0x727f0774, 0x7f497f67, 0x1a3fe7c0, 0xb39c81d1, 0x44a47f7f, 0x7f8b066f, +0x7f787ab5, 0x7ba7e870, 0xb932a3a9, 0xc85c1149, 0x32a28d61, 0x7f8d812c, 0x93819da2, 0x647ae98c, +0x777f7e9e, 0xbb447fec, 0x2fabd677, 0x3a7f8c08, 0x51707f28, 0x35f81da5, 0x0b3cfc4e, 0xd4179b8a, +0xef77a6ca, 0x31e02016, 0xdbb81924, 0x7189b4a7, 0x08a671aa, 0x817f2352, 0x81819e81, 0xec7fb7e4, +0x81699ae5, 0x88817f20, 0x5ee7d181, 0x944d8150, 0x7f7f52d9, 0xc1815114, 0x3281a67a, 0x52fa8181, +0xc4e47f7f, 0x7f824cbd, 0x728cf0bf, 0xa6b20e46, 0x9ffe631c, 0x639d82cc, 0x7f638136, 0x7f7f3381, +0x7f8b4794, 0x44b19231, 0x08da5253, 0xaa815d93, 0x7f6a7f69, 0x616331c2, 0xdaa47fcf, 0x7f272255, +0x3ee4098e, 0x819527f9, 0xcfc187a5, 0x7f81e781, 0xf71402bd, 0x9fecc0d1, 0x2067a67f, 0xa1dace7f, +0x42817fa8, 0x8181da23, 0x03818181, 0xc35e3af7, 0x941d7ff3, 0x817f33e5, 0x7f2a78f7, 0xbe426494, +0x0d2d81a4, 0x817f20cf, 0x89b2f4d0, 0x8171ba71, 0x6245be4e, 0x817f8140, 0xed8a7f81, 0xdb097f7f, +0x81724d42, 0xe0de7bfb, 0xde611f7f, 0x7f54d981, 0xb1d07fd7, 0x487f7fef, 0x7f2c8139, 0x7f7f7f10, +0x3e812db6, 0x63447ff6, 0x7c7f277f, 0x9f7f8b7f, 0x76d47f81, 0x197faadb, 0x6a596c91, 0xc681a3a3, +0x7da1d13f, 0x4af8d329, 0xaa819881, 0x7d7f7f4a, 0x3a9d1753, 0xaf818145, 0x5b905350, 0xee313e4c, +0x3fa881c7, 0x437fc046, 0x817fbd9a, 0x30f77f14, 0x3e81df81, 0xa42f4e53, 0x7f67d481, 0x4f4b819e, +0xc5474f22, 0x6eed3376, 0x7fb1ed92, 0x5b3e813d, 0x6c8181a7, 0x720df323, 0x2d0e7017, 0xc7448174, +0x817fb27f, 0xad7f01de, 0x817f10b1, 0xf6231fed, 0xa56d7a81, 0x98817fef, 0x8181e4a0, 0x48aa7fb1, +0x81727f6a, 0xa4059a04, 0xe0cff64c, 0x5ea7679c, 0x69c1009b, 0x7f816b2a, 0x5cc58181, 0x7f954f3d, +0x848b7f17, 0xaee99031, 0x7fbb951f, 0xa2da7f73, 0xc5acfb81, 0x2c1ecf2a, 0x6981fdba, 0x19897fb2, +0x7f4af7a6, 0x85cd8129, 0xe845e0d5, 0xdf658407, 0xd522567f, 0xab242f2e, 0x7fdd70a4, 0x1c9d038c, +0x2f923f85, 0x27f1b2c5, 0x7f812781, 0x7f818181, 0x7f9603cb, 0xc32881af, 0x5ad1f2a1, 0x61b99a32, +0x57cd3bfb, 0x7ffc6fd7, 0x9e81c281, 0xfea25f7f, 0x85a2bfe7, 0xf3ef5107, 0x7f81565e, 0x1d447f81, +0x814e817f, 0x40853b00, 0x6caf3f7f, 0xe13a7fe2, 0x816162c5, 0x81b4e66f, 0x81e18fb8, 0x7da87f66, +0x7fef667f, 0xea2ba1f4, 0x408181d2, 0xba81676f, 0xdd817481, 0x7f9d7fff, 0xd6544752, 0xb1bd61ce, +0x3aa26a56, 0x817e9bf8, 0x8158964a, 0xa0d3253c, 0x308130f6, 0x501d7f23, 0x367f34d2, 0x818581eb, +0x817f4743, 0xdf9e81c8, 0x5c7f13a4, 0x12182965, 0x9cca6c7f, 0x47817f4f, 0x0cbd2918, 0xb05cf048, +0x28810542, 0xe8a869a0, 0x7fb7682b, 0x3f7fb5d1, 0x813dc581, 0x2ea58dcb, 0x4a4e6881, 0x687681b8, +0x665c057f, 0xa78127e0, 0x81b28166, 0x817f686e, 0x7f261637, 0x81ad7131, 0x54817f68, 0x2eae6470, +0xf110f558, 0x8aa44bc2, 0x81f12d55, 0xf37f35cd, 0x7f68679f, 0x3fc481db, 0xe02a5a41, 0x817f8130, +0x919b6c25, 0x14749815, 0x9d7f6c60, 0xc5777fa4, 0x7f8db49b, 0x524a623d, 0x2ef59cc0, 0xd18f4a24, +0x37707f92, 0x4af98126, 0x81b43c76, 0x7f965818, 0x7f81c786, 0x057f7f49, 0x1ab3ef1e, 0x1781eb8a, +0xf0909181, 0x656da3b4, 0x5181cbb9, 0x81e9a237, 0x8ace577f, 0xd19f2c0c, 0x86a7817f, 0xb7628100, +0x817fcfa2, 0x7f3cddf4, 0x744a96d2, 0x19967ffb, 0x7f7f813a, 0x81f2b043, 0x7d46cd81, 0x7f006e7f, +0x363a7c9b, 0x9f812dda, 0x77c77f1c, 0x8172274d, 0xa7ba8181, 0xff7f1ea8, 0x817f4e7f, 0x377f9ad7, +0x81447f7f, 0xf81f3623, 0x58ce7f7f, 0x8a4a208f, 0x4d938115, 0xb0ac7029, 0xf72b23cf, 0x467f9dd3, +0x81819130, 0x62bb7fc4, 0x84b4b190, 0x2781b070, 0xdc81cda4, 0xcb8145b3, 0xda812b38, 0xda307f7f, +0xafbc8158, 0x7fcb7205, 0x47e781ae, 0xc056245f, 0x81997f56, 0x51d9d6f7, 0x7f895c4e, 0xb7814beb, +0x7f658181, 0x757f81bf, 0xdb81816e, 0x582edcb2, 0xb9860711, 0x587f81ca, 0xa45a7f0b, 0x81e68a35, +0x7f7f3b0f, 0x3c233956, 0x7f5f3e44, 0x81ba915e, 0x9ea4dd81, 0xc323e1bc, 0xb1ac0322, 0x5e7f0e2b, +0x6b2fb26b, 0x0e92812c, 0x667fc670, 0x7faccae4, 0xce8181be, 0x815e68c5, 0x273e7f69, 0x10f3e868, +0x47a8b82c, 0xc8817f10, 0x617281b6, 0xe4a44714, 0xe19d4b04, 0xe8818333, 0x81e481fb, 0x58ab1e34, +0xa68c8168, 0x815f4c12, 0x181be656, 0x817f147f, 0xc87f7f8b, 0x7f7fa1f9, 0x7c787f7f, 0x7f7ff8ae, +0xcf9200a0, 0x7f65e492, 0xc37fbb89, 0xa234a37f, 0xa27f7fb4, 0x818a6fb3, 0x04817fb5, 0x2e7f636a, +0x905db630, 0x812bbc0d, 0x8f1beb7f, 0x7f83bb5c, 0x81b96698, 0xbebc8152, 0x6669b181, 0x7f81452e, +0x6861ca81, 0x8806d040, 0x4570d28b, 0x812681fe, 0x817e3b48, 0xcd3ddb3c, 0x21777fa4, 0x7f3d81cd, +0xae0d8104, 0x8134b9fe, 0x7fb87fdc, 0x81ac7f6a, 0xbeec5c5d, 0x60cc4dfe, 0x967f82fc, 0x3a8187a2, +0xe9577fa9, 0x818181a5, 0x8181b4aa, 0x81204f7f, 0x81708146, 0xbe08d127, 0xdec25eca, 0xc3e0db2f, +0xf7817f4f, 0x7f5da797, 0xc9c44f90, 0xbc5b84c5, 0xda44a681, 0xcc9b810a, 0x38c5c3c1, 0x674294d4, +0xe47fe181, 0xa4817f54, 0xcd06b70a, 0x5b3d7f7f, 0x7f137fbc, 0x38769bd6, 0x817f811d, 0x6bc4046f, +0xba9a7f2d, 0xca91ea2a, 0xe881d10b, 0xf9810daf, 0x42e57f81, 0xc87c147f, 0x4f817f7f, 0x66c7bd81, +0xb991549f, 0x816febec, 0xdc50fd71, 0xaab9aa83, 0x7fbd3952, 0x7f50c6cf, 0x1481f8a2, 0x3ff381ab, +0xf6b0470a, 0x81e12ebc, 0x817f5f39, 0x3c7fb836, 0x79813781, 0x7fefa2c9, 0x7e81030d, 0xb849bf3e, +0x81613b40, 0x08817f32, 0xbd5ffe64, 0xd688be81, 0x0166eab3, 0x81077f0a, 0xe5817f56, 0x91b83696, +0xac8181d6, 0x5732a410, 0x40818181, 0x81915bb3, 0xa87f8145, 0x816a06ce, 0x033f7d7f, 0x86438281, +0x3afc477f, 0x9cdf8102, 0x786d4383, 0x81ecfe7f, 0x89a7471d, 0x349c7fd7, 0x7f377f3a, 0x51d55daf, +0x62337f61, 0x547f910e, 0x4bea99d2, 0xbfa9557f, 0x7f2ee96a, 0xcb9ccccd, 0x0fc3a681, 0x687f30fd, +0xb07f4530, 0x83814334, 0x955bf3c6, 0x7f909981, 0x7b4e617f, 0x7659def0, 0x05565d7f, 0x81f271cc, +0x31ca8581, 0x1afd6755, 0x818181ff, 0x7f8181ef, 0x7f7f77ce, 0x1d6692cf, 0x73c57f7f, 0xf083d53f, +0x707f9c09, 0x1ce6813b, 0x17bcb0c6, 0x15b59ba7, 0xde7f817f, 0x7f925801, 0xeba91d81, 0x568190e4, +0x7f817e72, 0x8d7ffa3c, 0x82f281fb, 0x548a7f7f, 0xe9777fa8, 0x407f16cd, 0x7e8167a8, 0xc5812c04, +0xeae8e181, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xf481c67a, 0x89b07fc3, 0x2e4d7b44, 0x9181818e, 0x83b88158, 0x8181739b, 0x4aa97f6a, 0xb36d7fa6, +0x075bb9b8, 0xcf839c97, 0x20ba9176, 0x117a6a6d, 0xc35b571e, 0x8181fb5f, 0xec3a7fa9, 0x3eec7fcb, +0x53622f7f, 0x8681a07f, 0x0ff39b65, 0xb6c82420, 0xefb381d6, 0xd5390961, 0xf1887f0f, 0xbec2abad, +0x64d57f81, 0x2281057b, 0x1f7fe936, 0x99038181, 0xc1450b81, 0x65cc5386, 0xb886acc1, 0x109dde08, +0x6417d0dd, 0xcb7f7f76, 0x9681b397, 0x53c39e81, 0x437fd46e, 0x751c3481, 0xdd4c813c, 0x38817f65, +0xf0b39281, 0x31357fcc, 0xf37fae31, 0xba8181e7, 0xefc1e23b, 0xa8650162, 0xbb815838, 0xd6eeba30, +0x8de2db81, 0xc01ca018, 0xed2dfb81, 0x7f84731f, 0x40633968, 0x557f2c0f, 0x5f5c6374, 0x41b02181, +0x447f6e09, 0x8d56b3a6, 0xe47f81bd, 0xbe712a04, 0x3e7e78b2, 0x470a8128, 0x298981b3, 0xe65e2866, +0x5bad817f, 0x78884acf, 0xb521287f, 0x81df4b81, 0x33818184, 0xb3d65f30, 0xc2ed7fbc, 0xc4811ccd, +0xec92a11d, 0x5bc5817b, 0x57ad8103, 0x7f6226e4, 0x07c2d87f, 0x3d7fb181, 0xff73974c, 0x08815f61, +0x50616fbc, 0x923ec16c, 0x2181c73a, 0xb8f88181, 0x047f7f7c, 0xe87fa53d, 0x399ca775, 0xef139839, +0x7f217f43, 0x811415c8, 0x37f6b9c6, 0x7f7f817f, 0x11c6ad81, 0x81b3c88d, 0x0ca47c91, 0x024a7604, +0x2dda2f7f, 0x811c5281, 0xc27f814b, 0x7f37a317, 0x42433381, 0xddfbc9da, 0x23737f7f, 0xe3acaecd, +0x1d846dc3, 0x7f1bd4e3, 0x4055d37f, 0x7f1e9a81, 0x31d29025, 0x6d90cf64, 0xdf532fea, 0x1a3dc07f, +0xf997ee19, 0x597f5460, 0x2a0b5b30, 0x5751a381, 0xd27f8489, 0x7f1f9ae4, 0x2bd07f7f, 0x5281923c, +0xbb7fae6b, 0xd344db7f, 0xb0431bc3, 0x33744f44, 0xd2996981, 0xce048861, 0xd57f36c1, 0x1181819f, +0xe7592aef, 0x7fbe817f, 0x177f7f04, 0x2cc78381, 0x27558149, 0x7f64746e, 0x2bb97dc7, 0x10aba652, +0x02f70c7f, 0x7fd8ae81, 0xcd81f07f, 0x9352c65e, 0x344a817f, 0x4f282881, 0x3e2d23fe, 0x69517fb3, +0x7fd1e4a6, 0x3bf47f7f, 0x33909ff6, 0x81aba30c, 0xaa8181dd, 0xf6f36f81, 0xb57f7fa4, 0xe8b6a572, +0xb0ac3a81, 0x81817413, 0x104de181, 0xef977fcf, 0x2054acbe, 0xa9013b81, 0x4a7f34fe, 0x49747f6d, +0x5ad74c74, 0x0e582cc5, 0xa7ea83c9, 0x7f7f750e, 0x38847f81, 0x41817281, 0x3344debd, 0xd229728c, +0x027f839f, 0x5d9fc4ff, 0xdb1e7f51, 0x439681ca, 0x1b81b581, 0x7f777f9f, 0xd6bfb07f, 0xb050814a, +0x1981648e, 0x2cca7f56, 0x30814ab8, 0xc48143a5, 0x5bab3c8b, 0x7f97249c, 0xf7f09eb9, 0x074aa055, +0xc86bbe54, 0x815ed4b2, 0x7fd0b28f, 0xd7e07470, 0xcf815cc6, 0x7e7f7f63, 0x81dfe09b, 0x4098da7f, +0xc1d5a339, 0x7928937f, 0xa481bf6e, 0x81accdd5, 0x3b9c5cb7, 0x817f81a8, 0xc49b8a56, 0xec817f93, +0xb7a9306f, 0x43555d59, 0x5f815d7f, 0xb79e7fc8, 0xc9d17fa5, 0x7f9999b8, 0x73467f81, 0x38627fd7, +0x7a9138ab, 0xbd46b67f, 0x71b5823e, 0x5c81fbb3, 0x3d508f7b, 0x8173c630, 0xd4816172, 0x3f81d92d, +0xcd6b9d7f, 0x72ee607f, 0x851bd2ce, 0xbc4e7fde, 0x1c6c8193, 0x9252b181, 0xcc217f96, 0x296d7f98, +0x5957ae75, 0x817f14bb, 0xbf7b8191, 0x44d87f81, 0x352a84fa, 0x524a882e, 0xae66ac81, 0xbc7fc592, +0x2cb1dc81, 0x42e56887, 0x7981b76a, 0xa5667333, 0xd2ab7e7f, 0xe37f817c, 0x26817f7a, 0x23570c5a, +0x1a685290, 0x814bb476, 0xf6527bb0, 0x7b810805, 0xe63cd272, 0xc1d97fb5, 0x1e8124d3, 0xd34f157f, +0x367f82a6, 0x14819e1e, 0x39226087, 0x818681da, 0x8121417f, 0x81186358, 0x57e88e9c, 0x077f6e37, +0x96087f7f, 0x9a82c77f, 0x0781c4b8, 0x81217f81, 0xc565447f, 0xab41447f, 0xf7915a1f, 0xe58b5a81, +0xcb817d13, 0x81819181, 0x0d4cc8ee, 0x63b4f36e, 0x587f81b3, 0x47947981, 0xcc7f7f88, 0xa3816781, +0x2581a481, 0xc750aa5c, 0xcd440151, 0x4d684b81, 0xd8a6b50f, 0x4f7fa9b5, 0x3f1b93cf, 0xb58f812e, +0xaacd817f, 0x136d7fa9, 0x81b581b9, 0xb75d7fd5, 0xd29a8133, 0x337f8ec0, 0x75ac901a, 0x0a6d7fb2, +0x2d208186, 0x8186b97f, 0x0cb42af4, 0x03ac9e7f, 0x1167a77f, 0x7f19fad8, 0x2d4781b9, 0xf97f6658, +0x9081bc81, 0x6f7f4087, 0x8e527f8d, 0x6873d688, 0x817fbc88, 0x4b81608a, 0x22814ea0, 0xe97f81c5, +0x10bb3de5, 0x818115ed, 0x421b3081, 0xa17f6e52, 0xf46d7f09, 0xd87f8185, 0x68a79c2b, 0x7f7f837f, +0x4d7f4967, 0xc8507f81, 0xc67881f1, 0x0dad027f, 0xad7f8125, 0xa47fb3aa, 0xc74ceb01, 0x373974a7, +0x4e7f8153, 0xa87c423b, 0x2ad75081, 0x4a817f35, 0x357f5517, 0x55816581, 0xcb7fa97f, 0x7b797f7f, +0x504ee981, 0x7adecc6b, 0xce338197, 0xc49ab9bd, 0xe3877f3e, 0x7f817f81, 0xea3624fa, 0xfd889681, +0xfd7f7ff9, 0xa6732f2f, 0xa81b81e0, 0x817f7fae, 0xbcb4b010, 0xc37f7ff4, 0x9a52819e, 0xc730eaec, +0x437f817f, 0x8865815a, 0x53337f64, 0x2d817f8f, 0xd7e2417f, 0x2b6ec637, 0x3d819d41, 0xe4877f52, +0x26a26a63, 0xdc74a867, 0x71433c4d, 0x94b02e35, 0xd6a155f5, 0x3cd37f73, 0x5c89997f, 0x569e7f03, +0xe0adb53a, 0x49d78e81, 0x9c7f22a4, 0x01385b17, 0x9081db0e, 0x3a8c46a9, 0x1e016448, 0xfebdc287, +0xf072dec5, 0x9f816429, 0x4bb0817f, 0x5a0ac21a, 0xf74ca8aa, 0x82811b7f, 0x1c08bf81, 0x1fe36842, +0xbc7f8181, 0x373b7f21, 0x097f8150, 0x54935b9a, 0x3a7f1381, 0xceb77ff1, 0x55ab4e7f, 0xcb1ab47f, +0x9f17477e, 0x7374b97f, 0xb2512a9d, 0x8148d0d2, 0xc057444f, 0xe94f8162, 0x7f816e40, 0x1da3d14d, +0xb458eb23, 0x7f907a47, 0xc8657f81, 0xc4f36ba1, 0xbc8181e6, 0x81efd081, 0x53607fa6, 0x51368181, +0x32b84fdc, 0x8127b27f, 0xd2247f5c, 0x56f77669, 0xecfdfe9d, 0x697fc681, 0x7f7f2781, 0xdb7f371a, +0x1b8181fb, 0xea78f17f, 0x5a187f7c, 0x7f7c705e, 0x2b58816c, 0x757f607f, 0xc87fc97f, 0xec5b66a6, +0xb89574c0, 0x77ccb739, 0xe1fd2aa7, 0x7f45d8cf, 0x20283a95, 0x5f45909a, 0xe581748f, 0xf97fab7f, +0xc8e0357c, 0x73c7da4b, 0x7f0e812e, 0xba01c67c, 0x0324fb81, 0xea2ee62f, 0x253e88ae, 0x077f81cc, +0x817fc781, 0x94f17fff, 0x0ed6f0f4, 0x84677f8f, 0xb598462a, 0x81a87fec, 0x3dbaa47f, 0xbd62fd81, +0x277f81ae, 0x0f43ab6c, 0x07c1617f, 0xc7bc8181, 0xba2460fa, 0x6d0df181, 0x92dfa27f, 0xf7d1033d, +0x53b71860, 0x81b28146, 0x6564b13a, 0x7fcf0981, 0xf9004e81, 0x10229f55, 0xdb7f7f05, 0x281845aa, +0xca6ddfab, 0x6481d77f, 0x4e4120ab, 0x81006b47, 0x518dce81, 0x907f8145, 0x4d5e7f2a, 0x064076ad, +0xdc1c8e81, 0x354b2545, 0xc8426706, 0x4447b281, 0x21daad30, 0x6d21a202, 0x04249781, 0x19ac7063, +0x3a7f00a0, 0x81f41c2f, 0x523c5b36, 0xb6817f43, 0x3f817f86, 0x811234c1, 0xd77fd8a3, 0xc2f2927f, +0x557f7fb1, 0x41d9e881, 0xeec06dde, 0xe4633caf, 0x3c72fd19, 0x9cffc57f, 0x4b7c8659, 0xcbf6e57c, +0xd9bb7f7f, 0x5fdd819f, 0x69ecd881, 0x7f817f90, 0xe68181f7, 0x10811439, 0x2a7a2c37, 0x66438157, +0xbc634044, 0x3fe98163, 0x81ac8166, 0x8143811d, 0x364f63d5, 0x377f4e81, 0x24755bb8, 0x17adfc5a, +0xdedea8e0, 0x2e6e9e14, 0x0e816188, 0xe56cbe81, 0xb9c85cca, 0x817fb120, 0xae7f8181, 0xe37f7f7f, +0x0827d377, 0xdc7f815d, 0x9a2a5625, 0xb2ab4736, 0x817f2274, 0x817fb29c, 0xdcece2cf, 0x5bddd988, +0xcc1e817f, 0x24793971, 0x40ea214f, 0x326f7e64, 0x1a9e3ed0, 0x268c1a7f, 0x314b8548, 0x0f7f8701, +0x347f7c7f, 0xb9ca13bb, 0x3492187f, 0xc67fa67f, 0x7f49814e, 0xaa7f91d1, 0x18d53577, 0xc88b53a1, +0x20af691f, 0xe6853f81, 0xcf5d08bf, 0x81705981, 0xe30d47f0, 0xa8c17fa5, 0xdb817fb4, 0x12818172, +0x83433d81, 0x4a7ff6e4, 0x327f937b, 0xbb6509d3, 0x2c02fc7f, 0xf3b7feb4, 0x415d60ab, 0x136551d0, +0x0e818181, 0x832eb165, 0x3c7f7f82, 0x817770ae, 0xf9b3a525, 0xddcb3d02, 0x008b6181, 0xdbe55445, +0xec8137cb, 0xf5e8f76c, 0x61815ac9, 0xc8810fb0, 0x35547799, 0x0d81a035, 0x1c3eea42, 0x88d77f96, +0x2948677f, 0x0852db6e, 0x42367f74, 0x0d7f867f, 0x3a7fff81, 0xd1d1d271, 0x02a981e5, 0x2bfd2988, +0xd3818199, 0x4e7f4010, 0x09297fd4, 0x7f816b68, 0xe60a05ca, 0xeb81c97f, 0xa2cf5e81, 0xfd7f7f52, +0x07057f53, 0x8672147f, 0x389bd281, 0x3a855c79, 0x41328181, 0x21fe5e81, 0x073f7fc3, 0x3654f170, +0x24bc7f7f, 0x4f816ee1, 0x67427f7f, 0x8140676d, 0xef53e53d, 0xa48bce41, 0xdb5832d8, 0xf64a58dd, +0x3d3e70ab, 0x53ab4a16, 0x137f2023, 0x74569bad, 0x017f8138, 0x81902bed, 0xbdca8f24, 0xa34d8193, +0x81cf7f90, 0xab43b32b, 0x003f7f49, 0xbf3d4570, 0xbce67f72, 0x7c197fc0, 0x5376d47f, 0xd53d7fa8, +0x7e9bb47f, 0xd72aa0f2, 0xde818138, 0x5cc3a981, 0xd57d9c5d, 0xecb2d6a9, 0xf97f81e4, 0xb67f8f33, +0xb92b577f, 0xc483f97f, 0x469d9481, 0xd4868181, 0x7031e886, 0x95b4ca8f, 0xc6d4bd93, 0x117f227f, +0xb67e7fe9, 0x7fb35540, 0x07d01f81, 0xb4ce9b40, 0x1b118681, 0x7f657bfc, 0x2bbe817f, 0x287f176e, +0x6c96bb02, 0xcfff9e59, 0xec7f647f, 0x817f81b6, 0xabd131be, 0x819081e8, 0x4724b87f, 0x5f817f3e, +0x62b99368, 0x81818110, 0xc99ad3b2, 0x25816734, 0x0702743f, 0xe1b4812f, 0xcb787f81, 0xac864257, +0xcb928181, 0x55e27b81, 0x26f281a4, 0x63898181, 0xbbe1e54a, 0x58d2f881, 0x49e3cc81, 0xf7ea287f, +0xe9827f82, 0x81a69a5c, 0xdd81d292, 0x7f935122, 0xd17fdc3f, 0x321a8fa8, 0xfa819a81, 0x1fdb7f79, +0xc6cf9b09, 0xe181547f, 0x0acacab3, 0x0e7f72ca, 0xf562e081, 0x13d3827f, 0x5692de7f, 0x35b04a5d, +0xdd818e3a, 0x6b7f6160, 0x29303878, 0xc7687fbf, 0x38508173, 0xa6bd37be, 0x0d339881, 0x5e198614, +0x67f745e5, 0x81081a7f, 0xa3c77d84, 0xaadb7f81, 0x578d7ff0, 0x75a0b54e, 0x0d01587f, 0xa1cb624b, +0xf94181b7, 0x819d3a81, 0x37258135, 0x5aa87f3b, 0x0e7f7fd0, 0x5b7f817f, 0xda4ce9b1, 0x40917f81, +0xc57f7f3e, 0x4115b391, 0x627b816f, 0xa8575f49, 0x99ec8124, 0x33db907f, 0x4973c07f, 0xc9b71548, +0xde548177, 0xb608bfcc, 0x1d0787bd, 0xd37f793a, 0xfe847f7f, 0x7f3f4111, 0x3dd5de99, 0xbedb817f, +0x4c65c24d, 0x5d2c813e, 0xd901b37f, 0x974c5c92, 0x7f7f7f7f, 0x812b7f81, 0x0057836f, 0xf0778181, +0x2881f3c5, 0x35147581, 0x817fb31a, 0x7e7ae063, 0xfa1e4184, 0x7f1e787f, 0x529c5123, 0x553b9a81, +0x12de4220, 0x1fa92f8f, 0x4d66a52a, 0x554a2f40, 0xad3f637f, 0xbc81257f, 0x04f8976a, 0x2aa1fc7f, +0x3881b3cb, 0xcfc6ee25, 0xa37f5f60, 0xffddf08e, 0xce817f2a, 0x824f4685, 0x17b8a353, 0xa97f8a81, +0xfc81dc7f, 0x7f81a5b0, 0x26fab529, 0x811085c4, 0x031c5a76, 0x817d7f95, 0x1a8181cc, 0xe6aa0f7f, +0x1e454a7f, 0x1c98818c, 0x2b5ef528, 0x7f2b7f5a, 0x4ec7adbe, 0x6981f15d, 0x7f1d4b23, 0x0f337fb9, +0x1db1b85f, 0xdb7fbe3d, 0x1eb3aff5, 0xba2a7f96, 0xd6a0761a, 0xa97f117f, 0x341781f3, 0x9981817f, +0x56dd7f44, 0x431981b3, 0x115d7f7b, 0x7f5a818b, 0x943248aa, 0xb78a45db, 0xc2046981, 0x7a330a6f, +0xedb7817f, 0x81198df6, 0x29e37f9d, 0x74818143, 0xe5147f86, 0x7fac4869, 0x39e2bb4a, 0x422b983d, +0xdb949bec, 0x2c7f5181, 0xe7539781, 0x7f818ca1, 0x2e815f79, 0x2b199727, 0x28ea3181, 0xe65c7fa5, +0xfda2810a, 0x7b227ff5, 0xc259caa9, 0xdf9e7f4e, 0x1c7fbc49, 0xce892118, 0x083b81e0, 0x7081b06f, +0x0c7f507f, 0x637fae31, 0xf2967f40, 0x810181fa, 0x0878b37f, 0x98817f4d, 0xdaa946cb, 0xae813eb4, +0x67bb97b4, 0xe156b2a5, 0xc97f6dcc, 0xa90bd681, 0x14817f81, 0x7f816058, 0x1d587f76, 0xea425425, +0xd62e4781, 0x477fdca5, 0xcb667f7f, 0x8169daa2, 0x631cc881, 0x1381fb76, 0xf27f817f, 0xb297434b, +0x3b1d7bae, 0x89b8d27f, 0x947f8bbe, 0xbc81d770, 0xf94f0724, 0x3cdc817e, 0xf981817f, 0x1b75245a, +0xab20818c, 0xf2811c81, 0xfc78c27f, 0xb77f0881, 0x838132d7, 0x20818381, 0x127f815a, 0x8e9e267f, +0x1fa87fc5, 0x1da2bf47, 0x0f81939b, 0x118ba016, 0x52c07c6d, 0x697fdd00, 0x0e617f92, 0xab812b56, +0xce754988, 0x5e8181db, 0x22814b35, 0xfda981f5, 0xa981e85b, 0x477f93e0, 0x1e73d681, 0xdc748147, +0x01a1479b, 0x6d4e8164, 0xd37f8b7f, 0xbf6b7f6b, 0xc68110bc, 0x81819156, 0x257f497c, 0xb07fa0c3, +0xcac10d73, 0x39b9284d, 0xad817fd5, 0x7f8a5781, 0xe37f7f2d, 0x7f7fe7d7, 0x186d2c39, 0xc4813181, +0x0ac8a47f, 0x569d4cd2, 0x7f3d597f, 0xb87fbe59, 0x35117742, 0xc18c7fa7, 0xb03bd7ce, 0xd77f6829, +0xec3a7281, 0x81285968, 0xf8a69dd1, 0x81e38181, 0x4e1dbe77, 0x783d4e9e, 0x50bc7f85, 0x4181dd76, +0xa61a4bac, 0x627dd07f, 0xa08168a3, 0xfefdde94, 0xcdc19d05, 0x39817f7f, 0x18d78181, 0x631681cd, +0x91d2e1ac, 0xd2bfce81, 0x01f1817f, 0x810681d0, 0xccc18c5a, 0x7f0b617f, 0x563a8345, 0x917f26e1, +0x87147fad, 0x88161a8c, 0x1481928f, 0x5c96b841, 0x1b7ff206, 0xf1bf4759, 0xc6efdc5b, 0xa1078181, +0xf52b428b, 0x817f7f10, 0xdcd1c062, 0x0c863afa, 0xe26a27b1, 0xbd5a967f, 0xe8047fa4, 0x5be68181, +0xef7b2e81, 0x60f47ff1, 0xf9761c7f, 0x8f297a94, 0x2c81096a, 0x7fc40ec0, 0xbb7fb3b8, 0x4494cae8, +0x5847c916, 0x7d728183, 0xe74d7f81, 0x818d426b, 0x0006ba4d, 0xb4bd9ba6, 0xe00a813e, 0x68032681, +0x18877f81, 0xb46281d3, 0x3381113e, 0x6a7f57f7, 0xe2a7194d, 0xcb7f7fca, 0x62c66981, 0x5181e082, +0x6acdde81, 0xbcbbf27f, 0x3e3ea181, 0x81e6c17f, 0xf854097d, 0x307d58c8, 0x2e9e81a7, 0x93ce81ce, +0xcad4d5a2, 0x1272b081, 0xb84ccf3b, 0x007f9d7f, 0xe294efb0, 0x830c7fb7, 0xca07b17f, 0x3b9a88bc, +0x09350bd4, 0xae007f48, 0x3a6a8181, 0x38777f48, 0xce7f7f12, 0x9781570e, 0x3766817f, 0x4b607f7f, +0xe38c2477, 0x9cc64b35, 0x157f0742, 0x6881d981, 0x53c88c81, 0x9f8974ae, 0xa77f8319, 0xfb527fbc, +0xdf865f22, 0x407f8117, 0x5f5a4c24, 0x14207f77, 0xbfe8e081, 0x667f7f58, 0x31f17f37, 0x467f307f, +0xed7f7f48, 0x2bc96b81, 0x04816572, 0x8137a081, 0xea407b02, 0x7f06814a, 0x097c819a, 0x3ef22003, +0x077d1469, 0x32e06181, 0x1e7fa7de, 0xc7508658, 0x2d58ddad, 0x921d7e79, 0x3af381d7, 0x31b971a9, +0xa7b38de5, 0xf274be04, 0x9690d41d, 0x857f4dff, 0xcf7f5cb0, 0x8117bc7f, 0x1b7f4a91, 0x288181d6, +0x3f4d7b12, 0x7f7f979c, 0x4581b06d, 0x7faf7f81, 0xaf1dac81, 0x4d068bb7, 0x367f50bc, 0xdb7fbd41, +0x4f7f7f38, 0x81ac15f8, 0x2c3725a9, 0x98577f4e, 0xb20f8197, 0x6f816981, 0x26c87aa2, 0x1781c2a1, +0xf5449d24, 0x14cc2651, 0xe33d7f7a, 0x4d7f7ff2, 0x3554512e, 0x25c23b96, 0xde7f8d7f, 0x44bc34b3, +0x2a7f3050, 0x1aec3857, 0xada98181, 0x2644d0ee, 0xcbc2333e, 0x7f8e7f87, 0x4aa03181, 0x11b736b7, +0x3abb2381, 0x2f96817f, 0xe1476381, 0x83ca2b85, 0xfc3281ba, 0xa0d62222, 0xefbe354f, 0xa022be81, +0xd77fb435, 0x17538367, 0xee85d87f, 0xa4a66071, 0xc8402561, 0x818a277f, 0x9d4ddd7f, 0x23bf327f, +0x32ec1b81, 0x8c138d68, 0x237f1a15, 0x4a0e2b7f, 0x5b7f4981, 0xba747f29, 0xa1d37848, 0x0c7f03df, +0x923f1d7f, 0x8faa7c7b, 0x35068194, 0x60d2f465, 0x27606681, 0x7fc37f8a, 0x31bd3bd5, 0xcf58445f, +0xdcce241b, 0x88d9816c, 0xb9b2a7d2, 0x2205817f, 0x01ec81af, 0x4581c8a8, 0xdb0f1b6f, 0xca0628cd, +0xf63881c7, 0x7fa3697f, 0x5246567f, 0xb77f7fa1, 0x297f897f, 0x4cb8c84b, 0xce9e977f, 0xbf811e0a, +0x219d746e, 0x7adcfa81, 0xbcce1a61, 0x28987681, 0xfa7faeeb, 0xdb454581, 0xa5a5919d, 0xbf85a57f, +0x34b68581, 0x925c812d, 0x189a4c7f, 0x3ad03756, 0xf8c97f13, 0x97227f81, 0xfd7f070e, 0x7c7fd41e, +0xfe81b327, 0x81a6627f, 0x0016cf64, 0xded56665, 0xcc5fbd10, 0x81112f30, 0x4c6c877f, 0xefb9b53f, +0x33bc2181, 0x5e797cc7, 0x2a10c047, 0x917a7f81, 0x3a81817f, 0x8197ccbd, 0x73df4f32, 0x264f522b, +0xc1e9528f, 0xbb494681, 0xfbde6eab, 0x4f7f280b, 0x987a7f1d, 0x167f1f7f, 0x0b817f81, 0x8124a87f, +0x927f8181, 0x7f81ad86, 0xc779dc81, 0xd0f681fb, 0xcfd8fb81, 0x19cf4981, 0xb87f4bf5, 0x4893529b, +0x0040eb60, 0x7fc78bae, 0x474455dc, 0x0b7f7f7f, 0xa92f7f70, 0x7f3d9c73, 0x137fc699, 0xb4a3c6fa, +0xcb7f5c1d, 0x9c259c99, 0xdf5183d9, 0xa62181a9, 0x9a273761, 0xa5e8cd8b, 0x41b4bf1b, 0xa9818110, +0xb27f7f7f, 0x0e6bb7c4, 0x2e3e7f90, 0xa4c68172, 0xf73f7f7f, 0x81818164, 0x5299a157, 0x0a297f5c, +0x9a46f024, 0x8178d77f, 0x02818181, 0x8181025c, 0xd96828bb, 0x77644a05, 0xb77e4427, 0x407fa650, +0xab7f7f56, 0xaeeff9fe, 0x2f871d3b, 0xb8d7dd43, 0xe8817f7f, 0x7f4d0a27, 0x036a5b7f, 0xd4a3e67f, +0x9122dd23, 0x627fb09d, 0x055c6534, 0x0689a1b3, 0x4f484a7f, 0x7f77b1e5, 0xc47f9d06, 0xd381c37f, +0x3b819a7f, 0x4381827f, 0xed81817f, 0x95c3917f, 0x1b1e9ff3, 0x4c98cf7a, 0x81927f81, 0x703fd644, +0xed5db0d6, 0x23225674, 0xf95a8187, 0xe6ac7f32, 0x488150e5, 0xf6b5e281, 0x29810449, 0xfdada97f, +0xa6a19781, 0xfe36879a, 0xc96ac845, 0x3bf937bf, 0xa2812172, 0x84203765, 0x5f9e3403, 0x017f6a34, +0x2cc6607f, 0x99877f7b, 0x2ad981d2, 0x81933581, 0xdf81338a, 0xd478056f, 0xfa7fa571, 0x1d818352, +0x17c9db81, 0x9c7f7f52, 0xdf9bd4b1, 0x417f98a5, 0xca5517df, 0xc44b22d0, 0x58727f9e, 0x28817fd5, +0x477f2fb3, 0x8b3f7f59, 0x0940765f, 0xa970b281, 0x0a0a7828, 0x81319e7f, 0x2dc34181, 0x4081668d, +0xe7817fcb, 0x3641753a, 0xc17f3d81, 0xb88154b1, 0x73246eb5, 0xb0db8186, 0x09a2ec6a, 0xd82e2c71, +0x336f7f81, 0xd6817f4e, 0x43814a81, 0xc579811f, 0xc0812803, 0x447fa1e0, 0x81b01b7f, 0x752152b3, +0x4f15817f, 0xf97f61c0, 0xc99bd9b4, 0x2281307f, 0x607f8181, 0x7342b07f, 0x06bd9181, 0xb8b8bac5, +0x3b3ca425, 0x8175e89b, 0xa50d7f4a, 0xbb56b781, 0x817fca6c, 0xac0fa7e8, 0x8e7894b7, 0x1d05cf50, +0xf34f5b7e, 0xb65332e5, 0xc76e9375, 0x66d058a1, 0xe5a09f7f, 0xe493eaa5, 0x05fb81b5, 0x33817f14, +0xee418105, 0x81a16f2c, 0x367fa849, 0x7aedbecc, 0x100f81c4, 0x81b2fb3c, 0xcc7fb181, 0x1b3ff096, +0xd3b03a81, 0x4b815f75, 0x497f9c7f, 0x81015625, 0xa0817f81, 0xb0b8167f, 0x7eb7a3fe, 0xe97f6585, +0x555a877f, 0x4b7f8181, 0x12a95e4a, 0xcb6f5afe, 0xd87b5fad, 0xbe655fa0, 0x8b81300b, 0xccb26381, +0x39868173, 0xd6817fa0, 0xcf684e81, 0x7f3bae43, 0xfd8c20a8, 0xcfa0a31f, 0xc0307f81, 0x4e7f5d84, +0xeb941e81, 0x6f77d070, 0xfa0b7f7f, 0x3cb88193, 0xf6818163, 0x3d5f8fbf, 0x40c4c73b, 0x4b7f4e4b, +0xae968181, 0x818181b2, 0x81148181, 0x6b325381, 0xeae5582e, 0x7630307f, 0x1c0f6ba9, 0xa54a0457, +0xd37fc693, 0x2345817f, 0xe44f1e7f, 0x3e4cc9cc, 0x3081babf, 0x817f45c7, 0x5265e57f, 0x427f81ca, +0xe451817f, 0x8190b7de, 0xf0718981, 0x7f9ad381, 0xb9645da5, 0x7f7bed3e, 0x5ce37af9, 0x307f4ecb, +0x0a7f8135, 0x81ffa7a0, 0x534fa1a5, 0x7f42d641, 0x0e501e61, 0x7f7f6edc, 0xc859c081, 0x377f85f7, +0x0df9ab94, 0x817f7f7f, 0xfe7f7f81, 0xc1327ff4, 0xe84c842c, 0x7f1e5bc4, 0x1da77cf1, 0x1e817f53, +0x5f9ab07f, 0x86209e4a, 0x204e81cb, 0x33c9928d, 0x275a2d8d, 0x7f810281, 0xfe7ff7ba, 0xfab77fea, +0x658145e5, 0x73d57fd6, 0x01ec097f, 0x6d83207f, 0x49810cb5, 0xb5d9ce39, 0xf9e0436a, 0x629c81ed, +0x48cf2c8c, 0x7fe37f7d, 0x5b257d81, 0x765f50b6, 0x2cc98403, 0x817fbebf, 0x127114c7, 0x347f287f, +0xd2d72990, 0x81099d9a, 0x8143cac5, 0x8c452fc2, 0xd27f8f6e, 0x61957f25, 0xbc6fc54d, 0xce81f31f, +0xd381787f, 0xac0e5156, 0xf081afc4, 0xb47f6f2f, 0xef811a81, 0x015ee99c, 0xd46de9d9, 0x30655a6d, +0x09b2b87e, 0xaf13753a, 0xc6dd2a7d, 0xb9bd8190, 0x81537f7f, 0x669ff8ed, 0x5b810c81, 0x42e5a566, +0x0c4174cd, 0xbdf9b7bc, 0x1c118e65, 0xe28f9b2a, 0x8c207f3a, 0x1e7f7ff4, 0xd6b57f1c, 0xf0131edf, +0x38c9a381, 0x7f40817f, 0xb735817d, 0xa1a864de, 0xd99cbf57, 0x811a81f5, 0xb381e381, 0xe88e7fb6, +0xfb4a5b89, 0x7fc006a3, 0x1c81653d, 0xbceaa09c, 0x8d7799d7, 0x4b407a81, 0xdc81bca1, 0x3437d76c, +0xd79fe5c9, 0xd9adeea8, 0x163e8164, 0x2cc1b281, 0x3e81e9f1, 0x936504c9, 0x047f6f7f, 0xf981a776, +0x203b2d68, 0x81dde8d1, 0x13e9e9bd, 0xe04108a3, 0x50304281, 0x486d7fb7, 0xbbff81ce, 0x31d43aa3, +0x21813c7f, 0x81c8f989, 0x7f481024, 0x0a979b6a, 0x010081d7, 0x7792e641, 0x0654d37f, 0xa53da946, +0x96c781d2, 0x41524ca6, 0x2ab2d581, 0x1c65bb79, 0xaaa494af, 0x81e09681, 0x3d7facf5, 0x04c3818d, +0x2c1461c7, 0x788581d9, 0x1d3f2081, 0x49dfaec2, 0xfdf07f61, 0x40396d32, 0xc8835fbf, 0x7fb19f54, +0x2fcc8142, 0xe7dcb4e1, 0x73c3a807, 0x7fc68137, 0x061e81ac, 0x81c70c7f, 0x1d817f73, 0xfdbace27, +0xa5fa4081, 0x9b5575ca, 0xee81cc4b, 0xe85a7f53, 0x8daff2e0, 0xd1d1067b, 0x98ec3662, 0xa5818253, +0xf8266d26, 0x38da26ac, 0x3f98912e, 0x4a10f144, 0xd845a345, 0x811bd786, 0x4b137f7f, 0x3427fa81, +0xe981eb9f, 0x8f4ce6e7, 0x277f8181, 0xb0a5b03b, 0xd0633788, 0x4781b17f, 0xb27f3ee7, 0xd37f30b6, +0x21c3a15f, 0x0492a4d0, 0x097a6c7f, 0x047f1c81, 0x994b7f81, 0x818ea981, 0xd46d7fca, 0x2b8a5381, +0x9d424d91, 0x814d7f81, 0x32aa367f, 0x28ff1b73, 0xbea1dbde, 0x76db7f86, 0x248a8d37, 0x294b8136, +0x6e8142d6, 0xec65687f, 0x66297f57, 0xdfb563b3, 0xd352ee79, 0x0689d45c, 0xc58123cb, 0x0b62bf8c, +0x53c6d80b, 0x7fbc9773, 0xe4596e21, 0x2584812f, 0x1793b781, 0xaa815927, 0xb8659035, 0xccbe2281, +0x5eabb4c9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xb339946b, 0xd7497238, 0xc36e8181, 0xd0816d3e, 0x7f7f2681, 0x6709bf21, 0x92e3bf81, 0xe54358cc, +0x6bb5a661, 0x3a7f81f9, 0x8140f0fb, 0xc5a67f1c, 0x8d3381a5, 0x817f81c4, 0x72817fd5, 0xa72c76fd, +0x68dc8b11, 0x9b5f4098, 0xc0f43965, 0x7f0ecf02, 0x7cfdd720, 0xe1a0ac15, 0x087fc3c6, 0x81b66e6a, +0x410a893b, 0x81c491f4, 0x81d87033, 0x2056562a, 0x7f526cd8, 0x817fe90f, 0x81f78178, 0x81d93134, +0x3699e0a2, 0x7fa181c9, 0x81f64081, 0x8f816b2e, 0x816ece59, 0xd548fd2c, 0xc4ee3919, 0x6d847f16, +0x81e423c5, 0xfade4a40, 0x9e29eeb9, 0x7fe450f5, 0x5207177f, 0xf17f710b, 0x8cf291ad, 0xd09f9cf0, +0x7f022d20, 0xb7ea81c6, 0xbb89cfa5, 0x1c6fd006, 0x7f8481dd, 0x81020914, 0xb14c81e9, 0x4d9b4f08, +0x7f6064c8, 0x817f7fcc, 0x6b9819e9, 0xb253e7df, 0x724368fa, 0x816fe408, 0x7481a204, 0x0e6fec58, +0x70449617, 0xf5a1da3f, 0x7f446e7f, 0x1005abce, 0x38664981, 0x8240472c, 0x10f52409, 0x818186dc, +0xf7810be2, 0x9c2ad304, 0x81817f62, 0xcc40a43d, 0x5e6b81e7, 0x7ff0e2fb, 0x812a7f7f, 0xe3017f51, +0x817f24dc, 0x85c49997, 0x863c7024, 0x7fc0ce3b, 0x637f8c81, 0x814c9dbe, 0x8ea08156, 0x2cf47f9f, +0x5b55a9b1, 0x107d7546, 0xcd0381b9, 0xd8617f42, 0x7f81b8f1, 0xb506abd3, 0x745f2b2b, 0x7f81b7d5, +0xbf7fdb20, 0x1ca3a610, 0x7fe5e9af, 0x20b37f08, 0x810e6f81, 0x9b7fe6ad, 0x1aa35d81, 0x46032cc7, +0xad7f7f77, 0x8bd48245, 0x3dffaa81, 0x507f91d9, 0x907f9a25, 0x404b81b7, 0xc67f7f97, 0xb1eae864, +0xed2a18c5, 0x2ea85ef3, 0x8153434e, 0x816daaf3, 0x7f03ad67, 0xa0ec264e, 0x640ca1e5, 0xf0818f2b, +0xcbd27ff7, 0xa6a39206, 0x4ca811b9, 0x4c57a068, 0x8647e4c9, 0x7f438ad2, 0x7f945029, 0xc168e72c, +0x7fed4781, 0x81f706cd, 0x62810667, 0x177f7f32, 0xb105d09c, 0x81fa7f16, 0x7f11fa53, 0xc8a6430b, +0xececbb81, 0xe82644a6, 0x3e82f381, 0x28817feb, 0x90c18135, 0xd0f5810f, 0x507f0ba3, 0xfeb38808, +0x8e6c66ea, 0x70a0c4c8, 0x8146912c, 0xb8e01cb1, 0x2b817f51, 0x64818207, 0x9f3a4e81, 0x7f4aece1, +0x84aeafb6, 0xa17f8188, 0x9a7fe759, 0x1cbf5681, 0xad7f6bad, 0x818eebdf, 0x438181e9, 0xa7d07f22, +0x75dbd318, 0x81817f3f, 0x5457bd92, 0x4b204ffc, 0x7f1c637f, 0x8b4c7ffe, 0xa4d97fe8, 0x6194ca37, +0xb06c7f06, 0xad2f1ac0, 0xaef07f7f, 0x15818101, 0x22bf8d7f, 0x597f35cd, 0xb155ab0c, 0xc2838b0f, +0x0f81f4e6, 0x181f7f81, 0x31e1817f, 0x6a2846c0, 0xede8048e, 0x2952c3e3, 0x09187fda, 0xce411cce, +0xbbc197b5, 0x8181464a, 0x161922d0, 0xc37f292f, 0xbd736439, 0xc881b6fb, 0x81ba557f, 0x9da521f0, +0x3e7f52dc, 0x3b3a813c, 0x7f544bc3, 0x46b1b3fc, 0xbeb18e34, 0x418156e1, 0xab22e318, 0x7fbe66e3, +0x2237bfb9, 0x010081be, 0xc159b8df, 0xf449b264, 0x017f9e82, 0x9dbd7ff1, 0x09c7cbd7, 0x81bc537f, +0x817fe1c7, 0x7f177f60, 0x7474bcdf, 0x3c7f6f70, 0x7f7f987f, 0x81812ecc, 0xca783f94, 0x64cc4da9, +0xa0ba1d0a, 0x7aeec524, 0x43bb6b81, 0x1a338981, 0x206be419, 0x65819d5a, 0x7f81d73f, 0x81a67f36, +0x22810442, 0x7fd4cef9, 0x6067ad85, 0xd6d17f30, 0xea7f8166, 0x457f7f84, 0x817f1bc8, 0x6b86be00, +0x7f8bc555, 0x519d5bfa, 0xd07f97e4, 0x505c81d4, 0xf1eb8115, 0x72bdd002, 0x9da57f77, 0x817f12cc, +0x81c03652, 0x441872fb, 0x554bdf67, 0x2e46f0d1, 0x81817f8d, 0x7ff5ce55, 0xd2ded97f, 0x817f67af, +0x0539c336, 0xa37f2f7f, 0x8150637f, 0x8156d068, 0x827fbda5, 0x9f176b2a, 0x81878c0d, 0x81117f07, +0xc0d15559, 0x869c81c4, 0x7fa498da, 0x46d5d102, 0x81f7a581, 0x816eca47, 0x67ad9d95, 0xccb49c2e, +0x297c5440, 0x817f7cda, 0x9f55bd08, 0x2b7fc490, 0x817f817f, 0x377a8158, 0x91b5bf7f, 0xc87f4f21, +0x977fc1d9, 0x7f3088f4, 0xe938b6ca, 0x41707434, 0x81a27fd5, 0xcf818116, 0x817f887f, 0x09cf3bc9, +0x814edf19, 0x46206509, 0x34a36c81, 0x313fc7da, 0x92f34a81, 0x21e942d8, 0x365c16d1, 0x68907ff1, +0xcb8190e3, 0x5e7f7fa3, 0x6fb78c98, 0xa1444250, 0x812bb37f, 0x83a26f0d, 0x739bab07, 0xcb2cea1d, +0x668174ef, 0x288b8965, 0x95849a7f, 0xdc0981b0, 0xd875297f, 0x8153d5b0, 0x9d81e6dd, 0xae81d259, +0xd981813d, 0x7f64ed35, 0x1f459b0f, 0xb8ebe4e5, 0x72812e81, 0x81909b54, 0x02f54fb3, 0xa87281f4, +0x7f6381cc, 0x7f3cab5b, 0xb1958152, 0x814b9bfa, 0x81312b5e, 0xc2977f23, 0x347fbb97, 0x3b057fe6, +0x40208144, 0x7f817fad, 0x54cb9deb, 0x37b34a28, 0x81781b81, 0x7f1b8130, 0x81e194f1, 0x882b7f1f, +0x81dfc90a, 0xe4a97fa6, 0x9e81ab40, 0x971c2535, 0x5a7f7f3d, 0x47708116, 0xab778160, 0x81ac57e3, +0xc2854dec, 0x81ea81a1, 0x8b347f7f, 0xe981d130, 0x93c70917, 0x817f812d, 0x81925016, 0x7f813953, +0x52a5a5fc, 0x7a33d8e1, 0xcbd80281, 0x79df8101, 0x797afc87, 0x7581bbf0, 0x81567f94, 0x472ad4cd, +0x23e49434, 0x4c7ffc03, 0x41b0717f, 0xcc67b7bc, 0x7f7f48bd, 0x8c1c81b9, 0x3a460d72, 0x9eb5fa34, +0x03530615, 0x6c7f7754, 0x818167d3, 0x7fc22100, 0x7f3da881, 0xa24e7f61, 0x321bb411, 0xd981c827, +0x76e8814a, 0x69ca13fb, 0x1390b881, 0xb1d08157, 0x7f4669a2, 0x7f237f13, 0x30268178, 0x0eb87f34, +0xee1aaa30, 0x816596e1, 0x31813181, 0x88888243, 0x817de70e, 0x84811713, 0xd74d7f52, 0x06b17f35, +0xed347f1e, 0x66d66058, 0x7f817fee, 0x035edde8, 0x819b18a6, 0x8e8198ee, 0x817fb5f5, 0x311e442b, +0x957f941d, 0x4e6aa649, 0x7f677f41, 0x8d876acb, 0x7e7bb58f, 0x44c27fce, 0x6f39ec5e, 0x7f7f81d2, +0xd43ba60f, 0x488150c8, 0x8181e9e8, 0xfe46ec02, 0xa2cc7fd8, 0x7f810781, 0x7f30c356, 0x22c97fc5, +0xbcc97f40, 0xf2b2ce1e, 0x7b59537f, 0x46d994ea, 0x4ae2273a, 0x7f36d92d, 0x818ad281, 0xbf7f2b7f, +0x8181abf8, 0x924f4eb0, 0xa62c81b6, 0x812b99aa, 0x447f817f, 0x2c7f5746, 0x0859b34d, 0x83e652db, +0x7fc781ca, 0x819e5cfe, 0x55c5d07f, 0xb4bb3dff, 0xc24b8178, 0x93d28123, 0x15e63a7f, 0x7fc87f40, +0x812fd94c, 0x991b8170, 0xb13593c6, 0x3b9a5119, 0x3b752581, 0x20b89686, 0xcac17f7f, 0x81237f6f, +0x99ec643e, 0x02813100, 0x81124724, 0x3455436b, 0x8155cc81, 0x68136028, 0x81517f5d, 0xc57481f6, +0xe4c88159, 0x81fba227, 0xaa814381, 0xb3818ebc, 0x457f8b51, 0x118181a1, 0x575b7fe7, 0x53571239, +0xa7d35d43, 0x4b577f89, 0x1f817fc2, 0x6c7f9609, 0x9714813b, 0x81d723b6, 0x6c7f377f, 0xa3cf6826, +0x08b27f45, 0xbf7f8184, 0x814de5a0, 0x8181a2fd, 0x167f3c70, 0x8a7fa9e4, 0x65ac4b7f, 0x7fd367c5, +0x81112d7f, 0x8170811d, 0x817f589e, 0x8b7f7f44, 0xba2ab081, 0x527f5bf6, 0x2faad6e3, 0xc335a82e, +0xb862c003, 0x81715776, 0x5081817f, 0xdd7585c0, 0xb7989d7c, 0x367f81b1, 0xa0818129, 0xc6f37f55, +0x5006be1d, 0x817faac3, 0x7e667f81, 0xaf2c7f99, 0x347f897f, 0x2bb1aac8, 0x8112eee8, 0x7f5c62de, +0x007f14d1, 0xa1a2140b, 0x95446419, 0x5e7fc82a, 0x7a7ff07f, 0x81fe7d31, 0x010a8149, 0x7f3e7fb6, +0x397f81ae, 0x7b7f7fba, 0x797f5981, 0x7f7f170a, 0xb9cf087f, 0x0be6cb28, 0xdd97cf4e, 0x92520625, +0x817f3ae4, 0x6c81c381, 0x440cc5ae, 0x2b7fb8b7, 0xe94a2081, 0x81967f4a, 0x7f817f9d, 0x7f81a7a1, +0x815b52cd, 0xd59d57f6, 0x899e827f, 0x7f7f9aa0, 0x52819e7f, 0xda3a2223, 0x8b81073c, 0x818132d0, +0x55638800, 0x9804bcb5, 0xc3810a7f, 0x6ddab6e3, 0x7fcae34b, 0x7f814a2d, 0xea7fed91, 0x3b9bb0d9, +0x87d97f1e, 0x16535739, 0xcc2f7f81, 0x7f98813a, 0x5873bbe6, 0x241781f3, 0xbcc7cb33, 0x7ff69847, +0x8d11c0dd, 0x9ac9d787, 0x66cff992, 0x7f7fc312, 0xaa4fe681, 0x39967f26, 0x201c7f7f, 0x9a7f4849, +0x5768a814, 0x814d731b, 0x81917f81, 0x6eea7d7f, 0xad7f65fe, 0x3d3e81d3, 0xae672981, 0x7f1c81a0, +0x9881053a, 0x81a16307, 0xf64c4063, 0xbc7b97d9, 0xa29dc0a1, 0x8161189c, 0x7478b3db, 0x87b330e1, +0x817f0598, 0xcf422b0b, 0xc29b7ac8, 0xc2817faf, 0x8185581c, 0x81d0b675, 0xc93f7fa9, 0x814e3a02, +0x815d6511, 0x5d81075f, 0xd768c13e, 0x89815437, 0xac810d85, 0x1a7fa5e9, 0x14a6bb81, 0x54531dfd, +0x81dafd24, 0x978133dd, 0x818130be, 0xb67f5bb3, 0x2c7f4179, 0x81b281f4, 0xf3a463fb, 0xda36c4d4, +0xb17f811d, 0x37ca75f1, 0x53257f7f, 0x3ef0208b, 0xdc71817f, 0x978181ef, 0x7f81d17f, 0x1197810f, +0x277f7f47, 0x7ff6b1b0, 0x4562fca6, 0x725d89e3, 0x888197cf, 0x05477fd3, 0x4988077f, 0x81cbb5d9, +0x047fcaa8, 0xdb7f7fc9, 0x81ccfe5f, 0xd91643ff, 0x7f3f7f7f, 0x03815ed4, 0x697c7f81, 0x815b814d, +0x287f0d32, 0x7881a041, 0x247f95f4, 0xc87048e8, 0x3d815e7f, 0x71ba7f0b, 0x50815075, 0x7e53dc30, +0x3f7755fe, 0x1d032571, 0x818cbaf0, 0xbda97f50, 0x7ffc0aad, 0xbf457f42, 0x66b48f81, 0x072c3f1c, +0x433d9cfc, 0x71077f76, 0xac2d5564, 0xdc523811, 0x7f54a538, 0x7f707f00, 0x8c10a6f1, 0xf4a581d3, +0xae875d1d, 0xd37f9747, 0x8124b869, 0x81a17745, 0x61bb8b7f, 0x227f8129, 0xa77fc381, 0x997f8119, +0x817f812b, 0x81a78836, 0xdd557fc6, 0x907f6418, 0xbfa9accd, 0x4f815762, 0x97818181, 0xa0524fa6, +0x815b5721, 0xc77f7f7f, 0x7f725efb, 0x437f614e, 0x81f15c6f, 0x7fb77f28, 0x473f7a1c, 0x7f81d71b, +0x7f5133e9, 0x7cd17f32, 0xfb7572e3, 0x16c35e62, 0xc961a649, 0xdec47c37, 0x6d442844, 0x386b4616, +0x9583c437, 0x81d57fae, 0x8114357f, 0x818f9db4, 0x7ff181d7, 0x773fb601, 0x4032fb29, 0x8613b71f, +0x7f81b3f4, 0x1256f605, 0x297f817f, 0x9a7f2996, 0x5d81b87f, 0xc8907ffd, 0x817f7f35, 0xf6719ac7, +0x7b7f523d, 0x18d8ca2e, 0x2681b97f, 0xc02a810d, 0x34cda181, 0x32e081bc, 0x016f7f08, 0x461bdaec, +0x04330900, 0x633f61ac, 0xa3815204, 0xa534dda9, 0x7f81814f, 0x91a66329, 0x7f51aacd, 0x7ff681a7, +0xabe476e8, 0xb57f9cae, 0x177f27c0, 0x7f2f8b0a, 0x1281a9ba, 0xd991af49, 0xea527f82, 0x9be09d46, +0x28b2a2bc, 0x81c8a1d6, 0x5e1f4e71, 0x817f812e, 0x28b981cc, 0xb071cf04, 0x82cb8139, 0x81608181, +0x819381ae, 0x818f90c8, 0x817f64c6, 0xd169c7c9, 0x8f548381, 0x87f7b03e, 0x6657817f, 0x81be8102, +0x0d078c5f, 0x7ff97fd4, 0x7f814981, 0xb3bb7faf, 0x37c3dd6b, 0x4c6930b7, 0xb56ba479, 0xfc82520f, +0x3494f934, 0xa2016c53, 0xc513eeba, 0x8c283bcf, 0x7fa6047f, 0x54319236, 0x42b2c19c, 0xf965c947, +0x60777fca, 0x02767f47, 0x4921bb04, 0x81818fa9, 0x8eab7f5d, 0x81f4aa14, 0x1abdf97f, 0xbdaa220d, +0xac368139, 0xddb1c212, 0x81d9fd99, 0x90b77f3f, 0x029ec8ca, 0x7f93d9db, 0x8563627f, 0xc5b72d52, +0x2e6eacc0, 0x7f66815b, 0x50db375b, 0x4529813f, 0x7f8d817f, 0x44486f52, 0xbcd64c9a, 0x7fd2bf33, +0x43507f58, 0x7281a4d3, 0x7ca82149, 0x29817fd0, 0x653544b9, 0x88c681a1, 0xd93c2bfe, 0x530835cf, +0x5be26556, 0x7fb37fd1, 0x81e68174, 0xe88c0c42, 0xb63b817f, 0x394a81c9, 0x407f8107, 0x747f1f52, +0x91816dcf, 0x5f818161, 0x8514aebe, 0x7f496bac, 0x5e818181, 0xe8e358ee, 0xae1a7f0b, 0xa4c97f05, +0x77a77f52, 0x818160fd, 0x6bab7f81, 0xcec7e121, 0xf4810196, 0x4a7f68e3, 0xe56d5a7d, 0x813d2c6b, +0x7d0b7ff5, 0x7bbd6760, 0x67812b81, 0x188197d7, 0x8146057f, 0x811eff1d, 0x818ecc4d, 0x4a786245, +0x72593331, 0x2e81556a, 0x66aad481, 0x94818128, 0xde89ba81, 0x4df07227, 0x7f73ff8f, 0x7f44b981, +0x9bf9e707, 0x46811bff, 0x85a96a36, 0xc13b7f15, 0x6670ba65, 0x81fcefee, 0xae8187b9, 0x73c3baa9, +0x819e8123, 0x9cfbc6aa, 0x7f89c73a, 0x7fde9812, 0x97136581, 0xc38181e6, 0x81de9c0c, 0x4994ab0e, +0x30977f06, 0x59dda72a, 0xc9f87fd1, 0x8186b4d7, 0xba86de81, 0x98a24c3b, 0x12157f3f, 0xd7674b1d, +0x81816042, 0x8da8926e, 0x397f81f6, 0x3dd281b1, 0x7f6570ba, 0x7f875412, 0xd74f5be9, 0xab81f207, +0x7feaa863, 0xab81da0d, 0x7ae79023, 0x357f8111, 0x654a468e, 0x521c2306, 0x2f817f37, 0xdb818a41, +0x50b5b30c, 0x71817fdc, 0x7f7f7f04, 0xb13471fa, 0xd1843f7f, 0xb700ece6, 0x109064ea, 0x989b4b03, +0x27556fd8, 0x5ecee700, 0x5f5a2281, 0xa81c81dd, 0xac54b6bb, 0xe60f1ae8, 0x139dc4dc, 0x22818109, +0x2c7fc74f, 0xa69cf331, 0x9d272281, 0x7f9a6da8, 0xb1bb8f45, 0x81815a6e, 0x8315517b, 0x638181f0, +0x273db266, 0x90777f18, 0x047d763a, 0xbdf50a4e, 0x7f5f5c12, 0x817f7f53, 0xcb177385, 0xb2ca7f22, +0x818eaa17, 0x815d4c81, 0xa67fc281, 0x7fd856eb, 0x01becb84, 0xa8e2685d, 0x7fadbe7f, 0x1b7f6a05, +0xef47f495, 0x817f1b1b, 0x8c8d0b81, 0x57b9a5d4, 0xdc298159, 0x5e81a7e2, 0x81467f5b, 0x370f6df0, +0xc49c30a1, 0x7a545710, 0x974b81ff, 0x458c814a, 0x237f17dd, 0x427fb6da, 0x1a7fe5de, 0x817f8121, +0x817f1c96, 0x9c817f90, 0x0e7fd365, 0x818aa15b, 0x7fd302f2, 0xdb7c138e, 0x7fe68181, 0xbf818112, +0x7f2e7fc8, 0x81728101, 0x6482d830, 0x59e24b0b, 0x9b67c284, 0x6e811018, 0x81a42c32, 0xd87a4da2, +0x817f2d41, 0x3e2fbce2, 0xd1d44623, 0x7464b44c, 0xcc255f95, 0x56c93b38, 0xa87f1491, 0x04819c5c, +0x7f457fd8, 0x8d6bb866, 0x819c8181, 0xbc118166, 0x3d4c2a5f, 0x7a6d51fe, 0x79065067, 0x8181d1fb, +0xff6f2b08, 0xf5be7f35, 0x9fa567f5, 0xabb581b4, 0x81819a5e, 0x7f8187c5, 0xaa7f5669, 0xdf526044, +0x7f6ea5f5, 0x7f3a68c7, 0x4feb7fb5, 0x627f2850, 0x39f49181, 0x71ec22ea, 0xc17f4c44, 0x56f4db23, +0x7f08cc95, 0x977fde95, 0x7f4f7f81, 0x81e07f1c, 0x5e7c7fe9, 0x1c3534ce, 0x7f907f2b, 0x7f83418b, +0xeb81daec, 0xa6fc892a, 0x757f7ffb, 0x6281cc2c, 0xb826cecb, 0xc7810a2e, 0x60d1906e, 0x7f8175ed, +0xd085cb36, 0x88c4811a, 0x5e3e707f, 0xaba57fff, 0x099c127a, 0xbac67fb7, 0xa9817d82, 0x4f6c7faf, +0x43d17a0b, 0x92a13dc8, 0x81995d8d, 0xab7f90fd, 0x5f1f8189, 0x767f8101, 0xb7caa2bc, 0x7f8177cd, +0xe0655857, 0x81cfebeb, 0x81af6fc0, 0x57ac6dae, 0x437f8176, 0x513c60fb, 0x9ef3c081, 0x78d0d12e, +0xa40c7f0e, 0x438101c0, 0x81816405, 0x6f527f04, 0x8d0fa47f, 0x6d7fbb7f, 0x39187f74, 0x3c7f5f06, +0x677f7fdc, 0x8114250d, 0xe08373c7, 0x9c7f7dd8, 0x816341a3, 0xdf7f073e, 0x7f818174, 0xca84e8ff, +0xd6ff70ef, 0x7fa1a3c7, 0x7f7f8148, 0x81de7fa2, 0x4d323671, 0x5aaafbff, 0x05ac7f7f, 0xd58102e8, +0xad6c45e4, 0x81677f27, 0x818132ce, 0x7fa55a1c, 0x553029ce, 0x81a47f06, 0x81ca6189, 0x5cd581af, +0x70f34733, 0x676d431f, 0x81387f66, 0xef916df0, 0x72099950, 0x867f81fe, 0xaa7f657f, 0xd7521bef, +0x81d573c6, 0x7f76bcd6, 0xaba4c10b, 0xe394b7d7, 0x82579781, 0x88f5715a, 0xf7815cda, 0x65817727, +0xeab07f22, 0xbb5f7c40, 0xc0a48139, 0x95442a2d, 0x857f7d81, 0xcd7a81ee, 0x7971819e, 0x3a31f0fe, +0x537f6181, 0xc307bed6, 0x8936627f, 0x98b18136, 0xd07c817f, 0x7f7f8126, 0x133a607f, 0x98d40015, +0x368a8123, 0xe181501d, 0xc9817681, 0xa27b2e00, 0x47dd81e1, 0x0e7f81d3, 0xf3287fce, 0x7f3400c9, +0x8d65c745, 0x4c8148c4, 0x21817f7f, 0x81ac0af0, 0x4462c1fa, 0xa99e4e8e, 0x7f153ad8, 0x8168bb47, +0x8370e19d, 0x7f3281ca, 0xf2437283, 0x667f279d, 0x9cb4c17f, 0xde814315, 0x72d3a17f, 0xac113b66, +0x6c13abef, 0x7f816cb5, 0xc8c7c37f, 0xa7d1862e, 0x8b7fb87f, 0x9dd9a384, 0xb69b22f0, 0x157f710a, +0x9007c13f, 0x4518caf0, 0x836c4246, 0x03f981d1, 0x817f7f7f, 0x4581b92f, 0xb4718193, 0xa8815e05, +0x437f81fe, 0x52817fdd, 0xb1477f54, 0xc12e3cba, 0x7f81815f, 0x4e737f32, 0x817fc141, 0xa67f7f58, +0xd19dab37, 0x8b9eb14b, 0x7fe8be30, 0x905d7fba, 0x16ae520b, 0x81015d10, 0x71812450, 0x1de37f1b, +0x811fa6af, 0xdf77b8e9, 0x647ff1bf, 0x17be7fbb, 0x817f6224, 0x8115e99f, 0x7fca7f7f, 0xd48f0fa2, +0xda7fc4ac, 0x10649756, 0x2f89af26, 0xdb5f3ec4, 0x817fde7f, 0xbde94df1, 0x9a707fb7, 0x7f7a656b, +0xfad88c3f, 0x7ccc7f5c, 0x7f8cc477, 0x7fc26452, 0x28c7812f, 0x85b7a1ab, 0x818181ad, 0x404ce719, +0x540fe3e5, 0x705bf0fd, 0x6206a54a, 0x89486861, 0x75e25f81, 0x3c9bc93d, 0x3457c36d, 0x57ab2f25, +0x3cd9bd13, 0x81769cbe, 0x87557fae, 0x025c7109, 0x05457f64, 0x5f427f13, 0x5c7f26be, 0xb9818130, +0x34e63305, 0x8a81ebcd, 0x673326ba, 0x05647ff7, 0x818b8181, 0x8c81782a, 0x4bc0b30f, 0x759749c7, +0x399e99f6, 0x7fdb4313, 0x9c7f5cae, 0x6cc2a611, 0x811dab81, 0x7f7f413b, 0x4fb37081, 0x818c8164, +0xac4c01d8, 0x1f63813e, 0x81db7881, 0x8194404b, 0xcc9bc55f, 0x542900eb, 0x87ff34c5, 0x507f7fa2, +0x7fd97f03, 0x79e428e3, 0x2f7f7c6c, 0x57813f13, 0x7f7f817a, 0x61c40926, 0x68a9457f, 0x63ea9f2f, +0xea81a8ec, 0xfd81301c, 0x81cd8181, 0x812cf7fc, 0xc996b697, 0x81895df8, 0x8d4ae3ca, 0x4c5de834, +0x81643d19, 0x202babce, 0x55a89081, 0x64ba81f9, 0x7481db7f, 0xa0eba6bf, 0x81c12ee3, 0x8181a75d, +0xc8e9939c, 0x0981295a, 0xf22e527f, 0x817f3314, 0xc4f17f5e, 0x8c83651a, 0x7f74a17d, 0xbdd28405, +0xb6bc4795, 0x388c7cdd, 0x957f7f7f, 0x1db7ec29, 0x68f59c45, 0x8142eaa1, 0x81f0b543, 0xa48163fe, +0x81d08134, 0x7d673f5d, 0x8ecdcf94, 0x6e56195a, 0x7f222687, 0x7fd8fb10, 0x81aa977b, 0x22014258, +0xd541be81, 0x817f62fb, 0x707fea79, 0x7f817f60, 0x4b7f3c7f, 0x60a4032c, 0x1c68c2ae, 0x7fc27f19, +0xd5a55cd4, 0x09a651f4, 0xb5447f7f, 0x7f815bfe, 0xe681d381, 0x1781f900, 0x8eb6b0d7, 0x1d90fdf8, +0x528147c4, 0x816b7f46, 0x7f6381c3, 0xd5d2088b, 0xcce4ae52, 0xdf4ec304, 0x967e5e1f, 0x567f1439, +0x317f810a, 0x815f814b, 0xe13ee67f, 0x7f8177a3, 0xac69c42a, 0x7f5837e7, 0x61b481c8, 0x777f812f, +0xcea38116, 0x6b6b7f37, 0x8feac838, 0xf9457f3c, 0xe5107f74, 0xcc957f56, 0xa3ab7f81, 0x81817f6e, +0xc5817f2b, 0x197d0d99, 0x7ad0c84a, 0x81ada865, 0x81b31c81, 0xee7f9b54, 0x815a3406, 0x3f617fce, +0x3d4db8c2, 0x5ac39e72, 0xd390812f, 0x27c6ede7, 0x6f69d981, 0x2981f141, 0x7faa2681, 0x787f6668, +0xc24ec00e, 0x7f008142, 0xfa811aad, 0x2d567fb0, 0x5adb7f65, 0x8a864fc5, 0x6d817f85, 0x307f7f1f, +0x5c817f47, 0xcc7f43b6, 0x9bb08159, 0x496f7f2f, 0x41e383c2, 0x4e7f7f88, 0x71ce63e4, 0xe07f4c7f, +0x857c58ad, 0x8599641d, 0x655c687f, 0x97a64fde, 0xdd42707f, 0x29ced6b6, 0xdf25c153, 0x7f047fbb, +0x7c5f462e, 0x61d08548, 0x7f7fab7f, 0x48b1ecb0, 0x93c63349, 0x039c7fe3, 0x817fce1a, 0x29bb7112, +0x7f3bbaf0, 0x81818d2f, 0x7f5b3d41, 0x1fa18160, 0xc481af81, 0xfc818130, 0xdae2bd73, 0x4d3c81cc, +0xa47f5f0a, 0x5e3ad1a6, 0x1a816eab, 0xb307dbd0, 0xa8798b88, 0x7f81252a, 0x6d7f2899, 0x4d7fa214, +0xc375762c, 0x7fb655ab, 0x5bb98185, 0x1381682c, 0x5281ca7f, 0xc56d7fc8, 0xa81d8170, 0x8daa50f4, +0x8bbf7f03, 0xcf7fb0c2, 0x3b733caf, 0x7f756442, 0x8c81353c, 0xf7e82f0f, 0xa5a620f2, 0x8ae39fea, +0xada55ad4, 0x74f1de4c, 0x37714753, 0x538193e3, 0xb1811481, 0xe5bd81cb, 0x70fc4ea8, 0x888473eb, +0x30b57f1a, 0x90c3f010, 0x81817577, 0xea8c4ae4, 0x6977547f, 0x549481a8, 0xf27f54b8, 0xf87f7fd3, +0xef81843e, 0x5a437fbb, 0xa77f8181, 0x77354c05, 0x9781667f, 0x7fc2ae7f, 0x0b81b868, 0x1267b5e3, +0xa0de743b, 0xb4cce348, 0x8192819d, 0xf0817faf, 0xecc781ab, 0x7f57af2a, 0x499e13c0, 0x7f3d632a, +0xac96fcc8, 0x81727829, 0x7f7ff281, 0x81819bb4, 0xc5bfd358, 0x76553120, 0xb57dbcb5, 0x9b425d12, +0xb0814cc1, 0xea3d393b, 0x1dde5e27, 0x03a6f127, 0x39a9a981, 0x94304751, 0x3af97f00, 0xceaa49d8, +0x3c8124d1, 0x7f24b547, 0x2830e08d, 0x3d7a8f0e, 0x456ffc4c, 0x814e7f4a, 0x357f817f, 0x7f61bc51, +0xd7097f44, 0x213ecf47, 0x815281bd, 0xa9a58187, 0x0c3cbfb2, 0x18f92fa4, 0x307f7f52, 0x727f3361, +0x6cdc8e37, 0x7f9d9e24, 0x64466e7f, 0x2491328c, 0xd58181cb, 0xc97ff4b1, 0x1890627b, 0xa48168b3, +0x7fad44dc, 0x411b7f43, 0x6681647c, 0xc5171bcd, 0x4a6d7fd9, 0x7e369d2b, 0xf8124f61, 0xa71515f1, +0xb381ec09, 0xc4ab71c0, 0x9e2e977f, 0x7f7f0d58, 0x1cdb7b16, 0x81f87f81, 0x517f7f60, 0xf4a3ea33, +0x5c2112c3, 0xc67f7e06, 0x9d7f78c6, 0x811730e4, 0xa29b6170, 0x81817fd1, 0xb6637f87, 0x4f1c540d, +0xe57f7707, 0x277d5c28, 0x7f817f21, 0x5e31e1ab, 0x7f81cd81, 0x815daab2, 0xec5284bc, 0xb45d7b63, +0x7f4d815e, 0x0860494f, 0x81874034, 0x81d0f00a, 0x5b4274ea, 0xdce04fd7, 0x8188680f, 0x827f7fc7, +0x8137e715, 0x9f7f6699, 0x786e75eb, 0x8253202d, 0xb2813ddd, 0x7315a11a, 0x81c18164, 0x7f7f8141, +0x6870da25, 0x117f3efd, 0x7f1c5f1f, 0xcb6d63bf, 0x45561890, 0xc3df8136, 0x23275f32, 0x81817f5d, +0xa50f7fde, 0x7f3ba6ae, 0x37a4bbf4, 0x81a6fd1a, 0x9b9bb6ec, 0x8b2cff0a, 0x2035d781, 0xa1c47fce, +0x095dee2d, 0x7f3a2d51, 0x69727f7f, 0xec8aad61, 0xb0dbcc42, 0x2e706fee, 0x962a9d53, 0x81814554, +0x759026dd, 0xb38851cf, 0x817fa70b, 0x7f462fb9, 0xcc7faf23, 0xa2981632, 0x3e8d8160, 0x07815dd2, +0x82817f22, 0x5a755325, 0x45c77f81, 0x81653cac, 0x93f73dd9, 0x3d81c4cd, 0xf67aa181, 0x467e7f1f, +0xe6c10cfa, 0x9bd4c12f, 0x6c51ca85, 0x4d7f2835, 0xc0bb341b, 0x81812aed, 0x87a181be, 0x4f7f7f6d, +0x81c9e3c4, 0x117f95bf, 0xd457e634, 0xb84b567d, 0x5618f922, 0xda7fc1ed, 0x7f7f81d6, 0xa07da0b1, +0x2e627f0a, 0x814ee836, 0xb65bff90, 0x3e29b6de, 0xb1b78f5d, 0x1724a1f0, 0x81484221, 0xe16d7fb6, +0x578181f2, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 + +hard_output0= +0xb5bc6ac8, 0xf5373664, 0x1310345c, 0xd5bae4e7, 0x1fc9e83e, 0xebfdfded, 0x84bd86ab, 0xb7aabe00, +0x60b44fea, 0xb9067464, 0x30325378, 0xa9195955, 0xf70c6e5c, 0x90922632, 0xc90b1cdb, 0xf2f5fb69, +0x73056b63, 0x1a33bf3f, 0x17755b5c, 0xc58bff6d, 0x2f4390b2, 0x2869d508, 0xe7c7dfe8, 0x38552963, +0x21da5367, 0x07282b9b, 0xa4767105, 0x1e294251, 0xe350a940, 0xb8a6aa27, 0xed12d778, 0xf10d9ece, +0xab93527f, 0xcf2da7e7, 0x68f6d0b1, 0x811f4bca, 0x577b06b2, 0x3234f13e, 0x30bab7df, 0x8dc47655, +0xbb843bed, 0x86da3aba, 0x30950c97, 0xdd096d7a, 0xa871fd6c, 0x8bee4e6b, 0x8fea30d0, 0x6c05b4d2, +0xf3e144d3, 0xd24ebb1f, 0x065635e5, 0x8d3f2cf9, 0x536c6c6a, 0xfbb0a5d0, 0x3d707b42, 0xc44d5982, +0xa5f4ad8f, 0xf32c0970, 0x1bccf1a6, 0x05916020, 0xa64fb176, 0x5ede6a35, 0xaf4966da, 0x9df5e0e7, +0x75042abc, 0x9ef10481, 0x11ddcbc8, 0xa0f5518c, 0xd5c23418, 0x2393d558, 0xfbe7dfeb, 0xed1c64c2, +0x86a36508, 0xde2dfb1e, 0xb8d0fef9, 0x24505232, 0xc894e71c, 0xbcc752a0, 0x40b74e83, 0x90d23c8c, +0x728e4a61, 0x108f0b08, 0x66f522ee, 0xc258d851, 0x35a31c44, 0x11311b5b, 0xfd3d5be9, 0x5ae448ff, +0x4f64994b, 0x5b8247a9, 0x4021114d, 0x2f0b6e82, 0x5eaa9828, 0x50ac71c0, 0xfb86ee52, 0x0dc1ac9b, +0xbbd47645, 0x8f357115, 0x978ceea0, 0xd557db99, 0x99b30388, 0xfc9a8a1c, 0x0f75be1a, 0x50143e22, +0x8840989b, 0x738ec50e, 0xe6b2783d, 0xf67899c8, 0x27ebed69, 0x6c415a16, 0x3a6cc2dc, 0xcd4e4e5d, +0x6cb12b2e, 0xdb88d7c0, 0x79cd1582, 0xbc422413, 0xe72ad2f4, 0x8eaac30f, 0x0bd86747, 0x6d87f69d, +0x15d62038, 0x4b375630, 0x0d51b859, 0x16db2cb2, 0xf210603a, 0x0abeb833, 0x55c694d0, 0xe57ca43b, +0x0ba94428, 0x1398a406, 0xe47d3889, 0x5a20203d, 0x250d7a1a, 0xd930ffec, 0x03992e79, 0xf2759376, +0x024ec121, 0x91fc3a2c, 0xb7e11cc5, 0x4ff7d459, 0xb8700134, 0xd6e61758, 0x4eba0a32, 0xb747e3ec, +0x7073fad7, 0xded80f99, 0x331e2f1b, 0xfa1f1bed, 0x056424a2, 0x1d1d95e0, 0x550b9ec8, 0x51ee2a38, +0x19525153, 0xd70c4cd5, 0x0d6cd7ad, 0xe44d1cf2, 0x30dfecda, 0xdacd7fe8, 0x7321d795, 0xddf48ef4, +0xe271e6a4, 0x9c1feecb, 0x951fcd7b, 0x8acc5a03, 0x3fb83527, 0xe306de74, 0x7b9cd6ee, 0x8e140885, +0xd4c91e8d, 0xe8c39733, 0x0f02f87f, 0xfb06b1b9, 0x0dc9349c, 0xf76bae8e, 0x4f642a07, 0x3d48a9aa, +0xe3ea323a, 0xa1cd5c8a, 0x40aa0e70, 0x132042d3, 0xa9732f6c, 0xd15a00c4, 0x43d3b046, 0x9a51ebd4, +0xc46ee0ed, 0xe2a2148b, 0xf5c478f0, 0x1fb01cf3, 0xf4f321ec, 0xd973811f, 0x11ad11b9, 0x5c67adda + +e = +34560 + +k = +6144 + +rv_index = +0 + +iter_max = +8 + +iter_min = +4 + +expected_iter_count = +8 + +ext_scale = +15 + +num_maps = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_negllr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_negllr.data new file mode 100644 index 0000000000..b5ef624616 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_negllr.data @@ -0,0 +1,1224 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation +op_type = +RTE_BBDEV_OP_TURBO_DEC + +input0 = +0x0a45ef00, 0xb2bdc60f, 0xc810d206, 0xf21cc300, 0xb0c93da1, 0xaae019d7, 0x23ba3c29, 0xa61d1e09, +0x202906d1, 0xd2b61ef3, 0x59e7f241, 0x2ec8daec, 0x68015520, 0x0912f4a3, 0x01282329, 0xa1fd1439, +0x0701231b, 0x0fdcba0a, 0xbe97c6c3, 0x0438e652, 0xd5f644d4, 0xbd0e5f4b, 0xfcb6d0d4, 0x0825b15a, +0x362e2fc8, 0xbbd5abda, 0x0df8c12d, 0xd016b5de, 0x1e439a0c, 0x44c94242, 0x00e2e8c5, 0x0639d241, +0xef6aa40b, 0x90de9def, 0x43e0ea14, 0x31dd07cf, 0xbad70a05, 0xcffc228a, 0x00293bd7, 0x6038080c, +0xdaeb3e20, 0xdd260c4c, 0xaa41fb3c, 0x6eeef0d4, 0x5b02c0f3, 0x14d6ac69, 0xfef0ce44, 0xc5abccf2, +0x2a0f00c4, 0xd6cadb30, 0x38e212cf, 0x5e9abc29, 0xf105fce4, 0xde34e024, 0xb9d42365, 0x281eb22e, +0xb219c055, 0x6504b01e, 0x465602ab, 0x1233a4e7, 0xa9ebf4cf, 0x63c1ed3f, 0xdbe9b71f, 0xf994579c, +0x22f359b5, 0x3606379d, 0xae30fa1e, 0x1d6e290c, 0xc6e0440a, 0x2f129132, 0x1b317bf6, 0xcfdbc119, +0x32022857, 0xaef168dc, 0xa1251d37, 0x65eec43b, 0x9630e70e, 0xe9e1fd98, 0x3e02d8ab, 0xf348af3e, +0xf7b0f027, 0x2ff021db, 0xecae5bd4, 0x1b2f3e34, 0xbb2511c0, 0xd611ddad, 0xf951d2d6, 0xb1dd0191, +0xc325cf35, 0x58bdf4b7, 0x36094dd7, 0x07cd3b44, 0x02c4ae4d, 0x812af6d9, 0x32f63731, 0x31103329, +0xac0033ff, 0x817f583f, 0xc4817f88, 0x8d81790a, 0xa6a2817f, 0x7f81910a, 0x7fc5ed7f, 0xbf2f7f8d, +0x7ff14707, 0x49cc3bda, 0xb04d5a2d, 0xd8d392b0, 0x7f69d3e1, 0x83ae43ad, 0x99b7da75, 0x3a7f7fd3, +0xd46d6fd2, 0x4f7fc524, 0x137f812f, 0x587fcd8a, 0x81c481bf, 0x9caa6184, 0x0bc3a499, 0xe2901a23, +0xfeb59b6f, 0x7f818171, 0xf68ed39d, 0x8113a975, 0x81dd6681, 0x7ffe707f, 0x5836757f, 0x48a98122, +0x7f724081, 0x81588447, 0x59f8b799, 0x7f6dbab0, 0x817f8f09, 0x13c3ecb6, 0x7ff98d64, 0xc4911e81, +0x33922f9b, 0x05c9e85c, 0xa19071b3, 0xec1ca24e, 0x02a48181, 0x813b8196, 0x7fca7d51, 0x7f81814d, +0x00815911, 0x242a7f5f, 0x29d6ee98, 0x8a61887f, 0x4e815e7f, 0x773e811d, 0x8e65d1a7, 0x8d514860, +0x3081b248, 0x7f2393ab, 0x815d2e31, 0x817f4be2, 0x81818519, 0xa07f677f, 0x0defa853, 0x22811c4c, +0xbe81d32d, 0x2d7fdc7f, 0xd8f3195c, 0xf69bc13a, 0x7f7fdae1, 0x2a56717f, 0xd4811c7c, 0xbe218c81, +0x81a556d3, 0x3f43a8c4, 0x6a95b0cf, 0x427f79db, 0x959cbc5c, 0x9f00dd19, 0xa1e8c5d4, 0x59814997, +0x4e35eb7f, 0xf87f348b, 0x76749124, 0xab7f7f1c, 0xf0816c81, 0x8c62b45d, 0x744ec34f, 0x329a7fce, +0x9048b815, 0x0076dcd0, 0x812d2981, 0x98d5cb15, 0xd29652cc, 0x2cd15e33, 0xc2557f91, 0x03517f6a, +0xfc1cc134, 0x0f7f6a00, 0x81939c0e, 0x7f4677a9, 0x7f597f5e, 0x4f972a86, 0x81b2ab81, 0x207f7f69, +0x85b9b234, 0xc1857fac, 0xedaa7c08, 0x7f50057f, 0x7f1dc26d, 0x7fa47f81, 0x7ff57f76, 0xb3bca5cc, +0x6b31d550, 0xce3a6583, 0xdac01f7f, 0x81184838, 0x65239c09, 0xde415bf5, 0x7f7f3881, 0x097fdc7a, +0x81698160, 0xa8da57db, 0x3281530a, 0x628d057f, 0xad7381f2, 0x18a35579, 0x3d909f7f, 0xbf7f7f81, +0x8181eb36, 0x6bd45881, 0x578c7520, 0x417fdc89, 0x307f5bad, 0x667f8181, 0xe1b44f6e, 0x817f7f2b, +0xd55cb62e, 0x8aa0ab9a, 0x81e42e47, 0xbc925270, 0x77aa4a90, 0x56247581, 0x8ff5f670, 0x7d7f9cc7, +0x3a013a2e, 0x10810005, 0x815eab7e, 0x812fe1c6, 0x81f0b47f, 0x7f2b8c03, 0x7f7fc07f, 0x7e497281, +0xd1d70cd5, 0xd981b501, 0x0c63b57f, 0xd8a8ea7f, 0xdeaece7f, 0xa08107f0, 0x9f54e62e, 0xa8cfc431, +0x7f985ee1, 0x811ae887, 0x7f81df4d, 0xc081d1bb, 0x81a15a9a, 0x7f44bf05, 0x037f057f, 0xf22c7f9d, +0x7f7f7f7f, 0x81856e03, 0xbcb08381, 0x46bb372d, 0x7f7bd59c, 0x8157e815, 0xa1910b3a, 0x5c537f7f, +0x3e81717f, 0x4851ac7f, 0x813b7f83, 0x867fb25e, 0x098131ca, 0xb06fc77f, 0x7f60e97f, 0xa25f5c46, +0xe82eae48, 0x40bf987f, 0x817f81e2, 0xf5b2c831, 0x810597de, 0x045c7f4b, 0x81e33f36, 0x81aaf35e, +0x81817fc6, 0xe700587f, 0x93b37fea, 0x9f81fc97, 0x4def727f, 0x6bc07fe7, 0x7f811076, 0x81248175, +0x0a7e5cf6, 0xcd7f7f81, 0x7f49f37e, 0x8181917f, 0x7f70df81, 0xd17f81b5, 0x1f6b4ef7, 0xa21d6b8b, +0x7fb0461a, 0x5c027581, 0x81819bb4, 0x816ee78f, 0xad7f817b, 0xe481a10a, 0xa1cb8d81, 0x32813e3a, +0x947f7f81, 0x8184bff3, 0xa96cd072, 0xeb0c5881, 0x814ab385, 0xe3f67f7f, 0x584a81c9, 0xdbc5c781, +0x78816e49, 0x817f8a81, 0x7f3f7fff, 0x56d89f40, 0x4397e427, 0x7f29b20d, 0x7f597fad, 0x35817f65, +0x0a7f3b19, 0x61c97f81, 0xc6817a65, 0xaa5ceb7f, 0xfc427fef, 0xb8684c75, 0x447fbaa3, 0x4d7fae7f, +0x8196e3bb, 0xe1588132, 0x7ff27f34, 0x8173bff4, 0x7f705f6d, 0x7f7f817f, 0xa353354c, 0x7f58ca67, +0x7a5a7f9c, 0x1e81ee7f, 0x98d681d9, 0x9e60c443, 0x7f7f39a3, 0xc79bc87f, 0x3ae8827d, 0x9f812e81, +0x7f6f8170, 0xa987947f, 0x2481aa81, 0x538fdd7f, 0x237f1442, 0x14e99a84, 0x6e62b068, 0x7b810541, +0x73a57fad, 0x69977881, 0x9be9cd7f, 0x9a48537c, 0xfccc7f47, 0x7f40a457, 0xbc63b4b8, 0x74bb447e, +0x36817f12, 0xd371cd1f, 0x7f1ed17f, 0x36624bbe, 0x726c811b, 0x4abe5c58, 0x81de39c1, 0x7b5ae996, +0xaa818105, 0xa881bebd, 0x5e7f6edb, 0xa8d08165, 0xd495f17f, 0x7fd06098, 0x7fb157fc, 0xc0f661d3, +0xd09f812a, 0x7f8ef77f, 0x69477f00, 0xf45f8481, 0x0f7fa07f, 0x97f17f7f, 0x6ceaac7f, 0x7f7f8163, +0x7fbcbe98, 0x698b697f, 0x79c0da81, 0x8b81e681, 0x81817f36, 0x6b814881, 0x7f918ec6, 0xb67aed0e, +0xc5020b85, 0x81ee8c18, 0x7ff650a5, 0x814f6233, 0x508139a1, 0x814e6aa1, 0xa055487f, 0x3ed75817, +0x4f7f81da, 0x1ddcfa81, 0x7f7f1dbc, 0x825b6454, 0x2ee6819b, 0x73eb6861, 0xf7fe9516, 0xe3816dc5, +0x527f3f7f, 0x550d8fb9, 0xf3f82681, 0x5954b562, 0x7e7f20bc, 0x817f6b4f, 0x8108bc22, 0x17fb8113, +0x7b040f33, 0x586282d5, 0x078c5c7f, 0xe17fc493, 0xdd813545, 0x9ba17f6e, 0x7fccfad5, 0x916f7fa3, +0x21ce7f1f, 0x1a037f81, 0x8e4d0081, 0x7a360731, 0x167fd77f, 0x96762a84, 0xca5660e3, 0x45f0d87a, +0x7fd151ae, 0x9e7f22a6, 0x7f817f8c, 0x1501b9cb, 0x886c4184, 0xea627f6c, 0xc53e7f08, 0x1a63d6eb, +0x481b4a73, 0xca816575, 0x167f7f7f, 0x15814549, 0x6d985e81, 0xa60b1f62, 0xa1818181, 0x33af7f7f, +0x816c7ff7, 0x7f81b67f, 0x08602281, 0x9a81815b, 0xe6787f3f, 0x7aba4f81, 0x5015817f, 0x1d02d55e, +0xbaf3e826, 0xc34ca8cb, 0x503e7c82, 0x647a7f60, 0x7f810873, 0x81149d63, 0x7f818181, 0x7f7ff3d1, +0x11d8dce2, 0x7fe3634c, 0xb63c535b, 0x810e6181, 0x81277f54, 0x817fa2dd, 0x34c34476, 0x848a65f8, +0x96f911b0, 0x9aa76464, 0x8200816e, 0x6d7f56a6, 0xcdb9e57f, 0x874e836a, 0x93a363a6, 0x41c09883, +0x8144c072, 0x52a77fef, 0xe8ded5e2, 0xf6857f81, 0x81b79f4c, 0x7f7f71a2, 0x2b5852bc, 0x1f7b43b0, +0x4c5aa37f, 0x557f3d2a, 0xa17fb581, 0x7349d204, 0x4042ec2b, 0x89cd96bb, 0xd3368281, 0x7f7b8181, +0x0f28f5cd, 0xe8aa4d23, 0x88628b33, 0x8181817f, 0x758197af, 0x37b43b4a, 0xc081c1a5, 0x8e3c4881, +0x7fcb0983, 0x55fe14e4, 0x734c7f20, 0x89267c21, 0x7781a4b7, 0x7f7f4eb3, 0x81ac8fa2, 0xddc20981, +0x7f9b2659, 0x2d7fc65e, 0x818181e8, 0x6a176a89, 0xaa7fb68e, 0x5c5446d2, 0xda7dcc81, 0xc3a5e054, +0x7881477f, 0x7057146f, 0x00764b7f, 0x7fa87f7f, 0xa4ff8181, 0xf07f7f7f, 0xa37a5cd3, 0x28a881b1, +0x13e0cb4f, 0x8f7f9804, 0x3d343181, 0x567fda8a, 0x5828c7d0, 0x434fe70a, 0x7fd5fe78, 0x1f818181, +0x686103cf, 0x62aab5ee, 0x5506cb88, 0x5428ad7f, 0x51908c1a, 0x6d5db4ef, 0x3f7f686a, 0xa6a15a8d, +0x917f7f53, 0xb77fea86, 0x7f816aa2, 0x6ae581d7, 0x54ad634a, 0xd59ca328, 0x6d815bfa, 0x5f470046, +0x23818188, 0x817a9419, 0x7f57dc81, 0xb02a81ad, 0xe986757e, 0xd9810681, 0x81f7be26, 0xbcb5cf7f, +0x63776b56, 0x4358bc47, 0x528aa47b, 0x9e7f7181, 0xd0818100, 0x0d811a7f, 0x7f818155, 0xbe207fc3, +0xb70d393c, 0x812bbd48, 0x7f7f7d0e, 0x81b5ab00, 0x1ecb8681, 0x24c67fcd, 0x2fc7ed01, 0x5503a881, +0x7f3d7fb4, 0x9a81559e, 0x6508d5f4, 0x08b56b7d, 0x96d84e10, 0x7fac9ec1, 0x817ca281, 0xd9b01081, +0xaf81d3a7, 0x8102b34b, 0xa0f98181, 0x7f7f929e, 0x3cf6d023, 0x990ed581, 0x147f817f, 0x81483a81, +0x68375130, 0x487f1451, 0xa0973d81, 0x87d4d4f7, 0x90633e22, 0xbc7f45e0, 0x2c4ea77f, 0x0811896e, +0x8d7f52e9, 0x8120aeb0, 0x3d159d81, 0x93cb0097, 0xce81bb81, 0x74194855, 0x4e7f3f26, 0x817f819f, +0x4531814f, 0x517f7fbb, 0x4981a87f, 0x4c810f4e, 0x3239b67f, 0xa17f194c, 0x81e58e81, 0x7f4890e5, +0xb07ffa3c, 0x937fa181, 0x447fa516, 0xbab5000e, 0x887f7f7f, 0x8181b17f, 0x7f82d4ad, 0x7f828159, +0x81b35c57, 0x23bcb1dd, 0x819446c7, 0x7fbf9ea6, 0x817f7fc1, 0x33817f81, 0x5cfe7fb6, 0x7f81fc61, +0x91477f4c, 0x88994381, 0x65bb447f, 0x198d61ae, 0x817f9f7f, 0x557cbcb8, 0x81fab781, 0x1bab3f7d, +0x7f812298, 0x7f44fadc, 0x1dc1c665, 0x7fde3a8d, 0x94c37f2b, 0xc7d8eb23, 0xdaae8181, 0x129c68bc, +0x7f819111, 0x7f32ce2c, 0xf0d17f02, 0x7f6a817f, 0x5cd564e0, 0x7f7fc47f, 0xd6995c9d, 0x70a7d476, +0x3b7ff299, 0x7f2f237f, 0x4381ac1f, 0x0bd67fb2, 0x81ba594d, 0xa6777fd5, 0x881cc254, 0x8189977f, +0x7f813b3e, 0xc17f7f7f, 0x3baa3dc9, 0x81007f57, 0x7f810295, 0x81f7a1c3, 0x7f65de7f, 0x4ca87f53, +0x407f81b9, 0x7f436fa6, 0x399f9581, 0x7f177f86, 0xbc698194, 0x447fd081, 0x81663d37, 0x01faee9b, +0xc485ff7f, 0xed6ff281, 0x4c6713c4, 0x28b0487f, 0x7f88e8c9, 0x8169016d, 0x7f7f71dd, 0x474bf37f, +0xb756b143, 0x95caeed0, 0xec7f872d, 0x437f23e1, 0xb42b3030, 0x662f8d76, 0xd4818f71, 0x8161fd50, +0x8863663e, 0x78256b06, 0x661b549c, 0x8e817fb4, 0x06b98354, 0x5a905ec1, 0xec960281, 0x2c30bbe3, +0x937f7f63, 0x6ade543f, 0x7f7f9f5e, 0x98dac336, 0x81327f73, 0x677f6d46, 0x637f5c7a, 0x82478181, +0xedbc9014, 0x9a7f431b, 0xb2d25981, 0x7f898181, 0x81815ab1, 0x2d7fa683, 0x7f03b2b0, 0x89bc7f18, +0x81947fb8, 0x1995817f, 0x78e54c17, 0x816cb1c3, 0x1a2681e0, 0xac3a7f8a, 0xdff245bb, 0x422ada81, +0x1ed1e07f, 0x7f6f5276, 0x8481db81, 0x9a817fe4, 0x1e132dab, 0x5c7fdf7f, 0x7d81ac7f, 0x937f7fe0, +0x49568171, 0x3f81907f, 0x81466896, 0x7f667f2b, 0x577f9a7f, 0x7fd73c0b, 0xc946df59, 0xd72f767a, +0xb51d326a, 0xc77f4f7c, 0xbc814bf5, 0xdae47fab, 0x40a64f73, 0x898188ea, 0x1c751c97, 0x7f8ed37f, +0x81b9585f, 0x6eb6758e, 0x5e11b233, 0xf0a47f81, 0x81709065, 0x447fbcc6, 0x58d1819b, 0x9fa36e74, +0x817fa9f3, 0x9f506f66, 0x81cd047f, 0x187f8136, 0x9d810500, 0x64cd8eb0, 0x7f817f7f, 0xf850e2f6, +0x81b61869, 0x606a66c4, 0x81638118, 0x20dca772, 0x6287b381, 0x8e056874, 0x086d99b9, 0x54438172, +0xb281697f, 0x5c470c16, 0xb0340523, 0x7f81b96b, 0x4451b8a1, 0x7f7fe6db, 0x57887f3a, 0x14438129, +0x927758ce, 0xe27fa16a, 0x8c30bd81, 0x7b7fff47, 0x41e58175, 0x35812462, 0xe7ff4358, 0xb4c04079, +0xa87c108b, 0x81aae151, 0x3d797f8e, 0x33007f3c, 0x27c2715a, 0x188c7fba, 0xb481e081, 0xe026d96e, +0x402d8185, 0x7066ffcd, 0xc5914e7f, 0x977f655f, 0x7f68b5d9, 0xcad3235d, 0xc77f8e81, 0x1cb4817f, +0x7f473044, 0x15168159, 0x7f5c81d2, 0x7f99bd6f, 0xb7ab0006, 0xf2487f41, 0xd2de0f82, 0x6a81627f, +0x2e8e87fa, 0x25187fb3, 0x6d31b393, 0xdd3d4b81, 0xa942a11d, 0xd21281d0, 0xe6b0e17f, 0x8a5646ad, +0x907f8124, 0x7f81d2e2, 0xd8c8e17f, 0xeb8b7f81, 0x3ad8bb1a, 0x7f7fbf81, 0xcb30ddf4, 0xa09134d8, +0x8187d2bc, 0x4949168a, 0x53998181, 0xd5e21412, 0x81811cb0, 0x11349a98, 0xdab2afe4, 0xd97f7f7f, +0x7f7f8181, 0x327e7fd4, 0x97818114, 0x827b6517, 0x5f0aabbd, 0x7f905b81, 0xafdde37f, 0xcd40cf7e, +0x7f56817f, 0x95810db2, 0xaf7fd131, 0x8181811a, 0x9e7f8f73, 0xe250d481, 0x7f2abb90, 0x5f7d981f, +0xb3257f91, 0xec657f2f, 0xfa815e3a, 0x6e223481, 0x6c00eaa8, 0x7fb19394, 0x8799c181, 0x810e7fde, +0x7d478181, 0x7fdc76bd, 0x035f8102, 0x627f447f, 0x7ff7ff7f, 0x81265db0, 0x6e81ac2c, 0x8802d277, +0x81c3f781, 0xec81d259, 0x817b7d81, 0x7a5b7f7f, 0x4953ab64, 0x896a52a0, 0xb28111f8, 0xd25d8f0e, +0x7f818174, 0x813f7f3b, 0x7fff7f72, 0x0fa87f88, 0xbcfad248, 0x507dd360, 0x7fae817f, 0x81f27f81, +0x72fa4d1b, 0x5a21d2a1, 0x6381817f, 0x5fb55ab3, 0x8ec3816f, 0x257f4ab5, 0x4c74ef81, 0x19a3f27f, +0x752746c6, 0xe17f8181, 0x7f7c8199, 0xdb9981a1, 0xcb984bd7, 0x815ea881, 0xdc50e0d9, 0xb9366f24, +0x7f455dec, 0x817cb181, 0x424856f3, 0x67ab02a5, 0x0081657f, 0x105e8191, 0xeab817a7, 0x3a7f6d5a, +0x425a1503, 0xeaac317f, 0x7fbe2cd0, 0xd2819a6d, 0x34887f6b, 0xef7f817f, 0xc3577f8f, 0xb124a664, +0x9981167f, 0xb4946031, 0xb8817f7f, 0x81c570ed, 0xc9c88181, 0x3a4cdf81, 0xd9514781, 0x8948c0fe, +0x2d5a8111, 0x68817f7f, 0x6be87f81, 0xa62c0381, 0x857f7fba, 0xa8c4ab7f, 0x279cc57f, 0x98816e0b, +0x817ff70e, 0x21536d81, 0x875ca181, 0x008164f2, 0x96955a53, 0x57a53917, 0x6517faad, 0xdecd7f49, +0x81819c32, 0x7f7fc25d, 0xfd81b181, 0x9f818166, 0x9c7f107f, 0x7f15b67f, 0x81636692, 0x18f276b5, +0xbb9d08e2, 0x6c25797f, 0x417f43fc, 0xd0a37eca, 0xd4702b8f, 0x5c72ba00, 0x7f9dcdbe, 0xd4ad8122, +0x39f1a381, 0x9b419181, 0xac816ace, 0xfb7c81e6, 0xdd7f7fb9, 0x2a27bb61, 0x3781499f, 0x7f6a7f93, +0x4bbf81a5, 0x4a07e527, 0xab4f8143, 0xc2703e81, 0xb1813d81, 0x81747ba3, 0x11cb7f81, 0xd7a385fd, +0xc9d0c981, 0x647fe554, 0x811d3681, 0x18817fdc, 0x81811bef, 0xd381845e, 0x466539da, 0x1081617f, +0xb5b99261, 0x56cd7f8d, 0xaaa79076, 0x7f814a81, 0x7f7fe313, 0x7f7f8170, 0x5df9817f, 0x102fe72a, +0x0c7f79ae, 0x4368d9e1, 0x6b0af013, 0xc13ed920, 0x98ed6a7f, 0xc494d37f, 0x81816a35, 0xc27f7f4f, +0x451a7f3a, 0x4c812e15, 0x032f49b1, 0xbd7f02a1, 0x507f0d67, 0x9c5f007f, 0x8712c21b, 0x6ba7385a, +0x7fb62c58, 0x7f818bcf, 0x7f7fc57f, 0x4141698d, 0x1e817f5c, 0x813fbe97, 0x6f817fa8, 0x51637759, +0x7f4ed17f, 0x81ac2c28, 0xf1c75bfd, 0x1463c260, 0xcb7f7fcf, 0x7483675a, 0x40eb7f7f, 0xad7f81a2, +0x7f817f50, 0x66816683, 0x407f8c81, 0xaf8190b3, 0x81d347f2, 0x5a215a81, 0xca7f8132, 0xd0528ef2, +0x8129c3a0, 0xa4a7c52b, 0x0b816383, 0xbc7faf5d, 0x38d34e66, 0xff65a68b, 0x817999d7, 0x5a620463, +0x885a817f, 0xad947f81, 0x7f1c902c, 0xaa0e9003, 0xd7ccb971, 0x64a68198, 0xb2337f11, 0x81a4d5dd, +0x817f81fd, 0x7e814f81, 0x817f3da2, 0x8381fd08, 0x81a35a81, 0x7f0099e3, 0xfa1f5850, 0x6773efd6, +0x6e7e5268, 0x138e7fc5, 0x81449526, 0x815781c2, 0xca2faff4, 0xf37f7f64, 0xaa080369, 0x7fb07f5c, +0x81397fcd, 0x972dbbbe, 0x813f8e81, 0x812ed669, 0xbf76e310, 0x0be7f981, 0x81929781, 0x577f8644, +0x0cc7e94b, 0x7e1d2995, 0x7ace8119, 0x81814867, 0x617f505c, 0xb9ad7f3e, 0x3ad56e18, 0x81e5b75d, +0xca874729, 0x7f81ad9c, 0x5881813e, 0xbb240a46, 0xcc908863, 0x6fc2815b, 0xfa4bca7f, 0x8f817319, +0xfe819dae, 0x81814281, 0x867f21e9, 0xfdaa0500, 0xd08c9e41, 0x99ea3b94, 0x7fa9394c, 0x81337f7f, +0xb57f23f9, 0xc59a8181, 0x815a7fa4, 0x16c9c781, 0x9f17b97f, 0xb2817f89, 0x7fbd95a5, 0xb27f7f8e, +0xa5e0b5c9, 0xefabff4c, 0x7fb7ea7f, 0x9aec9841, 0xb0e1784b, 0x81b29d1d, 0x7fba1781, 0x81f7086b, +0x8129f27f, 0x818181ea, 0xc1ce8113, 0xfbfbaacf, 0x9d4c14ed, 0x40c1ea26, 0x6051cd3f, 0x6cd681be, +0x4c469beb, 0x17637f22, 0x81882850, 0xbc91d4be, 0x6e318122, 0x95628181, 0x6c7f7f33, 0x6c47537f, +0xa8d27f7f, 0x3de9b857, 0xc73a2c81, 0x4e7f8101, 0x3b7f817f, 0x3a78815c, 0x1a67771c, 0x5a8286a4, +0xf7b98166, 0xd3b37f81, 0x4eb17f2f, 0xc1098181, 0x969a7fc5, 0x0bfbfbb9, 0x316f8194, 0x7f6f8184, +0x484ec57f, 0x364a007f, 0x1f81817f, 0xc5b9ac81, 0xbb81b97f, 0x1f82647b, 0x2c4b4600, 0x89813d0c, +0x75ffc374, 0xad7f5e23, 0x0af481a5, 0x3d0e3eee, 0xa49481cb, 0x39815284, 0x8187f438, 0x1a7c7f7f, +0x817fa8b5, 0x7fca781e, 0xb401d779, 0x424c7fda, 0x3c429944, 0x488d7f7f, 0x78966481, 0xaf687f5d, +0x89052b37, 0xbf7f407f, 0xe07fce79, 0x9fdf45d3, 0x8181de83, 0xe67f7f5a, 0x7fe6a3fa, 0x38705b81, +0x81518232, 0x7d5d9978, 0x270372c9, 0x818568a2, 0xca7f66c8, 0x43a06a3c, 0x831b4281, 0x853a7fb0, +0x8178cf45, 0x7f7f7fbc, 0xbdb69d20, 0x525c5392, 0xc081d97b, 0x18217f16, 0xb6ec7659, 0x0861819b, +0xc48b819e, 0x817f38f2, 0x7f7f787f, 0x7f365c81, 0x64a9f87f, 0xe4e67dac, 0xd1580073, 0x81817f54, +0x597f2ced, 0x575cabd0, 0xce81d781, 0x819c81a4, 0x7f5aceb2, 0x7f57ac33, 0x81e4d87f, 0x1df5d24d, +0x7f4f7f7f, 0x7feb81e8, 0x6a81816a, 0x7f668144, 0x3431b13e, 0x3cc6b82b, 0x815dc38c, 0xc65781b0, +0xae897f81, 0x9751537a, 0x817f0e88, 0xb15e69ea, 0x6f7f7f90, 0x24e681a4, 0xd97fa74f, 0x1881fa61, +0x2e743b95, 0xeb817f7f, 0x7fcd677f, 0x317f7fec, 0x9246f573, 0x2e7fae81, 0x7eb72b7d, 0x4d8144bd, +0x3f7fcb81, 0x7f619f9d, 0x51e7b87f, 0x81688e5c, 0x0d3d55d4, 0xb9b0817f, 0xaec17fd2, 0x017f2ffb, +0xa8af3550, 0x81187f3d, 0xa033427f, 0x38c83442, 0x7f7f8181, 0xe38a35cc, 0x1f00c081, 0x7f297f7f, +0xd17f7f81, 0x6e81c637, 0xc4387945, 0x26839381, 0xd481e281, 0x0b72bf12, 0x057f9e7f, 0x5eef2c81, +0x9216b507, 0xd7906948, 0x637f627f, 0x0a11bfaa, 0xd605bd9e, 0x81ea9c81, 0x72f03c3d, 0x4f819f7f, +0xc563d7b7, 0xad5a3899, 0x7ff15105, 0x7f692e81, 0xbf79c6c9, 0x3c738181, 0x7f4a0597, 0xecb5d588, +0x7f7f2b3c, 0x888144dc, 0xbd7f6e61, 0x6b6e81e5, 0x5d5b1caf, 0x4c743b73, 0x7f727f2f, 0x667f3551, +0x8fc63881, 0x81565a6c, 0x61817f3d, 0x0aa5d083, 0x81215ea2, 0x60461f02, 0x0d7fc1ee, 0xe77f813b, +0x40d9767f, 0x1c817fa8, 0x7f815e7f, 0xa5447f7f, 0x2ac45607, 0x81417f7f, 0x00aceb81, 0x8181cfe4, +0x817f81aa, 0xaa3eda6e, 0x7fbd4adc, 0xf8bb5deb, 0xf0867fe7, 0x3f33a481, 0x819e1bb7, 0x81458b81, +0x9573148c, 0x986d1ee0, 0x45deb557, 0xcf7f688f, 0x23d5b1a9, 0xc3fdfeb0, 0x3fad633c, 0xe4be21bb, +0x81819acf, 0x567f1571, 0x5a2c130b, 0x7f14e77f, 0x37d38908, 0xe55da5d4, 0xf2e16033, 0x23db8181, +0x7f8160bf, 0x177fa17f, 0xa00f4dc8, 0x47818153, 0xf7817b81, 0x529681a0, 0xeca34413, 0x7f49a081, +0x2c9c81c3, 0x8181ae14, 0x8125425f, 0x39b1123a, 0xe4e781b8, 0x4f83e39f, 0xd298507f, 0x49e92f7f, +0x26bac981, 0xf0a27f49, 0x81d281a8, 0x993dc681, 0x48c19a95, 0x98af7a6f, 0x3baa107f, 0x899d3c00, +0x7f814467, 0xc6e821df, 0x05226d8c, 0x9a813aba, 0x8d818117, 0x81688142, 0xd9244ff9, 0xdb0da3d0, +0xbef62430, 0x55868181, 0x8176d83f, 0x33813ef2, 0x941a6534, 0x81d0741b, 0x4e37927f, 0x6b2515e2, +0x8181aa81, 0x9581605b, 0x678113a0, 0x6e7f2681, 0xc1819f81, 0x813ca072, 0x7f81b97f, 0x3d95817f, +0x81233f81, 0x911e90e0, 0x76a6d5d9, 0xc6b5057f, 0x5262b67f, 0x81812681, 0xa68110fa, 0xc74a6049, +0x478eef7f, 0x8ea225d1, 0x77fd31f8, 0x7f568422, 0x81207f81, 0x94628118, 0x81a47fc0, 0x7f637f7f, +0xa8898caf, 0x8125b97c, 0x3de89f9a, 0x7f81bb71, 0x24183337, 0x88c0437f, 0xe97f6bb5, 0xa0dc007e, +0x36dcd381, 0x887cd84a, 0x0a817381, 0x9b818176, 0x46327ffa, 0x487f926d, 0x07508107, 0x7f7ffe06, +0xcefe7f7f, 0x028172d9, 0x7f7381da, 0x81f97f58, 0x81818d0d, 0x06597fcb, 0x817f7ff5, 0x8e999e7f, +0x7fd22e8f, 0x81766ae5, 0x817f7f86, 0xca81bf7f, 0xfd144e10, 0x947ff681, 0xa9817f4f, 0x7f187748, +0x81819081, 0x8170ca74, 0x7a5d9c79, 0xbe483f81, 0x6f7f9fa0, 0x7fb0505b, 0x7fc7f15f, 0x81793081, +0xbc7bb830, 0xce7ff56d, 0x81e02681, 0xa5968113, 0xa47fd381, 0x81a68197, 0xf4ca2a7f, 0xd220acb6, +0x7f837ae6, 0x5c812609, 0x847fd94f, 0x6adf9afc, 0xb17fc822, 0xfd1b82ec, 0x8dfbf181, 0xbe008215, +0x1dfd1081, 0xd1768cc8, 0x76818144, 0x7a917f9b, 0x0c6aada1, 0x16d3654e, 0xea1a8d7a, 0x9508c955, +0xbfe88c4c, 0x593fa4d6, 0x8c45818e, 0x7f7f557f, 0x7f1dcc7f, 0x984c8181, 0x6b817f7f, 0x6c8131d9, +0x4c8185e0, 0x678457da, 0xa6bb81f1, 0x79c0ca67, 0x7fe2c433, 0x257b8381, 0x37323c7f, 0xd768283d, +0xdde15d81, 0x7996d7be, 0x7fd38110, 0x81706b66, 0x7feb685e, 0x817fba69, 0x8182ec99, 0x53c67fac, +0x7f7fc1da, 0xf8afcee6, 0x09816181, 0x8a4f9e6c, 0x5b94c2c6, 0x812b3b97, 0xd0237f7b, 0x81817f64, +0x81768181, 0x7f24b359, 0x1f326247, 0x7f7f5e38, 0x81267f42, 0xff8781be, 0x85817758, 0x7f172281, +0x81599137, 0x22423760, 0x81c8e277, 0x7f46f381, 0xbb668184, 0x7f547f7f, 0x4aa27e87, 0x217f8c35, +0x925eb643, 0x48b89ac8, 0x7f9d8181, 0xffe3a47f, 0x3e810ac3, 0x7f2c7fa0, 0x847f4681, 0x8106818d, +0x81787f10, 0x3e2a5fa5, 0x81a38181, 0xfa7f712b, 0x74dd166f, 0x0d2819a4, 0x557f426d, 0x7f818158, +0x1b817f93, 0x927f0e81, 0x7f1b9a56, 0x78c78898, 0xbb07493f, 0xd4b37f1b, 0xae8aafef, 0x7fc2c3a0, +0xb1bb3d19, 0x1189816f, 0xc2813c7f, 0xc27ff3be, 0x7f3bc183, 0xd1817c7f, 0xc6817fa9, 0x0f9ad87f, +0x7f10c96f, 0x517f7fca, 0xb9958181, 0x9870315a, 0x1c091752, 0x7f0a4746, 0x509ec654, 0x168190cf, +0x8e3d0000, 0xc0817f69, 0x7f8a6f85, 0x7fe8b634, 0x2631815a, 0x67942d85, 0x5a7f8b38, 0xa2a07e1d, +0xfa816e81, 0x3c81bc7f, 0x813b7fed, 0x81aae601, 0x7f81ba4e, 0x81817fa7, 0x32453b81, 0x8e8aa579, +0x7f81d1e2, 0x78a4847f, 0x81819b57, 0x13137779, 0x81c5557f, 0x7fd18195, 0x049928a6, 0xedd7897f, +0xa0816adf, 0xb0815ab9, 0xb2c73281, 0x7f01a4b5, 0x5ebacf94, 0x7fbb8181, 0xa97f7fd1, 0xec9d5661, +0x3da381ec, 0x4445a98f, 0x291ca97f, 0x9d948d9b, 0xf9f0d592, 0x8b1fcd81, 0x81d54fea, 0xdb81600e, +0x69a781c0, 0x817f78f0, 0x818181a4, 0x36810aa0, 0x646f9f7f, 0x70c25f34, 0x9471817f, 0x3e5081db, +0x5cc37f74, 0x7f0a814d, 0x990ba07f, 0xe55babcf, 0x59813a5b, 0x26b96e7f, 0x199c8125, 0x812e0db3, +0xe581b498, 0x8174a97f, 0x440f7ff0, 0x812d487d, 0x227f9881, 0x7fcb77b8, 0x157fc3e9, 0xdbfcff7f, +0x81085d64, 0x44a9bdaf, 0x42998481, 0xb885b098, 0x94817f94, 0x81d3367f, 0x48394f81, 0x817a697f, +0x64671052, 0xbd81153c, 0xd8637f02, 0x558cd081, 0x8485d766, 0x9ea7c1ae, 0x81b2afc6, 0x81657f40, +0x62d4f31b, 0xbd7f7f8b, 0x7b909c60, 0x2f81734e, 0x5060ab22, 0x10b62281, 0x1d83812a, 0xc7aa8866, +0x31444bc6, 0x815d6281, 0x822f8f58, 0xb75aa477, 0xc21f9a27, 0xd3545a36, 0xad30af19, 0x6b813f7f, +0x0000188d, 0x7fa14165, 0x177a549f, 0x8f9e037f, 0x1cd8f7f1, 0x1e7fb9d0, 0x557363c3, 0x7f9c1a26, +0x769fda1c, 0x7f7f8192, 0x157f7e7f, 0xcb61817f, 0x4a9d3d64, 0x8148aa58, 0x637fd2d0, 0x308481d2, +0x95a8324b, 0x7f7f3681, 0xbe407f4b, 0x2b769128, 0x8156657b, 0x7f7f7f7f, 0x45c97f0c, 0x81577f8d, +0xe90f8181, 0x817f689e, 0x2781f97f, 0x7fd1a966, 0xa07f6a14, 0xddbb7fab, 0xa53f57fe, 0x56c77f81, +0x35e0837f, 0xde818164, 0x7f5bb62f, 0x7ffe814c, 0x4a8fe8cb, 0x7f7f5b81, 0x81137fbf, 0x8157a240, +0x81048171, 0xa9d17f18, 0x8458817f, 0x81424a81, 0x9d817fb2, 0x31ef5181, 0xd081507f, 0x567b6e81, +0x91a3276b, 0x7f257f81, 0x98d9a897, 0x8eb301e8, 0x7f8a11a8, 0xac7fb482, 0x1420dd00, 0xa629e6aa, +0x98628159, 0x4a815981, 0xf081eda7, 0xaf5ac540, 0xde387936, 0xf6f2cc49, 0x7fa88152, 0x4587a0b6, +0x0549f981, 0x7f6a817f, 0x7fde8f79, 0x7fd77f81, 0xbd58b276, 0x477f5db5, 0xa3d0817f, 0xb3811743, +0x378d5f7f, 0x889c8175, 0x00d9bffb, 0xa386f71b, 0x9b9b5a7f, 0x05301691, 0x077afd81, 0xc9813d20, +0x655b8118, 0xb1810fc4, 0x2ae18160, 0x7f818141, 0x81c2db39, 0x7f3cd124, 0x52c77f7f, 0xcfdb5141, +0x8113b964, 0x0c0bd10c, 0x8137637f, 0x56bf8149, 0x5fceb17f, 0x01857f81, 0xea81917a, 0xd67a3c7f, +0x5fd93fa4, 0x93720000, 0x31e08193, 0x957faa7f, 0x30e1b019, 0x557f19fc, 0x327f5c1c, 0x81e98181, +0x567f6f7f, 0x817f60bc, 0xe4f481a2, 0xb1f2aa31, 0xba5b7f36, 0x4d2bd790, 0x914d4e38, 0x817f7722, +0x10fb7fcd, 0x2f7f3026, 0x8c7f3c92, 0xbe81392b, 0x1cae7f78, 0xb6cb6581, 0x2f52db43, 0x49cb7f71, +0x7fe6dfe9, 0x232e7e66, 0x1497965f, 0x67316ca2, 0xaf71c384, 0x727fbd7f, 0x5e7f6ab9, 0x7b5181bd, +0x38e38170, 0x48cae97f, 0x4a81669c, 0x3d2d7f7f, 0x69508352, 0xac988181, 0xe093a587, 0xbd907753, +0x817fb87f, 0x894ac8c0, 0x9f7f9ccc, 0x6336a2de, 0x7f7fd741, 0x75b723c5, 0x396e7fc6, 0xc5c0819d, +0x813c7172, 0x816a7fa6, 0x95bdf475, 0x69b21f5f, 0x817f7f06, 0x4c90685e, 0x7fea7f7f, 0x7f958f0b, +0xf6a7937f, 0x5b6caa7f, 0x5fbf7f30, 0x4c6cb506, 0x7f097f95, 0x8181d881, 0x817f34b8, 0x937f7089, +0x830181a8, 0xa6b2817f, 0x4912930e, 0x7f8fd67b, 0xf69bd281, 0x7a5fd981, 0xc4aa7f7f, 0x817f819b, +0x9c05c2f5, 0x8f579881, 0x5aa4818e, 0xc14dc0bd, 0x7fce0981, 0x147fcd41, 0x817fe75b, 0xf8e1a54f, +0x817f8981, 0x1334585f, 0x810281db, 0x146db1bd, 0x25347f7f, 0x9cbf987f, 0xb6736d0c, 0x814ab481, +0x0fd1653e, 0x7fd67170, 0xe564ce22, 0xd05df37f, 0x10871f96, 0x9dc9e03e, 0x53bc03ad, 0xc47fd1c5, +0xaa4dd88d, 0x00004ad1, 0x8a35a85a, 0xcff89253, 0x64d0819b, 0x149ab17f, 0x819f7a33, 0x49fc81c7, +0x1881d433, 0x196171c4, 0x784dbdae, 0x8193148e, 0x75b63674, 0xdf81e4ab, 0xad299a6d, 0x8168b3d3, +0xeea6426e, 0x81c99981, 0xb17f647f, 0x814ec5d2, 0x2e3b16a8, 0x81597f81, 0xa97f8181, 0x2caec714, +0x387906fd, 0x818181be, 0x7f7fbcb3, 0xd55a81e6, 0x8134ae81, 0x7fc3817f, 0x9853ee56, 0x5881999d, +0x9ea98184, 0xfa8181a6, 0xceff5978, 0x688e505f, 0x7fbbb830, 0xc678d06a, 0x3c90e3ae, 0x4b6d7f23, +0x24cd7f58, 0x7f92c181, 0xb1a97fc2, 0xba872981, 0x66ec49a3, 0x7f7f26b5, 0x7f8163b8, 0xae7f7f7f, +0xde7f3781, 0x4147d381, 0xe191cb81, 0xd45b81c3, 0x474c9e91, 0x55b546db, 0x0e81b5a6, 0xb5b976aa, +0x7f7f7f3d, 0x968a81d7, 0x7f1f9333, 0xb37f7f7f, 0x2f7f6418, 0x2532a07e, 0x8b81bf44, 0x89818144, +0xa1572ffd, 0xfebf182a, 0xe54d7f5f, 0x107f8949, 0x00210081, 0xc53345a1, 0xa2818ff6, 0x81c181e2, +0x9b81f1d5, 0xd1061965, 0xb7a47ff0, 0x81817fb0, 0x18bc6181, 0x7ccc5981, 0xbe2b9dae, 0x038f8173, +0x7f3bec4d, 0x81ec81b0, 0x817b9a6a, 0x817cb47f, 0x7fa98fb5, 0xb0355e36, 0x8dad6109, 0x4b138116, +0xa3e19d81, 0x449ab793, 0x984acd21, 0x168aeb94, 0x85baac5d, 0x7fac8173, 0x81ad81d9, 0xa34abb7f, +0x81ca817f, 0x817f6074, 0x7fbc0000, 0xc79b108a, 0xc06990ca, 0x317f12cf, 0x9281e743, 0x90c681fd, +0x17b57f3a, 0xbdd05681, 0xfafcef3d, 0x6f0a0d81, 0x4337197f, 0x7f4881af, 0xb592de71, 0x44c24881, +0x536f9532, 0x21506996, 0x68489d79, 0x4aaf4312, 0x740c9447, 0x657f6673, 0x637f7f0f, 0x81205569, +0x8fb3fe9c, 0x4881995c, 0x8163cfb0, 0x17a4817f, 0x7f59ad84, 0x6d0c30d2, 0xbdc6b981, 0x1bfa8155, +0x7f22a8ca, 0x9c9a817f, 0x3bdba778, 0xf6817eb1, 0x07858141, 0xc037817e, 0x3f2c868c, 0x8181d07f, +0x02b704dd, 0x467f6bc8, 0x4881ab7f, 0xa25c814e, 0xcb4d8e6e, 0x477c7f88, 0xd991aecb, 0x9c81b243, +0x12d6b7e6, 0x03d745a0, 0xdf0bc9d8, 0x52637f85, 0xd557817f, 0x96342cc0, 0x81423981, 0x70657f81, +0xde8181cb, 0x8a81de2b, 0xf55d3e2f, 0x2d717f81, 0xba81289e, 0x99c27f7f, 0x81c5817f, 0x90be817f, +0x918ea3dc, 0x8de39c22, 0xce577f93, 0x3f7f8186, 0x9e817f7f, 0x816c8aeb, 0x3d818e2e, 0x8181be9f, +0x0fb9429c, 0x3c7f5155, 0x81275b24, 0xa47fda70, 0x84cc88c5, 0x70797f81, 0x812eaebb, 0x16a1314f, +0x7f7f817f, 0x38b61a4c, 0x7fb7388b, 0x7fb6e681, 0x5581987f, 0x9281c37f, 0xc45b7f7f, 0x8b35b97f, +0x7f7f7f81, 0xa23c0e3b, 0x7f9b2083, 0x9cc39283, 0x8843699c, 0xc07f81dc, 0xa1f98b7f, 0x81d245b5, +0x8181597f, 0x1aa93681, 0x000001df, 0x81574196, 0x7f3f3df1, 0x6fc8c7c4, 0x5e4d7f8c, 0x81b4dc44, +0xd56f7f8b, 0x8116a381, 0xb03f5f81, 0xf5020639, 0x7f02b25c, 0x55818143, 0xab658147, 0x357f1daa, +0x296ac18e, 0x8186e57f, 0x7464272d, 0x417863e1, 0xeae67831, 0x1a605547, 0x45ffb1d5, 0x7f066c81, +0x81bfb062, 0x4cb8f381, 0x81817f7f, 0x145a4bc0, 0x2e813d7f, 0xc6524d71, 0x81818181, 0xc9d681fb, +0x2a5db57f, 0x12c97fa7, 0x317f7f48, 0xf9b88131, 0x354c1389, 0xd77f8155, 0x811b4dbe, 0x9d3d457f, +0xf9dc2f28, 0xb01c8181, 0x5a81716d, 0x7f7f3d81, 0xd87f867f, 0x817f0581, 0x564f8181, 0x7f678181, +0x5cdd7f91, 0x07ad3f96, 0xb4dd9e34, 0x7f7fd50d, 0xa67f81b6, 0x01353420, 0x6481798a, 0xa5a68181, +0x9c7f816e, 0xafc73c84, 0x427b8d32, 0x1bbb817f, 0xd45c7fa5, 0xb0c2ec48, 0xb459aa7f, 0x70818181, +0x5ec983e7, 0x81294066, 0x81447f6f, 0x9b819f5e, 0x7fb1a47f, 0x81b8a081, 0x5f91c62b, 0x7f63de81, +0xdc813ff2, 0x817f81ce, 0x3d677f0b, 0x4da9dae5, 0xcc8190d9, 0x1d7fbbfa, 0x5ffdd2b7, 0x69624b8f, +0x50963e7f, 0x7f7fa281, 0xcc4b8149, 0x8102da7f, 0x3f7f9df5, 0x435732c5, 0x7f07d881, 0xb20fe07f, +0x4896ac46, 0x44b3ed39, 0x7f7f8127, 0x9e7f81e4, 0x8181b15f, 0x7c818132, 0x7f41980b, 0x299ea18d, +0x7f196381, 0x7fc95f36, 0xbecb7f35, 0xdaa80000, 0x292a7fe2, 0x3292947f, 0x7f98e9c5, 0xb77c984e, +0x74847f81, 0x917f487f, 0x537766db, 0x30b71c7f, 0x81237f81, 0x9d7f9542, 0xfc75737f, 0x72499c3a, +0x6885625b, 0x7f061c6d, 0x818e7f81, 0x5b814381, 0x81f17f4d, 0x4d81b6cd, 0xd2f7d778, 0xe5e9d5db, +0xf7f081c2, 0xb80b0481, 0x975658f2, 0xe8b1197f, 0x81634b1a, 0x7f6bd994, 0xdbd67f7f, 0x757f3406, +0xc4d07f7f, 0x63e7507a, 0x102b7709, 0xe08cf836, 0x1db26230, 0x1a814510, 0x40679bdb, 0xf336a87f, +0x7fc3bf7f, 0x818e69c8, 0xf67aa2a3, 0x75425b7f, 0xa4b654c1, 0x7f7f5ac1, 0x5f10488d, 0x57dc7f30, +0x7d817f81, 0xfc81237c, 0x388a81d6, 0xbce67f42, 0x7f7a7f56, 0xfbb7ff87, 0x467f4681, 0x22dc9b7f, +0xba939029, 0x4a44c1a5, 0xa4be71d3, 0x7ffb3589, 0xfefae9a6, 0xa1963e4f, 0x66b3d6b3, 0x81506f83, +0xee7f32ee, 0x7ffe7f7f, 0xbf505c53, 0xd769ca7f, 0x69c267d2, 0x7f9f8346, 0x3f7f7f7f, 0x48813f51, +0x7fed8115, 0x9e81aef0, 0x7f7f22e3, 0x819fa190, 0x55457f81, 0x7f813b81, 0x251b4a0d, 0x6476818e, +0xc4d8da21, 0x52fd2d4b, 0x81943c7f, 0x273ce481, 0x7d53817f, 0xcd9d9058, 0x754151d2, 0xcb9f365b, +0xac73ecd4, 0x7ffd9a4b, 0x577f2d92, 0x41c60481, 0x81297fa9, 0x9f7f850f, 0x8c513329, 0xe854c39f, +0x34bb4a20, 0xc37f5178, 0x0787cc22, 0x6c86717f, 0x75815a48, 0x2023777f, 0xd37fdd7f, 0x6a819cf7, +0xdc44f5e3, 0x258157bd, 0xe8e7813d, 0xb9118195, 0x9a5a4581, 0x2d8c517f, 0x0c728161, 0xaec769ac, +0x1f554191, 0xfc8be381, 0xca703b7f, 0xab813d5a, 0x3f7faced, 0x707a2181, 0x7f1b8c7f, 0x7fad7f99, +0xb307377f, 0x6c9d5b81, 0x7f3bfac6, 0x8182567f, 0x5a246cdd, 0x55408105, 0x277f7f84, 0x7fa09c52, +0x817fa355, 0x404fd360, 0xecbc4281, 0xc6897f20, 0x7881ae81, 0x407f81e1, 0xfb35587f, 0x9b67fb81, +0x7f8103ad, 0x36708155, 0xab81f381, 0xa3fe6417, 0xa97f7f98, 0x3cf7cd7e, 0xae1b4dc6, 0x8ac2f749, +0x7fb35e89, 0x07e0743b, 0x7f818135, 0x81a15481, 0x93819bbc, 0x81f68114, 0x194ccd81, 0x81527f7f, +0x583ba074, 0x91654d78, 0x4e81398d, 0x0c54567f, 0xe453d054, 0xd37f8175, 0xd57f81ea, 0x345e5b7f, +0x3589262c, 0xa8b886de, 0x811b8197, 0xbbc890ee, 0x8db0b9dc, 0x9fcb817f, 0x39817f7f, 0x55391fe5, +0x7f7f3f92, 0x5a7f55d9, 0x747f3c71, 0x43e31da0, 0x67dccd81, 0x81ddffaa, 0xc32a5881, 0xb9816d7f, +0x424d7f7f, 0xb97fa435, 0x7fdb7f81, 0x48fb8182, 0x8181407f, 0xba7fa88d, 0xa16d467f, 0x81cb8a81, +0x8181a66c, 0x8c747c1b, 0xb4810470, 0x8133dc82, 0xbc77727f, 0xee981437, 0x7f2e8981, 0x26be1939, +0x12da817f, 0x81a1da61, 0x1d2af46f, 0x7f3781f5, 0x29500000, 0x657fc67d, 0x81817f7f, 0x49e406cb, +0x0b787faa, 0x7bc2643b, 0xe4e4f0ec, 0xd28175e5, 0x7f425abc, 0x900c1828, 0x7fa85f7f, 0xe8365361, +0xc5d87fa2, 0x81baffab, 0x81818612, 0xbcb5af1b, 0x7a7e5d7f, 0x81b07f7f, 0xa27aba93, 0x817fd881, +0x818481b0, 0x7f8d1c22, 0xb48c869b, 0x977f9429, 0x9a8c7fc5, 0xb8d9b270, 0x6e340e88, 0x670f7f39, +0x7f4efebd, 0x41b5b57f, 0x7f277f0c, 0x5f177f23, 0x94818592, 0x68362b87, 0x6681ea7b, 0x7f187fd2, +0xa38131ae, 0xc97f698e, 0x25bd8155, 0xe37d88d6, 0x2d018f4d, 0x391e7f7f, 0x7f7f845a, 0xe8f8ee81, +0x4beb9d63, 0x7fd47ff8, 0x5e5781ec, 0x237ffe3a, 0x8e818168, 0xa1e781e7, 0x85de7f81, 0xbaaad281, +0xa7486481, 0x555e737f, 0xa2b28f7f, 0x70635a47, 0x7f837fd8, 0x64ea8641, 0xc20c7f81, 0x0b9e738e, +0x698e8145, 0x783a5a00, 0x7f376e81, 0x7f8cbd20, 0x7f548181, 0x81149934, 0x3dad456a, 0xb4561fed, +0x815d8127, 0xaea4bb24, 0x2187755a, 0x847ff0b7, 0x7fdb9039, 0x81887695, 0x8781e111, 0xe0de037f, +0xc879f7ca, 0x7fc18381, 0x7f7ff7bf, 0x958b7f81, 0xa65fe7ad, 0x3481817f, 0x9f897b7f, 0xa2bb7f7f, +0x31018170, 0x70e08c81, 0x4c1da62b, 0x16f27ff7, 0xdf0781ed, 0xbf4081c0, 0x3a233c53, 0xf8aed938, +0xef24617b, 0x812681ab, 0xa66e4db4, 0xef9b65b3, 0x00007f44, 0x7f7f997f, 0x7f341fc7, 0x0f9b2be4, +0x7ff67f81, 0x81817e2a, 0x4b4d7f81, 0xc0706505, 0x81fc60e1, 0x30d87f9c, 0x7fff9c0d, 0xa789757f, +0x3881d769, 0x6367bf81, 0x9bae7f8d, 0x8e81bbb6, 0x61e88127, 0xc96c7fbf, 0xdf813181, 0x7f7f7de7, +0x3e817f81, 0xb97f817f, 0x8b927f81, 0x5e74742d, 0x7c49817f, 0xbc1172b1, 0x81818181, 0x6dd2d4bb, +0x98f3e058, 0x7f81efde, 0xaeee76df, 0xd57fca01, 0xf5817f81, 0x26747f81, 0xdc3f8181, 0xc335c749, +0x7f2f7f7f, 0x7f02e67f, 0xfb706975, 0x8f4efde7, 0x819b414c, 0xb14cde70, 0x22e6812e, 0x3843892d, +0x6f81ce60, 0x50c12725, 0xb4e279d5, 0x7fb1ac7f, 0xbc7f8183, 0xc7767881, 0xb6e71854, 0xb37f7f77, +0x3d7f7f7f, 0x817f6824, 0x4981ae81, 0x7f811a7f, 0x58c37f74, 0xbef5a27f, 0x92a62541, 0x8643aa3c, +0x8f838181, 0x397fe4f4, 0x8a814677, 0x93e3affa, 0xa6fa21e9, 0x7a3e7f7f, 0x332a7872, 0xf28c8176, +0x227f573d, 0xbbbb6348, 0x7fefb2de, 0x43817f69, 0xc4c37b31, 0x747fa118, 0xacb3819c, 0x7f689f89, +0x74e0604b, 0x81b57f88, 0xe925a0cf, 0x81be2181, 0x126d34f1, 0x7648d74e, 0xd760b29b, 0x04d0fda1, +0x3b858181, 0x1be20981, 0x8127ac7f, 0x8a6b8181, 0x7f616ca2, 0x37e6e881, 0x7f9b82c0, 0x7f6e7f93, +0x8dc72420, 0x752f3d39, 0x5e7fd2e5, 0x7f25c372, 0xe97f2677, 0x307f0000, 0x81383b86, 0x713de0fd, +0xe47c817f, 0xf0214e8f, 0x8108349e, 0xe0c92881, 0x7fafb0e2, 0xe939b48c, 0x4855d8ae, 0xb581e469, +0x967feb6a, 0xba543d20, 0xc47f0c62, 0x2a28e6b2, 0xd27fb09a, 0xbadf7f7a, 0xbf98d54c, 0x5f54cfa3, +0x4881248d, 0xc97f7f53, 0x17816966, 0x3450877f, 0x4ff681c8, 0xfdb8786d, 0x0209730d, 0x7fbbba84, +0xc5994cff, 0x4d31cc44, 0x7fb99400, 0x239d757f, 0xa2bd517f, 0xd5558194, 0x93818191, 0x819b8190, +0x447f9289, 0x777f3e81, 0xc2c04a7b, 0x27c38eaa, 0x437a383d, 0x7f812432, 0xbd77707f, 0x7f81ea6d, +0x40256698, 0x81a95b58, 0x2fb47f81, 0x74b64d86, 0x70f07f23, 0xd7d6bbd5, 0x817f18a6, 0xe862327f, +0x3ff56cff, 0x7f7f8197, 0xcb75c381, 0x58954f57, 0x43818176, 0xa903811d, 0x7f6abbfa, 0x8cd7a77a, +0x55814473, 0x7f819e1a, 0x557f9e89, 0xa9c955e0, 0x648191b0, 0x81a97f51, 0x1dbc1181, 0x685a6b36, +0x7f2e5ef2, 0x59819afb, 0x3f30fd68, 0xe986702b, 0x810a2581, 0xfedf7781, 0x947ffb3a, 0xa9777f29, +0x9c547f3d, 0xe36d7f07, 0x81909281, 0x2b87817f, 0x07aa817f, 0xd9137f30, 0xb791d3ff, 0xb84869c5, +0x4db4e1ce, 0x81beed66, 0x1637adce, 0x10a1897d, 0xfd817fbb, 0x5771c343, 0x3b16dc58, 0x7fbf813f, +0x7f9ba269, 0x353a7e21, 0x14f07fa6, 0x7f81815b, 0x484bb301, 0x0000c27c, 0x59141b93, 0x7f637f3e, +0x3012937f, 0xf2a2b350, 0x1d7f7f7f, 0x81b6d4ed, 0x4fc3ba54, 0x3f7f107f, 0x02af3855, 0x598c814a, +0x3eb09fd7, 0x636832b6, 0x7f9e817f, 0x7f939c7f, 0x7fa99581, 0x7f817fb1, 0x387f3475, 0x9893f771, +0x52813581, 0xc5c75881, 0x7f787887, 0xb97981d0, 0x27436262, 0xfae6f21d, 0x81cacf5d, 0x41a5de81, +0x81817d81, 0x3b2f7f9e, 0x5dc0ade8, 0x3d0e8154, 0x81bd3a0a, 0x6e818153, 0x7f818123, 0x817fc575, +0x811b669b, 0x7f037929, 0x26acac81, 0x7fb3efb6, 0x82817fc3, 0x0c81f981, 0x607a677f, 0xc8258116, +0x0ae77a50, 0x816fba35, 0x7f256549, 0x04c57f89, 0x4381075f, 0x81cd3b56, 0x8ccdad7f, 0x7fa45cd5, +0x817fb67f, 0xb7698dbe, 0x5562298b, 0x688c257f, 0x9d7fde81, 0xe57f4e81, 0x7f81c9ea, 0x281a41f9, +0x7ffdfc6c, 0xaa32217f, 0x81a08166, 0x8181b1ae, 0xc447880e, 0x2b81367f, 0x2944a47f, 0xc6de9b49, +0x81816841, 0x54fa7fa8, 0x587beb7f, 0xe3475a81, 0x81dc2cb1, 0xa95dc06d, 0x8bd7477f, 0xb05d7f81, +0xb4c19d7f, 0x43817f53, 0xde7f5c7f, 0xe3d2817f, 0x8948aadf, 0xc17f7ffb, 0xd08188c1, 0x8181204e, +0xb3b6d781, 0x7381b381, 0x787f7681, 0xee640849, 0x657f8181, 0x811b329b, 0x5c728eed, 0x0c7f59c9, +0x4cc3b12c, 0x814f7e3d, 0x5f7f7f46, 0xf9817fd9, 0xb1b5ba76, 0x1f42609e, 0x3db30000, 0x400d7f46, +0x7f7f7f81, 0x45d36281, 0x81df9581, 0x7a7f7f53, 0x8181330a, 0x7ff5c3ab, 0x9e81b4bd, 0x7f70c27f, +0xac1666b3, 0xcf7f52e2, 0x817fea30, 0x8c4b3f7f, 0xa085bde5, 0xabae307f, 0x817f7fde, 0x17bc61b4, +0x914ccc4b, 0xe1e56bae, 0xac294f88, 0x75e562cd, 0xbfbd35cd, 0xed507f81, 0x81afcf81, 0x7fdc819b, +0x5a0385e8, 0x4f2aabf2, 0x569c7f3f, 0x7fbee1bf, 0xb0407fc4, 0x6b548214, 0xbcd6877f, 0x3d6e7716, +0x9a8134a3, 0x0a7f7f81, 0x29d73eca, 0xadbe7f65, 0x7fc1bb81, 0x7f63dc7f, 0x7f815430, 0x810e2366, +0x7f36057f, 0xda39d7d0, 0xe9855ddb, 0x7fffa2f9, 0x3b9a8181, 0x7f06b781, 0x844db0a2, 0x7b1d7fa3, +0x99a795ad, 0x7b819a6a, 0x3781819a, 0x867fc788, 0xa181817f, 0xfcc3637f, 0x747f5a5a, 0xf27f690f, +0x2f8a9c2f, 0x617f7fb3, 0x81b4b1c2, 0xa2818b96, 0x7f7f7fa6, 0x20707f81, 0x7fc9817f, 0x55577fc3, +0x777b40b9, 0xdffa3781, 0x38ba0e4e, 0x4f667d32, 0x9cf081ea, 0x8187d122, 0x79af9ebc, 0x647f99c2, +0xd1a47f79, 0xaba67f7f, 0x6b270e96, 0x90c07265, 0x817f4b81, 0x71f31f65, 0x2d818692, 0x65570681, +0x81f59b98, 0xe6b181ec, 0xc5b1a58f, 0x7fb2c981, 0x7fdb5914, 0xe37f81bd, 0x7fefd823, 0x9a7f9ccb, +0x631762c2, 0x7f4e81b8, 0x813d88c1, 0x9768c97f, 0xbb867f81, 0x2cd79456, 0x00004aa7, 0x8ec66e57, +0x7f7af878, 0x747f3cb4, 0x8c774fa4, 0x7f8df013, 0x8c5c7264, 0x3aade68d, 0x81819c30, 0xb0d38147, +0xbd816181, 0x4f415cbc, 0x7f21f710, 0xf7ba5565, 0x81df367f, 0x637f7f9a, 0x7f182e7f, 0x6f81996f, +0xca547fe5, 0x637f8db9, 0xccb4fe59, 0x55ca7f81, 0x7f7f7fae, 0xceffc677, 0x2955d0f8, 0x91a07f7f, +0x7f818181, 0xebc2f87f, 0x7f213646, 0x94a2a981, 0xd1819bdc, 0x7f866084, 0x2381ff8b, 0x75b58114, +0x447f162b, 0x5275e0a3, 0x37578cc2, 0x0dc1ec31, 0xb73681a8, 0xb081978a, 0x74429a2c, 0x698859dc, +0x937fb91d, 0x7fcdc06e, 0x81b4ffff, 0x7e2b168d, 0x4b649aa9, 0xe648be08, 0x44e37b7f, 0xc0fc27e9, +0x1b16521e, 0x81577fc5, 0x7f8152a8, 0x2981ee7f, 0xf08dd19f, 0x7d93ed81, 0x814435c5, 0xe6c67f29, +0x7ffc8111, 0x87f65881, 0x3f62563a, 0xa09a81f9, 0x490f5781, 0xc70d6284, 0xfb818181, 0x56817f38, +0x87420960, 0x0d2dedb3, 0x8ef18143, 0x4c5b4a62, 0x8f947f81, 0x667f8121, 0xcc817f81, 0xb567a44c, +0x7996b182, 0x736e9881, 0x81627f7f, 0x7f8e7f81, 0x725ee43d, 0x9f436a50, 0x7f055d88, 0x93498181, +0x21d08f7f, 0x26f17f3c, 0x581d939b, 0x90595ba7, 0xf5200e81, 0x4b91b78f, 0xcb7fc693, 0xe87fd04b, +0xaf81087f, 0x14ac4a01, 0x7f7d7f81, 0xe014dd7f, 0xc2816aed, 0x79760a93, 0x7f9b817f, 0x81480000, +0x844d73a5, 0x7f8181bb, 0x819dae3f, 0xc87f8e82, 0x9d81a23e, 0x7fbd813a, 0x8181702e, 0x4fab7a67, +0xd57f70b6, 0x817c53ac, 0x1355de7f, 0x4264437f, 0x81b0ff2f, 0x16d6e094, 0x7fc40f55, 0x7f9b7edf, +0x7f5a7f81, 0x7f996e66, 0x8e932881, 0x7f817f81, 0x6d4ca679, 0x815f871e, 0x81b4817f, 0x7fa97f81, +0x5e03827f, 0xbcd8b6a8, 0xc5683edc, 0xbb007fdc, 0xea266973, 0x498e467f, 0x86b1cc7f, 0x17814738, +0x81b7ae62, 0x56fea8f3, 0x5eac534d, 0x54f67f81, 0x24add4ce, 0x811a7881, 0x81cfc383, 0x9f2f81ef, +0x7f1f41fe, 0x819e3781, 0xcc73a3b0, 0xee148181, 0x7181d87c, 0x81c1c9e2, 0xfee4727f, 0x9b608139, +0xa2ec4ace, 0x7f810c7f, 0x9a7f2288, 0x46b169e4, 0x9b40817f, 0x547f2f7f, 0x81ef4f81, 0x243fffe3, +0x8181dd3f, 0x347f6596, 0x7f59c3fa, 0xa26cc7ac, 0xf7384881, 0xbdc0a118, 0x7f8173a8, 0xabf1b3e3, +0x7e3e8eac, 0x30c07bce, 0xbca0b981, 0x75816414, 0x81377f81, 0x7f7feaa1, 0xd8287f86, 0xfbd98bd1, +0x7f987fc1, 0x81b8347f, 0x8c7f37e2, 0x987f3c7f, 0xb5f681ab, 0x347f1adc, 0x1b815481, 0x91f17f60, +0xbf85a67f, 0x6d7f2374, 0x587f3c1b, 0x74b0ae9c, 0x97a64fb4, 0x1437697f, 0xc77f3b81, 0xf4e0bbad, +0xb6892b64, 0x5ed0e47f, 0xa55c8100, 0xbbe24e10, 0x50bb6551, 0x6db5349d, 0xaaae405f, 0x4d7f4f6d, +0x989e95a5, 0xcae9bf2b, 0x811e7f4d, 0x90538181, 0x7f9f096e, 0x4126a5df, 0x1369537c, 0x81a73581, +0x722f1409, 0x8b297c54, 0xf17f5081, 0xc22b4595, 0x7f6fde57, 0xdea96095, 0x7f98814f, 0x40f8fb81, +0x697fd77f, 0x35e07f33, 0x27459a7f, 0xc0818181, 0x3e817fb2, 0xdd5eae81, 0x8a8efd53, 0x13e91281, +0x2c486ba8, 0x7f6b447f, 0x7f818120, 0x1c496781, 0xf8e45993, 0x48817f81, 0x009db045, 0x7fd9c722, +0xab817fe2, 0x73bd7951, 0x687fa97f, 0x7f7f7fb8, 0x4f447ffb, 0xfc31d9c2, 0xc1d5d865, 0x526abd82, +0x7f6e7f47, 0x6b31817e, 0x8509817f, 0x5581fcbf, 0x7f9bd8ac, 0xcc22f37f, 0x547fa07f, 0xbd4fd2bb, +0x6f49a523, 0x835e896c, 0x65458e81, 0xd0e37fd2, 0x81587fe0, 0xd95fb08b, 0xd938d43f, 0x11e67fc6, +0x7fec3c2e, 0x7f8581d5, 0x017981b9, 0x812c8133, 0x307415cb, 0x2081bd7a, 0x994d5c83, 0x53812ab3, +0x7f8190bc, 0xad811645, 0x73c1ca14, 0x94c87d32, 0xbd4a7063, 0x7f442f7f, 0x06812617, 0xc481acc0, +0xc7bacc81, 0x81de5481, 0x7fa3167f, 0x4a3a385f, 0x2b817f37, 0xae912b7f, 0x32c4cfeb, 0xc3bf3bb1, +0xa4a63e50, 0x846c7b7a, 0x5c81816a, 0x75813daf, 0xd0665307, 0x6031117f, 0x507f5429, 0x29bfc44e, +0x81b69437, 0xa4c54d61, 0x81391b7f, 0x98347fec, 0xf7da5b06, 0x7e3d8b7f, 0x7f7f1abe, 0xa955d23a, +0xb7810000, 0xa1608164, 0x5f813cfb, 0x16602281, 0x5fb6814d, 0x3c3fd67f, 0x5dae83eb, 0x58ac2c2c, +0x097f5d25, 0x6081da52, 0x7fd4818c, 0xe181d13c, 0xc66d7f2c, 0xe94a00a3, 0x2cec12a0, 0xe84c6398, +0x64398162, 0xd056816f, 0x8147e081, 0x9ceb75c0, 0x7fbec481, 0x16d15734, 0x8158cd7f, 0x369c8172, +0x2a479b81, 0x7f4e9686, 0xb1494e0f, 0xe5816226, 0x057f7f55, 0x81dba929, 0x8f1890e4, 0x5e7f817f, +0x7f7f8162, 0xfced63c7, 0x370aadc1, 0x5f09b34f, 0x7fc0be25, 0x36927fec, 0x814d0ab6, 0xfd077f60, +0x8162f9ab, 0x8185597f, 0x2bac2f66, 0x28e6aa9f, 0x814dc1c6, 0x717f3841, 0xffd1078b, 0x4f5b8a12, +0x7f429a7f, 0x7f734d7f, 0x43817faf, 0x7f4e7f52, 0x232e0524, 0x7f4158e4, 0x327f7f7f, 0x89b464d8, +0x8130a3a7, 0x7fe6ac32, 0xd1818e81, 0x427f957f, 0x8150c60e, 0x3cb50481, 0x31955f7f, 0xec427f9f, +0x99eb5f69, 0x8ac893da, 0xf97da17f, 0x7f847f73, 0x7f97ce7f, 0x7f7fe806, 0x8984629e, 0x34539cba, +0x8a64a575, 0x25297f49, 0x1c509d07, 0xd5aa7f7e, 0x74817f79, 0x81819981, 0x95815a8b, 0x9518a19f, +0x3d9183ce, 0x817f00a1, 0x30306781, 0xc67f7f7f, 0x81594a49, 0x3d620f81, 0x3481bd81, 0xc3af8e63, +0xc249dc8b, 0xe5fa637f, 0x81185512, 0xa0b48307, 0x814c817f, 0xc6dac58b, 0x8b5c781a, 0x81982c81, +0x0000b269, 0x8105f78d, 0x81ad60f7, 0x81ffb8cc, 0x917ffed4, 0x104fc0a1, 0xfa38b45b, 0xb5318137, +0xbd781466, 0x0bd8068c, 0x72c57f91, 0x8181b48e, 0x7f81aedc, 0x43677f7f, 0x7f4f7f3a, 0x437f8178, +0xe99d0b81, 0x868792bc, 0x17727f57, 0xada05e06, 0x694d707f, 0x9081e59b, 0x7f3a8181, 0xb2bae481, +0x7f81dde5, 0x3e307f7f, 0xcaa07f3a, 0x2e1a8170, 0xed0f4881, 0x297f7f61, 0x81cc815e, 0x4fec813b, +0x1a4f02b2, 0xc6e66a4e, 0xe9817f6f, 0xc2c36a02, 0x302e9f60, 0x4ea28137, 0xb9d57f32, 0x462a7f81, +0x9085bb36, 0x7f7f817f, 0x3c714908, 0x70c9c17e, 0x5a7f204b, 0x8fbf6f70, 0x97880981, 0x0cbacfdb, +0xb80f6d81, 0xb6bb3aef, 0x81691db8, 0x1081e2df, 0x7f0504a0, 0x797d5e7f, 0x006de423, 0x7f19f16f, +0x1eb28181, 0x819f7f81, 0x7f6a84b9, 0x936537f2, 0x14a87f81, 0x7fa9cb81, 0x81813a8c, 0x8182c47f, +0x56758144, 0x81c55c97, 0x86de0b81, 0x818181d9, 0x7f386281, 0x7fbb2738, 0xffd18d81, 0x17e1eb34, +0x656449b7, 0x7f7fbe33, 0xd7f681b6, 0x77313c4f, 0x7dc9151e, 0x28debefb, 0x7f7f5c62, 0xa850b25f, +0x81166b59, 0x7aea7f05, 0x325d81a1, 0x7fd06471, 0x93137fbb, 0x43a51892, 0x3e326cfe, 0xab81a942, +0xb208d017, 0x817f0781, 0x08fcca86, 0xa31a7f81, 0xeb93206a, 0xd4fa21f4, 0x684f9029, 0x7f817f57, +0xdca7812c, 0x7f7f0000, 0xf2dc5a96, 0x7f62aa7f, 0x918d1c7f, 0xfbb5add6, 0x407fc0da, 0x4d5d9f7f, +0x935d8166, 0x817da9b1, 0x205d7f3a, 0xe08b4181, 0xd8bd7f7f, 0x4f33818c, 0x8105b781, 0x2f81cd81, +0xbaf8a48d, 0x2b81aa7f, 0x90b5810d, 0xbc62c181, 0x1592f72a, 0x4d81b5fe, 0x7f81e447, 0x99d22181, +0x303e3ea5, 0xa23078a5, 0xba8a7995, 0xd5282790, 0x6681453a, 0x7ff7ab7f, 0x7f4e8195, 0x8bc48181, +0x817fd481, 0x81b98142, 0x265a8182, 0x81f768a7, 0x85f11690, 0x7f957f7a, 0x109981a4, 0xeabba365, +0x577f9057, 0x5f7fae65, 0x817f8199, 0x718e3daf, 0xd6818181, 0xd1a1cc81, 0x97a48187, 0xd8d14520, +0x497b7f10, 0x7f81d781, 0xb77f747f, 0x7f813974, 0xc52a7f7f, 0x7a292226, 0x81602ef8, 0xe481cc7f, +0x0b4266a9, 0x4722287f, 0x7648747f, 0x9c861ec6, 0x4ba9efbe, 0x2063813f, 0x5b277f81, 0x54608181, +0x81b3ae7a, 0x5b812281, 0x6c306f81, 0x4fa0bcd5, 0x540c85d5, 0x2f81817f, 0xd2c9078a, 0x4281a39a, +0x3e7fa1d8, 0xa47fb881, 0x3efe9c7f, 0x7f5f6c23, 0x4681d46f, 0x49cb81c9, 0x7f4eaa68, 0x2e7f7fac, +0xbb497fd0, 0x3a4253a8, 0x91a6aaaa, 0x4f7f5a52, 0xf9375fad, 0x8b2a7f2d, 0x746e7f81, 0x7fb0cbe0, +0x5a917fd1, 0x5b65867f, 0xe9606f9c, 0xe9f8814e, 0x3045cf65, 0x937fad52, 0x760f5a81, 0x9be4ba50, +0xb59d81e5, 0x0000d77f, 0xd481bd81, 0x27224a55, 0x61467c81, 0x91d865df, 0xffa17fe4, 0x7f8a0c68, +0x1640fd52, 0x987f7f6e, 0x4d815a5a, 0x3081b65b, 0x7d7f6c8e, 0x5b26bf60, 0x44814281, 0x5a813427, +0x81f47a3b, 0xef9281eb, 0x81994ca6, 0x7081317f, 0x7f7fd49a, 0xfb8c8e7d, 0x546ad581, 0xd6817f16, +0x7f3e4b81, 0x4f4c4898, 0x817fe22f, 0x819a37c9, 0x387f1a55, 0x8cfddd03, 0x318aa9bb, 0xcb6e2d90, +0xa47f0d1b, 0xae81c204, 0x7f797f27, 0x0a7f65ad, 0xe4ac81af, 0xb2d74d81, 0xca0fad81, 0x357f69a8, +0xad71a581, 0x5be9d4de, 0xaebe8181, 0x95817fd8, 0x8f7aedb6, 0x0a81e59e, 0xa07f20eb, 0x7e66427f, +0x56769b04, 0x2e8149f1, 0x81f6f87f, 0xc3813768, 0xbcc28850, 0x6cbd3dac, 0x7fda99dc, 0x657f7fd5, +0x7fcf7f60, 0x81233698, 0x81daf17f, 0x867f7f7f, 0x7fda7f36, 0x0c7fae20, 0x7f817d78, 0x7fd09481, +0x818f30e0, 0x7f437c7f, 0xaecc2b3e, 0xcf427fca, 0xccfd2cce, 0xefd898bc, 0x7f5b81e2, 0x1d4b812c, +0x865871ae, 0x553ab4ae, 0x69817f7f, 0x811a745a, 0xa32a163d, 0x2e967f57, 0xff817f7d, 0x70d43e9a, +0x814681ae, 0x9f817f31, 0x819b8110, 0xfca3819d, 0xc4fc45b2, 0x56b2817f, 0x7c811d7b, 0x997f8181, +0xbe0dc3d8, 0x9f5b56a6, 0x7f8181e2, 0x5d59eb29, 0xa357e4c6, 0x8161817f, 0x3c7e7f32, 0x7fd07f06, +0x817f82ad, 0x93de8341, 0x92850000, 0x0c65c06f, 0x0a4d2817, 0x7705d752, 0xbcd8687f, 0xc4397f7f, +0x1b7ffd47, 0xada5012d, 0x7f8158e5, 0xba617e10, 0xa97d811f, 0x1fb61081, 0xac41e74e, 0x8c7ea7a3, +0x997f452e, 0xb5858149, 0x5c3cb0a0, 0xc8ffab38, 0x49d65d7f, 0xbbd07c81, 0x35b06b7f, 0xcc7f7f7f, +0x50c42881, 0x707f7fde, 0x7fd67f7f, 0x7f819981, 0xd4d6a781, 0xcb103b7f, 0x7f4fee9f, 0xb3997fe0, +0x7f9381a5, 0xbc7f9a28, 0xf4aa819f, 0x7fe862df, 0x316dd1f8, 0xb4a66f81, 0x98816581, 0xdb817f2e, +0x34819ee0, 0x746c817f, 0xdc9cd3e1, 0x8e7fab2d, 0xec368b2e, 0x7f8381c8, 0x817f7f7f, 0x814de179, +0xed5b7f4d, 0x274bdfa1, 0x5851250b, 0xec811a81, 0x7f365569, 0x57935681, 0x08757781, 0x196d813e, +0xa67581b5, 0x83a7d981, 0x73988163, 0x816eb57f, 0x2ce47e40, 0x5bef6481, 0xb131155f, 0xc2f9817f, +0x519b67b4, 0x7d2c7f59, 0x7fdb8150, 0x5c7fc881, 0xca285c9d, 0x7f7f7fe6, 0x39aabd59, 0xb9b494e6, +0x81401831, 0x74247792, 0xab7dfaab, 0x817fcd81, 0x819b25e3, 0x587f337f, 0x817fd238, 0x818a332c, +0x9db6bcc3, 0x1681c227, 0x7058306d, 0x50a27f64, 0x8181a4b2, 0x7fe2a57f, 0x8d5f4777, 0x7f7f8f81, +0x6e8381f7, 0x22518136, 0xae72d0d6, 0x7f9bba7f, 0x8117d27f, 0x792b7ff0, 0xe45892e0, 0x8e6f5c34, +0x3994817f, 0xa981afca, 0x0000a592, 0x7f811d81, 0x09548181, 0x0ea8127f, 0x7f7fb49d, 0xd6690b81, +0xa1846059, 0x81d15d81, 0x6ccaf481, 0x81ddef83, 0x7fccc681, 0xab502722, 0x4620e862, 0x3981de76, +0x7f81889f, 0x5b818154, 0x797222dc, 0x4b8153a6, 0xa470816d, 0x7fb2657f, 0x81150b64, 0x89dc1f57, +0xaa636e7f, 0xe59cba67, 0xb3b2da41, 0xc7818192, 0x7637d0d9, 0x1a78a78c, 0xaf5e3f5c, 0x8181a581, +0x56285469, 0xeed47f7a, 0x697ff6a5, 0x7f7b7f1e, 0x398181cb, 0x999fe4a0, 0xc17f8816, 0x5c815aa2, +0x78717fce, 0x7f7f842c, 0xf07f4c43, 0x7f818148, 0xbc66c134, 0x8168ce22, 0xaf1791a8, 0x3522ae40, +0x95afa97d, 0x435d4e69, 0x2ab59d7f, 0x8197c47f, 0x93cfe645, 0x8dba727f, 0x227f7f81, 0xb17feb7f, +0x702a7f81, 0xebd463b7, 0x5381e929, 0x817dba7f, 0x5c811a24, 0xfa7f814d, 0x817f8197, 0x2f7f704f, +0x36817f7d, 0xe87f0d7f, 0x54b07fb6, 0x81733686, 0x8fcb7fcf, 0xd888c623, 0x2de5ebc5, 0x8f6f6569, +0x7f7981f9, 0x908136b1, 0xa93a7fb5, 0x405f8141, 0x01a54dbc, 0xb6815763, 0x8ccc3ffc, 0x5681105b, +0x4a1498bf, 0x4c6f82e5, 0xa67f556c, 0x7f5d564f, 0xdb8132d0, 0x1e958139, 0xe386811b, 0x04845a40, +0x7fbd8109, 0x833b62ec, 0x81f40717, 0x701d8181, 0x8191ee44, 0xae2d9d7f, 0x3fa17854, 0xcbcad981, +0x73c2d681, 0x5f738681, 0xb87081dd, 0x817f0000, 0x037fcda9, 0x922caef5, 0x7cc7f91e, 0x9a7fbd88, +0x81819528, 0xf2cd7f53, 0xfd7c8170, 0xfb7fb997, 0x7f7f3f7f, 0xe4818154, 0x18c4414b, 0x4fa48da4, +0x81718181, 0x817c957f, 0x7f2e1582, 0x09bc81bf, 0x5e4b817f, 0xd5590d7f, 0x7f818b44, 0x88abcf7f, +0x39508181, 0x81ab86bf, 0xba58c325, 0x65bc83ed, 0x3402857f, 0x81c61e7f, 0x8bbab505, 0x81b2aba0, +0x8153ec32, 0x6803d681, 0x819d817f, 0xb6de31a4, 0x367f7fc2, 0xb1048db9, 0x6389815b, 0x7ffb7b01, +0x8f1b817f, 0xc1817f7f, 0x04187f64, 0x45cfac7a, 0x0f1b578c, 0x0f209f24, 0x33817f7f, 0x7f7f7f81, +0xac814781, 0x5a9d3dbf, 0x62a65581, 0xcb8a7353, 0x7f81c5b8, 0xba447fa1, 0x9081774d, 0x7af9ed38, +0xb6849bce, 0xacf07c18, 0xa1894581, 0xd7634242, 0x2d0e8174, 0xdbf799d9, 0x7fe7b446, 0x84110cf7, +0x6474da81, 0x8185e120, 0x9da4f123, 0xd07fce54, 0xa9cdf7af, 0x84db817f, 0x9e9a23b7, 0x81774c7f, +0x7f818152, 0x817f5243, 0x39058181, 0xbbc91e81, 0xe3d87581, 0x81b66581, 0x7fb06a61, 0x0bcd0fdf, +0x8188dee9, 0x1cd87f92, 0xf036977f, 0x977f4d61, 0x1da12581, 0x3a7fbee0, 0x87467fa8, 0x7fe27fa3, +0x89d37f7c, 0x397c7ff4, 0x57e64171, 0xc4819181, 0x93677f41, 0x65be2517, 0xbe6c7f7f, 0xaa7f7f81, +0x255d650e, 0x098181c9, 0xe8124525, 0xc73a4949, 0x24d14b47, 0x6730f681, 0xfe251c6e, 0xbc7fa092, +0x81917f5f, 0x81d1ab81, 0xd6128193, 0x13d62e52, 0x941c14f4, 0x25b452c6, 0x7f9c947d, 0x815d3f42, +0x81c8c9d0, 0x7f524663, 0x40ae7524, 0x2f81c77e, 0x815c8483, 0x7f7fb27f, 0x7fc37f44, 0xe07f9db7, +0x7b812117, 0x1c965b7f, 0x1822ad4b, 0xccb9e67f, 0xc5b18115, 0x7f8c377f, 0xd13939cb, 0x38e8147f, +0x4e722d21, 0x9e81ef00, 0x81c0fa81, 0x812d8158, 0x9d84a57f, 0xefc32797, 0x7fc9987f, 0xa37f8199, +0x81812681, 0x81818190, 0x89a9814c, 0x7945c381, 0xa57f816d, 0x7d65af81, 0x81bb7f72, 0x1c81cd7f, +0x6d3e4e7f, 0x6cbef90d, 0xca24894d, 0xb04892b6, 0x7f7f1e81, 0xf57f5965, 0x0769a7b0, 0x698562b9, +0x16817f7f, 0xabb94bb7, 0xc35c81f3, 0xb9b5728e, 0x8181641f, 0x81d2d2be, 0x9181bb37, 0xf82b9222, +0x7bdc7ff5, 0x9b812fa1, 0x8173f4ec, 0x94810185, 0x2bd00d63, 0x814c50dd, 0x9be376e5, 0xed7f90dc, +0x817bf98c, 0xe1df634d, 0x287f81ae, 0x27a4f115, 0x62101a81, 0x2723b481, 0x9c507f66, 0x44a01769, +0xbfd13025, 0x7f815b81, 0x5d5c817f, 0xb37f7fa5, 0x7f79b2c6, 0xa1e2847f, 0x813ac57f, 0x417f8b7f, +0x4b505b55, 0x22d47fbb, 0x7f886ad7, 0xf78c7f48, 0x53a5245d, 0xdfd37f1b, 0xb37f81c4, 0x907fc99f, +0xa393f1c0, 0x7f5f7015, 0x37be3fb3, 0x7f4c9e28, 0x7f770000, 0x9b7a0531, 0x7f35cdde, 0x5b4047cf, +0x81881773, 0xdc6e9ea5, 0x517f477f, 0xb2a77f81, 0x9981472d, 0xd4c57f81, 0x6ef2a77f, 0x81d481a3, +0x3d87307f, 0x214321bd, 0x7b7f7f8e, 0x997f1cbe, 0x266681ec, 0x3639f87f, 0x687f7fed, 0xf17f8191, +0x1558ae38, 0x815ac086, 0x81247f78, 0x7f612db7, 0x128d7fc9, 0x187fbf81, 0x4a898116, 0x3a6c818d, +0x7f7fdcf1, 0x60cb3e9c, 0x81bf627f, 0xe7c17fa1, 0x52247fd2, 0x814781dc, 0x6eb67f1a, 0x9d0b7f7d, +0xc2b238f8, 0x81b1427a, 0xa1555aad, 0x103c0c29, 0x97319c81, 0x05ab3a7f, 0x811f1d7f, 0x817f8195, +0x40bffc7f, 0x3aa38f4a, 0x46e17fcb, 0x6781fc31, 0xb725a5e4, 0x427f8cbd, 0x7f857fd4, 0xca1f7f9d, +0x2f77c6b9, 0xdde30a0e, 0x7f93fca2, 0xc6aa7fc7, 0x7f9e7f7f, 0x9b78012e, 0xdda0d07f, 0x0b4c7f83, +0x7fee4b44, 0x81640552, 0x40d573c0, 0x390efbce, 0x327fb881, 0xf5e69aec, 0x81e9c7d1, 0x81717f74, +0x81817d78, 0xac6eba86, 0x41a2d07f, 0x8981da45, 0x5264b681, 0x527f46f2, 0x949e7f52, 0x7fdd7fbd, +0x81678102, 0x87756c64, 0x3d2a81ca, 0xc87f8107, 0xd17fb64a, 0xa7b553b5, 0x8191812a, 0x55ddbf7f, +0x517f7b7f, 0x897aad7f, 0x63817f8d, 0xd9547f7f, 0x43437351, 0x84818181, 0x3a7f8127, 0xccbfdf7f, +0xe1191588, 0x81c80c65, 0x7ffcf571, 0xcc147b7f, 0x00007081, 0x2b7f7f7f, 0x889b3a2b, 0x5358e78b, +0xfcb917ab, 0x81c3f74d, 0xd57faa18, 0x69937f23, 0xd7321b81, 0x5db1ad81, 0x17577f0a, 0xf48118bf, +0x81822681, 0x2981e87f, 0xc16e6c7f, 0x891d38ae, 0xf37f813f, 0x81b96b55, 0x2fcd81b1, 0x23b5f981, +0x695c4d28, 0xa0810fab, 0x6cd5ea3d, 0xefc68ec4, 0xae32887e, 0xa27f0b17, 0x7f8baa97, 0x8116b3a1, +0xa393817f, 0x817019f0, 0x1d7f8193, 0x18f0d764, 0xb27fb7c9, 0xc4da637f, 0xcd586f56, 0x7f23810d, +0x572f25f3, 0x05df7f15, 0x817f815c, 0x8b147f84, 0x0f817f6b, 0x7f1f7f7f, 0xbccee4a8, 0xcb5ad7ed, +0x33a5f88b, 0xc7817ecd, 0x8781817f, 0x817e6444, 0x6697817f, 0xf9490257, 0x83d5f581, 0x7168b332, +0xf4ed4781, 0x17e0c1c4, 0x16b9c997, 0x8581247f, 0x81887b3f, 0x2281a5c7, 0xce437f0f, 0x994c6f81, +0xbcd09735, 0x9269d57d, 0x449a7e61, 0x8c6e7f81, 0x81b38c7f, 0x81db7791, 0x62602681, 0x3246817f, +0x81bb2881, 0x6d2510b4, 0xb07fbf69, 0x49ea817f, 0x938153e7, 0xf17f425b, 0x3b817f89, 0x36b48181, +0x837c1d0a, 0x853cbd2c, 0x2950527f, 0x388de1bc, 0xfa1c7f54, 0x7b507f7f, 0xad311c42, 0x8d8ae6c3, +0x9081677f, 0x58810e81, 0x984b4881, 0x4b9f407f, 0x819a00ff, 0x857faee2, 0xa06d9fb5, 0x448979b8, +0x9cc0f17f, 0x7f2fce7f, 0xa0b9ad7f, 0x428a7f7f, 0xdf562afa, 0x7f6f0000, 0xe04a5bef, 0xa7ad2867, +0x23818146, 0x7f7f0642, 0x7f481981, 0x7f810f81, 0x99a9db81, 0x64d437cd, 0xaf7fcb6d, 0x81815311, +0x723c81bd, 0xcc7fc729, 0x81a47e49, 0x9abce744, 0x7385eb5b, 0x7f7f5b7f, 0x2bb3819d, 0x81fd7f49, +0x7f5f8198, 0x7fb6a2f3, 0xe97fc33c, 0x436c79d3, 0x5ea67fff, 0x5a7ff2ac, 0x28aa713c, 0x8181c681, +0x7f7c8846, 0xaf817f39, 0x90bcc57f, 0x841c7f4a, 0x817f8181, 0x7f4e811b, 0xb53a81ce, 0x7f451a7f, +0x5f38027f, 0x7b81e4f3, 0x817f87c6, 0x8141318c, 0x532c81a4, 0x817fc84c, 0x919d33db, 0x29f2b781, +0x7f568139, 0x4658b1a6, 0x7f69342d, 0x81ab9582, 0x367fa301, 0x47468181, 0x7f8c8181, 0x81216a81, +0x9b577f7f, 0x7f447f7f, 0x72ef4649, 0x45418103, 0xee48bb81, 0xa7027c7f, 0x0ea4237f, 0x6b717cf4, +0xa296a17f, 0x17007f7f, 0x869835c8, 0x8a7f77ec, 0x5d7b8139, 0x32688f81, 0x7fdab0b3, 0x815c7f7d, +0x06a01fb6, 0x814981de, 0xa1c681d8, 0xdc6ff522, 0xd13081b1, 0x9c5a7ff5, 0x7f7f7f5c, 0x86faa148, +0x811a696b, 0xbb7fa2c5, 0x815779bf, 0xae3b7f48, 0x8c45d6de, 0x7f867f9a, 0x3e359b7f, 0xb7c48181, +0x78c27f95, 0xc4818181, 0x81cd7f3f, 0x558a8193, 0x7f4ca874, 0x4e1eb447, 0x2744355f, 0x9020ead4, +0x16e47ff6, 0x708123b7, 0xbeb61418, 0x27fcdd50, 0xde21e5d8, 0x9500a3db, 0xefc29f4d, 0x5ef0c542, +0xe02a3bc8, 0xe91a38bf, 0x24f81e3c, 0xe0fe4f11, 0x3be6891d, 0x7fef09ae, 0x16977ff0, 0xe8b74a18, +0x1a50fa2e, 0x24c04bf9, 0x39c84714, 0xbed7f6c1, 0xaeddab44, 0xa7f9ca2d, 0x275dc01b, 0x1df6e74b, +0xc3171107, 0xbcc93481, 0x1403f685, 0xcc1c0439, 0xb602ebaa, 0xe235d0e1, 0xf1afe3e3, 0x0814c025, +0xb4f93607, 0xa709c243, 0xbbfabdd8, 0xfd3e81e7, 0x2f9ae335, 0x1c1d52e9, 0x00f133a5, 0x23eee238, +0xc625eced, 0xefd56878, 0xe3cadc03, 0x585db90a, 0x024ace2b, 0xe3d804ef, 0xdf54d5a1, 0xc9e11709, +0xc3a20ccb, 0x18c0005f, 0x52424437, 0xccaba110, 0xc75736d6, 0xa8f1401a, 0x3186aa67, 0x0b1aaebe, +0xf952cf90, 0xfa4edd16, 0x9d72bee5, 0x2824f455, 0x9a3cb150, 0x6bbfe929, 0x6a6f5f9d, 0xbfa5385f, +0xf89828bc, 0x6b6d0baf, 0xcab514c5, 0xa9baf505, 0x24cff2c2, 0x1c2511d8, 0x3abccde9, 0x7f60deef, +0xbbf4dddd, 0x11366331, 0x0241c141, 0x5111c984, 0xc17f54da, 0xed4c1bb8, 0x0af6fb57, 0xfd2c28c0, +0xe790142d, 0x6bff6403, 0x7fd8cce3, 0x3c282cc0, 0xea48f68b, 0x3ecdd5e3, 0xb917f2e5, 0xd2b25334, +0xf65b10b5, 0xfdd0d4be, 0xe6e22cc9, 0xc59ec206, 0x3f3238cc, 0xbcbe2fd0, 0x2418c910, 0x3d07f7cc, +0xa25bf9cf, 0xdb81ebfc, 0xd35b2203, 0xde2d23cc, 0x3cd706d5, 0x0e34f6f5, 0xc2d20000, 0xfef1e4e0, +0xd26ad6e1, 0xfa130b0d, 0x324b211c, 0xc5dfc3a9, 0xf83ebec9, 0x0dd627c0, 0xcee99850, 0x4fcd1533, +0x04597ff0, 0x40d0ff25, 0x045cd181, 0x908f9ca1, 0xd0417f7b, 0x2f0a2c87, 0xfef998c7, 0xcc3370f3, +0xb0f4267f, 0x1bbe5072, 0xd8d6063a, 0xd058cb32, 0x448fffad, 0xa9b50064, 0x184ebdf7, 0xfe2e3538, +0x561f16a6, 0xe7f20181, 0x449b95f9, 0x0338f7b2, 0x4012bcae, 0xd67f6797, 0x4966f6f2, 0x1dcc60c0, +0xeecec631, 0x279f81c4, 0xc9f751be, 0x75994dc8, 0x01001ded, 0xb0ba1822, 0xbb14eff9, 0xb2dae837, +0x4cf69e23, 0xf35d6ad7, 0xf69e57c9, 0x3727d2e3, 0x31b3517f, 0xc1da575d, 0x30e2c1d5, 0x54d7beef, +0x293edf19, 0xeb37d80e, 0x296cee35, 0xeff14f04, 0x232d06de, 0xb2815853, 0x2c601508, 0xa5ecb6ff, +0xb407f524, 0x4ccd9a19, 0xe448b0c2, 0x01ebd4c6, 0x52fc03a1, 0x286afce2, 0xe4d45ebb, 0x2953101d, +0xca12d31f, 0x10cb00dd, 0xd2ae6347, 0x46e82f44, 0x45d64600, 0xae393c05, 0xf7219fb9, 0xeffe09d2, +0xedfbb5d1, 0x07070413, 0xd7d6ec37, 0xa0f7a621, 0x75bd023f, 0xc45b5d37, 0x19ca9b39, 0xd1ee50b7, +0x50062231, 0x301ca07f, 0xbeadd410, 0x1ce01d02, 0x51a5fbff, 0xd9104c7f, 0x79e4f23a, 0x33e47449, +0x1ceda8ea, 0xf6d65581, 0x418dd3e3, 0x9fc1e612, 0x54f747d9, 0x839acbce, 0x0000221c, 0x031434b6, +0xcc48960f, 0x1045ea23, 0xa8d7f8a1, 0xaf01243e, 0x2bf461c7, 0x9c2139dd, 0xd42bd5d5, 0xf8c2f5d5, +0xdeb61f4b, 0xf12ac9cd, 0x107f3209, 0x818d1d3c, 0xca34572c, 0x34da0052, 0xf9a951e2, 0xdf34d209, +0x0f8b37c1, 0xa7dee3d3, 0x1a390c98, 0x1d16e135, 0x33c3ad66, 0xd9e2cca4, 0xcbabcce4, 0x2eadd581, +0x81383b81, 0xc0db251b, 0x0a6e91c3, 0xdab3c725, 0xd2293bfc, 0x22d6abb5, 0xdb524adc, 0x30cf5f24, +0xb92527e8, 0x6000b7bf, 0xfefe1fe4, 0x2cf9035e, 0x2743f125, 0xd007b3ad, 0x2dd5e43a, 0x5a35e7b9, +0xea06e5b7, 0x39f3e1aa, 0x592614f3, 0x7fc3bab7, 0xf1aefe00, 0xf3e9b9fc, 0xcd81aee6, 0xae3e31cc, +0x95d8fbc7, 0x7f26bbf8, 0xf20e57e3, 0xf9eee307, 0xfde2bff2, 0x10e8f7db, 0xfbb0de50, 0xdfaa10e8, +0x5e18ee3a, 0x0520a445, 0xddd2bc9e, 0x13c97536, 0x33cf5159, 0xfac6d2f7, 0x18ca01e5, 0x112251da, +0x0211d9b6, 0x375feb63, 0x9a25b9cf, 0xfb5bf632, 0xe5b4a803, 0x95f55e8d, 0xdbede748, 0x39aed0bf, +0x5efd9c49, 0xcc7fd13c, 0xfba1a3d7, 0xa8a80206, 0x08f7e7d3, 0xd1fac77f, 0x32fb9272, 0xe1829834, +0x45408175, 0x34e4eec0, 0x0ca4ecae, 0x15e31638, 0x1d072d02, 0xee44d6ee, 0xafa5282c, 0x4d4d9f2a, +0xcdfc0f24, 0x9dfaf345, 0xbf3839c3, 0x3268a3e3, 0x2e4eacb5, 0x93dce12c, 0x4a484f3b, 0xdf7d0000, +0xeb113c3d, 0xd4bdf13f, 0xecc0f511, 0xd4cdf8c2, 0x42fc05f9, 0x53be2def, 0xb22e49cf, 0xead92e2e, +0xf956f1cc, 0x02c821e0, 0x1da533e5, 0x1fc50531, 0x34c30f37, 0x7ccba6e4, 0xab1afe2e, 0xb93bd67f, +0xea28a8a8, 0xf3ef282e, 0xac0c507f, 0xd0cbdd53, 0xd344ea1d, 0x472a1029, 0xed099f70, 0x1240edc6, +0x7f143244, 0xbae0d3d5, 0x7a4bddfd, 0x5f07d846, 0x1cdf4aaf, 0x4fc40ac1, 0xcfca381a, 0xb67fd847, +0xd381dde6, 0xdad40d1d, 0x64cb2d07, 0x171a8bc6, 0x11110cbf, 0x2c442dff, 0xbe90f52b, 0xd75500e5, +0xd8459ef9, 0xff0bc92f, 0x44a903c8, 0xb767d7f2, 0xc281fc02, 0xca534906, 0x25fdec32, 0x5f2aaeb2, +0x121b376c, 0xe3e41dd2, 0x12ecd9f8, 0xc5071a9d, 0xfaaeee7d, 0x183a1a57, 0xadcb921d, 0x1e33a3b2, +0x72e52634, 0xc8d4e81e, 0x3b1e0200, 0x321e1608, 0x49add232, 0x0516ff41, 0xc23181d3, 0xfa4e0151, +0xa63502cb, 0xda381204, 0x72d92da5, 0x7cd7ebff, 0xce08d106, 0x61c6f034, 0x55310f68, 0xed66c357, +0xc527d609, 0xdab11518, 0x41b808e5, 0x5f21e65e, 0xd4f6f036, 0xfc40008d, 0xaa7f19a0, 0xbff0ac1b, +0x78283b60, 0x1d0a4a03, 0xd6d0d016, 0xf1f23847, 0x58d93518, 0xd6d481b7, 0xaf11e02e, 0x5c74b67f, +0xd5734f27, 0x2fb07fc2, 0x29564eff, 0xcafae603, 0x1228f673, 0x3367ce30, 0x132d1342, 0xc80c10e9, +0x68ad07f9, 0x379c0c9c, 0x3a73c010, 0xc1a534bc, 0x69b0fc14, 0xf0d3ba81, 0x0d07bbe3, 0x3319fa45, +0x38815afe, 0xc1a67850, 0x7fe740fe, 0xc43fb638, 0xa0864249, 0x07a7dc33, 0x05e606d4, 0x3c6a81ca, +0x0cdb2635, 0x5dd3f756, 0xcbf09b70, 0x53b2a5b3, 0x5f035ab0, 0xfdda1fbd, 0x0510ac20, 0xa8611f44, +0x38ceb74c, 0x5048e2e5, 0x907f0238, 0xd9ad00d9, 0x7c247736, 0x8aabe3c6, 0xf5443d27, 0x7ff84622, +0x4bcc0a34, 0x797dc7e0, 0xf914e5f2, 0xa12df5d7, 0x0fdc23f9, 0x377f50c3, 0x8f47bf82, 0xb9948a4a, +0x8135ca9e, 0x523ace17, 0xd299fb23, 0x523b5407, 0x38b42a22, 0xadee2cd8, 0xee04b9c8, 0x2de3a5e2, +0x9f132faa, 0xa0030325, 0x019996f4, 0xd6c5562a, 0xf3e19255, 0x00ff2432, 0xe8f6cf36, 0xe55a7f14, +0x7079f06f, 0x1e11ff0b, 0xcbe89aa8, 0x6b363996, 0xe61dd6f7, 0x15133821, 0xf35940f9, 0xd9b139c1, +0x2ad6e10b, 0x2a29c0c6, 0x3c6ee3ce, 0x4b0a3624, 0x23cc10df, 0x17cdb502, 0xa46eaa3f, 0x42350300, +0xed66334e, 0x1d6fc255, 0x3213e4c5, 0x23d4a65a, 0x05b9a3e9, 0xbacd0c19, 0xc9c5b5b1, 0x8e12670d, +0x4aabbe2d, 0xb815e3c7, 0x5a2dd152, 0x3ef6551c, 0xf0a1b4f3, 0xb8b8459b, 0xc52dd72e, 0xb9f4b9f7, +0xbd05dcc8, 0xfae04029, 0xb16ad8df, 0x03d167d4, 0xaf08525b, 0xdbdf3117, 0x4192d163, 0x00a2caad + +hard_output0 = +0xb5bc6ac8, 0xf5373664, 0x1310345c, 0xd5bae4e7, 0x1fc9e83e, 0xebfdfded, 0x84bd86ab, 0xb7aabe00, +0x60b44fea, 0xb9067464, 0x30325378, 0xa9195955, 0xf70c6e5c, 0x90922632, 0xc90b1cdb, 0xf2f5fb69, +0x73056b63, 0x1a33bf3f, 0x17755b5c, 0xc58bff6d, 0x2f4390b2, 0x2869d508, 0xe7c7dfe8, 0x38552963, +0x21da5367, 0x07282b9b, 0xa4767105, 0x1e294251, 0xe350a940, 0xb8a6aa27, 0xed12d778, 0xf10d9ece, +0xab93527f, 0xcf2da7e7, 0x68f6d0b1, 0x811f4bca, 0x577b06b2, 0x3234f13e, 0x30bab7df, 0x8dc47655, +0xbb843bed, 0x86da3aba, 0x30950c97, 0xdd096d7a, 0xa871fd6c, 0x8bee4e6b, 0x8fea30d0, 0x6c05b4d2, +0xf3e144d3, 0xd24ebb1f, 0x065635e5, 0x8d3f2cf9, 0x536c6c6a, 0xfbb0a5d0, 0x3d707b42, 0xc44d5982, +0xa5f4ad8f, 0xf32c0970, 0x1bccf1a6, 0x05916020, 0xa64fb176, 0x5ede6a35, 0xaf4966da, 0x9df5e0e7, +0x75042abc, 0x9ef10481, 0x11ddcbc8, 0xa0f5518c, 0xd5c23418, 0x2393d558, 0xfbe7dfeb, 0xed1c64c2, +0x86a36508, 0xde2dfb1e, 0xb8d0fef9, 0x24505232, 0xc894e71c, 0xbcc752a0, 0x40b74e83, 0x90d23c8c, +0x728e4a61, 0x108f0b08, 0x66f522ee, 0xc258d851, 0x35a31c44, 0x11311b5b, 0xfd3d5be9, 0x5ae448ff, +0x4f64994b, 0x5b8247a9, 0x4021114d, 0x2f0b6e82, 0x5eaa9828, 0x50ac71c0, 0xfb86ee52, 0x0dc1ac9b, +0xbbd47645, 0x8f357115, 0x978ceea0, 0xd557db99, 0x99b30388, 0xfc9a8a1c, 0x0f75be1a, 0x50143e22, +0x8840989b, 0x738ec50e, 0xe6b2783d, 0xf67899c8, 0x27ebed69, 0x6c415a16, 0x3a6cc2dc, 0xcd4e4e5d, +0x6cb12b2e, 0xdb88d7c0, 0x79cd1582, 0xbc422413, 0xe72ad2f4, 0x8eaac30f, 0x0bd86747, 0x6d87f69d, +0x15d62038, 0x4b375630, 0x0d51b859, 0x16db2cb2, 0xf210603a, 0x0abeb833, 0x55c694d0, 0xe57ca43b, +0x0ba94428, 0x1398a406, 0xe47d3889, 0x5a20203d, 0x250d7a1a, 0xd930ffec, 0x03992e79, 0xf2759376, +0x024ec121, 0x91fc3a2c, 0xb7e11cc5, 0x4ff7d459, 0xb8700134, 0xd6e61758, 0x4eba0a32, 0xb747e3ec, +0x7073fad7, 0xded80f99, 0x331e2f1b, 0xfa1f1bed, 0x056424a2, 0x1d1d95e0, 0x550b9ec8, 0x51ee2a38, +0x19525153, 0xd70c4cd5, 0x0d6cd7ad, 0xe44d1cf2, 0x30dfecda, 0xdacd7fe8, 0x7321d795, 0xddf48ef4, +0xe271e6a4, 0x9c1feecb, 0x951fcd7b, 0x8acc5a03, 0x3fb83527, 0xe306de74, 0x7b9cd6ee, 0x8e140885, +0xd4c91e8d, 0xe8c39733, 0x0f02f87f, 0xfb06b1b9, 0x0dc9349c, 0xf76bae8e, 0x4f642a07, 0x3d48a9aa, +0xe3ea323a, 0xa1cd5c8a, 0x40aa0e70, 0x132042d3, 0xa9732f6c, 0xd15a00c4, 0x43d3b046, 0x9a51ebd4, +0xc46ee0ed, 0xe2a2148b, 0xf5c478f0, 0x1fb01cf3, 0xf4f321ec, 0xd973811f, 0x11ad11b9, 0x5c67adda + +soft_output0 = +0x81818181, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x817f817f, 0x81817f81, +0x7f817f81, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x817f8181, 0x81817f81, +0x7f7f7f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f7f8181, +0x81817f7f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, +0x7f818181, 0x8181817f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x817f817f, +0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, +0x8181817f, 0x817f7f81, 0x81818181, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, +0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f81817f, +0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, +0x81817f81, 0x81817f81, 0x81817f81, 0x817f817f, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x8181817f, +0x7f817f7f, 0x817f7f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x817f8181, 0x7f7f7f81, +0x7f817f81, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, +0x7f7f817f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x7f81817f, +0x7f7f7f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f817f81, +0x817f7f81, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x81818181, 0x7f818181, 0x8181817f, +0x817f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x817f8181, 0x81817f7f, +0x7f7f8181, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x81818181, 0x7f81817f, 0x817f817f, 0x81818181, +0x817f8181, 0x817f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f81, 0x7f7f8181, 0x7f817f7f, 0x7f7f817f, +0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, +0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x81817f81, +0x817f7f81, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, +0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, +0x8181817f, 0x817f8181, 0x81817f81, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x7f7f8181, +0x8181817f, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x8181817f, 0x81817f81, 0x817f8181, +0x81818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x817f8181, +0x817f7f81, 0x817f7f81, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f81817f, 0x81818181, 0x8181817f, +0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, +0x8181817f, 0x7f81817f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, +0x7f81817f, 0x81817f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x81817f7f, +0x81817f7f, 0x81817f7f, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x7f7f8181, +0x817f7f7f, 0x81818181, 0x7f818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, +0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f817f, 0x81817f81, 0x817f8181, 0x7f7f817f, +0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x817f817f, 0x81817f7f, +0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, +0x7f81817f, 0x7f818181, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f81, +0x7f7f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x8181817f, +0x817f817f, 0x7f7f7f81, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f817f, 0x81817f7f, +0x817f7f7f, 0x81818181, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f817f81, 0x817f8181, +0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x817f817f, +0x7f817f7f, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f81, +0x81817f81, 0x817f7f7f, 0x81817f7f, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, +0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, +0x817f7f81, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x81818181, 0x7f81817f, 0x7f81817f, 0x817f8181, +0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, +0x8181817f, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f81817f, +0x8181817f, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x81818181, +0x817f817f, 0x7f818181, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f817f, +0x817f7f7f, 0x817f8181, 0x81817f81, 0x81818181, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, +0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x81817f81, +0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x8181817f, +0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f81817f, 0x7f81817f, +0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x7f818181, +0x8181817f, 0x81818181, 0x8181817f, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x7f81817f, 0x7f817f7f, +0x81817f81, 0x7f81817f, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f817f7f, +0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f7f7f7f, +0x7f818181, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x8181817f, 0x81817f7f, +0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x81818181, +0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x81817f7f, +0x7f818181, 0x817f7f81, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f817f81, 0x7f7f7f81, +0x7f818181, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x81817f7f, 0x8181817f, 0x817f8181, 0x8181817f, +0x7f818181, 0x7f817f81, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f7f, +0x817f8181, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x81817f81, 0x7f7f7f7f, +0x7f818181, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, +0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x81818181, 0x817f8181, +0x7f7f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, +0x817f8181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f818181, 0x817f7f7f, 0x7f7f7f7f, +0x817f7f81, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x81817f81, 0x81817f81, 0x7f7f7f81, +0x8181817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, +0x7f817f81, 0x81818181, 0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x8181817f, 0x7f818181, +0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, +0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x8181817f, +0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, +0x817f817f, 0x7f81817f, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x81818181, 0x817f817f, 0x7f7f817f, +0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f81, +0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f817f, +0x7f7f8181, 0x7f7f7f81, 0x817f8181, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x7f817f81, +0x7f817f81, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, +0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f81817f, +0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, +0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81818181, 0x8181817f, 0x81817f7f, 0x81818181, 0x817f817f, +0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x81817f7f, +0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x817f7f7f, 0x817f817f, +0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x7f817f81, +0x817f7f7f, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x81817f81, 0x81818181, 0x7f817f7f, +0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, +0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x7f7f817f, +0x817f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x817f817f, +0x7f817f7f, 0x7f817f7f, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x8181817f, 0x7f7f8181, 0x7f817f7f, +0x7f817f81, 0x7f7f8181, 0x81817f81, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f7f7f81, 0x8181817f, +0x81817f7f, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, +0x81817f7f, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x81817f81, 0x817f7f81, +0x81818181, 0x817f7f7f, 0x7f818181, 0x81818181, 0x7f7f817f, 0x817f817f, 0x7f7f817f, 0x7f817f7f, +0x7f817f81, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x817f817f, 0x7f818181, +0x817f7f81, 0x817f7f7f, 0x81817f81, 0x81818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f8181, +0x7f818181, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, +0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f81817f, 0x817f8181, 0x7f81817f, +0x8181817f, 0x81818181, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, +0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x7f81817f, +0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x7f817f81, 0x7f817f81, 0x7f7f817f, +0x81818181, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f81817f, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, +0x7f817f81, 0x817f817f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x81817f81, +0x7f7f7f81, 0x81818181, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x7f818181, 0x7f7f8181, +0x7f7f7f81, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x817f8181, 0x817f8181, 0x817f7f81, +0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, +0x81817f7f, 0x7f817f7f, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f7f, +0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x81817f81, 0x817f7f7f, 0x7f7f817f, +0x817f7f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f81, +0x8181817f, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f817f, +0x7f7f7f81, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, +0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x7f818181, 0x7f817f81, +0x8181817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x817f817f, 0x81817f81, 0x7f7f8181, +0x7f7f7f7f, 0x7f81817f, 0x817f817f, 0x81817f81, 0x81817f81, 0x81817f7f, 0x81817f81, 0x81817f81, +0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x817f7f7f, +0x7f7f7f81, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, +0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f817f81, 0x7f817f7f, +0x81818181, 0x817f817f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x81818181, 0x8181817f, 0x7f817f81, +0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f817f81, +0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f7f81, 0x817f8181, 0x81817f7f, 0x81817f7f, +0x7f7f817f, 0x817f817f, 0x7f817f81, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x81817f7f, +0x817f817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x817f7f81, 0x817f8181, 0x8181817f, +0x81818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, +0x8181817f, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x81817f7f, +0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f7f, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f818181, +0x7f7f7f81, 0x81817f7f, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, +0x7f7f817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x81818181, 0x7f7f8181, 0x817f8181, 0x7f817f81, +0x7f817f81, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x817f7f7f, 0x7f81817f, 0x7f817f7f, +0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f7f817f, 0x7f817f7f, 0x817f817f, +0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, +0x817f7f81, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, +0x817f817f, 0x81817f7f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x81817f81, +0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f817f, 0x817f7f81, 0x817f7f81, 0x7f818181, +0x817f7f7f, 0x8181817f, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x817f8181, +0x8181817f, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x817f817f, 0x817f7f81, 0x81818181, 0x81818181, +0x8181817f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x817f8181, 0x7f7f817f, +0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x7f817f7f, +0x8181817f, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x81818181, 0x817f7f7f, 0x817f817f, +0x7f7f7f7f, 0x817f8181, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x81817f81, +0x7f818181, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, +0x81817f81, 0x817f7f7f, 0x817f817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, +0x7f81817f, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x817f7f81, 0x7f818181, +0x7f818181, 0x817f7f81, 0x7f817f81, 0x7f7f7f7f, 0x81817f81, 0x81818181, 0x7f818181, 0x7f81817f, +0x81817f81, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x81817f7f, +0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x817f7f7f, +0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f7f, +0x81818181, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81817f7f, 0x817f817f, +0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, +0x817f7f7f, 0x7f7f817f, 0x817f8181, 0x7f817f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x81818181, +0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x81818181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x81818181, +0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x817f7f81, +0x7f81817f, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, +0x81817f81, 0x81817f81, 0x7f817f81, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x81817f81, +0x7f7f817f, 0x8181817f, 0x817f7f81, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x817f7f7f, +0x8181817f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f81, 0x817f7f7f, 0x81818181, 0x817f7f7f, +0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x817f817f, 0x7f81817f, 0x81818181, +0x81817f81, 0x81818181, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81818181, +0x81818181, 0x81818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f818181, +0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x817f7f7f, 0x81817f81, +0x7f7f7f7f, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x81817f81, +0x817f817f, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f81817f, +0x817f8181, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x7f818181, 0x81817f7f, +0x81817f7f, 0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f818181, 0x7f81817f, +0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x8181817f, 0x8181817f, 0x7f817f81, 0x8181817f, 0x8181817f, +0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, +0x7f818181, 0x7f817f81, 0x81818181, 0x817f817f, 0x817f817f, 0x7f818181, 0x817f8181, 0x7f7f817f, +0x7f7f7f81, 0x817f7f7f, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f817f, 0x7f7f817f, +0x7f817f81, 0x817f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x8181817f, 0x7f7f8181, +0x7f818181, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x817f817f, 0x817f7f81, 0x7f7f7f81, 0x81817f81, +0x817f8181, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, +0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x7f7f8181, 0x8181817f, +0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x817f817f, +0x817f7f7f, 0x81817f7f, 0x7f818181, 0x81818181, 0x817f7f81, 0x81817f7f, 0x817f8181, 0x817f8181, +0x81817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, +0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, 0x817f8181, +0x817f817f, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f81817f, +0x7f817f81, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x81817f81, +0x7f7f8181, 0x7f817f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, +0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x8181817f, +0x7f817f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x81818181, +0x7f817f81, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x7f7f7f7f, +0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, +0x817f7f7f, 0x81817f81, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x7f817f81, +0x7f7f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, +0x7f817f7f, 0x817f8181, 0x7f818181, 0x81817f7f, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, +0x7f81817f, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f818181, 0x817f7f7f, 0x7f81817f, +0x81817f81, 0x7f7f7f81, 0x7f818181, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f8181, +0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x81817f81, +0x817f8181, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f81817f, +0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x817f7f81, 0x81817f81, 0x7f817f81, +0x817f8181, 0x7f818181, 0x7f817f81, 0x81817f81, 0x81817f81, 0x817f8181, 0x7f818181, 0x81818181, +0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x8181817f, 0x81818181, 0x817f7f81, 0x7f818181, +0x81817f81, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f7f817f, 0x8181817f, +0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x7f7f8181, +0x7f7f8181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, +0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x81817f7f, +0x817f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, +0x7f7f8181, 0x817f817f, 0x7f7f7f81, 0x7f7f817f, 0x817f8181, 0x7f81817f, 0x7f81817f, 0x817f7f7f, +0x7f817f7f, 0x817f817f, 0x817f7f81, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f81817f, +0x7f7f8181, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f81817f, 0x817f8181, 0x8181817f, 0x7f817f7f, +0x817f8181, 0x817f7f81, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, +0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x8181817f, 0x81817f81, +0x817f817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x7f817f7f, 0x7f7f7f81, 0x817f817f, +0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f7f7f, 0x817f8181, +0x7f7f8181, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x81817f81, 0x817f8181, 0x817f7f7f, +0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x81817f7f, +0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f7f, +0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, +0x7f818181, 0x817f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x81817f7f, 0x817f8181, 0x7f7f8181, +0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, +0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, +0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x817f8181, +0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f81817f, 0x7f7f817f, 0x81817f81, 0x7f7f8181, +0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x817f817f, +0x7f81817f, 0x7f818181, 0x817f8181, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, +0x817f8181, 0x817f8181, 0x7f817f81, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x817f817f, 0x81818181, +0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x81818181, +0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f818181, +0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x81817f81, +0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, +0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x81817f81, +0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, +0x7f81817f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x817f7f81, +0x7f7f7f81, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x7f81817f, 0x817f8181, 0x81817f7f, 0x7f817f81, +0x81818181, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x8181817f, 0x81818181, 0x81818181, +0x81818181, 0x817f8181, 0x81817f81, 0x817f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f81817f, +0x7f7f7f81, 0x7f7f7f7f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x817f7f7f, +0x7f817f7f, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x817f7f81, +0x81818181, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, +0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, +0x7f7f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x81817f81, +0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x817f7f7f, +0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, +0x7f818181, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, +0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x817f817f, 0x817f7f7f, 0x81817f7f, +0x7f81817f, 0x817f817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x817f7f81, +0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, +0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x81817f7f, +0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x81817f81, +0x7f7f7f81, 0x817f7f81, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x81817f81, 0x7f817f7f, 0x7f818181, +0x7f818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f7f817f, +0x81818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x817f7f7f, +0x81817f7f, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x817f7f81, +0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, +0x7f817f7f, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, +0x7f81817f, 0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, +0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x81818181, +0x7f81817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, +0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x7f81817f, +0x81817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, +0x7f7f817f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x8181817f, 0x7f817f81, 0x81817f7f, +0x817f7f7f, 0x7f7f8181, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x7f7f817f, +0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, +0x817f817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x81818181, 0x81817f81, +0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, +0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x7f7f817f, +0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x81818181, 0x8181817f, 0x7f7f7f81, 0x7f818181, +0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f81817f, 0x817f7f81, +0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x8181817f, 0x7f817f7f, +0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f818181, +0x81817f81, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x7f7f7f81, +0x817f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x817f8181, +0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x817f817f, +0x81817f81, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x817f7f7f, +0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81817f81, 0x81817f7f, 0x8181817f, +0x817f817f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, +0x817f817f, 0x817f8181, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x817f817f, +0x81818181, 0x7f818181, 0x817f7f81, 0x817f8181, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, +0x7f7f7f7f, 0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x7f7f8181, +0x7f7f8181, 0x81817f7f, 0x81817f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, +0x817f7f81, 0x8181817f, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x7f7f817f, +0x81817f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, +0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f817f, +0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x7f817f7f, +0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f7f, +0x7f817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x817f817f, 0x8181817f, +0x817f7f7f, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f7f, 0x7f7f8181, +0x81818181, 0x81818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f81817f, +0x7f7f817f, 0x7f818181, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, +0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f818181, +0x7f817f81, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f817f7f, 0x7f817f81, +0x817f7f81, 0x7f7f817f, 0x81817f81, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x81817f81, +0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x7f818181, 0x7f7f7f7f, 0x817f7f81, +0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, +0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x7f81817f, +0x7f817f7f, 0x81817f81, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, +0x81817f81, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x7f818181, 0x7f818181, 0x7f818181, 0x7f81817f, +0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x81818181, +0x81817f7f, 0x81818181, 0x817f7f81, 0x81817f81, 0x81817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, +0x7f7f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x81817f81, 0x7f7f7f81, 0x8181817f, +0x8181817f, 0x7f7f817f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x817f817f, 0x817f817f, 0x7f81817f, +0x8181817f, 0x817f7f7f, 0x7f818181, 0x817f7f7f, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x817f817f, +0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x7f81817f, 0x817f8181, +0x7f81817f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x8181817f, 0x81817f81, +0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, +0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x81818181, 0x81818181, 0x81818181, +0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, +0x7f817f81, 0x817f8181, 0x7f81817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x817f7f7f, 0x817f8181, +0x7f7f8181, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x7f81817f, +0x7f817f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x817f7f81, 0x817f817f, +0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x817f817f, +0x8181817f, 0x81818181, 0x81817f81, 0x817f8181, 0x81818181, 0x81817f7f, 0x817f8181, 0x7f7f8181, +0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, +0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x7f817f7f, +0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x7f7f817f, 0x81818181, +0x7f81817f, 0x817f8181, 0x81818181, 0x81817f81, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f7f81, +0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x7f81817f, 0x7f818181, +0x7f818181, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x817f7f81, +0x7f817f7f, 0x7f7f7f7f, 0x7f818181, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x81818181, +0x7f7f817f, 0x81817f81, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x81818181, 0x817f817f, +0x7f7f7f81, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x8181817f, +0x7f7f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81817f81, +0x817f817f, 0x81817f81, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x817f817f, +0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x817f7f7f, +0x7f817f81, 0x7f7f8181, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x817f817f, +0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x7f81817f, +0x7f7f817f, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x7f817f81, +0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x817f7f7f, +0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x817f7f81, 0x817f7f81, +0x7f817f7f, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, +0x7f817f7f, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, +0x817f8181, 0x7f818181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f7f7f7f, +0x8181817f, 0x81817f81, 0x817f7f81, 0x81818181, 0x81817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f7f, +0x817f7f81, 0x817f7f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, +0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x7f818181, 0x817f817f, 0x7f7f7f81, +0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x7f81817f, 0x817f817f, 0x8181817f, 0x7f7f7f7f, +0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x8181817f, +0x81817f81, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f81, 0x7f818181, +0x7f817f7f, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x81817f7f, 0x817f817f, +0x7f81817f, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f8181, +0x7f7f8181, 0x7f7f7f81, 0x7f818181, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x7f81817f, +0x817f8181, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, +0x81818181, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x817f8181, +0x81817f81, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x81817f81, 0x81817f81, +0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f7f7f7f, +0x81817f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x817f8181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, +0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, +0x81818181, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, 0x81818181, 0x7f7f817f, 0x7f818181, +0x7f7f7f7f, 0x81818181, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, +0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f817f, +0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x81817f81, +0x817f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, +0x7f818181, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x7f7f8181, +0x817f7f81, 0x81817f81, 0x817f8181, 0x817f817f, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f8181, +0x7f7f7f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, +0x81818181, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x817f8181, +0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, +0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, +0x817f7f7f, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, +0x81817f7f, 0x817f7f7f, 0x7f817f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f7f817f, 0x7f817f81, +0x81817f81, 0x81818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x817f8181, +0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x7f817f81, +0x7f818181, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x8181817f, +0x7f7f817f, 0x817f817f, 0x81817f81, 0x81817f81, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x817f7f81, +0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x81817f81, 0x7f817f81, +0x7f81817f, 0x817f7f81, 0x7f818181, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, +0x81817f7f, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x8181817f, 0x7f7f817f, 0x8181817f, 0x7f818181, +0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f7f81, +0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f81817f, 0x81818181, +0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x817f7f81, 0x8181817f, +0x81818181, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, +0x81818181, 0x81818181, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f817f, +0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x8181817f, +0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x817f7f7f, +0x81818181, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, +0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x817f817f, +0x81818181, 0x8181817f, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x8181817f, +0x7f818181, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f818181, 0x81818181, 0x8181817f, +0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x81818181, +0x81818181, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x81817f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, +0x7f7f8181, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x81818181, +0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f817f, 0x81818181, +0x7f817f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, +0x81817f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x8181817f, 0x81818181, 0x81817f7f, +0x7f81817f, 0x81818181, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x817f817f, 0x7f818181, +0x7f817f7f, 0x7f7f7f7f, 0x817f817f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x81818181, 0x7f7f817f, +0x817f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x81817f81, +0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f7f7f7f, 0x81818181, 0x8181817f, 0x7f817f81, 0x8181817f, +0x7f81817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x7f818181, 0x81818181, +0x81817f81, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x7f818181, 0x81817f81, +0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, +0x817f817f, 0x817f817f, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x8181817f, +0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, +0x7f817f7f, 0x81818181, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f818181, 0x7f817f7f, +0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x817f7f81, +0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x81818181, 0x81817f7f, 0x817f817f, 0x817f817f, 0x7f7f817f, +0x7f81817f, 0x81818181, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, +0x7f817f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x8181817f, 0x817f7f81, 0x7f817f81, +0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x8181817f, +0x7f81817f, 0x817f817f, 0x7f817f81, 0x8181817f, 0x7f818181, 0x81817f81, 0x7f818181, 0x81818181, +0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f7f81, +0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x7f818181, +0x7f7f8181, 0x817f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f817f7f, +0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, +0x7f7f8181, 0x7f818181, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, +0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x81817f81, +0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, +0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x8181817f, 0x817f7f81, +0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, +0x7f818181, 0x7f818181, 0x7f817f81, 0x7f7f7f7f, 0x7f81817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, +0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f81817f, +0x81817f81, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, +0x7f81817f, 0x81818181, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f7f817f, +0x817f7f81, 0x817f7f81, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x81818181, +0x8181817f, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x7f81817f, +0x81817f7f, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x81818181, 0x7f7f7f81, +0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x81817f81, 0x7f81817f, 0x81817f81, 0x7f7f8181, +0x817f817f, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f7f817f, +0x817f8181, 0x7f7f817f, 0x8181817f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f7f, +0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f81, 0x8181817f, 0x7f817f7f, 0x81818181, 0x7f7f7f81, +0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x81818181, 0x7f7f7f81, +0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x817f8181, +0x7f817f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x7f818181, 0x817f7f81, +0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x81818181, +0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81817f81, 0x8181817f, 0x7f818181, 0x81817f81, +0x817f7f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, +0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f81817f, 0x7f7f8181, +0x7f818181, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x817f7f7f, 0x7f817f7f, +0x7f7f8181, 0x817f8181, 0x7f818181, 0x81817f81, 0x7f818181, 0x8181817f, 0x8181817f, 0x7f818181, +0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x81818181, 0x817f7f7f, +0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x817f817f, 0x817f817f, +0x7f818181, 0x7f7f8181, 0x8181817f, 0x817f817f, 0x81817f7f, 0x81818181, 0x7f81817f, 0x817f817f, +0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x7f7f817f, 0x7f7f7f7f, +0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f818181, 0x7f7f7f7f, +0x7f7f7f7f, 0x7f7f7f81, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, +0x817f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f81, +0x817f817f, 0x817f7f7f, 0x81818181, 0x7f818181, 0x81818181, 0x81818181, 0x7f7f7f81, 0x8181817f, +0x81818181, 0x7f817f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x8181817f, 0x817f7f81, +0x7f817f7f, 0x81817f7f, 0x817f8181, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, +0x817f7f7f, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, +0x7f817f81, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f818181, 0x81817f81, +0x817f8181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x81817f81, +0x81817f7f, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x817f817f, 0x817f8181, 0x817f7f7f, 0x8181817f, +0x81817f7f, 0x8181817f, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x817f817f, +0x81818181, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x8181817f, +0x7f818181, 0x7f817f81, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x7f7f8181, 0x7f7f7f7f, +0x7f81817f, 0x817f8181, 0x817f817f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f7f7f, +0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x817f8181, +0x81817f81, 0x817f8181, 0x7f81817f, 0x817f8181, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f818181, +0x7f7f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x817f7f7f, +0x7f7f817f, 0x817f7f7f, 0x817f817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, +0x7f817f81, 0x81818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x81817f81, +0x81818181, 0x81817f81, 0x7f7f817f, 0x81818181, 0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f81817f, +0x817f8181, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f8181, +0x7f81817f, 0x7f818181, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x7f81817f, 0x817f8181, +0x81817f81, 0x81818181, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x81817f81, +0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x81818181, +0x81817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81817f81, 0x8181817f, +0x817f817f, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, 0x8181817f, 0x7f7f7f7f, 0x817f817f, +0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, +0x7f81817f, 0x817f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, +0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x81818181, +0x81817f81, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, +0x817f817f, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f81, +0x7f817f7f, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, +0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f817f81, 0x817f817f, 0x81817f7f, 0x7f81817f, 0x8181817f, +0x817f7f81, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x81818181, 0x7f818181, 0x817f7f7f, 0x81818181, +0x81818181, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f81817f, +0x817f817f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x7f7f817f, +0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, +0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, +0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, +0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x817f7f81, 0x81817f81, +0x817f7f81, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x8181817f, +0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x81818181, 0x817f8181, 0x7f7f8181, 0x81818181, 0x817f7f81, +0x817f8181, 0x81817f7f, 0x8181817f, 0x817f817f, 0x8181817f, 0x7f818181, 0x81817f81, 0x81818181, +0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x8181817f, +0x817f7f81, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x817f8181, +0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x81817f81, +0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, +0x817f7f81, 0x817f8181, 0x8181817f, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, +0x81817f81, 0x817f8181, 0x817f7f7f, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x817f7f81, +0x81817f7f, 0x7f818181, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x81817f81, +0x81818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f817f7f, +0x7f7f8181, 0x817f8181, 0x7f818181, 0x8181817f, 0x81817f81, 0x817f7f7f, 0x7f817f81, 0x81818181, +0x817f817f, 0x81818181, 0x817f7f81, 0x817f7f7f, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x817f7f81, +0x7f818181, 0x817f7f7f, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x81818181, 0x817f7f81, +0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f81817f, +0x817f817f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x7f81817f, +0x81818181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x817f7f7f, +0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, +0x7f7f7f7f, 0x817f7f81, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x81818181, +0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x817f7f7f, 0x81818181, 0x81817f7f, +0x7f817f7f, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x81817f7f, 0x817f8181, 0x7f81817f, +0x7f7f7f7f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x8181817f, 0x81817f81, +0x817f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x7f817f81, 0x81818181, 0x817f8181, 0x8181817f, +0x7f817f7f, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x817f8181, +0x7f81817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x817f8181, 0x7f7f7f81, +0x8181817f, 0x8181817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x81818181, 0x7f7f7f81, +0x7f817f7f, 0x81818181, 0x817f8181, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, +0x81818181, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x817f8181, +0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81817f7f, 0x817f8181, +0x817f8181, 0x7f818181, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f8181, +0x7f7f7f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x81817f81, +0x7f817f7f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f817f81, +0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, +0x817f817f, 0x81817f7f, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x817f8181, 0x81818181, 0x8181817f, +0x81817f7f, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f817f, +0x817f8181, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, +0x81817f81, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x817f8181, +0x81817f81, 0x8181817f, 0x7f7f7f81, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f8181, 0x817f8181, +0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x81817f81, +0x817f8181, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x81818181, 0x7f817f81, 0x81817f7f, 0x81818181, +0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f7f, +0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f817f, +0x817f817f, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f817f7f, +0x7f7f7f81, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f817f, +0x81818181, 0x81818181, 0x8181817f, 0x81817f81, 0x81818181, 0x817f8181, 0x7f817f7f, 0x7f817f81, +0x817f8181, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f7f, +0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f81, 0x817f8181, +0x81818181, 0x817f817f, 0x81817f81, 0x817f817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, +0x81817f81, 0x7f81817f, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, +0x8181817f, 0x7f81817f, 0x8181817f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x8181817f, +0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x7f7f7f7f, +0x7f817f7f, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x7f7f8181, +0x7f817f81, 0x7f817f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x7f7f8181, 0x7f817f7f, +0x7f7f8181, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x8181817f, +0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x81818181, +0x7f817f81, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, +0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f817f81, +0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x81818181, +0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, +0x817f7f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, +0x7f818181, 0x81818181, 0x817f8181, 0x81817f7f, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x7f7f8181, +0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x8181817f, 0x81818181, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, +0x81817f7f, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x81817f7f, +0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x7f81817f, +0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, +0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x817f7f81, 0x817f7f81, 0x7f817f81, +0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x81818181, +0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f817f81, 0x81817f7f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, +0x7f818181, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x817f7f81, 0x7f7f7f81, +0x81818181, 0x7f817f7f, 0x81818181, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x81818181, +0x7f817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x8181817f, 0x817f817f, +0x817f817f, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f81, +0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, +0x817f7f7f, 0x81818181, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x7f81817f, 0x7f7f8181, +0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x817f7f81, 0x7f817f81, +0x81817f81, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f81, +0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, +0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, +0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x8181817f, +0x817f817f, 0x81818181, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, +0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x81817f7f, 0x81818181, 0x7f81817f, 0x7f7f7f7f, +0x81818181, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f8181, 0x81818181, +0x81818181, 0x7f7f8181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f817f, 0x817f817f, +0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f8181, +0x7f817f7f, 0x7f817f81, 0x817f8181, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f8181, +0x81817f7f, 0x7f7f7f7f, 0x817f7f81, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f817f81, 0x7f81817f, +0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, +0x7f81817f, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f8181, +0x817f7f81, 0x7f7f7f81, 0x7f818181, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x817f7f81, 0x81818181, +0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x7f818181, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f81817f, +0x817f7f81, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x81817f81, +0x81818181, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f81817f, +0x81817f81, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81818181, +0x7f817f81, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, +0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f817f, 0x7f7f7f7f, +0x817f817f, 0x8181817f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, +0x7f81817f, 0x7f7f7f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, +0x81818181, 0x81817f81, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f81817f, +0x81818181, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x817f7f7f, +0x817f817f, 0x817f7f81, 0x81818181, 0x81817f81, 0x7f818181, 0x81817f7f, 0x817f817f, 0x7f81817f, +0x817f7f81, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x817f7f7f, +0x7f818181, 0x817f8181, 0x7f7f817f, 0x817f7f81, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x7f81817f, +0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x81818181, 0x7f7f817f, +0x817f8181, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x81818181, +0x81817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x7f817f7f, +0x7f817f7f, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f8181, 0x81817f81, +0x7f817f7f, 0x817f8181, 0x817f817f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, +0x81817f81, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, +0x7f818181, 0x7f81817f, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81818181, +0x7f818181, 0x7f817f81, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, +0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f818181, 0x81818181, 0x817f7f81, 0x817f8181, +0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f818181, +0x81818181, 0x7f7f817f, 0x81818181, 0x7f818181, 0x7f817f7f, 0x7f817f81, 0x7f7f8181, 0x81818181, +0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, +0x7f817f81, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, +0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f + +e = +34560 + +k = +6144 + +rv_index = +0 + +iter_max = +8 + +iter_min = +4 + +expected_iter_count = +8 + +ext_scale = +15 + +num_maps = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_SOFT_OUTPUT, RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN, +RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_posllr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_posllr.data new file mode 100644 index 0000000000..13ad0908ce --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_posllr.data @@ -0,0 +1,1225 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_DEC + +input0 = +0xf6bb1100, 0x4e433af1, 0x38f02efa, 0x0ee43d00, 0x5037c35f, 0x5620e729, 0xdd46c4d7, 0x5ae3e2f7, +0xe0d7fa2f, 0x2e4ae20d, 0xa7190ebf, 0xd2382614, 0x98ffabe0, 0xf7ee0c5d, 0xffd8ddd7, 0x5f03ecc7, +0xf9ffdde5, 0xf12446f6, 0x42693a3d, 0xfcc81aae, 0x2b0abc2c, 0x43f2a1b5, 0x044a302c, 0xf8db4fa6, +0xcad2d138, 0x452b5526, 0xf3083fd3, 0x30ea4b22, 0xe2bd66f4, 0xbc37bebe, 0x001e183b, 0xfac72ebf, +0x11965cf5, 0x70226311, 0xbd2016ec, 0xcf23f931, 0x4629f6fb, 0x3104de76, 0x00d7c529, 0xa0c8f8f4, +0x2615c2e0, 0x23daf4b4, 0x56bf05c4, 0x9212102c, 0xa5fe400d, 0xec2a5497, 0x021032bc, 0x3b55340e, +0xd6f1003c, 0x2a3625d0, 0xc81eee31, 0xa26644d7, 0x0ffb041c, 0x22cc20dc, 0x472cdd9b, 0xd8e24ed2, +0x4ee740ab, 0x9bfc50e2, 0xbaaafe55, 0xeecd5c19, 0x57150c31, 0x9d3f13c1, 0x251749e1, 0x076ca964, +0xde0da74b, 0xcafac963, 0x52d006e2, 0xe392d7f4, 0x3a20bcf6, 0xd1ee6fce, 0xe5cf850a, 0x31253fe7, +0xcefed8a9, 0x520f9824, 0x5fdbe3c9, 0x9b123cc5, 0x6ad019f2, 0x171f0368, 0xc2fe2855, 0x0db851c2, +0x095010d9, 0xd110df25, 0x1452a52c, 0xe5d1c2cc, 0x45dbef40, 0x2aef2353, 0x07af2e2a, 0x4f23ff6f, +0x3ddb31cb, 0xa8430c49, 0xcaf7b329, 0xf933c5bc, 0xfe3c52b3, 0x7fd60a27, 0xce0ac9cf, 0xcff0cdd7, +0x5400cd01, 0x7f81a8c1, 0x3c7f8178, 0x737f87f6, 0x5a5e7f81, 0x817f6ff6, 0x813b1381, 0x41d18173, +0x810fb9f9, 0xb734c526, 0x50b3a6d3, 0x282d6e50, 0x81972d1f, 0x7d52bd53, 0x6749268b, 0xc681812d, +0x2c93912e, 0xb1813bdc, 0xed817fd1, 0xa8813376, 0x7f3c7f41, 0x64569f7c, 0xf53d5c67, 0x1e70e6dd, +0x024b6591, 0x817f7f8f, 0x0a722d63, 0x7fed578b, 0x7f239a7f, 0x81029081, 0xa8ca8b81, 0xb8577fde, +0x818ec07f, 0x7fa87cb9, 0xa7084967, 0x81934650, 0x7f8171f7, 0xed3d144a, 0x8107739c, 0x3c6fe27f, +0xcd6ed165, 0xfb3718a4, 0x5f708f4d, 0x14e45eb2, 0xfe5c7f7f, 0x7fc57f6a, 0x813683af, 0x817f7fb3, +0x007fa7ef, 0xdcd681a1, 0xd72a1268, 0x769f7881, 0xb27fa281, 0x89c27fe3, 0x729b2f59, 0x73afb8a0, +0xd07f4eb8, 0x81dd6d55, 0x7fa3d2cf, 0x7f81b51e, 0x7f7f7be7, 0x60819981, 0xf31158ad, 0xde7fe4b4, +0x427f2dd3, 0xd3812481, 0x280de7a4, 0x0a653fc6, 0x8181261f, 0xd6aa8f81, 0x2c7fe484, 0x42df747f, +0x7f5baa2d, 0xc1bd583c, 0x966b5031, 0xbe818725, 0x6b6444a4, 0x610023e7, 0x5f183b2c, 0xa77fb769, +0xb2cb1581, 0x0881cc75, 0x8a8c6fdc, 0x558181e4, 0x107f947f, 0x749e4ca3, 0x8cb23db1, 0xce668132, +0x70b848eb, 0x008a2430, 0x7fd3d77f, 0x682b35eb, 0x2e6aae34, 0xd42fa2cd, 0x3eab816f, 0xfdaf8196, +0x04e43fcc, 0xf1819600, 0x7f6d64f2, 0x81ba8957, 0x81a781a2, 0xb169d67a, 0x7f4e557f, 0xe0818197, +0x7b474ecc, 0x3f7b8154, 0x135684f8, 0x81b0fb81, 0x81e33e93, 0x815c817f, 0x810b818a, 0x4d445b34, +0x95cf2bb0, 0x32c69b7d, 0x2640e181, 0x7fe8b8c8, 0x9bdd64f7, 0x22bfa50b, 0x8181c87f, 0xf7812486, +0x7f977fa0, 0x5826a925, 0xce7fadf6, 0x9e73fb81, 0x538d7f0e, 0xe85dab87, 0xc3706181, 0x4181817f, +0x7f7f15ca, 0x952ca87f, 0xa9748be0, 0xbf812477, 0xd081a553, 0x9a817f7f, 0x1f4cb192, 0x7f8181d5, +0x2ba44ad2, 0x76605566, 0x7f1cd2b9, 0x446eae90, 0x8956b670, 0xaadc8b7f, 0x710b0a90, 0x83816439, +0xc6ffc6d2, 0xf07f00fb, 0x7fa25582, 0x7fd11f3a, 0x7f104c81, 0x81d574fd, 0x81814081, 0x82b78e7f, +0x2f29f42b, 0x277f4bff, 0xf49d4b81, 0x28581681, 0x22523281, 0x607ff910, 0x61ac1ad2, 0x58313ccf, +0x8168a21f, 0x7fe61879, 0x817f21b3, 0x407f2f45, 0x7f5fa666, 0x81bc41fb, 0xfd81fb81, 0x0ed48163, +0x81818181, 0x7f7b92fd, 0x44507d7f, 0xba45c9d3, 0x81852b64, 0x7fa918eb, 0x5f6ff5c6, 0xa4ad8181, +0xc27f8f81, 0xb8af5481, 0x7fc5817d, 0x7a814ea2, 0xf77fcf36, 0x50913981, 0x81a01781, 0x5ea1a4ba, +0x18d252b8, 0xc0416881, 0x7f817f1e, 0x0b4e38cf, 0x7ffb6922, 0xfca481b5, 0x7f1dc1ca, 0x7f560da2, +0x7f7f813a, 0x1900a881, 0x6d4d8116, 0x617f0469, 0xb3118e81, 0x95408119, 0x817ff08a, 0x7fdc7f8b, +0xf682a40a, 0x3381817f, 0x81b70d82, 0x7f7f6f81, 0x8190217f, 0x2f817f4b, 0xe195b209, 0x5ee39575, +0x8150bae6, 0xa4fe8b7f, 0x7f7f654c, 0x7f921971, 0x53817f85, 0x1c7f5ff6, 0x5f35737f, 0xce7fc2c6, +0x6c81817f, 0x7f7c410d, 0x5794308e, 0x15f4a87f, 0x7fb64d7b, 0x1d0a8181, 0xa8b67f37, 0x253b397f, +0x887f92b7, 0x7f81767f, 0x81c18101, 0xaa2861c0, 0xbd691cd9, 0x81d74ef3, 0x81a78153, 0xcb7f819b, +0xf681c5e7, 0x9f37817f, 0x3a7f869b, 0x56a41581, 0x04be8111, 0x4898b48b, 0xbc81465d, 0xb3815281, +0x7f6a1d45, 0x1fa87fce, 0x810e81cc, 0x7f8d410c, 0x8190a193, 0x81817f81, 0x5dadcbb4, 0x81a83699, +0x86a68164, 0xe27f1281, 0x682a7f27, 0x62a03cbd, 0x8181c75d, 0x39653881, 0xc6187e83, 0x617fd27f, +0x81917f90, 0x57796c81, 0xdc7f567f, 0xad712381, 0xdd81ecbe, 0xec17667c, 0x929e5098, 0x857ffbbf, +0x8d5b8153, 0x9769887f, 0x65173381, 0x66b8ad84, 0x043481b9, 0x81c05ca9, 0x449d4c48, 0x8c45bc82, +0xca7f81ee, 0x2d8f33e1, 0x81e22f81, 0xca9eb542, 0x8e947fe5, 0xb642a4a8, 0x7f22c73f, 0x85a6176a, +0x567f7ffb, 0x587f4243, 0xa2819225, 0x58307f9b, 0x2c6b0f81, 0x8130a068, 0x814fa904, 0x400a9f2d, +0x30617fd6, 0x81720981, 0x97b98100, 0x0ca17c7f, 0xf1816081, 0x690f8181, 0x94165481, 0x81817f9d, +0x81444268, 0x97759781, 0x8740267f, 0x757f1a7f, 0x7f7f81ca, 0x957fb87f, 0x816f723a, 0x4a8613f2, +0x3bfef57b, 0x7f1274e8, 0x810ab05b, 0x7fb19ecd, 0xb07fc75f, 0x7fb2965f, 0x60abb881, 0xc229a8e9, +0xb1817f26, 0xe324067f, 0x8181e344, 0x7ea59cac, 0xd21a7f65, 0x8d15989f, 0x09026bea, 0x1d7f933b, +0xae81c181, 0xabf37147, 0x0d08da7f, 0xa7ac4b9e, 0x8281e044, 0x7f8195b1, 0x7ff844de, 0xe9057fed, +0x85fcf1cd, 0xa89e7e2b, 0xf974a481, 0x1f813c6d, 0x237fcbbb, 0x655f8192, 0x8134062b, 0x6f91815d, +0xdf3281e1, 0xe6fd817f, 0x72b3007f, 0x86caf9cf, 0xea812981, 0x6a8ad67c, 0x36aaa01d, 0xbb102886, +0x812faf52, 0x6281de5a, 0x817f8174, 0xebff4735, 0x7894bf7c, 0x169e8194, 0x3bc281f8, 0xe69d2a15, +0xb8e5b68d, 0x367f9b8b, 0xea818181, 0xeb7fbbb7, 0x9368a27f, 0x5af5e19e, 0x5f7f7f7f, 0xcd518181, +0x7f948109, 0x817f4a81, 0xf8a0de7f, 0x667f7fa5, 0x1a8881c1, 0x8646b17f, 0xb0eb7f81, 0xe3fe2ba2, +0x460d18da, 0x3db45835, 0xb0c2847e, 0x9c8681a0, 0x817ff88d, 0x7fec639d, 0x817f7f7f, 0x81810d2f, +0xef28241e, 0x811d9db4, 0x4ac4ada5, 0x7ff29f7f, 0x7fd981ac, 0x7f815e23, 0xcc3dbc8a, 0x7c769b08, +0x6a07ef50, 0x66599c9c, 0x7e007f92, 0x9381aa5a, 0x33471b81, 0x79b27d96, 0x6d5d9d5a, 0xbf40687d, +0x7fbc408e, 0xae598111, 0x18222b1e, 0x0a7b817f, 0x7f4961b4, 0x81818f5e, 0xd5a8ae44, 0xe185bd50, +0xb4a65d81, 0xab81c3d6, 0x5f814b7f, 0x8db72efc, 0xc0be14d5, 0x77336a45, 0x2dca7e7f, 0x81857f7f, +0xf1d80b33, 0x1856b3dd, 0x789e75cd, 0x7f7f7f81, 0x8b7f6951, 0xc94cc5b6, 0x407f3f5b, 0x72c4b87f, +0x8135f77d, 0xab02ec1c, 0x8db481e0, 0x77da84df, 0x897f5c49, 0x8181b24d, 0x7f54715e, 0x233ef77f, +0x8165daa7, 0xd3813aa2, 0x7f7f7f18, 0x96e99677, 0x56814a72, 0xa4acba2e, 0x2683347f, 0x3d5b20ac, +0x887fb981, 0x90a9ec91, 0x008ab581, 0x81588181, 0x5c017f7f, 0x10818181, 0x5d86a42d, 0xd8587f4f, +0xed2035b1, 0x718168fc, 0xc3cccf7f, 0xaa812676, 0xa8d83930, 0xbdb119f6, 0x812b0288, 0xe17f7f7f, +0x989ffd31, 0x9e564b12, 0xabfa3578, 0xacd85381, 0xaf7074e6, 0x93a34c11, 0xc1819896, 0x5a5fa673, +0x6f8181ad, 0x4981167a, 0x817f965e, 0x961b7f29, 0xac539db6, 0x2b645dd8, 0x937fa506, 0xa1b900ba, +0xdd7f7f78, 0x7f866ce7, 0x81a9247f, 0x50d67f53, 0x177a8b82, 0x277ffa7f, 0x7f0942da, 0x444b3181, +0x9d8995aa, 0xbda844b9, 0xae765c85, 0x62818f7f, 0x307f7f00, 0xf37fe681, 0x817f7fab, 0x42e0813d, +0x49f3c7c4, 0x7fd543b8, 0x818183f2, 0x7f4b5500, 0xe2357a7f, 0xdc3a8133, 0xd13913ff, 0xabfd587f, +0x81c3814c, 0x667fab62, 0x9bf82b0c, 0xf84b9583, 0x6a28b2f0, 0x8154623f, 0x7f845e7f, 0x2750f07f, +0x517f2d59, 0x7ffe4db5, 0x60077f7f, 0x81816e62, 0xc40a30dd, 0x67f22b7f, 0xec817f81, 0x7fb8c67f, +0x98c9afd0, 0xb881ecaf, 0x6069c37f, 0x792c2c09, 0x709dc2de, 0x4481bb20, 0xd4b25981, 0xf8ef7792, +0x7381ae17, 0x7fe05250, 0xc3eb637f, 0x6d350069, 0x327f457f, 0x8ce7b8ab, 0xb281c1da, 0x7f817f61, +0xbbcf7fb1, 0xaf818145, 0xb77f5881, 0xb47ff1b2, 0xcec74a81, 0x5f81e7b4, 0x7f1b727f, 0x81b8701b, +0x508106c4, 0x6d815f7f, 0xbc815bea, 0x464b00f2, 0x78818181, 0x7f7f4f81, 0x817e2c53, 0x817e7fa7, +0x7f4da4a9, 0xdd444f23, 0x7f6cba39, 0x8141625a, 0x7f81813f, 0xcd7f817f, 0xa402814a, 0x817f049f, +0x6fb981b4, 0x7867bd7f, 0x9b45bc81, 0xe7739f52, 0x7f816181, 0xab844448, 0x7f06497f, 0xe555c183, +0x817fde68, 0x81bc0624, 0xe33f3a9b, 0x8122c673, 0x6c3d81d5, 0x392815dd, 0x26527f7f, 0xee649844, +0x817f6fef, 0x81ce32d4, 0x102f81fe, 0x81967f81, 0xa42b9c20, 0x81813c81, 0x2a67a463, 0x90592c8a, +0xc5810e67, 0x81d1dd81, 0xbd7f54e1, 0xf52a814e, 0x7f46a7b3, 0x5a89812b, 0x78e43eac, 0x7f776981, +0x817fc5c2, 0x3f818181, 0xc556c337, 0x7f0081a9, 0x817ffe6b, 0x7f095f3d, 0x819b2281, 0xb45881ad, +0xc0817f47, 0x81bd915a, 0xc7616b7f, 0x81e9817a, 0x44977f6c, 0xbc81307f, 0x7f9ac3c9, 0xff061265, +0x3c7b0181, 0x13910e7f, 0xb499ed3c, 0xd850b881, 0x81781837, 0x7f97ff93, 0x81818f23, 0xb9b50d81, +0x49aa4fbd, 0x6b361230, 0x148179d3, 0xbd81dd1f, 0x4cd5d0d0, 0x9ad1738a, 0x2c7f718f, 0x7f9f03b0, +0x789d9ac2, 0x88db95fa, 0x9ae5ac64, 0x727f814c, 0xfa477dac, 0xa670a23f, 0x146afe7f, 0xd4d0451d, +0x6d81819d, 0x9622acc1, 0x818161a2, 0x68263dca, 0x7fce818d, 0x998193ba, 0x9d81a486, 0x7eb97f7f, +0x134470ec, 0x6681bde5, 0x4e2ea77f, 0x81777f7f, 0x7f7fa64f, 0xd3815a7d, 0x81fd4e50, 0x774481e8, +0x7f6c8148, 0xe76b7f81, 0x881bb4e9, 0x7f944f3d, 0xe6da7f20, 0x54c68176, 0x210ebb45, 0xbed6267f, +0xe22f2081, 0x8191ae8a, 0x7c7f257f, 0x667f811c, 0xe2edd355, 0xa4812181, 0x837f5481, 0x6d818120, +0xb7aa7f8f, 0xc17f7081, 0x7fba986a, 0x819a81d5, 0xa9816681, 0x8129c4f5, 0x37ba21a7, 0x29d18a86, +0x4be3ce96, 0x3981b184, 0x447fb50b, 0x261c8155, 0xc05ab18d, 0x777f7816, 0xe48be469, 0x81722d81, +0x7f47a8a1, 0x924a8b72, 0xa2ef4ecd, 0x105c817f, 0x7f90709b, 0xbc81443a, 0xa82f7f65, 0x615d928c, +0x7f81570d, 0x61b0919a, 0x7f33fc81, 0xe8817fca, 0x637ffb00, 0x9c337250, 0x817f8181, 0x08b01e0a, +0x7f4ae897, 0xa0969a3c, 0x7f9d7fe8, 0xe024598e, 0x9e794d7f, 0x72fb988c, 0xf8936747, 0xacbd7f8e, +0x4e7f9781, 0xa4b9f4ea, 0x50ccfbdd, 0x817f4795, 0xbcaf485f, 0x81811a25, 0xa97881c6, 0xecbd7fd7, +0x6e89a832, 0x1e815f96, 0x74d0437f, 0x858101b9, 0xbf1b7f8b, 0xcb7fdc9e, 0x1901bda8, 0x4c40c087, +0x5884f075, 0x7f561faf, 0xc3878172, 0xcd0081c4, 0xd93e8fa6, 0xe8748146, 0x4c7f207f, 0x20da2792, +0xc0d37f7b, 0x909a0133, 0x3b6fb281, 0x69819ba1, 0x81984b27, 0x362ddda3, 0x3981727f, 0xe44c7f81, +0x81b9d0bc, 0xebea7fa7, 0x81a47f2e, 0x81674391, 0x495500fa, 0x0eb881bf, 0x2e22f17e, 0x967f9e81, +0xd2727906, 0xdbe8814d, 0x93cf4d6d, 0x23c3b57f, 0x57be5fe3, 0x2eee7f30, 0x1a501f81, 0x76aaba53, +0x70817fdc, 0x817f2e1e, 0x28381f81, 0x1575817f, 0xc62845e6, 0x8181417f, 0x35d0230c, 0x606fcc28, +0x7f792e44, 0xb7b7ea76, 0xad677f7f, 0x2b1eecee, 0x7f7fe450, 0xefcc6668, 0x264e511c, 0x27818181, +0x81817f7f, 0xce82812c, 0x697f7fec, 0x7e859be9, 0xa1f65543, 0x8170a57f, 0x51231d81, 0x33c03182, +0x81aa7f81, 0x6b7ff34e, 0x51812fcf, 0x7f7f7fe6, 0x6281718d, 0x1eb02c7f, 0x81d64570, 0xa18368e1, +0x4ddb816f, 0x149b81d1, 0x067fa2c6, 0x92decc7f, 0x94001658, 0x814f6d6c, 0x79673f7f, 0x7ff28122, +0x83b97f7f, 0x81248a43, 0xfda17ffe, 0x9e81bc81, 0x81090181, 0x7fdaa350, 0x927f54d4, 0x78fe2e89, +0x7f3d097f, 0x147f2ea7, 0x7f85837f, 0x86a58181, 0xb7ad559c, 0x7796ae60, 0x4e7fef08, 0x2ea371f2, +0x817f7f8c, 0x7fc181c5, 0x8101818e, 0xf1588178, 0x44062eb8, 0xb0832da0, 0x81527f81, 0x7f0e817f, +0x8e06b3e5, 0xa6df2e5f, 0x9d7f7f81, 0xa14ba64d, 0x723d7f91, 0xdb81b64b, 0xb48c117f, 0xe75d0e81, +0x8bd9ba3a, 0x1f817f7f, 0x81847f67, 0x25677f5f, 0x3568b529, 0x7fa2587f, 0x24b02027, 0x47ca91dc, +0x81bba314, 0x7f844f7f, 0xbeb8aa0d, 0x9955fe5b, 0x007f9b81, 0xf0a27f6f, 0x1648e959, 0xc68193a6, +0xbea6ebfd, 0x1654cf81, 0x8142d430, 0x2e7f6693, 0xcc788195, 0x11817f81, 0x3da98171, 0x4fdc5a9c, +0x677fea81, 0x4c6ca0cf, 0x487f8181, 0x7f3b9013, 0x37387f7f, 0xc6b4217f, 0x27afb97f, 0x77b84002, +0xd3a67fef, 0x987f8181, 0x9518817f, 0x5ad4fd7f, 0x7b818146, 0x583c5581, 0xd9643b81, 0x687f92f5, +0x7f8109f2, 0xdfad937f, 0x79a45f7f, 0x007f9c0e, 0x6a6ba6ad, 0xa95bc7e9, 0x9be90653, 0x223381b7, +0x7f7f64ce, 0x81813ea3, 0x037f4f7f, 0x617f7f9a, 0x6481f081, 0x81eb4a81, 0x7f9d9a6e, 0xe80e8a4b, +0x4563f81e, 0x94db8781, 0xbf81bd04, 0x305d8236, 0x2c90d571, 0xa48e4600, 0x81633342, 0x2c537fde, +0xc70f5d7f, 0x65bf6f7f, 0x547f9632, 0x05847f1a, 0x23818147, 0xd6d9459f, 0xc97fb761, 0x8196816d, +0xb5417f5b, 0xb6f91bd9, 0x55b17fbd, 0x3e90c27f, 0x4f7fc37f, 0x7f8c855d, 0xef35817f, 0x295d7b03, +0x3730377f, 0x9c811bac, 0x7fe3ca7f, 0xe87f8124, 0x7f7fe511, 0x2d7f7ca2, 0xba9bc726, 0xf07f9f81, +0x4b476e9f, 0xaa338173, 0x5659708a, 0x817fb67f, 0x81811ded, 0x81817f90, 0xa3077f81, 0xf0d119d6, +0xf4818752, 0xbd98271f, 0x95f610ed, 0x3fc227e0, 0x68139681, 0x3c6c2d81, 0x7f7f96cb, 0x3e8181b1, +0xbbe681c6, 0xb47fd2eb, 0xfdd1b74f, 0x4381fe5f, 0xb081f399, 0x64a10081, 0x79ee3ee5, 0x9559c8a6, +0x814ad4a8, 0x817f7531, 0x81813b81, 0xbfbf9773, 0xe27f81a4, 0x7fc14269, 0x917f8158, 0xaf9d89a7, +0x81b22f81, 0x7f54d4d8, 0x0f39a503, 0xec9d3ea0, 0x35818131, 0x8c7d99a6, 0xc0158181, 0x53817f5e, +0x817f81b0, 0x9a7f9a7d, 0xc081747f, 0x517f704d, 0x7f2db90e, 0xa6dfa67f, 0x36817fce, 0x30ae720e, +0x7fd73d60, 0x5c593bd5, 0xf57f9d7d, 0x448151a3, 0xc82db29a, 0x019b5a75, 0x7f876729, 0xa69efc9d, +0x78a67f81, 0x536c817f, 0x81e470d4, 0x56f270fd, 0x2934478f, 0x9c5a7f68, 0x4ecd81ef, 0x7f5c2b23, +0x7f817f03, 0x827fb17f, 0x7f81c35e, 0x7d7f03f8, 0x7f5da67f, 0x8100671d, 0x06e1a8b0, 0x998d112a, +0x9282ae98, 0xed72813b, 0x7fbc6bda, 0x7fa97f3e, 0x36d1510c, 0x0d81819c, 0x56f8fd97, 0x815081a4, +0x7fc78133, 0x69d34542, 0x7fc1727f, 0x7fd22a97, 0x418a1df0, 0xf519077f, 0x7f6e697f, 0xa9817abc, +0xf43917b5, 0x82e3d76b, 0x86327fe7, 0x7f7fb899, 0x9f81b0a4, 0x475381c2, 0xc62b92e8, 0x7f1b49a3, +0x3679b9d7, 0x817f5364, 0xa87f7fc2, 0x45dcf6ba, 0x3470789d, 0x913e7fa5, 0x06b53681, 0x717f8de7, +0x027f6352, 0x7f7fbe7f, 0x7a81df17, 0x0356fb00, 0x307462bf, 0x6716c56c, 0x8157c7b4, 0x7fcd8181, +0x4b81dd07, 0x3b667f7f, 0x7fa6815c, 0xea37397f, 0x61e94781, 0x4e7f8177, 0x81436b5b, 0x4e818172, +0x5b204b37, 0x115501b4, 0x81491681, 0x661468bf, 0x501f88b5, 0x7f4e63e3, 0x8146e97f, 0x7f09f895, +0x7fd70e81, 0x7f7f7f16, 0x3f327fed, 0x05055631, 0x63b4ec13, 0xc03f16da, 0xa0af33c1, 0x942a7f42, +0xb4ba6515, 0xe99d81de, 0x7f78d8b0, 0x446f2c42, 0x92cf7fde, 0x6b9e7f7f, 0x948181cd, 0x94b9ad81, +0x582e8181, 0xc31748a9, 0x39c6d47f, 0xb2817fff, 0xc5817f81, 0xc6887fa4, 0xe69989e4, 0xa67e7a5c, +0x09477f9a, 0x2d4d817f, 0xb24f81d1, 0x3ff77f7f, 0x6a66813b, 0xf5050547, 0xcf917f6c, 0x81917f7c, +0xb8b23b81, 0xcab60081, 0xe17f7f81, 0x3b47547f, 0x457f4781, 0xe17e9c85, 0xd4b5ba00, 0x777fc3f4, +0x8b013d8c, 0x5381a2dd, 0xf60c7f5b, 0xc3f2c212, 0x5c6c7f35, 0xc77fae7c, 0x7f790cc8, 0xe6848181, +0x7f81584b, 0x813688e2, 0x4cff2987, 0xbeb48126, 0xc4be67bc, 0xb8738181, 0x886a9c7f, 0x519881a3, +0x77fbd5c9, 0x4181c081, 0x20813287, 0x6121bb2d, 0x7f7f227d, 0x1a8181a6, 0x811a5d06, 0xc890a57f, +0x7faf7ece, 0x83a36788, 0xd9fd8e37, 0x7f7b985e, 0x36819a38, 0xbd6096c4, 0x7de5be7f, 0x7bc68150, +0x7f8831bb, 0x81818144, 0x434a63e0, 0xaea4ad6e, 0x407f2785, 0xe8df81ea, 0x4a148aa7, 0xf89f7f65, +0x3c757f62, 0x7f81c80e, 0x81818881, 0x81caa47f, 0x9c570881, 0x1c1a8354, 0x2fa8008d, 0x7f7f81ac, +0xa781d413, 0xa9a45530, 0x327f297f, 0x7f647f5c, 0x81a6324e, 0x81a954cd, 0x7f1c2881, 0xe30b2eb3, +0x81b18181, 0x81157f18, 0x967f7f96, 0x819a7fbc, 0xcccf4fc2, 0xc43a48d5, 0x7fa33d74, 0x3aa97f50, +0x5277817f, 0x69afad86, 0x7f81f278, 0x4fa29716, 0x91818170, 0xdc1a7f5c, 0x278159b1, 0xe87f069f, +0xd28cc56b, 0x157f8181, 0x81339981, 0xcf818114, 0x6eba0b8d, 0xd281527f, 0x8249d583, 0xb37fbc43, +0xc181357f, 0x819f6163, 0xaf194881, 0x7f9872a4, 0xf3c3ab2c, 0x47507f81, 0x523f812e, 0xff81d105, +0x5851cbb0, 0x7fe881c3, 0x60cdbe81, 0xc838ccbe, 0x81817f7f, 0x1d76cb34, 0xe100407f, 0x81d78181, +0x2f81817f, 0x927f3ac9, 0x3cc887bb, 0xda7d6d7f, 0x2c7f1e7f, 0xf58e41ee, 0xfb816281, 0xa211d47f, +0x6eea4bf9, 0x297097b8, 0x9d819e81, 0xf6ef4156, 0x2afb4362, 0x7f16647f, 0x8e10c4c3, 0xb17f6181, +0x3b9d2949, 0x53a6c867, 0x810faffb, 0x8197d27f, 0x41873a37, 0xc48d7f7f, 0x81b6fb69, 0x144b2b78, +0x8181d5c4, 0x787fbc24, 0x4381929f, 0x95927f1b, 0xa3a5e451, 0xb48cc58d, 0x818e81d1, 0x9a81cbaf, +0x713ac87f, 0x7faaa694, 0x9f7f81c3, 0xf65b307d, 0x7fdfa25e, 0xa0bae1fe, 0xf3813f12, 0x19817fc5, +0xc0278a81, 0xe47f8158, 0x817fa281, 0x5bbc8181, 0xd63caaf9, 0x7fbf8181, 0x0054157f, 0x7f7f311c, +0x7f817f56, 0x56c22692, 0x8143b624, 0x0845a315, 0x107a8119, 0xc1cd5c7f, 0x7f62e549, 0x7fbb757f, +0x6b8dec74, 0x6893e220, 0xbb224ba9, 0x31819871, 0xdd2b4f57, 0x3d030250, 0xc1539dc4, 0x1c42df45, +0x7f7f6631, 0xaa81eb8f, 0xa6d4edf5, 0x81ec1981, 0xc92d77f8, 0x1ba35b2c, 0x0e1fa0cd, 0xdd257f7f, +0x817fa041, 0xe9815f81, 0x60f1b338, 0xb97f7fad, 0x097f857f, 0xae6a7f60, 0x145dbced, 0x81b7607f, +0xd4647f3d, 0x7f7f52ec, 0x7fdbbea1, 0xc74feec6, 0x1c197f48, 0xb17d1d61, 0x2e68b081, 0xb717d181, +0xda46377f, 0x105e81b7, 0x7f2e7f58, 0x67c33a7f, 0xb83f666b, 0x68518691, 0xc556f081, 0x7763c400, +0x817fbc99, 0x3a18df21, 0xfbde9374, 0x667fc646, 0x737f7fe9, 0x7f987fbe, 0x27dcb107, 0x25f35d30, +0x420adcd0, 0xab7a7f7f, 0x7f8a28c1, 0xcd7fc20e, 0x6ce69bcc, 0x7f308ce5, 0xb2c96e81, 0x95dbeb1e, +0x7f7f567f, 0x6b7fa0a5, 0x997fed60, 0x9281da7f, 0x3f7f617f, 0x7fc4608e, 0x817f4781, 0xc36b7f81, +0x7fddc17f, 0x6fe27020, 0x8a5a2b27, 0x3a4bfb81, 0xae9e4a81, 0x7f7fda7f, 0x5a7ff006, 0x39b6a0b7, +0xb9721181, 0x725edb2f, 0x8903cf08, 0x81aa7cde, 0x7fe0817f, 0x6c9e7fe8, 0x7f5c8140, 0x819d8181, +0x58777451, 0x7fdb4784, 0xc3186166, 0x817f458f, 0xdce8cdc9, 0x7840bd81, 0x1781954b, 0x60240082, +0xca242d7f, 0x788428b6, 0xf67f8d7f, 0x657f7f8a, 0xbace8106, 0xb8816e93, 0xf9b07ff9, 0x818102fa, +0x32028181, 0xfe7f8e27, 0x818d7f26, 0x7f0781a8, 0x7f7f73f3, 0xfaa78135, 0x7f81810b, 0x72676281, +0x812ed271, 0x7f8a961b, 0x7f81817a, 0x367f4181, 0x03ecb2f0, 0x6c810a7f, 0x577f81b1, 0x81e889b8, +0x7f7f707f, 0x7f90368c, 0x86a36487, 0x42b8c17f, 0x91816160, 0x8150b0a5, 0x81390fa1, 0x7f87d07f, +0x448548d0, 0x32810b93, 0x7f20da7f, 0x5b6a7fed, 0x5c812d7f, 0x7f5a7f69, 0x0c36d681, 0x2ee0544a, +0x817d861a, 0xa47fdaf7, 0x7c8127b1, 0x96216604, 0x4f8138de, 0x03e57e14, 0x73050f7f, 0x42007eeb, +0xe303f07f, 0x2f8a7438, 0x8a7f7fbc, 0x866f8165, 0xf496535f, 0xea2d9bb2, 0x16e67386, 0x6bf837ab, +0x411874b4, 0xa7c15c2a, 0x74bb7f72, 0x8181ab81, 0x81e33481, 0x68b47f7f, 0x957f8181, 0x947fcf27, +0xb47f7b20, 0x997ca926, 0x5a457f0f, 0x87403699, 0x811e3ccd, 0xdb857d7f, 0xc9cec481, 0x2998d8c3, +0x231fa37f, 0x876a2942, 0x812d7ff0, 0x7f90959a, 0x811598a2, 0x7f814697, 0x7f7e1467, 0xad3a8154, +0x81813f26, 0x0851321a, 0xf77f9f7f, 0x76b16294, 0xa56c3e3a, 0x7fd5c569, 0x30dd8185, 0x7f7f819c, +0x7f8a7f7f, 0x81dc4da7, 0xe1ce9eb9, 0x8181a2c8, 0x7fda81be, 0x01797f42, 0x7b7f89a8, 0x81e9de7f, +0x7fa76fc9, 0xdebec9a0, 0x7f381e89, 0x81ba0d7f, 0x459a7f7c, 0x81ac8181, 0xb65e8279, 0xdf8174cb, +0x6ea24abd, 0xb8486638, 0x81637f7f, 0x011d5c81, 0xc27ff63d, 0x81d48160, 0x7c81ba7f, 0x7ffa7f73, +0x7f8881f0, 0xc2d6a15b, 0x7f5d7f7f, 0x06818fd5, 0x8c23ea91, 0xf3d8e75c, 0xab81be93, 0x817f7fa8, +0xe57f816d, 0x6e81f27f, 0x81e566aa, 0x88397868, 0x45f9b7c1, 0x2c4d81e5, 0x52765111, 0x813e3d60, +0x4f45c3e7, 0xef777f91, 0x3e7fc481, 0x3e810d42, 0x81c53f7d, 0x2f7f8481, 0x3a7f8157, 0xf1662881, +0x81f03791, 0xaf818136, 0x476b7f7f, 0x6890cfa6, 0xe4f7e9ae, 0x81f6b9ba, 0xb0623aac, 0xea7f7031, +0x72c30000, 0x407f8197, 0x8176917b, 0x81184acc, 0xdacf7fa6, 0x996cd37b, 0xa68175c8, 0x5e6082e3, +0x067f927f, 0xc47f4481, 0x7fc58113, 0x7f561aff, 0x817f46b2, 0x7f7f8159, 0xcebbc57f, 0x72765b87, +0x817f2f1e, 0x885c7c81, 0x7f7f65a9, 0xeded8987, 0x7f3bab81, 0x812f7f6b, 0xfc67d85a, 0x13297781, +0x607f9621, 0x507fa647, 0x4e39ce7f, 0x81ff5c4b, 0xa246316c, 0x81457f7f, 0x5781812f, 0x1463aa9f, +0xc35d7f14, 0xbcbb5771, 0xd7e45781, 0x636c7365, 0x07102b6e, 0x75e1337f, 0x7f2bb116, 0x257fa0f2, +0x97597f40, 0x7f818810, 0x7f7f7f5c, 0xca7ff660, 0x9c916181, 0x903ea1cc, 0x6c8f7f81, 0xc2b07f25, +0xa43d818c, 0x81f67fb3, 0x67f56081, 0x1ba55531, 0xa77fc6a5, 0xda479281, 0xe7647fdb, 0x7fd2f34d, +0x1b7f4c68, 0x7f8c5781, 0xbcf18110, 0x7fd3b883, 0xde81687f, 0x81358948, 0xeb813d17, 0x25040181, +0x7ff8a39c, 0xbc574351, 0xbe677c7f, 0x487b5068, 0x6c7f816c, 0x7f2dca81, 0xb8c7b17f, 0x7f869781, +0x9c99f0ae, 0x437febc4, 0x289d81fe, 0xab74307f, 0x7c7b299a, 0x62593f52, 0x7f4e513a, 0x7f9b81c0, +0x9e2c0de5, 0x43818175, 0x857064a0, 0xd17f8db2, 0xb0a055de, 0xf04ade7f, 0xe37d7fd6, 0x3956789a, +0xcfbcb53a, 0x7fa39e7f, 0x7ed171a8, 0x49a65c89, 0x3ee166d9, 0x2daca6ca, 0x53d051e7, 0x957fc181, +0x0000e873, 0x815fbf9b, 0xe986ac61, 0x7162fd81, 0xe428090f, 0xe2814730, 0xab8d9d3d, 0x8164e6da, +0x8a6126e4, 0x81817f6e, 0xeb818281, 0x359f7f81, 0xb663c39c, 0x7fb856a8, 0x9d812e30, 0xd07c7f2e, +0x6b58ceb5, 0x8181ca7f, 0x42c081b5, 0xd58a6fd8, 0x7faa9b85, 0x81818181, 0xbb3781f4, 0x7fa98173, +0x17f17f7f, 0x7f819862, 0xd97f0781, 0x812f579a, 0x608196ec, 0x23458155, 0x5bc1a902, 0xaa39817f, +0xcb207d81, 0x227f7f9c, 0x81a54ad1, 0x81027fb4, 0xb6711835, 0x8181a57f, 0x7fed8141, 0x7fa95ec0, +0x7ffc7f8f, 0x572f81e8, 0x7ca87f81, 0x7fbeb67f, 0x637f814e, 0xcf11af7f, 0x307fb081, 0xaa85927f, +0x6f5dd995, 0x81db817f, 0x68275869, 0x724dff18, 0x8176ef58, 0x54814c7e, 0xece02300, 0x5ad71a56, +0x689e7fa7, 0xb67fa77f, 0x107f1359, 0x51a63bc0, 0x22c887ca, 0x0a0e34b7, 0x81587fae, 0xbb79604a, +0xfbb7077f, 0x81967f81, 0x81227187, 0x8129817f, 0x43a84e8a, 0xb981a34b, 0x5d307f81, 0x4d7fe9bd, +0xc973a181, 0x78647f8b, 0x00274105, 0x5d7a09e5, 0x6565a681, 0xfbd0ea6f, 0xf986037f, 0x377fc3e0, +0x9ba57fe8, 0x4f7ff13c, 0xd61f7fa0, 0x817f7fbf, 0x7f3e25c7, 0x81c42fdc, 0xae398181, 0x3125afbf, +0x7fed479c, 0xf4f52ff4, 0x7fc99d81, 0xaa417fb7, 0xa1324f81, 0xff7b817f, 0x167f6f86, 0x2a86c481, +0xa127c15c, 0x6d8e0000, 0xcf207f6d, 0x6b815681, 0xd01f50e7, 0xab81e704, 0xce81a4e4, 0x7f177f7f, +0xaa819181, 0x7f81a044, 0x1c0c7f5e, 0x4f0e56cf, 0x46a581ca, 0xb3d52970, 0x6fb3b2c8, 0x7f8189de, +0xf0058133, 0xd181d0da, 0x7481c46e, 0x427fc7d5, 0xe4528188, 0x4a359b7f, 0xd1ae25bd, 0xb735818f, +0x811a2117, 0xddd2829a, 0xec696aa1, 0x99cf945e, 0x518f3d7c, 0x8e814381, 0xa2819647, 0x85af7f43, +0xc81d7f90, 0xb8361781, 0xb67f9a64, 0xc3d38181, 0x97b07dae, 0x54687f7f, 0x206d5b79, 0x437089ad, +0x7f814881, 0x77b63840, 0x61816434, 0x9dca5e22, 0x818129bf, 0x8b49dd3b, 0xc792813a, 0x3b407f63, +0x7fc48f8e, 0x7f96815a, 0x6b430c8b, 0x974ee1a1, 0x7f8181fa, 0xb47098a2, 0x81168181, 0x816b71f5, +0x0a596d81, 0xa5945681, 0xa14181d0, 0xb4944bfa, 0x81f7816b, 0x7f7f287f, 0x7f81cc48, 0x6d819077, +0x7dff7f58, 0x5a4e7f81, 0xb7ee6df2, 0x81712a85, 0x0a652e7f, 0x86a1277f, 0x3c568181, 0x7f817f65, +0x64fb3e0b, 0x71a9687f, 0xa65c7f72, 0x3fb34043, 0x8132f77f, 0xec8133bf, 0x7f8119a5, 0x081f5bb1, +0x7f81777f, 0xedcca8a1, 0x7ffe7f25, 0xec934f43, 0xdbcc8181, 0x64416881, 0x4a8d93f4, 0x7fb64c7f, +0xf12f9bc2, 0x812a8f90, 0x1b9c32de, 0x30a30d81, 0xf079e16a, 0x633720c2, 0xad44fd53, 0x3c812f3b, +0x56b32873, 0x0000b62f, 0x76cb58a6, 0x31086ead, 0x9c307f65, 0xec664f81, 0x7f6186cd, 0xb7047f39, +0xe87f2ccd, 0xe79f8f3c, 0x88b34352, 0x7f6dec72, 0x8b4aca8c, 0x217f1c55, 0x53d76693, 0x7f984d2d, +0x125abe92, 0x7f37677f, 0x4f819c81, 0x7fb23b2e, 0xd2c5ea58, 0x7fa7817f, 0x57817f7f, 0xd45239ec, +0xc887fa03, 0x7f7f7f42, 0x8181444d, 0x2ba67f1a, 0x7fcc527f, 0x813d7f81, 0x68ad12aa, 0xa87f6763, +0x62577f7c, 0x067f7f5a, 0x3201a788, 0x9872b0a1, 0x814548d0, 0x3a883096, 0xc4701d52, 0xb59381dd, +0xdc3381a8, 0x816e3f7f, 0x4f57813e, 0x4679d77f, 0x9a14b75d, 0x8181da4b, 0x817f9d48, 0x52818181, +0x2281c97f, 0xbfb92d7f, 0x1f6f357f, 0x2ca57f3d, 0xb9b4626f, 0xab4bba25, 0xf27f4b5a, 0x4b478a56, +0x818181c3, 0x6a767f29, 0x81e16dcd, 0x4d818181, 0xd1819ce8, 0xdbce6082, 0x757f41bc, 0x777f7fbc, +0x5fa9d103, 0x0241e8d6, 0x1bb381a1, 0xf08177b7, 0x00df007f, 0x3bcdbb5f, 0x5e7f710a, 0x7f3f7f1e, +0x657f0f2b, 0x2ffae79b, 0x495c8110, 0x7f7f8150, 0xe8449f7f, 0x8434a77f, 0x42d56352, 0xfd717f8d, +0x81c514b3, 0x7f147f50, 0x7f856696, 0x7f844c81, 0x8157714b, 0x50cba2ca, 0x73539ff7, 0xb5ed7fea, +0x5d1f637f, 0xbc66496d, 0x68b633df, 0xea76156c, 0x7b4654a3, 0x81547f8d, 0x7f537f27, 0x5db64581, +0x7f367f81, 0x7f81a08c, 0x81440000, 0x3965f076, 0x40977036, 0xcf81ee31, 0x6e7f19bd, 0x703a7f03, +0xe94b81c6, 0x4330aa7f, 0x060411c3, 0x91f6f37f, 0xbdc9e781, 0x81b87f51, 0x4b6e228f, 0xbc3eb87f, +0xad916bce, 0xdfb0976a, 0x98b86387, 0xb651bdee, 0x8cf46cb9, 0x9b819a8d, 0x9d8181f1, 0x7fe0ab97, +0x714d0264, 0xb87f67a4, 0x7f9d3150, 0xe95c7f81, 0x81a7537c, 0x93f4d02e, 0x433a477f, 0xe5067fab, +0x81de5836, 0x64667f81, 0xc5255988, 0x0a7f824f, 0xf97b7fbf, 0x40c97f82, 0xc1d47a74, 0x7f7f3081, +0xfe49fc23, 0xba819538, 0xb87f5581, 0x5ea47fb2, 0x35b37292, 0xb9848178, 0x276f5235, 0x647f4ebd, +0xee2a491a, 0xfd29bb60, 0x21f53728, 0xae9d817b, 0x2ba97f81, 0x6accd440, 0x7fbec77f, 0x909b817f, +0x227f7f35, 0x767f22d5, 0x0ba3c2d1, 0xd38f817f, 0x467fd862, 0x673e8181, 0x7f3b7f81, 0x70427f81, +0x6f725d24, 0x731d64de, 0x32a9816d, 0xc1817f7a, 0x627f8181, 0x7f947615, 0xc37f72d2, 0x7f7f4261, +0xf147be64, 0xc481afab, 0x7fd9a5dc, 0x5c812690, 0x7c34783b, 0x9087817f, 0x7fd25245, 0xea5fcfb1, +0x81817f81, 0xc84ae6b4, 0x8149c875, 0x814a1a7f, 0xab7f6881, 0x6e7f3d81, 0x3ca58181, 0x75cb4781, +0x8181817f, 0x5ec4f2c5, 0x8165e07d, 0x643d6e7d, 0x78bd9764, 0x40817f24, 0x5f077581, 0x7f2ebb4b, +0x7f7fa781, 0xe657ca7f, 0x0000ff21, 0x7fa9bf6a, 0x81c1c30f, 0x9138393c, 0xa2b38174, 0x7f4c24bc, +0x2b918175, 0x7fea5d7f, 0x50c1a17f, 0x0bfefac7, 0x81fe4ea4, 0xab7f7fbd, 0x559b7fb9, 0xcb81e356, +0xd7963f72, 0x7f7a1b81, 0x8c9cd9d3, 0xbf889d1f, 0x161a88cf, 0xe6a0abb9, 0xbb014f2b, 0x81fa947f, +0x7f41509e, 0xb4480d7f, 0x7f7f8181, 0xeca6b540, 0xd27fc381, 0x3aaeb38f, 0x7f7f7f7f, 0x372a7f05, +0xd6a34b81, 0xee378159, 0xcf8181b8, 0x07487fcf, 0xcbb4ed77, 0x29817fab, 0x7fe5b342, 0x63c3bb81, +0x0724d1d8, 0x50e47f7f, 0xa67f8f93, 0x8181c37f, 0x28817a81, 0x7f81fb7f, 0xaab17f7f, 0x81997f7f, +0xa423816f, 0xf953c16a, 0x4c2362cc, 0x81812bf3, 0x5a817f4a, 0xffcbcce0, 0x9c7f8776, 0x5b5a7f7f, +0x64817f92, 0x5139c47c, 0xbe8573ce, 0xe5457f81, 0x2ca4815b, 0x503e14b8, 0x4ca75681, 0x907f7f7f, +0xa2377d19, 0x7fd7c09a, 0x7fbc8191, 0x657f61a2, 0x814f5c81, 0x7f48607f, 0xa16f3ad5, 0x819d227f, +0x247fc10e, 0x7f817f32, 0xc39981f5, 0xb357261b, 0x347f7027, 0xe3814506, 0xa1032e49, 0x979eb571, +0xb06ac281, 0x81815e7f, 0x34b57fb7, 0x7ffe2681, 0xc181630b, 0xbda9ce3b, 0x81f9287f, 0x4ef12081, +0xb86a54ba, 0xbc4d13c7, 0x81817fd9, 0x62817f1c, 0x7f7f4fa1, 0x847f7fce, 0x81bf68f5, 0xd7625f73, +0x81e79d7f, 0x8137a1ca, 0x423581cb, 0x26580000, 0xd7d6811e, 0xce6e6c81, 0x8168173b, 0x498468b2, +0x8c7c817f, 0x6f81b881, 0xad899a25, 0xd049e481, 0x7fdd817f, 0x63816bbe, 0x048b8d81, 0x8eb764c6, +0x987b9ea5, 0x81fae493, 0x7f72817f, 0xa57fbd7f, 0x7f0f81b3, 0xb37f4a33, 0x2e092988, 0x1b172b25, +0x09107f3e, 0x48f5fc7f, 0x69aaa80e, 0x184fe781, 0x7f9db5e6, 0x8195276c, 0x252a8181, 0x8b81ccfa, +0x3c308181, 0x9d19b086, 0xf0d589f7, 0x207408ca, 0xe34e9ed0, 0xe67fbbf0, 0xc0996525, 0x0dca5881, +0x813d4181, 0x7f729738, 0x0a865e5d, 0x8bbea581, 0x5c4aac3f, 0x8181a63f, 0xa1f0b873, 0xa92481d0, +0x837f817f, 0x047fdd84, 0xc8767f2a, 0x441a81be, 0x818681aa, 0x05490179, 0xba81ba7f, 0xde246581, +0x466d70d7, 0xb6bc3f5b, 0x5c428f2d, 0x8105cb77, 0x0206175a, 0x5f6ac2b1, 0x9a4d2a4d, 0x7fb0917d, +0x1281ce12, 0x81028181, 0x41b0a4ad, 0x29973681, 0x973e992e, 0x81617dba, 0xc1818181, 0xb87fc1af, +0x81137feb, 0x627f5210, 0x8181de1d, 0x7f615f70, 0xabbb817f, 0x817fc57f, 0xdbe5b6f3, 0x9c8a7f72, +0x3c2826df, 0xae03d3b5, 0x7f6cc481, 0xd9c41c7f, 0x83ad7f81, 0x336370a8, 0x8bbfaf2e, 0x3561caa5, +0x548d142c, 0x810366b5, 0xa981d36e, 0xbf3afc7f, 0x7fd78157, 0x61817bf1, 0x74afcdd7, 0x18ac3d61, +0xcc45b6e0, 0x3d81af88, 0xf97934de, 0x947a8f81, 0x8b7fa6b8, 0xe0dd8981, 0x2d812381, 0x967f6409, +0x24bc0b1d, 0xdb7fa943, 0x18197fc3, 0x47ef7f6b, 0x66a6bb7f, 0xd374af81, 0xf48e7f9f, 0x52399754, +0xe1abbf6f, 0x04751d7f, 0x3690c581, 0x557fc3a6, 0xc1815413, 0x9086df7f, 0x81e57481, 0x81538167, +0x4df9c981, 0x9463a57f, 0x81c5063a, 0x7f7eaa81, 0xa6dc9423, 0xabc07ffb, 0xd981817c, 0x816064ae, +0x7f815dab, 0xc0b12da0, 0x1444be7f, 0x3a7781e0, 0x887f527f, 0xc0817f1f, 0x05cba881, 0x6599057f, +0x817ffd53, 0xca907fab, 0x557f0d7f, 0x5d029ce9, 0x57818168, 0xc4093382, 0x52e5b33a, 0x763e09b7, +0x814da277, 0xf9208cc5, 0x817f7fcb, 0x7f5fac7f, 0x6d7f6544, 0x7f0a7fec, 0xe7b4337f, 0x7fae8181, +0xa8c5608c, 0x6f9bb388, 0xb27fc773, 0xf4acaa81, 0x1cad30ac, 0x2d817f8b, 0x2b817f16, 0xcca2a581, +0xcb77dad4, 0x58487a22, 0x7fe57f69, 0x45387012, 0x73504724, 0x61357f81, 0xc77f8181, 0xabc7e11b, +0x8181c16e, 0xa681ab27, 0x8c81c48f, 0xbd1de360, 0x9924337f, 0x7f230156, 0x3dd6a87f, 0x477f9381, +0xbeb38181, 0x47815ccb, 0x8125817f, 0xb8057f7e, 0x7f7fc081, 0x46815873, 0x5f93ba81, 0x7f35767f, +0x7f7f5a94, 0x748c84e5, 0x4c7ffc90, 0x7fcd247e, 0x44898e81, 0x1268ecc9, 0x81d2777f, 0xda42e7c7, +0xee267f81, 0x7f5f269f, 0xe3d60c91, 0x81c97f0b, 0xd7b00000, 0x9b813a83, 0x7f7f8181, 0xb71cfa35, +0xf5888156, 0x853e9cc5, 0x1c1c1014, 0x2e7f8b1b, 0x81bea644, 0x70f4e8d8, 0x8158a181, 0x18caad9f, +0x3b28815e, 0x7f460155, 0x7f7f7aee, 0x444b51e5, 0x8682a381, 0x7f508181, 0x5e86466d, 0x7f81287f, +0x7f7c7f50, 0x8173e4de, 0x4c747a65, 0x69816cd7, 0x6674813b, 0x48274e90, 0x92ccf278, 0x99f181c7, +0x81b20243, 0xbf4b4b81, 0x81d981f4, 0xa1e981dd, 0x6c7f7b6e, 0x98cad579, 0x9a7f1685, 0x81e8812e, +0x5d7fcf52, 0x37819772, 0xdb437fab, 0x1d83782a, 0xd3ff71b3, 0xc7e28181, 0x81817ca6, 0x1808127f, +0xb515639d, 0x812c8108, 0xa2a97f14, 0xdd8102c6, 0x727f7f98, 0x5f197f19, 0x7b22817f, 0x46562e7f, +0x59b89c7f, 0xaba28d81, 0x5e4e7181, 0x909da6b9, 0x817d8128, 0x9c167abf, 0x3ef4817f, 0xf5628d72, +0x97727fbb, 0x88c6a600, 0x81c9927f, 0x817443e0, 0x81ac7f7f, 0x7fec67cc, 0xc353bb96, 0x4caae113, +0x7fa37fd9, 0x525c45dc, 0xdf798ba6, 0x7c811049, 0x812570c7, 0x7f788a6b, 0x797f1fef, 0x2022fd81, +0x38870936, 0x813f7d7f, 0x81810941, 0x6b75817f, 0x5aa11953, 0xcc7f7f81, 0x61778581, 0x5e458181, +0xcfff7f90, 0x9020747f, 0xb4e35ad5, 0xea0e8109, 0x21f97f13, 0x41c07f40, 0xc6ddc4ad, 0x085227c8, +0x11dc9f85, 0x7fda7f55, 0x5a92b34c, 0x11659b4d, 0x000081bc, 0x81816781, 0x81cce139, 0xf165d51c, +0x810a817f, 0x7f7f82d6, 0xb5b3817f, 0x40909bfb, 0x7f04a01f, 0xd0288164, 0x810164f3, 0x59778b81, +0xc87f2997, 0x9d99417f, 0x65528173, 0x727f454a, 0x9f187fd9, 0x37948141, 0x217fcf7f, 0x81818319, +0xc27f817f, 0x47817f81, 0x756e817f, 0xa28c8cd3, 0x84b77f81, 0x44ef8e4f, 0x7f7f7f7f, 0x932e2c45, +0x680d20a8, 0x817f1122, 0x52128a21, 0x2b8136ff, 0x0b7f817f, 0xda8c817f, 0x24c17f7f, 0x3dcb39b7, +0x81d18181, 0x81fe1a81, 0x0590978b, 0x71b20319, 0x7f65bfb4, 0x4fb42290, 0xde1a7fd2, 0xc8bd77d3, +0x917f32a0, 0xb03fd9db, 0x4c1e872b, 0x814f5481, 0x44817f7d, 0x398a887f, 0x4a19e8ac, 0x4d818189, +0xc3818181, 0x7f8198dc, 0xb77f527f, 0x817fe681, 0xa83d818c, 0x420b5e81, 0x6e5adbbf, 0x7abd56c4, +0x717d7f7f, 0xc7811c0c, 0x767fba89, 0x6d1d5106, 0x5a06df17, 0x86c28181, 0xcdd6888e, 0x0e747f8a, +0xde81a9c3, 0x45459db8, 0x81114e22, 0xbd7f8197, 0x3c3d85cf, 0x8c815fe8, 0x544d7f64, 0x81986177, +0x8c20a0b5, 0x7f4b8178, 0x17db6031, 0x7f42df7f, 0xee93cc0f, 0x8ab829b2, 0x29a04e65, 0xfc30035f, +0xc57b7f7f, 0xe51ef77f, 0x7fd95481, 0x76957f7f, 0x819f945e, 0xc91a187f, 0x81657e40, 0x8192816d, +0x7339dce0, 0x8bd1c3c7, 0xa2812e1b, 0x81db3d8e, 0x1781da89, 0xd0810000, 0x7fc8c57a, 0x8fc32003, +0x1c847f81, 0x10dfb271, 0x7ff8cc62, 0x2037d87f, 0x8151501e, 0x17c74c74, 0xb8ab2852, 0x4b7f1c97, +0x6a811596, 0x46acc3e0, 0x3c81f49e, 0xd6d81a4e, 0x2e815066, 0x46218186, 0x41682bb4, 0xa1ac315d, +0xb87fdc73, 0x378181ad, 0xe97f979a, 0xccb07981, 0xb10a7f38, 0x03488893, 0xfef78df3, 0x8145467c, +0x3b67b401, 0xb3cf34bc, 0x81476c00, 0xdd638b81, 0x5e43af81, 0x2bab7f6c, 0x6d7f7f6f, 0x7f657f70, +0xbc816e77, 0x8981c27f, 0x3e40b685, 0xd93d7256, 0xbd86c8c3, 0x817fdcce, 0x43899081, 0x817f1693, +0xc0db9a68, 0x7f57a5a8, 0xd14c817f, 0x8c4ab37a, 0x901081dd, 0x292a452b, 0x7f81e85a, 0x189ece81, +0xc10b9401, 0x81817f69, 0x358b3d7f, 0xa86bb1a9, 0xbd7f7f8a, 0x57fd7fe3, 0x81964506, 0x74295986, +0xab7fbc8d, 0x817f62e6, 0xab816277, 0x5737ab20, 0x9c7f6f50, 0x7f5781af, 0xe344ef7f, 0x98a695ca, +0x81d2a20e, 0xa77f6605, 0xc1d00398, 0x177a90d5, 0x7ff6db7f, 0x0221897f, 0x6c8105c6, 0x578981d7, +0x64ac81c3, 0x1d9381f9, 0x7f706e7f, 0xd5797f81, 0xf9567f81, 0x27ed81d0, 0x496f2d01, 0x48b8973b, +0xb34c1f32, 0x7f42139a, 0xeac95332, 0xf05f7783, 0x037f8145, 0xa98f3dbd, 0xc5ea24a8, 0x81417fc1, +0x81655e97, 0xcbc682df, 0xec10815a, 0x817f7fa5, 0xb8b54dff, 0x00003e84, 0xa7ece56d, 0x819d81c2, +0xd0ee6d81, 0x0e5e4db0, 0xe3818181, 0x7f4a2c13, 0xb13d46ac, 0xc181f081, 0xfe51c8ab, 0xa7747fb6, +0xc2506129, 0x9d98ce4a, 0x81627f81, 0x816d6481, 0x81576b7f, 0x817f814f, 0xc881cc8b, 0x686d098f, +0xae7fcb7f, 0x3b39a87f, 0x81888879, 0x47877f30, 0xd9bd9e9e, 0x061a0ee3, 0x7f3631a3, 0xbf5b227f, +0x7f7f837f, 0xc5d18162, 0xa3405318, 0xc3f27fac, 0x7f43c6f6, 0x927f7fad, 0x817f7fdd, 0x7f813b8b, +0x7fe59a65, 0x81fd87d7, 0xda54547f, 0x814d114a, 0x7e7f813d, 0xf47f077f, 0xa0869981, 0x38db7fea, +0xf61986b0, 0x7f9146cb, 0x81db9bb7, 0xfc3b8177, 0xbd7ff9a1, 0x7f33c5aa, 0x74335381, 0x815ca42b, +0x7f814a81, 0x49977342, 0xab9ed775, 0x9874db81, 0x6381227f, 0x1b81b27f, 0x817f3716, 0xd8e6bf07, +0x81030494, 0x56cedf81, 0x7f607f9a, 0x7f7f4f52, 0x3cb978f2, 0xd57fca81, 0xd7bc5c81, 0x3a2265b7, +0x7f7f98bf, 0xac068158, 0xa8851581, 0x1db9a67f, 0x7f24d44f, 0x57a34093, 0x7529b981, 0x50a3817f, +0x4c3f6381, 0xbd7f81ad, 0x2281a481, 0x1d2e7f81, 0x77b85621, 0x3f818105, 0x307f783f, 0x7f7fe0b2, +0x4d4a297f, 0x8d7f4d7f, 0x88818a7f, 0x129cf8b7, 0x9b817f7f, 0x7fe5ce65, 0xa48e7213, 0xf481a737, +0xb43d4fd4, 0x7fb182c3, 0xa18181ba, 0x077f8127, 0x4f4b468a, 0xe1bea062, 0xc34d0000, 0xc0f381ba, +0x8181817f, 0xbb2d9e7f, 0x7f216b7f, 0x868181ad, 0x7f7fcdf6, 0x810b3d55, 0x627f4c43, 0x81903e81, +0x54ea9a4d, 0x3181ae1e, 0x7f8116d0, 0x74b5c181, 0x607b431b, 0x5552d081, 0x7f818122, 0xe9449f4c, +0x6fb434b5, 0x1f1b9552, 0x54d7b178, 0x8b1b9e33, 0x4143cb33, 0x13b0817f, 0x7f51317f, 0x81247f65, +0xa6fd7b18, 0xb1d6550e, 0xaa6481c1, 0x81421f41, 0x50c0813c, 0x95ac7eec, 0x442a7981, 0xc39289ea, +0x667fcc5d, 0xf681817f, 0xd729c236, 0x5342819b, 0x813f457f, 0x819d2481, 0x817facd0, 0x7ff2dd9a, +0x81cafb81, 0x26c72930, 0x177ba325, 0x81015e07, 0xc5667f7f, 0x81fa497f, 0x7cb3505e, 0x85e3815d, +0x67596b53, 0x857f6696, 0xc97f7f66, 0x7a813978, 0x5f7f7f81, 0x043d9d81, 0x8c81a6a6, 0x0e8197f1, +0xd17664d1, 0x9f81814d, 0x7f4c4f3e, 0x5e7f756a, 0x8181815a, 0xe090817f, 0x81377f81, 0xaba9813d, +0x8985c047, 0x2106c97f, 0xc846f2b2, 0xb19a83ce, 0x64107f16, 0x7f792fde, 0x87516244, 0x9c81673e, +0x2f5c8187, 0x555a8181, 0x95d9f26a, 0x70408e9b, 0x7f81b57f, 0x8f0de19b, 0xd37f7a6e, 0x9ba9fa7f, +0x7f0b6568, 0x1a4f7f14, 0x3b4f5b71, 0x814e377f, 0x8125a7ec, 0x1d817f43, 0x811128dd, 0x66816435, +0x9de99e3e, 0x81b27f48, 0x7fc3783f, 0x69983781, 0x457a817f, 0xd4296caa, 0x0000b659, 0x723a92a9, +0x81860888, 0x8c81c44c, 0x7489b15c, 0x817310ed, 0x74a48e9c, 0xc6531a73, 0x7f7f64d0, 0x502d7fb9, +0x437f9f7f, 0xb1bfa444, 0x81df09f0, 0x0946ab9b, 0x7f21ca81, 0x9d818166, 0x81e8d281, 0x917f6791, +0x36ac811b, 0x9d817347, 0x344c02a7, 0xab36817f, 0x81818152, 0x32013a89, 0xd7ab3008, 0x6f608181, +0x817f7f7f, 0x153e0881, 0x81dfcaba, 0x6c5e577f, 0x2f7f6524, 0x817aa07c, 0xdd7f0175, 0x8b4b7fec, +0xbc81ead5, 0xae8b205d, 0xc9a9743e, 0xf33f14cf, 0x49ca7f58, 0x507f6976, 0x8cbe66d4, 0x9778a724, +0x6d8147e3, 0x81334092, 0x7f4c0101, 0x82d5ea73, 0xb59c6657, 0x1ab842f8, 0xbc1d8581, 0x4004d917, +0xe5eaaee2, 0x7fa9813b, 0x817fae58, 0xd77f1281, 0x10732f61, 0x836d137f, 0x7fbccb3b, 0x1a3a81d7, +0x81047fef, 0x790aa87f, 0xc19eaac6, 0x60667f07, 0xb7f1a97f, 0x39f39e7c, 0x057f7f7f, 0xaa7f81c8, +0x79bef7a0, 0xf3d3134d, 0x720f7fbd, 0xb4a5b69e, 0x716c817f, 0x9a817fdf, 0x347f817f, 0x4b995cb4, +0x876a4f7e, 0x8d92687f, 0x7f9e8181, 0x8172817f, 0x8ea21cc3, 0x61bd96b0, 0x81fba378, 0x6db77f7f, +0xdf307181, 0xda0f81c4, 0xa8e36d65, 0x70a7a559, 0x0be0f27f, 0xb56f4971, 0x35813a6d, 0x188130b5, +0x517ff881, 0xec54b6ff, 0x8183817f, 0x20ec2381, 0x3e7f9613, 0x878af66d, 0x81657f81, 0x7fb80000, +0x7cb38d5b, 0x817f7f45, 0x7f6352c1, 0x3881727e, 0x637f5ec2, 0x81437fc6, 0x7f7f90d2, 0xb1558699, +0x2b81904a, 0x7f84ad54, 0xedab2281, 0xbe9cbd81, 0x7f5001d1, 0xea2a206c, 0x813cf1ab, 0x81658221, +0x81a6817f, 0x8167929a, 0x726dd87f, 0x817f817f, 0x93b45a87, 0x7fa179e2, 0x7f4c7f81, 0x8157817f, +0xa2fd7e81, 0x44284a58, 0x3b98c224, 0x45008124, 0x16da978d, 0xb772ba81, 0x7a4f3481, 0xe97fb9c8, +0x7f49529e, 0xaa02580d, 0xa254adb3, 0xac0a817f, 0xdc532c32, 0x7fe6887f, 0x7f313d7d, 0x61d17f11, +0x81e1bf02, 0x7f62c97f, 0x348d5d50, 0x12ec7f7f, 0x8f7f2884, 0x7f3f371e, 0x021c8e81, 0x65a07fc7, +0x5e14b632, 0x817ff481, 0x6681de78, 0xba4f971c, 0x65c07f81, 0xac81d181, 0x7f11b17f, 0xdcc1011d, +0x7f7f23c1, 0xcc819b6a, 0x81a73d06, 0x5e943954, 0x09c8b87f, 0x43405fe8, 0x817f8d58, 0x550f4d1d, +0x82c27254, 0xd0408532, 0x4460477f, 0x8b7f9cec, 0x7fc9817f, 0x8181165f, 0x28d8817a, 0x0527752f, +0x8168813f, 0x7f48cc81, 0x7481c91e, 0x6881c481, 0x4b0a7f55, 0xcc81e624, 0xe57fac7f, 0x6f0f81a0, +0x417b5a81, 0x9381dd8c, 0xa881c4e5, 0x8c505264, 0x695ab14c, 0xecc99781, 0x3981c57f, 0x0c204553, +0x4a77d59c, 0xa2301c81, 0x5ba47f00, 0x451eb2f0, 0xb0459baf, 0x934bcc63, 0x5652c0a1, 0xb381b193, +0x68626b5b, 0x361741d5, 0x7fe281b3, 0x70ad7f7f, 0x8161f792, 0xbfda5b21, 0xed97ad84, 0x7f59cb7f, +0x8ed1ecf7, 0x75d784ac, 0x0f81b07f, 0x3ed5bb6b, 0x819122a9, 0x2257a06b, 0x81687fb1, 0xc008057f, +0x97812981, 0xcb2081cd, 0xd9bb6681, 0x407f7f7f, 0xc27f814e, 0x23a2527f, 0x767203ad, 0xed17ee7f, +0xd4b89558, 0x8195bc81, 0x817f7fe0, 0xe4b7997f, 0x081ca76d, 0xb87f817f, 0x006350bb, 0x812739de, +0x557f811e, 0x8d4387af, 0x98815781, 0x81818148, 0xb1bc8105, 0x04cf273e, 0x3f2b289b, 0xae96437e, +0x819281b9, 0x95cf7f82, 0x7bf77f81, 0xab7f0441, 0x81652854, 0x34de0d81, 0xac816081, 0x43b12e45, +0x91b75bdd, 0x7da27794, 0x9bbb727f, 0x301d812e, 0x7fa88120, 0x27a15075, 0x27c82cc1, 0xef1a813a, +0x8114c4d2, 0x817b7f2b, 0xff877f47, 0x7fd47fcd, 0xd08ceb35, 0xe07f4386, 0x67b3a47d, 0xad7fd64d, +0x817f7044, 0x537feabb, 0x8d3f36ec, 0x6c3883ce, 0x43b6909d, 0x81bcd181, 0xfa7fdae9, 0x3c7f5440, +0x3946347f, 0x7f22ac7f, 0x815dea81, 0xb6c6c8a1, 0xd57f81c9, 0x526fd581, 0xce3c3115, 0x3d41c54f, +0x5c5ac2b0, 0x7c948586, 0xa47f7f96, 0x8b7fc351, 0x309aadf9, 0xa0cfef81, 0xb081acd7, 0xd7413cb2, +0x7f4a6cc9, 0x5c3bb39f, 0x7fc7e581, 0x68cc8114, 0x0926a5fa, 0x82c37581, 0x8181e642, 0x57ab2ec6, +0x497f0000, 0x5fa07f9c, 0xa17fc405, 0xeaa0de7f, 0xa14a7fb3, 0xc4c12a81, 0xa3527d15, 0xa854d4d4, +0xf781a3db, 0xa07f26ae, 0x812c7f74, 0x1f7f2fc4, 0x3a9381d4, 0x17b6005d, 0xd414ee60, 0x18b49d68, +0x9cc77f9e, 0x30aa7f91, 0x7fb9207f, 0x64158b40, 0x81423c7f, 0xea2fa9cc, 0x7fa83381, 0xca647f8e, +0xd6b9657f, 0x81b26a7a, 0x4fb7b2f1, 0x1b7f9eda, 0xfb8181ab, 0x7f2557d7, 0x71e8701c, 0xa2817f81, +0x81817f9e, 0x04139d39, 0xc9f6533f, 0xa1f74db1, 0x814042db, 0xca6e8114, 0x7fb3f64a, 0x03f981a0, +0x7f9e0755, 0x7f7ba781, 0xd554d19a, 0xd81a5661, 0x7fb33f3a, 0x8f81c8bf, 0x012ff975, 0xb1a576ee, +0x81be6681, 0x818db381, 0xbd7f8151, 0x81b281ae, 0xddd2fbdc, 0x81bfa81c, 0xce818181, 0x774c9c28, +0x7fd05d59, 0x811a54ce, 0x2f7f727f, 0xbe816b81, 0x7fb03af2, 0xc44bfc7f, 0xcf6ba181, 0x14be8161, +0x6715a197, 0x76386d26, 0x07835f81, 0x817c818d, 0x81693281, 0x818118fa, 0x777c9e62, 0xccad6446, +0x769c5b8b, 0xdbd781b7, 0xe4b063f9, 0x2b568182, 0x8c7f8187, 0x7f7f677f, 0x6b7fa675, 0x6be85f61, +0xc36f7d32, 0x7f81005f, 0xd0d0997f, 0x3a818181, 0x7fa7b6b7, 0xc39ef17f, 0xcc7f437f, 0x3d51729d, +0x3eb72475, 0x1b069d81, 0x7fe8abee, 0x604c7df9, 0x7fb47f81, 0x3a263b75, 0x75a488e6, 0x7f68d47f, +0x00004e97, 0x7ffb0973, 0x7f53a009, 0x7f014834, 0x6f81022c, 0xf0b1405f, 0x06c84ca5, 0x4bcf7fc9, +0x4388ec9a, 0xf528fa74, 0x8e3b816f, 0x7f7f4c72, 0x817f5224, 0xbd998181, 0x81b181c6, 0xbd817f88, +0x1763f57f, 0x7a796e44, 0xe98e81a9, 0x5360a2fa, 0x97b39081, 0x707f1b65, 0x81c67f7f, 0x4e461c7f, +0x817f231b, 0xc2d08181, 0x366081c6, 0xd2e67f90, 0x13f1b87f, 0xd781819f, 0x7f347fa2, 0xb1147fc5, +0xe6b1fe4e, 0x3a1a96b2, 0x177f8191, 0x3e3d96fe, 0xd0d261a0, 0xb25e7fc9, 0x472b81ce, 0xbad6817f, +0x707b45ca, 0x81817f81, 0xc48fb7f8, 0x90373f82, 0xa681e0b5, 0x71419190, 0x6978f77f, 0xf4463125, +0x48f1937f, 0x4a45c611, 0x7f97e348, 0xf07f1e21, 0x81fbfc60, 0x8783a281, 0x00931cdd, 0x81e70f91, +0xe24e7f7f, 0x7f61817f, 0x81967c47, 0x6d9bc90e, 0xec58817f, 0x8157357f, 0x7f7fc674, 0x7f7e3c81, +0xaa8b7fbc, 0x7f3ba469, 0x7a22f57f, 0x7f7f7f27, 0x81c89e7f, 0x8145d9c8, 0x012f737f, 0xe91f15cc, +0x9b9cb749, 0x818142cd, 0x290a7f4a, 0x89cfc4b1, 0x8337ebe2, 0xd8224205, 0x8181a49e, 0x58b04ea1, +0x7fea95a7, 0x861681fb, 0xcea37f5f, 0x81309c8f, 0x6ded8145, 0xbd5be86e, 0xc2ce9402, 0x557f57be, +0x4ef830e9, 0x7f81f97f, 0xf804367a, 0x5de6817f, 0x156de096, 0x2c06df0c, 0x98b170d7, 0x817f81a9, +0x24597fd4, 0x81810000, 0x0e24a66a, 0x819e5681, 0x6f73e481, 0x054b532a, 0xc0814026, 0xb3a36181, +0x6da37f9a, 0x7f83574f, 0xe0a381c6, 0x2075bf7f, 0x28438181, 0xb1cd7f74, 0x7ffb497f, 0xd17f337f, +0x46085c73, 0xd57f5681, 0x704b7ff3, 0x449e3f7f, 0xeb6e09d6, 0xb37f4b02, 0x817f1cb9, 0x672edf7f, +0xd0c2c25b, 0x5ed0885b, 0x4676876b, 0x2bd8d970, 0x9a7fbbc6, 0x81095581, 0x81b27f6b, 0x753c7f7f, +0x7f812c7f, 0x7f477fbe, 0xdaa67f7e, 0x7f099859, 0x7b0fea70, 0x816b8186, 0xf0677f5c, 0x16455d9b, +0xa98170a9, 0xa181529b, 0x7f817f67, 0x8f72c351, 0x2a7f7f7f, 0x2f5f347f, 0x695c7f79, 0x282fbbe0, +0xb78581f0, 0x817f297f, 0x49818c81, 0x817fc78c, 0x3bd68181, 0x86d7deda, 0x7fa0d208, 0x1c7f3481, +0xf5be9a57, 0xb9ded881, 0x8ab88c81, 0x647ae23a, 0xb5571142, 0xe09d7fc1, 0xa5d9817f, 0xaca07f7f, +0x7f4d5286, 0xa57fde7f, 0x94d0917f, 0xb160442b, 0xacf47b2b, 0xd17f7f81, 0x2e37f976, 0xbe7f5d66, +0xc2815f28, 0x5c81487f, 0xc2026481, 0x81a194dd, 0xba7f2c91, 0xb7357f37, 0x81b25698, 0xd2818154, +0x45b78130, 0xc6bead58, 0x6f5a5656, 0xb181a6ae, 0x07c9a153, 0x75d681d3, 0x8c92817f, 0x81503520, +0xa66f812f, 0xa59b7a81, 0x17a09164, 0x17087fb2, 0xd0bb319b, 0x6d8153ae, 0x8af1a67f, 0x651c46b0, +0x4b637f1b, 0x00002981, 0x2c7f437f, 0xd9deb6ab, 0x9fba847f, 0x6f289b21, 0x015f811c, 0x8176f498, +0xeac003ae, 0x68818192, 0xb37fa6a6, 0xd07f4aa5, 0x83819472, 0xa5da41a0, 0xbc7fbe7f, 0xa67fccd9, +0x7f0c86c5, 0x116e7f15, 0x7f67b45a, 0x907fcf81, 0x81812c66, 0x05747283, 0xac962b7f, 0x2a7f81ea, +0x81c2b57f, 0xb1b4b868, 0x7f811ed1, 0x7f66c937, 0xc881e6ab, 0x740323fd, 0xcf765745, 0x3592d370, +0x5c81f3e5, 0x527f3efc, 0x818781d9, 0xf6819b53, 0x1c547f51, 0x4e29b37f, 0x36f1537f, 0xcb819758, +0x538f5b7f, 0xa5172c22, 0x52427f7f, 0x6b7f8128, 0x7186134a, 0xf67f1b62, 0x6081e015, 0x829abe81, +0xaa8a65fc, 0xd27fb70f, 0x7f0a0881, 0x3d7fc998, 0x443e78b0, 0x9443c354, 0x81266724, 0x9b81812b, +0x813181a0, 0x7fddca68, 0x7f260f81, 0x7a818181, 0x812681ca, 0xf48152e0, 0x817f8388, 0x81306c7f, +0x7f71d020, 0x81bd8481, 0x5234d5c2, 0x31be8136, 0x3403d432, 0x11286844, 0x81a57f1e, 0xe3b57fd4, +0x7aa88f52, 0xabc64c52, 0x977f8181, 0x7fe68ca6, 0x5dd6eac3, 0xd26a81a9, 0x017f8183, 0x902cc266, +0x7fba7f52, 0x617f81cf, 0x7f657ff0, 0x045d7f63, 0x3c04bb4e, 0xaa4e7f81, 0x847fe385, 0x67817f7f, +0x42f33d28, 0x61a5aa5a, 0x817f7f1e, 0xa3a715d7, 0x5da91c3a, 0x7f9f7f81, 0xc48281ce, 0x813081fa, +0x7f817e53, 0x6d227dbf, 0x6e7b0000, 0xf49b4091, 0xf6b3d8e9, 0x89fb29ae, 0x44289881, 0x3cc78181, +0xe58103b9, 0x535bffd3, 0x817fa81b, 0x469f82f0, 0x57837fe1, 0xe14af07f, 0x54bf19b2, 0x7482595d, +0x6781bbd2, 0x4b7b7fb7, 0xa4c45060, 0x380155c8, 0xb72aa381, 0x4530847f, 0xcb509581, 0x34818181, +0xb03cd87f, 0x90818122, 0x812a8181, 0x817f677f, 0x2c2a597f, 0x35f0c581, 0x81b11261, 0x4d678120, +0x816d7f5b, 0x448166d8, 0x0c567f61, 0x81189e21, 0xcf932f08, 0x4c5a917f, 0x687f9b7f, 0x257f81d2, +0xcc7f6220, 0x8c947f81, 0x24642d1f, 0x728155d3, 0x14ca75d2, 0x817d7f38, 0x7f818181, 0x7fb31f87, +0x13a581b3, 0xd9b5215f, 0xa8afdbf5, 0x147fe67f, 0x81caab97, 0xa96daa7f, 0xf88b897f, 0xe7937fc2, +0x5a8b7f4b, 0x7d59277f, 0x8d687f9d, 0x7f924b81, 0xd41c82c0, 0xa5119c7f, 0x4fcfeba1, 0x3e077f81, +0xaf65994c, 0x83d481a7, 0x81257fb0, 0xa481387f, 0x36d8a463, 0x8181811a, 0xc75643a7, 0x474c6c1a, +0x7fc0e8cf, 0x8cdc896e, 0x55830655, 0x7f81337f, 0x7f65db1d, 0xa881cd81, 0x7f812ec8, 0x7f76cdd4, +0x634a443d, 0xea7f3ed9, 0x90a8d093, 0xb05e819c, 0x7f7f5c4e, 0x811e5b81, 0x73a1b989, 0x8181717f, +0x927d7f09, 0xdeaf7fca, 0x528e302a, 0x81654681, 0x7fe92e81, 0x87d58110, 0x1ca86e20, 0x7291a4cc, +0xc76c7f81, 0x577f5136, 0x00005b6e, 0x817fe37f, 0xf7ac7f7f, 0xf258ee81, 0x81814c63, 0x2a97f57f, +0x5f7ca0a7, 0x7f2fa37f, 0x94360c7f, 0x7f23117d, 0x81343a7f, 0x55b0d9de, 0xbae0189e, 0xc77f228a, +0x817f7861, 0xa57f7fac, 0x878ede24, 0xb57fad5a, 0x5c907f93, 0x814e9b81, 0x7febf59c, 0x7724e1a9, +0x569d9281, 0x1b644699, 0x4d4e26bf, 0x397f7f6e, 0x8ac93027, 0xe6885974, 0x51a2c1a4, 0x7f7f5b7f, +0xaad8ac97, 0x122c8186, 0x97810a5b, 0x818581e2, 0xc77f7f35, 0x67611c60, 0x3f8178ea, 0xa47fa65e, +0x888f8132, 0x81817cd4, 0x1081b4bd, 0x817f7fb8, 0x449a3fcc, 0x7f9832de, 0x51e96f58, 0xcbde52c0, +0x6b515783, 0xbda3b297, 0xd64b6381, 0x7f693c81, 0x6d311abb, 0x73468e81, 0xde81817f, 0x4f811581, +0x90d6817f, 0x152c9d49, 0xad7f17d7, 0x7f834681, 0xa47fe6dc, 0x06817fb3, 0x7f817f69, 0xd18190b1, +0xca7f8183, 0x1881f381, 0xac50814a, 0x7f8dca7a, 0x71358131, 0x28783add, 0xd31b153b, 0x71919b97, +0x81877f07, 0x707fca4f, 0x57c6814b, 0xc0a17fbf, 0xff5bb344, 0x4a7fa99d, 0x7434c104, 0xaa7ff0a5, +0xb6ec6841, 0xb4917e1b, 0x5a81ab94, 0x81a3aab1, 0x257fce30, 0xe26b7fc7, 0x1d7a7fe5, 0xfc7ca6c0, +0x81437ff7, 0x7dc59e14, 0x7f0cf9e9, 0x90e37f7f, 0x7f6f12bc, 0x52d36381, 0xc15f88ac, 0x3536277f, +0x8d3e2a7f, 0xa18d7a7f, 0x48907f23, 0x7f810000, 0xfd813357, 0x6ed4520b, 0x843907e2, 0x66814378, +0x7f7f6bd8, 0x0e3381ad, 0x03847f90, 0x05814769, 0x8181c181, 0x1c7f7fac, 0xe83cbfb5, 0xb15c735c, +0x7f8f7f7f, 0x7f846b81, 0x81d2eb7e, 0xf7447f41, 0xa2b57f81, 0x2ba7f381, 0x817f75bc, 0x78553181, +0xc7b07f7f, 0x7f557a41, 0x46a83ddb, 0x9b447d13, 0xccfe7b81, 0x7f3ae281, 0x75464bfb, 0x7f4e5560, +0x7fad14ce, 0x98fd2a7f, 0x7f637f81, 0x4a22cf5c, 0xca81813e, 0x4ffc7347, 0x9d777fa5, 0x810585ff, +0x71e57f81, 0x3f7f8181, 0xfce8819c, 0xbb315486, 0xf1e5a974, 0xf1e061dc, 0xcd7f8181, 0x8181817f, +0x547fb97f, 0xa663c341, 0x9e5aab7f, 0x35768dad, 0x817f3b48, 0x46bc815f, 0x707f89b3, 0x860713c8, +0x4a7c6532, 0x541084e8, 0x5f77bb7f, 0x299dbebe, 0xd3f27f8c, 0x25096727, 0x81194cba, 0x7ceff409, +0x9c8c267f, 0x7f7b1fe0, 0x635c0fdd, 0x308132ac, 0x57330951, 0x7c257f81, 0x6266dd49, 0x7f89b481, +0x817f7fae, 0x7f81aebd, 0xc7fb7f7f, 0x4537e27f, 0x1d288b7f, 0x7f4a9b7f, 0x8150969f, 0xf533f121, +0x7f782217, 0xe428816e, 0x10ca6981, 0x6981b39f, 0xe35fdb7f, 0xc6814220, 0x79ba8158, 0x811e815d, +0x772d8184, 0xc784810c, 0xa91abf8f, 0x3c7f6f7f, 0x6d9981bf, 0x9b42dbe9, 0x42948181, 0x5681817f, +0xdba39bf2, 0xf77f7f37, 0x18eebbdb, 0x39c6b7b7, 0xdc2fb5b9, 0x99d00a7f, 0x02dbe492, 0x4481606e, +0x7f6f81a1, 0x7f2f557f, 0x2aee7f6d, 0xed2ad2ae, 0x6ce4ec0c, 0xdb4cae3a, 0x81646c83, 0x7fa3c1be, +0x7f383730, 0x81aeba9d, 0xc0528bdc, 0xd17f3982, 0x7fa47c7d, 0x81814e81, 0x813d81bc, 0x20816349, +0x857fdfe9, 0xe46aa581, 0xe8de53b5, 0x34471a81, 0x3b4f7feb, 0x8174c981, 0x2fc7c735, 0xc818ec81, +0xb28ed3df, 0x627f1100, 0x7f40067f, 0x7fd37fa8, 0x637c5b81, 0x113dd969, 0x81376881, 0x5d817f67, +0x7f7fda7f, 0x7f7f7f70, 0x77577fb4, 0x87bb3d7f, 0x5b817f93, 0x839b517f, 0x7f45818e, 0xe47f3381, +0x93c2b281, 0x944207f3, 0x36dc77b3, 0x50b86e4a, 0x8181e27f, 0x0b81a79b, 0xf9975950, 0x977b9e47, +0xea7f8181, 0x5547b549, 0x3da47f0d, 0x474b8e72, 0x7f7f9ce1, 0x7f2e2e42, 0x6f7f45c9, 0x08d56ede, +0x8524810b, 0x657fd15f, 0x7f8d0c14, 0x6c7fff7b, 0xd530f39d, 0x7fb4b023, 0x651d8a1b, 0x13817024, +0x7f850774, 0x1f219db3, 0xd8817f52, 0xd95c0feb, 0x9ef0e67f, 0xd9dd4c7f, 0x64b0819a, 0xbc60e997, +0x412fd0db, 0x817fa57f, 0xa3a47f81, 0x4d81815b, 0x81874e3a, 0x5f1e7c81, 0x7fc63b81, 0xbf817581, +0xb5b0a5ab, 0xde2c8145, 0x81789629, 0x097481b8, 0xad5bdca3, 0x212d81e5, 0x4d817f3c, 0x70813761, +0x5d6d0f40, 0x81a190eb, 0xc942c14d, 0x81b462d8, 0x81890000, 0x6586fbcf, 0x81cb3322, 0xa5c0b931, +0x7f78e98d, 0x2492625b, 0xaf81b981, 0x4e59817f, 0x677fb9d3, 0x2c3b817f, 0x920e5981, 0x7f2c7f5d, +0xc379d081, 0xdfbddf43, 0x85818172, 0x6781e442, 0xda9a7f14, 0xcac70881, 0x98818113, 0x0f817f6f, +0xeba852c8, 0x7fa6407a, 0x7fdc8188, 0x819fd349, 0xee738137, 0xe881417f, 0xb6777fea, 0xc6947f73, +0x8181240f, 0xa035c264, 0x7f419e81, 0x193f815f, 0xaedc812e, 0x7fb97f24, 0x924a81e6, 0x63f58183, +0x3e4ec808, 0x7f4fbe86, 0x5faba653, 0xf0c4f4d7, 0x69cf647f, 0xfb55c681, 0x7fe1e381, 0x7f817f6b, +0xc0410481, 0xc65d71b6, 0xba1f8135, 0x997f04cf, 0x49db5b1c, 0xbe817443, 0x817b812c, 0x36e18163, +0xd1893a47, 0x231df6f2, 0x816d045e, 0x3a568139, 0x81628181, 0x6588ffd2, 0x23603081, 0xf5b4817d, +0x8112b5bc, 0x7f9cfbae, 0xc02b8d40, 0xc7f20532, 0xce81487f, 0x0b1a6614, 0x7f17392f, 0x7f8f818c, +0x7f7f8388, 0x5492467a, 0xbf5e3081, 0x777f26bb, 0xae9c4a7f, 0xae81ba0e, 0x6c6281ae, 0x81238143, +0x7f997ffe, 0x798b949c, 0xc3d67f36, 0x38817ff9, 0x2f814ab6, 0x594bad4b, 0x7f6f7fd6, 0xab234181, +0xaf818581, 0x77865381, 0x9d7f8173, 0x27ac8181, 0xbdbd8daf, 0x7c7f7f7f, 0xc6817fd9, 0x34412181, +0x1fe7eb78, 0x7f38f49b, 0x81040b8f, 0x34ec8581, 0x0000907f, 0xd5818181, 0x7865c6d5, 0xada81975, +0x0447e955, 0x7f3d09b3, 0x2b8156e8, 0x976d81dd, 0x29cee57f, 0xa34f537f, 0xe9a981f6, 0x0c7fe841, +0x7f7eda7f, 0xd77f1881, 0x3f929481, 0x77e3c852, 0x0d817fc1, 0x7f4795ab, 0xd1337f4f, 0xdd4b077f, +0x97a4b3d8, 0x607ff155, 0x942b16c3, 0x113a723c, 0x52ce7882, 0x5e81f5e9, 0x81755669, 0x7fea4d5f, +0x5d6d7f81, 0x7f90e710, 0xe3817f6d, 0xe810299c, 0x4e814937, 0x3c269d81, 0x33a891aa, 0x81dd7ff3, +0xa9d1db0d, 0xfb2181eb, 0x7f817fa4, 0x75ec817c, 0xf17f8195, 0x81e18181, 0x44321c58, 0x35a62913, +0xcd5b0875, 0x397f8233, 0x797f7f81, 0x7f829cbc, 0x9a697f81, 0x07b7fea9, 0x7d2b0b7f, 0x8f984dce, +0x0c13b97f, 0xe9203f3c, 0xea473769, 0x7b7fdc81, 0x7f7885c1, 0xde7f5b39, 0x32bd81f1, 0x67b4917f, +0x443069cb, 0x6e972b83, 0xbc66829f, 0x7492817f, 0x7f4d7481, 0x7f25896f, 0x9ea0da7f, 0xceba7f81, +0x7f45d87f, 0x93dbf04c, 0x50814197, 0xb7167f81, 0x6d7fad19, 0x0f81bea5, 0xc57f8177, 0xca4c7f7f, +0x7d84e3f6, 0x7bc443d4, 0xd7b0ae81, 0xc8731f44, 0x06e481ac, 0x85b08181, 0x53cfe4be, 0x73761a3d, +0x707f9981, 0xa87ff27f, 0x68b5b87f, 0xb561c081, 0x7f660001, 0x7b81521e, 0x6093614b, 0xbc778748, +0x64400f81, 0x81d13281, 0x60475381, 0xbe768181, 0x21aad606, 0x81910000, 0x20b6a511, 0x5953d899, +0xdd7f7fba, 0x8181fabe, 0x81b8e77f, 0x817ff17f, 0x6757257f, 0x9c2cc933, 0x51813593, 0x7f7fadef, +0x8ec47f43, 0x348139d7, 0x7f5c82b7, 0x664419bc, 0x8d7b15a5, 0x8181a581, 0xd54d7f63, 0x7f0381b7, +0x81a17f68, 0x814a5e0d, 0x17813dc4, 0xbd94872d, 0xa25a8101, 0xa6810e54, 0xd8568fc4, 0x7f7f3a7f, +0x818478ba, 0x517f81c7, 0x70443b81, 0x7ce481b6, 0x7f817f7f, 0x81b27fe5, 0x4bc67f32, 0x81bbe681, +0xa1c8fe81, 0x857f1c0d, 0x7f81793a, 0x7fbfcf74, 0xadd47f5c, 0x7f8138b4, 0x6f63cd25, 0xd70e497f, +0x81aa7fc7, 0xbaa84f5a, 0x8197ccd3, 0x7f556b7e, 0xca815dff, 0xb9ba7f7f, 0x81747f7f, 0x7fdf967f, +0x65a98181, 0x81bc8181, 0x8e11bab7, 0xbbbf7ffd, 0x12b8457f, 0x59fe8481, 0xf25cdd81, 0x958f840c, +0x5e6a5f81, 0xe9008181, 0x7a68cb38, 0x76818914, 0xa3857fc7, 0xce98717f, 0x8126504d, 0x7fa48183, +0xfa60e14a, 0x7fb77f22, 0x5f3a7f28, 0x24910bde, 0x2fd07f4f, 0x64a6810b, 0x818181a4, 0x7a065fb8, +0x7fe69795, 0x45815e3b, 0x7fa98741, 0x52c581b8, 0x74bb2a22, 0x817a8166, 0xc2cb6581, 0x493c7f7f, +0x883e816b, 0x3c7f7f7f, 0x7f3381c1, 0xab767f6d, 0x81b4588c, 0xb2e24cb9, 0xd9bccba1, 0x70e0162c, +0xea1c810a, 0x907fdd49, 0x424aece8, 0xd90423b0, 0x22df1b28, 0x6b005d25, 0x113e61b3, 0xa2103bbe, +0x20d6c538, 0x17e6c841, 0xdc08e2c4, 0x2002b1ef, 0xc51a77e3, 0x8111f752, 0xea698110, 0x1849b6e8, +0xe6b006d2, 0xdc40b507, 0xc738b9ec, 0x42290a3f, 0x522355bc, 0x590736d3, 0xd9a340e5, 0xe30a19b5, +0x3de9eff9, 0x4437cc7f, 0xecfd0a7b, 0x34e4fcc7, 0x4afe1556, 0x1ecb301f, 0x0f511d1d, 0xf8ec40db, +0x4c07caf9, 0x59f73ebd, 0x45064328, 0x03c27f19, 0xd1661dcb, 0xe4e3ae17, 0x000fcd5b, 0xdd121ec8, +0x3adb1413, 0x112b9888, 0x1d3624fd, 0xa8a347f6, 0xfeb632d5, 0x1d28fc11, 0x21ac2b5f, 0x371fe9f7, +0x3d5ef435, 0xe84000a1, 0xaebebcc9, 0x34555ff0, 0x39a9ca2a, 0x580fc0e6, 0xcf7a5699, 0xf5e65242, +0x07ae3170, 0x06b223ea, 0x638e421b, 0xd8dc0cab, 0x66c44fb0, 0x954117d7, 0x9691a163, 0x415bc8a1, +0x0868d844, 0x9593f551, 0x364bec3b, 0x57460bfb, 0xdc310e3e, 0xe4dbef28, 0xc6443317, 0x81a02211, +0x450c2323, 0xefca9dcf, 0xfebf3fbf, 0xafef377c, 0x3f81ac26, 0x13b4e548, 0xf60a05a9, 0x03d4d840, +0x1970ecd3, 0x95019cfd, 0x8128341d, 0xc4d8d440, 0x16b80a75, 0xc2332b1d, 0x47e90e1b, 0x2e4eadcc, +0x0aa5f04b, 0x03302c42, 0x1a1ed437, 0x3b623efa, 0xc1cec834, 0x4442d130, 0xdce837f0, 0xc3f90934, +0x5ea50731, 0x257f1504, 0x2da5defd, 0x22d3dd34, 0xc429fa2b, 0xf2cc0a0b, 0x3e2e0000, 0x020f1c20, +0x2e962a1f, 0x06edf5f3, 0xceb5dfe4, 0x3b213d57, 0x08c24237, 0xf32ad940, 0x321768b0, 0xb133ebcd, +0xfca78110, 0xc03001db, 0xfca42f7f, 0x7071645f, 0x30bf8185, 0xd1f6d479, 0x02076839, 0x34cd900d, +0x500cda81, 0xe542b08e, 0x282afac6, 0x30a835ce, 0xbc710153, 0x574b009c, 0xe8b24309, 0x02d2cbc8, +0xaae1ea5a, 0x190eff7f, 0xbc656b07, 0xfdc8094e, 0xc0ee4452, 0x2a819969, 0xb79a0a0e, 0xe334a040, +0x12323acf, 0xd9617f3c, 0x3709af42, 0x8b67b338, 0xff00e313, 0x5046e8de, 0x45ec1107, 0x4e2618c9, +0xb40a62dd, 0x0da39629, 0x0a62a937, 0xc9d92e1d, 0xcf4daf81, 0x3f26a9a3, 0xd01e3f2b, 0xac294211, +0xd7c221e7, 0x15c928f2, 0xd79412cb, 0x110fb1fc, 0xddd3fa22, 0x4e7fa8ad, 0xd4a0ebf8, 0x5b144a01, +0x4cf90bdc, 0xb43366e7, 0x1cb8503e, 0xff152c3a, 0xae04fd5f, 0xd896041e, 0x1c2ca245, 0xd7adf0e3, +0x36ee2de1, 0xf0350023, 0x2e529db9, 0xba18d1bc, 0xbb2aba00, 0x52c7c4fb, 0x09df6147, 0x1102f72e, +0x13054b2f, 0xf9f9fced, 0x292a14c9, 0x60095adf, 0x8b43fec1, 0x3ca5a3c9, 0xe73665c7, 0x2f12b049, +0xb0fadecf, 0xd0e46081, 0x42532cf0, 0xe420e3fe, 0xaf5b0501, 0x27f0b481, 0x871c0ec6, 0xcd1c8cb7, +0xe4135816, 0x0a2aab7f, 0xbf732d1d, 0x613f1aee, 0xac09b927, 0x7d663532, 0x0000dee4, 0xfdeccc4a, +0x34b86af1, 0xf0bb16dd, 0x5829085f, 0x51ffdcc2, 0xd50c9f39, 0x64dfc723, 0x2cd52b2b, 0x083e0b2b, +0x224ae1b5, 0x0fd63733, 0xf081cef7, 0x7f73e3c4, 0x36cca9d4, 0xcc2600ae, 0x0757af1e, 0x21cc2ef7, +0xf175c93f, 0x59221d2d, 0xe6c7f468, 0xe3ea1fcb, 0xcd3d539a, 0x271e345c, 0x3555341c, 0xd2532b7f, +0x7fc8c57f, 0x4025dbe5, 0xf6926f3d, 0x264d39db, 0x2ed7c504, 0xde2a554b, 0x25aeb624, 0xd031a1dc, +0x47dbd918, 0xa0004941, 0x0202e11c, 0xd407fda2, 0xd9bd0fdb, 0x30f94d53, 0xd32b1cc6, 0xa6cb1947, +0x16fa1b49, 0xc70d1f56, 0xa7daec0d, 0x813d4649, 0x0f520200, 0x0d174704, 0x337f521a, 0x52c2cf34, +0x6b280539, 0x81da4508, 0x0ef2a91d, 0x07121df9, 0x031e410e, 0xf0180925, 0x055022b0, 0x2156f018, +0xa2e812c6, 0xfbe05cbb, 0x232e4462, 0xed378bca, 0xcd31afa7, 0x063a2e09, 0xe836ff1b, 0xefdeaf26, +0xfeef274a, 0xc9a1159d, 0x66db4731, 0x05a50ace, 0x1b4c58fd, 0x6b0ba273, 0x251319b8, 0xc7523041, +0xa20364b7, 0x34812fc4, 0x055f5d29, 0x5858fefa, 0xf809192d, 0x2f063981, 0xce056e8e, 0x1f7e68cc, +0xbbc07f8b, 0xcc1c1240, 0xf45c1452, 0xeb1deac8, 0xe3f9d3fe, 0x12bc2a12, 0x515bd8d4, 0xb3b361d6, +0x3304f1dc, 0x63060dbb, 0x41c8c73d, 0xce985d1d, 0xd2b2544b, 0x6d241fd4, 0xb6b8b1c5, 0x21830000, +0x15efc4c3, 0x2c430fc1, 0x14400bef, 0x2c33083e, 0xbe04fb07, 0xad42d311, 0x4ed2b731, 0x1627d2d2, +0x07aa0f34, 0xfe38df20, 0xe35bcd1b, 0xe13bfbcf, 0xcc3df1c9, 0x84355a1c, 0x55e602d2, 0x47c52a81, +0x16d85858, 0x0d11d8d2, 0x54f4b081, 0x303523ad, 0x2dbc16e3, 0xb9d6f0d7, 0x13f76190, 0xeec0133a, +0x81eccebc, 0x46202d2b, 0x86b52303, 0xa1f928ba, 0xe421b651, 0xb13cf63f, 0x3136c8e6, 0x4a8128b9, +0x2d7f231a, 0x262cf3e3, 0x9c35d3f9, 0xe9e6753a, 0xefeff441, 0xd4bcd301, 0x42700bd5, 0x29ab001b, +0x28bb6207, 0x01f537d1, 0xbc57fd38, 0x4999290e, 0x3e7f04fe, 0x36adb7fa, 0xdb0314ce, 0xa1d6524e, +0xeee5c994, 0x1d1ce32e, 0xee142708, 0x3bf9e663, 0x06521283, 0xe8c6e6a9, 0x53356ee3, 0xe2cd5d4e, +0x8e1bdacc, 0x382c18e2, 0xc5e2fe00, 0xcee2eaf8, 0xb7532ece, 0xfbea01bf, 0x3ecf7f2d, 0x06b2ffaf, +0x5acbfe35, 0x26c8eefc, 0x8e27d35b, 0x84291501, 0x32f82ffa, 0x9f3a10cc, 0xabcff198, 0x139a3da9, +0x3bd92af7, 0x264febe8, 0xbf48f81b, 0xa1df1aa2, 0x2c0a10ca, 0x04c00073, 0x5681e760, 0x411054e5, +0x88d8c5a0, 0xe3f6b6fd, 0x2a3030ea, 0x0f0ec8b9, 0xa827cbe8, 0x2a2c7f49, 0x51ef20d2, 0xa48c4a81, +0x2b8db1d9, 0xd150813e, 0xd7aab201, 0x36061afd, 0xeed80a8d, 0xcd9932d0, 0xedd3edbe, 0x38f4f017, +0x9853f907, 0xc964f464, 0xc68d40f0, 0x3f5bcc44, 0x975004ec, 0x102d467f, 0xf3f9451d, 0xcde706bb, +0xc87fa602, 0x3f5a88b0, 0x8119c002, 0x3cc14ac8, 0x607abeb7, 0xf95924cd, 0xfb1afa2c, 0xc4967f36, +0xf425dacb, 0xa32d09aa, 0x35106590, 0xad4e5b4d, 0xa1fda650, 0x0326e143, 0xfbf054e0, 0x589fe1bc, +0xc83249b4, 0xb0b81e1b, 0x7081fec8, 0x27530027, 0x84dc89ca, 0x76551d3a, 0x0bbcc3d9, 0x8108bade, +0xb534f6cc, 0x87833920, 0x07ec1b0e, 0x5fd30b29, 0xf124dd07, 0xc981b03d, 0x71b9417e, 0x476c76b6, +0x7fcb3662, 0xaec632e9, 0x2e6705dd, 0xaec5acf9, 0xc84cd6de, 0x5312d428, 0x12fc4738, 0xd31d5b1e, +0x61edd156, 0x60fdfddb, 0xff676a0c, 0x2a3baad6, 0x0d1f6eab, 0x0001dcce, 0x180a31ca, 0x1ba681ec, +0x90871091, 0xe2ef01f5, 0x35186658, 0x95cac76a, 0x1ae32a09, 0xebedc8df, 0x0da7c007, 0x274fc73f, +0xd62a1ff5, 0xd6d7403a, 0xc4921d32, 0xb5f6cadc, 0xdd34f021, 0xe9334bfe, 0x5c9256c1, 0xbecbfd00, +0x139acdb2, 0xe3913eab, 0xceed1c3b, 0xdd2c5aa6, 0xfb475d17, 0x4633f4e7, 0x373b4b4f, 0x72ee99f3, +0xb65542d3, 0x48eb1d39, 0xa6d32fae, 0xc20aabe4, 0x105f4c0d, 0x4848bb65, 0x3bd329d2, 0x470c4709, +0x43fb2438, 0x0620c0d7, 0x4f962821, 0xfd2f992c, 0x51f8aea5, 0x2521cfe9, 0xbf6e2f9d, 0x005e3653 + +hard_output0 = +0xb5bc6ac8, 0xf5373664, 0x1310345c, 0xd5bae4e7, 0x1fc9e83e, 0xebfdfded, 0x84bd86ab, 0xb7aabe00, +0x60b44fea, 0xb9067464, 0x30325378, 0xa9195955, 0xf70c6e5c, 0x90922632, 0xc90b1cdb, 0xf2f5fb69, +0x73056b63, 0x1a33bf3f, 0x17755b5c, 0xc58bff6d, 0x2f4390b2, 0x2869d508, 0xe7c7dfe8, 0x38552963, +0x21da5367, 0x07282b9b, 0xa4767105, 0x1e294251, 0xe350a940, 0xb8a6aa27, 0xed12d778, 0xf10d9ece, +0xab93527f, 0xcf2da7e7, 0x68f6d0b1, 0x811f4bca, 0x577b06b2, 0x3234f13e, 0x30bab7df, 0x8dc47655, +0xbb843bed, 0x86da3aba, 0x30950c97, 0xdd096d7a, 0xa871fd6c, 0x8bee4e6b, 0x8fea30d0, 0x6c05b4d2, +0xf3e144d3, 0xd24ebb1f, 0x065635e5, 0x8d3f2cf9, 0x536c6c6a, 0xfbb0a5d0, 0x3d707b42, 0xc44d5982, +0xa5f4ad8f, 0xf32c0970, 0x1bccf1a6, 0x05916020, 0xa64fb176, 0x5ede6a35, 0xaf4966da, 0x9df5e0e7, +0x75042abc, 0x9ef10481, 0x11ddcbc8, 0xa0f5518c, 0xd5c23418, 0x2393d558, 0xfbe7dfeb, 0xed1c64c2, +0x86a36508, 0xde2dfb1e, 0xb8d0fef9, 0x24505232, 0xc894e71c, 0xbcc752a0, 0x40b74e83, 0x90d23c8c, +0x728e4a61, 0x108f0b08, 0x66f522ee, 0xc258d851, 0x35a31c44, 0x11311b5b, 0xfd3d5be9, 0x5ae448ff, +0x4f64994b, 0x5b8247a9, 0x4021114d, 0x2f0b6e82, 0x5eaa9828, 0x50ac71c0, 0xfb86ee52, 0x0dc1ac9b, +0xbbd47645, 0x8f357115, 0x978ceea0, 0xd557db99, 0x99b30388, 0xfc9a8a1c, 0x0f75be1a, 0x50143e22, +0x8840989b, 0x738ec50e, 0xe6b2783d, 0xf67899c8, 0x27ebed69, 0x6c415a16, 0x3a6cc2dc, 0xcd4e4e5d, +0x6cb12b2e, 0xdb88d7c0, 0x79cd1582, 0xbc422413, 0xe72ad2f4, 0x8eaac30f, 0x0bd86747, 0x6d87f69d, +0x15d62038, 0x4b375630, 0x0d51b859, 0x16db2cb2, 0xf210603a, 0x0abeb833, 0x55c694d0, 0xe57ca43b, +0x0ba94428, 0x1398a406, 0xe47d3889, 0x5a20203d, 0x250d7a1a, 0xd930ffec, 0x03992e79, 0xf2759376, +0x024ec121, 0x91fc3a2c, 0xb7e11cc5, 0x4ff7d459, 0xb8700134, 0xd6e61758, 0x4eba0a32, 0xb747e3ec, +0x7073fad7, 0xded80f99, 0x331e2f1b, 0xfa1f1bed, 0x056424a2, 0x1d1d95e0, 0x550b9ec8, 0x51ee2a38, +0x19525153, 0xd70c4cd5, 0x0d6cd7ad, 0xe44d1cf2, 0x30dfecda, 0xdacd7fe8, 0x7321d795, 0xddf48ef4, +0xe271e6a4, 0x9c1feecb, 0x951fcd7b, 0x8acc5a03, 0x3fb83527, 0xe306de74, 0x7b9cd6ee, 0x8e140885, +0xd4c91e8d, 0xe8c39733, 0x0f02f87f, 0xfb06b1b9, 0x0dc9349c, 0xf76bae8e, 0x4f642a07, 0x3d48a9aa, +0xe3ea323a, 0xa1cd5c8a, 0x40aa0e70, 0x132042d3, 0xa9732f6c, 0xd15a00c4, 0x43d3b046, 0x9a51ebd4, +0xc46ee0ed, 0xe2a2148b, 0xf5c478f0, 0x1fb01cf3, 0xf4f321ec, 0xd973811f, 0x11ad11b9, 0x5c67adda + +soft_output0 = +0x81818181, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x817f817f, 0x81817f81, +0x7f817f81, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x817f8181, 0x81817f81, +0x7f7f7f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f7f8181, +0x81817f7f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, +0x7f818181, 0x8181817f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x817f817f, +0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, +0x8181817f, 0x817f7f81, 0x81818181, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, +0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f81817f, +0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, +0x81817f81, 0x81817f81, 0x81817f81, 0x817f817f, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x8181817f, +0x7f817f7f, 0x817f7f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x817f8181, 0x7f7f7f81, +0x7f817f81, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, +0x7f7f817f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x7f81817f, +0x7f7f7f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f817f81, +0x817f7f81, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x81818181, 0x7f818181, 0x8181817f, +0x817f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x817f8181, 0x81817f7f, +0x7f7f8181, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x81818181, 0x7f81817f, 0x817f817f, 0x81818181, +0x817f8181, 0x817f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f81, 0x7f7f8181, 0x7f817f7f, 0x7f7f817f, +0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, +0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x81817f81, +0x817f7f81, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, +0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, +0x8181817f, 0x817f8181, 0x81817f81, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x7f7f8181, +0x8181817f, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x8181817f, 0x81817f81, 0x817f8181, +0x81818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x817f8181, +0x817f7f81, 0x817f7f81, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f81817f, 0x81818181, 0x8181817f, +0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, +0x8181817f, 0x7f81817f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, +0x7f81817f, 0x81817f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x81817f7f, +0x81817f7f, 0x81817f7f, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x7f7f8181, +0x817f7f7f, 0x81818181, 0x7f818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, +0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f817f, 0x81817f81, 0x817f8181, 0x7f7f817f, +0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x817f817f, 0x81817f7f, +0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, +0x7f81817f, 0x7f818181, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f81, +0x7f7f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x8181817f, +0x817f817f, 0x7f7f7f81, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f817f, 0x81817f7f, +0x817f7f7f, 0x81818181, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f817f81, 0x817f8181, +0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x817f817f, +0x7f817f7f, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f81, +0x81817f81, 0x817f7f7f, 0x81817f7f, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, +0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, +0x817f7f81, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x81818181, 0x7f81817f, 0x7f81817f, 0x817f8181, +0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, +0x8181817f, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f81817f, +0x8181817f, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x81818181, +0x817f817f, 0x7f818181, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f817f, +0x817f7f7f, 0x817f8181, 0x81817f81, 0x81818181, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, +0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x81817f81, +0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x8181817f, +0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f81817f, 0x7f81817f, +0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x7f818181, +0x8181817f, 0x81818181, 0x8181817f, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x7f81817f, 0x7f817f7f, +0x81817f81, 0x7f81817f, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f817f7f, +0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f7f7f7f, +0x7f818181, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x8181817f, 0x81817f7f, +0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x81818181, +0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x81817f7f, +0x7f818181, 0x817f7f81, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f817f81, 0x7f7f7f81, +0x7f818181, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x81817f7f, 0x8181817f, 0x817f8181, 0x8181817f, +0x7f818181, 0x7f817f81, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f7f, +0x817f8181, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x81817f81, 0x7f7f7f7f, +0x7f818181, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, +0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x81818181, 0x817f8181, +0x7f7f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, +0x817f8181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f818181, 0x817f7f7f, 0x7f7f7f7f, +0x817f7f81, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x81817f81, 0x81817f81, 0x7f7f7f81, +0x8181817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, +0x7f817f81, 0x81818181, 0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x8181817f, 0x7f818181, +0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, +0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x8181817f, +0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, +0x817f817f, 0x7f81817f, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x81818181, 0x817f817f, 0x7f7f817f, +0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f81, +0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f817f, +0x7f7f8181, 0x7f7f7f81, 0x817f8181, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x7f817f81, +0x7f817f81, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, +0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f81817f, +0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, +0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81818181, 0x8181817f, 0x81817f7f, 0x81818181, 0x817f817f, +0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x81817f7f, +0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x817f7f7f, 0x817f817f, +0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x7f817f81, +0x817f7f7f, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x81817f81, 0x81818181, 0x7f817f7f, +0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, +0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x7f7f817f, +0x817f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x817f817f, +0x7f817f7f, 0x7f817f7f, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x8181817f, 0x7f7f8181, 0x7f817f7f, +0x7f817f81, 0x7f7f8181, 0x81817f81, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f7f7f81, 0x8181817f, +0x81817f7f, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, +0x81817f7f, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x81817f81, 0x817f7f81, +0x81818181, 0x817f7f7f, 0x7f818181, 0x81818181, 0x7f7f817f, 0x817f817f, 0x7f7f817f, 0x7f817f7f, +0x7f817f81, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x817f817f, 0x7f818181, +0x817f7f81, 0x817f7f7f, 0x81817f81, 0x81818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f8181, +0x7f818181, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, +0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f81817f, 0x817f8181, 0x7f81817f, +0x8181817f, 0x81818181, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, +0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x7f81817f, +0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x7f817f81, 0x7f817f81, 0x7f7f817f, +0x81818181, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f81817f, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, +0x7f817f81, 0x817f817f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x81817f81, +0x7f7f7f81, 0x81818181, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x7f818181, 0x7f7f8181, +0x7f7f7f81, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x817f8181, 0x817f8181, 0x817f7f81, +0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, +0x81817f7f, 0x7f817f7f, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f7f, +0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x81817f81, 0x817f7f7f, 0x7f7f817f, +0x817f7f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f81, +0x8181817f, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f817f, +0x7f7f7f81, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, +0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x7f818181, 0x7f817f81, +0x8181817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x817f817f, 0x81817f81, 0x7f7f8181, +0x7f7f7f7f, 0x7f81817f, 0x817f817f, 0x81817f81, 0x81817f81, 0x81817f7f, 0x81817f81, 0x81817f81, +0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x817f7f7f, +0x7f7f7f81, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, +0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f817f81, 0x7f817f7f, +0x81818181, 0x817f817f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x81818181, 0x8181817f, 0x7f817f81, +0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f817f81, +0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f7f81, 0x817f8181, 0x81817f7f, 0x81817f7f, +0x7f7f817f, 0x817f817f, 0x7f817f81, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x81817f7f, +0x817f817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x817f7f81, 0x817f8181, 0x8181817f, +0x81818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, +0x8181817f, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x81817f7f, +0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f7f, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f818181, +0x7f7f7f81, 0x81817f7f, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, +0x7f7f817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x81818181, 0x7f7f8181, 0x817f8181, 0x7f817f81, +0x7f817f81, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x817f7f7f, 0x7f81817f, 0x7f817f7f, +0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f7f817f, 0x7f817f7f, 0x817f817f, +0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, +0x817f7f81, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, +0x817f817f, 0x81817f7f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x81817f81, +0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f817f, 0x817f7f81, 0x817f7f81, 0x7f818181, +0x817f7f7f, 0x8181817f, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x817f8181, +0x8181817f, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x817f817f, 0x817f7f81, 0x81818181, 0x81818181, +0x8181817f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x817f8181, 0x7f7f817f, +0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x7f817f7f, +0x8181817f, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x81818181, 0x817f7f7f, 0x817f817f, +0x7f7f7f7f, 0x817f8181, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x81817f81, +0x7f818181, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, +0x81817f81, 0x817f7f7f, 0x817f817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, +0x7f81817f, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x817f7f81, 0x7f818181, +0x7f818181, 0x817f7f81, 0x7f817f81, 0x7f7f7f7f, 0x81817f81, 0x81818181, 0x7f818181, 0x7f81817f, +0x81817f81, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x81817f7f, +0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x817f7f7f, +0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f7f, +0x81818181, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81817f7f, 0x817f817f, +0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, +0x817f7f7f, 0x7f7f817f, 0x817f8181, 0x7f817f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x81818181, +0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x81818181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x81818181, +0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x817f7f81, +0x7f81817f, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, +0x81817f81, 0x81817f81, 0x7f817f81, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x81817f81, +0x7f7f817f, 0x8181817f, 0x817f7f81, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x817f7f7f, +0x8181817f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f81, 0x817f7f7f, 0x81818181, 0x817f7f7f, +0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x817f817f, 0x7f81817f, 0x81818181, +0x81817f81, 0x81818181, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81818181, +0x81818181, 0x81818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f818181, +0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x817f7f7f, 0x81817f81, +0x7f7f7f7f, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x81817f81, +0x817f817f, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f81817f, +0x817f8181, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x7f818181, 0x81817f7f, +0x81817f7f, 0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f818181, 0x7f81817f, +0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x8181817f, 0x8181817f, 0x7f817f81, 0x8181817f, 0x8181817f, +0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, +0x7f818181, 0x7f817f81, 0x81818181, 0x817f817f, 0x817f817f, 0x7f818181, 0x817f8181, 0x7f7f817f, +0x7f7f7f81, 0x817f7f7f, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f817f, 0x7f7f817f, +0x7f817f81, 0x817f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x8181817f, 0x7f7f8181, +0x7f818181, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x817f817f, 0x817f7f81, 0x7f7f7f81, 0x81817f81, +0x817f8181, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, +0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x7f7f8181, 0x8181817f, +0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x817f817f, +0x817f7f7f, 0x81817f7f, 0x7f818181, 0x81818181, 0x817f7f81, 0x81817f7f, 0x817f8181, 0x817f8181, +0x81817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, +0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, 0x817f8181, +0x817f817f, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f81817f, +0x7f817f81, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x81817f81, +0x7f7f8181, 0x7f817f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, +0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x8181817f, +0x7f817f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x81818181, +0x7f817f81, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x7f7f7f7f, +0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, +0x817f7f7f, 0x81817f81, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x7f817f81, +0x7f7f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, +0x7f817f7f, 0x817f8181, 0x7f818181, 0x81817f7f, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, +0x7f81817f, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f818181, 0x817f7f7f, 0x7f81817f, +0x81817f81, 0x7f7f7f81, 0x7f818181, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f8181, +0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x81817f81, +0x817f8181, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f81817f, +0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x817f7f81, 0x81817f81, 0x7f817f81, +0x817f8181, 0x7f818181, 0x7f817f81, 0x81817f81, 0x81817f81, 0x817f8181, 0x7f818181, 0x81818181, +0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x8181817f, 0x81818181, 0x817f7f81, 0x7f818181, +0x81817f81, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f7f817f, 0x8181817f, +0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x7f7f8181, +0x7f7f8181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, +0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x81817f7f, +0x817f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, +0x7f7f8181, 0x817f817f, 0x7f7f7f81, 0x7f7f817f, 0x817f8181, 0x7f81817f, 0x7f81817f, 0x817f7f7f, +0x7f817f7f, 0x817f817f, 0x817f7f81, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f81817f, +0x7f7f8181, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f81817f, 0x817f8181, 0x8181817f, 0x7f817f7f, +0x817f8181, 0x817f7f81, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, +0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x8181817f, 0x81817f81, +0x817f817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x7f817f7f, 0x7f7f7f81, 0x817f817f, +0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f7f7f, 0x817f8181, +0x7f7f8181, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x81817f81, 0x817f8181, 0x817f7f7f, +0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x81817f7f, +0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f7f, +0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, +0x7f818181, 0x817f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x81817f7f, 0x817f8181, 0x7f7f8181, +0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, +0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, +0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x817f8181, +0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f81817f, 0x7f7f817f, 0x81817f81, 0x7f7f8181, +0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x817f817f, +0x7f81817f, 0x7f818181, 0x817f8181, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, +0x817f8181, 0x817f8181, 0x7f817f81, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x817f817f, 0x81818181, +0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x81818181, +0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f818181, +0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x81817f81, +0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, +0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x81817f81, +0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, +0x7f81817f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x817f7f81, +0x7f7f7f81, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x7f81817f, 0x817f8181, 0x81817f7f, 0x7f817f81, +0x81818181, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x8181817f, 0x81818181, 0x81818181, +0x81818181, 0x817f8181, 0x81817f81, 0x817f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f81817f, +0x7f7f7f81, 0x7f7f7f7f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x817f7f7f, +0x7f817f7f, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x817f7f81, +0x81818181, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, +0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, +0x7f7f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x81817f81, +0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x817f7f7f, +0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, +0x7f818181, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, +0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x817f817f, 0x817f7f7f, 0x81817f7f, +0x7f81817f, 0x817f817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x817f7f81, +0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, +0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x81817f7f, +0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x81817f81, +0x7f7f7f81, 0x817f7f81, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x81817f81, 0x7f817f7f, 0x7f818181, +0x7f818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f7f817f, +0x81818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x817f7f7f, +0x81817f7f, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x817f7f81, +0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, +0x7f817f7f, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, +0x7f81817f, 0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, +0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x81818181, +0x7f81817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, +0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x7f81817f, +0x81817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, +0x7f7f817f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x8181817f, 0x7f817f81, 0x81817f7f, +0x817f7f7f, 0x7f7f8181, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x7f7f817f, +0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, +0x817f817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x81818181, 0x81817f81, +0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, +0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x7f7f817f, +0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x81818181, 0x8181817f, 0x7f7f7f81, 0x7f818181, +0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f81817f, 0x817f7f81, +0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x8181817f, 0x7f817f7f, +0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f818181, +0x81817f81, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x7f7f7f81, +0x817f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x817f8181, +0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x817f817f, +0x81817f81, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x817f7f7f, +0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81817f81, 0x81817f7f, 0x8181817f, +0x817f817f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, +0x817f817f, 0x817f8181, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x817f817f, +0x81818181, 0x7f818181, 0x817f7f81, 0x817f8181, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, +0x7f7f7f7f, 0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x7f7f8181, +0x7f7f8181, 0x81817f7f, 0x81817f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, +0x817f7f81, 0x8181817f, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x7f7f817f, +0x81817f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, +0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f817f, +0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x7f817f7f, +0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f7f, +0x7f817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x817f817f, 0x8181817f, +0x817f7f7f, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f7f, 0x7f7f8181, +0x81818181, 0x81818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f81817f, +0x7f7f817f, 0x7f818181, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, +0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f818181, +0x7f817f81, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f817f7f, 0x7f817f81, +0x817f7f81, 0x7f7f817f, 0x81817f81, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x81817f81, +0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x7f818181, 0x7f7f7f7f, 0x817f7f81, +0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, +0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x7f81817f, +0x7f817f7f, 0x81817f81, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, +0x81817f81, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x7f818181, 0x7f818181, 0x7f818181, 0x7f81817f, +0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x81818181, +0x81817f7f, 0x81818181, 0x817f7f81, 0x81817f81, 0x81817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, +0x7f7f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x81817f81, 0x7f7f7f81, 0x8181817f, +0x8181817f, 0x7f7f817f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x817f817f, 0x817f817f, 0x7f81817f, +0x8181817f, 0x817f7f7f, 0x7f818181, 0x817f7f7f, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x817f817f, +0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x7f81817f, 0x817f8181, +0x7f81817f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x8181817f, 0x81817f81, +0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, +0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x81818181, 0x81818181, 0x81818181, +0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, +0x7f817f81, 0x817f8181, 0x7f81817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x817f7f7f, 0x817f8181, +0x7f7f8181, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x7f81817f, +0x7f817f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x817f7f81, 0x817f817f, +0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x817f817f, +0x8181817f, 0x81818181, 0x81817f81, 0x817f8181, 0x81818181, 0x81817f7f, 0x817f8181, 0x7f7f8181, +0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, +0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x7f817f7f, +0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x7f7f817f, 0x81818181, +0x7f81817f, 0x817f8181, 0x81818181, 0x81817f81, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f7f81, +0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x7f81817f, 0x7f818181, +0x7f818181, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x817f7f81, +0x7f817f7f, 0x7f7f7f7f, 0x7f818181, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x81818181, +0x7f7f817f, 0x81817f81, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x81818181, 0x817f817f, +0x7f7f7f81, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x8181817f, +0x7f7f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81817f81, +0x817f817f, 0x81817f81, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x817f817f, +0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x817f7f7f, +0x7f817f81, 0x7f7f8181, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x817f817f, +0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x7f81817f, +0x7f7f817f, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x7f817f81, +0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x817f7f7f, +0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x817f7f81, 0x817f7f81, +0x7f817f7f, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, +0x7f817f7f, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, +0x817f8181, 0x7f818181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f7f7f7f, +0x8181817f, 0x81817f81, 0x817f7f81, 0x81818181, 0x81817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f7f, +0x817f7f81, 0x817f7f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, +0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x7f818181, 0x817f817f, 0x7f7f7f81, +0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x7f81817f, 0x817f817f, 0x8181817f, 0x7f7f7f7f, +0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x8181817f, +0x81817f81, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f81, 0x7f818181, +0x7f817f7f, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x81817f7f, 0x817f817f, +0x7f81817f, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f8181, +0x7f7f8181, 0x7f7f7f81, 0x7f818181, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x7f81817f, +0x817f8181, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, +0x81818181, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x817f8181, +0x81817f81, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x81817f81, 0x81817f81, +0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f7f7f7f, +0x81817f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x817f8181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, +0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, +0x81818181, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, 0x81818181, 0x7f7f817f, 0x7f818181, +0x7f7f7f7f, 0x81818181, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, +0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f817f, +0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x81817f81, +0x817f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, +0x7f818181, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x7f7f8181, +0x817f7f81, 0x81817f81, 0x817f8181, 0x817f817f, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f8181, +0x7f7f7f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, +0x81818181, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x817f8181, +0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, +0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, +0x817f7f7f, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, +0x81817f7f, 0x817f7f7f, 0x7f817f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f7f817f, 0x7f817f81, +0x81817f81, 0x81818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x817f8181, +0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x7f817f81, +0x7f818181, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x8181817f, +0x7f7f817f, 0x817f817f, 0x81817f81, 0x81817f81, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x817f7f81, +0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x81817f81, 0x7f817f81, +0x7f81817f, 0x817f7f81, 0x7f818181, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, +0x81817f7f, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x8181817f, 0x7f7f817f, 0x8181817f, 0x7f818181, +0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f7f81, +0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f81817f, 0x81818181, +0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x817f7f81, 0x8181817f, +0x81818181, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, +0x81818181, 0x81818181, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f817f, +0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x8181817f, +0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x817f7f7f, +0x81818181, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, +0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x817f817f, +0x81818181, 0x8181817f, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x8181817f, +0x7f818181, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f818181, 0x81818181, 0x8181817f, +0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x81818181, +0x81818181, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x81817f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, +0x7f7f8181, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x81818181, +0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f817f, 0x81818181, +0x7f817f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, +0x81817f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x8181817f, 0x81818181, 0x81817f7f, +0x7f81817f, 0x81818181, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x817f817f, 0x7f818181, +0x7f817f7f, 0x7f7f7f7f, 0x817f817f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x81818181, 0x7f7f817f, +0x817f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x81817f81, +0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f7f7f7f, 0x81818181, 0x8181817f, 0x7f817f81, 0x8181817f, +0x7f81817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x7f818181, 0x81818181, +0x81817f81, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x7f818181, 0x81817f81, +0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, +0x817f817f, 0x817f817f, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x8181817f, +0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, +0x7f817f7f, 0x81818181, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f818181, 0x7f817f7f, +0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x817f7f81, +0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x81818181, 0x81817f7f, 0x817f817f, 0x817f817f, 0x7f7f817f, +0x7f81817f, 0x81818181, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, +0x7f817f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x8181817f, 0x817f7f81, 0x7f817f81, +0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x8181817f, +0x7f81817f, 0x817f817f, 0x7f817f81, 0x8181817f, 0x7f818181, 0x81817f81, 0x7f818181, 0x81818181, +0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f7f81, +0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x7f818181, +0x7f7f8181, 0x817f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f817f7f, +0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, +0x7f7f8181, 0x7f818181, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, +0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x81817f81, +0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, +0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x8181817f, 0x817f7f81, +0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, +0x7f818181, 0x7f818181, 0x7f817f81, 0x7f7f7f7f, 0x7f81817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, +0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f81817f, +0x81817f81, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, +0x7f81817f, 0x81818181, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f7f817f, +0x817f7f81, 0x817f7f81, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x81818181, +0x8181817f, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x7f81817f, +0x81817f7f, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x81818181, 0x7f7f7f81, +0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x81817f81, 0x7f81817f, 0x81817f81, 0x7f7f8181, +0x817f817f, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f7f817f, +0x817f8181, 0x7f7f817f, 0x8181817f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f7f, +0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f81, 0x8181817f, 0x7f817f7f, 0x81818181, 0x7f7f7f81, +0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x81818181, 0x7f7f7f81, +0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x817f8181, +0x7f817f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x7f818181, 0x817f7f81, +0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x81818181, +0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81817f81, 0x8181817f, 0x7f818181, 0x81817f81, +0x817f7f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, +0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f81817f, 0x7f7f8181, +0x7f818181, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x817f7f7f, 0x7f817f7f, +0x7f7f8181, 0x817f8181, 0x7f818181, 0x81817f81, 0x7f818181, 0x8181817f, 0x8181817f, 0x7f818181, +0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x81818181, 0x817f7f7f, +0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x817f817f, 0x817f817f, +0x7f818181, 0x7f7f8181, 0x8181817f, 0x817f817f, 0x81817f7f, 0x81818181, 0x7f81817f, 0x817f817f, +0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x7f7f817f, 0x7f7f7f7f, +0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f818181, 0x7f7f7f7f, +0x7f7f7f7f, 0x7f7f7f81, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, +0x817f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f81, +0x817f817f, 0x817f7f7f, 0x81818181, 0x7f818181, 0x81818181, 0x81818181, 0x7f7f7f81, 0x8181817f, +0x81818181, 0x7f817f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x8181817f, 0x817f7f81, +0x7f817f7f, 0x81817f7f, 0x817f8181, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, +0x817f7f7f, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, +0x7f817f81, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f818181, 0x81817f81, +0x817f8181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x81817f81, +0x81817f7f, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x817f817f, 0x817f8181, 0x817f7f7f, 0x8181817f, +0x81817f7f, 0x8181817f, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x817f817f, +0x81818181, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x8181817f, +0x7f818181, 0x7f817f81, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x7f7f8181, 0x7f7f7f7f, +0x7f81817f, 0x817f8181, 0x817f817f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f7f7f, +0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x817f8181, +0x81817f81, 0x817f8181, 0x7f81817f, 0x817f8181, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f818181, +0x7f7f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x817f7f7f, +0x7f7f817f, 0x817f7f7f, 0x817f817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, +0x7f817f81, 0x81818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x81817f81, +0x81818181, 0x81817f81, 0x7f7f817f, 0x81818181, 0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f81817f, +0x817f8181, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f8181, +0x7f81817f, 0x7f818181, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x7f81817f, 0x817f8181, +0x81817f81, 0x81818181, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x81817f81, +0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x81818181, +0x81817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81817f81, 0x8181817f, +0x817f817f, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, 0x8181817f, 0x7f7f7f7f, 0x817f817f, +0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, +0x7f81817f, 0x817f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, +0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x81818181, +0x81817f81, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, +0x817f817f, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f81, +0x7f817f7f, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, +0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f817f81, 0x817f817f, 0x81817f7f, 0x7f81817f, 0x8181817f, +0x817f7f81, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x81818181, 0x7f818181, 0x817f7f7f, 0x81818181, +0x81818181, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f81817f, +0x817f817f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x7f7f817f, +0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, +0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, +0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, +0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x817f7f81, 0x81817f81, +0x817f7f81, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x8181817f, +0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x81818181, 0x817f8181, 0x7f7f8181, 0x81818181, 0x817f7f81, +0x817f8181, 0x81817f7f, 0x8181817f, 0x817f817f, 0x8181817f, 0x7f818181, 0x81817f81, 0x81818181, +0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x8181817f, +0x817f7f81, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x817f8181, +0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x81817f81, +0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, +0x817f7f81, 0x817f8181, 0x8181817f, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, +0x81817f81, 0x817f8181, 0x817f7f7f, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x817f7f81, +0x81817f7f, 0x7f818181, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x81817f81, +0x81818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f817f7f, +0x7f7f8181, 0x817f8181, 0x7f818181, 0x8181817f, 0x81817f81, 0x817f7f7f, 0x7f817f81, 0x81818181, +0x817f817f, 0x81818181, 0x817f7f81, 0x817f7f7f, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x817f7f81, +0x7f818181, 0x817f7f7f, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x81818181, 0x817f7f81, +0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f81817f, +0x817f817f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x7f81817f, +0x81818181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x817f7f7f, +0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, +0x7f7f7f7f, 0x817f7f81, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x81818181, +0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x817f7f7f, 0x81818181, 0x81817f7f, +0x7f817f7f, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x81817f7f, 0x817f8181, 0x7f81817f, +0x7f7f7f7f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x8181817f, 0x81817f81, +0x817f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x7f817f81, 0x81818181, 0x817f8181, 0x8181817f, +0x7f817f7f, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x817f8181, +0x7f81817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x817f8181, 0x7f7f7f81, +0x8181817f, 0x8181817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x81818181, 0x7f7f7f81, +0x7f817f7f, 0x81818181, 0x817f8181, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, +0x81818181, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x817f8181, +0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81817f7f, 0x817f8181, +0x817f8181, 0x7f818181, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f8181, +0x7f7f7f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x81817f81, +0x7f817f7f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f817f81, +0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, +0x817f817f, 0x81817f7f, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x817f8181, 0x81818181, 0x8181817f, +0x81817f7f, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f817f, +0x817f8181, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, +0x81817f81, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x817f8181, +0x81817f81, 0x8181817f, 0x7f7f7f81, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f8181, 0x817f8181, +0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x81817f81, +0x817f8181, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x81818181, 0x7f817f81, 0x81817f7f, 0x81818181, +0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f7f, +0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f817f, +0x817f817f, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f817f7f, +0x7f7f7f81, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f817f, +0x81818181, 0x81818181, 0x8181817f, 0x81817f81, 0x81818181, 0x817f8181, 0x7f817f7f, 0x7f817f81, +0x817f8181, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f7f, +0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f81, 0x817f8181, +0x81818181, 0x817f817f, 0x81817f81, 0x817f817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, +0x81817f81, 0x7f81817f, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, +0x8181817f, 0x7f81817f, 0x8181817f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x8181817f, +0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x7f7f7f7f, +0x7f817f7f, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x7f7f8181, +0x7f817f81, 0x7f817f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x7f7f8181, 0x7f817f7f, +0x7f7f8181, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x8181817f, +0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x81818181, +0x7f817f81, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, +0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f817f81, +0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x81818181, +0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, +0x817f7f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, +0x7f818181, 0x81818181, 0x817f8181, 0x81817f7f, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x7f7f8181, +0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x8181817f, 0x81818181, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, +0x81817f7f, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x81817f7f, +0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x7f81817f, +0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, +0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x817f7f81, 0x817f7f81, 0x7f817f81, +0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x81818181, +0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f817f81, 0x81817f7f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, +0x7f818181, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x817f7f81, 0x7f7f7f81, +0x81818181, 0x7f817f7f, 0x81818181, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x81818181, +0x7f817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x8181817f, 0x817f817f, +0x817f817f, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f81, +0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, +0x817f7f7f, 0x81818181, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x7f81817f, 0x7f7f8181, +0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x817f7f81, 0x7f817f81, +0x81817f81, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f81, +0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, +0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, +0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x8181817f, +0x817f817f, 0x81818181, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, +0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x81817f7f, 0x81818181, 0x7f81817f, 0x7f7f7f7f, +0x81818181, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f8181, 0x81818181, +0x81818181, 0x7f7f8181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f817f, 0x817f817f, +0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f8181, +0x7f817f7f, 0x7f817f81, 0x817f8181, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f8181, +0x81817f7f, 0x7f7f7f7f, 0x817f7f81, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f817f81, 0x7f81817f, +0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, +0x7f81817f, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f8181, +0x817f7f81, 0x7f7f7f81, 0x7f818181, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x817f7f81, 0x81818181, +0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x7f818181, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f81817f, +0x817f7f81, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x81817f81, +0x81818181, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f81817f, +0x81817f81, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81818181, +0x7f817f81, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, +0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f817f, 0x7f7f7f7f, +0x817f817f, 0x8181817f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, +0x7f81817f, 0x7f7f7f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, +0x81818181, 0x81817f81, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f81817f, +0x81818181, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x817f7f7f, +0x817f817f, 0x817f7f81, 0x81818181, 0x81817f81, 0x7f818181, 0x81817f7f, 0x817f817f, 0x7f81817f, +0x817f7f81, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x817f7f7f, +0x7f818181, 0x817f8181, 0x7f7f817f, 0x817f7f81, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x7f81817f, +0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x81818181, 0x7f7f817f, +0x817f8181, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x81818181, +0x81817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x7f817f7f, +0x7f817f7f, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f8181, 0x81817f81, +0x7f817f7f, 0x817f8181, 0x817f817f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, +0x81817f81, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, +0x7f818181, 0x7f81817f, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81818181, +0x7f818181, 0x7f817f81, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, +0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f818181, 0x81818181, 0x817f7f81, 0x817f8181, +0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f818181, +0x81818181, 0x7f7f817f, 0x81818181, 0x7f818181, 0x7f817f7f, 0x7f817f81, 0x7f7f8181, 0x81818181, +0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, +0x7f817f81, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, +0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f + +e = +34560 + +k = +6144 + +rv_index = +0 + +iter_max = +8 + +iter_min = +4 + +expected_iter_count = +8 + +ext_scale = +15 + +num_maps = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_SOFT_OUTPUT, RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN, +RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT + +expected_status = +OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c2_k3136_r0_e4920_sbd_negllr_crc24b.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c2_k3136_r0_e4920_sbd_negllr_crc24b.data new file mode 100644 index 0000000000..cfff56ad9a --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c2_k3136_r0_e4920_sbd_negllr_crc24b.data @@ -0,0 +1,680 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_DEC + +input0 = +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0xD0000000, 0x33CDC8CE, 0x4FAEE4CC, 0xC7DC23C3, 0xC306D6CA, 0x2B360A24, 0xE91C423D, +0x1F323427, 0x4B1C33B6, 0x3EC9D0E7, 0x39204DD1, 0xCCD73C37, 0xC6F6D8E1, 0x1DF828F3, 0xDEE34025, +0xC41EC235, 0xD035E1D8, 0x3CC32843, 0x29B60C3C, 0xE92E122E, 0x454BD4C8, 0x35D02543, 0x33E4D0AC, +0x07AF2228, 0x38C62DD1, 0x233800C5, 0x3CC02DD1, 0x35E73B19, 0xDEBED026, 0x33C5EDD9, 0x33E51527, +0x1F21EA18, 0xCC3E3BD2, 0x013CC14C, 0x3724D23B, 0x23CDED2D, 0x21424630, 0xC5B0E64D, 0xCFC03BEF, +0x24294241, 0x46C526BC, 0xD82F334C, 0x1E283DCB, 0x3F3F33C7, 0x4A14D2A1, 0xD92F2AF3, 0xCFA820CC, +0xDD30C6CB, 0x2B3ACAB7, 0x4AFE29CD, 0x25BD3200, 0x2D293323, 0xD32A3B29, 0x29E64D0C, 0xBE4BFB3C, +0xB1DD242D, 0x0427F11D, 0x3046CFDA, 0xD633C0D5, 0xC0DDBE01, 0xDA3DD9B4, 0x3BCE3638, 0x23262CC6, +0x432BD2AE, 0x23A9E1C7, 0x1BE45609, 0x22CD35AA, 0x32D6371F, 0xCE27352A, 0xE2B73F40, 0xC2D0CE2C, +0xE72E3A3E, 0x2FF52147, 0xEFCF2E33, 0x003103CA, 0xC6C14A33, 0x45CAC0CF, 0x011E1FD3, 0x23D3C72B, +0x2EB644C4, 0x484BD930, 0x3AC22E1A, 0x1AB6DD42, 0xCEDDE232, 0x3ACCCC31, 0xB830CA2D, 0xC930D2D7, +0xD0E049BB, 0xE6243524, 0x3EF53914, 0xCB083BE3, 0x411EDBE9, 0x30C3C3E8, 0x3721F5E7, 0xBBDF3FD9, +0x2AD21F33, 0xEE402858, 0xD3AFD237, 0x3D39401D, 0x30003623, 0x4734DC46, 0x192ACD32, 0x3324CAC2, +0xD714D4B5, 0xDC2E21D0, 0x2327CDBA, 0x15B739C3, 0x31C9EEB8, 0xFAB5372E, 0xC239B5DA, 0xE628440F, +0x34D425C6, 0x293BE6FD, 0xBDC04BBC, 0xE0DDB7CF, 0xD627BC34, 0xA5422FCB, 0x13211ABC, 0x1708E51C, +0xCE33DAD1, 0x51AEC731, 0x2E383824, 0xC722D0D3, 0xCB32292B, 0xCECC402B, 0x1B312EF0, 0x34CF46CA, +0xE3BD252C, 0x0C21EC36, 0x4ADFECBE, 0xC4D2E62C, 0xADE5BAD3, 0xDDCC1D18, 0x521AC135, 0x3F302D37, +0x22CE2DCC, 0x262A1BCF, 0x4EE7D7CA, 0xD43D3526, 0x1840E020, 0xC3201F2F, 0x3ACB453E, 0x41EAD5B6, +0xB6C4CF17, 0x243A55D4, 0xC7501E28, 0x351DCD1C, 0xE3A8D502, 0x3235271C, 0xAC342F00, 0x34B4E3D8, +0x36473AE4, 0xAE403CEB, 0xBC3FDA3F, 0x552CDBEC, 0xE7C42B5C, 0xE743E13D, 0x18D44650, 0xBA2EDF31, +0xB5C3EC42, 0x432EBE2E, 0xADDE4F2A, 0x401BCAD6, 0x03D6EAEB, 0xD0DEB133, 0x153FC4D4, 0x30DA2FD3, +0xEE282FD9, 0x242ADC39, 0xD72B42D9, 0x44C7E0D5, 0xC72CB3C7, 0x27C9472B, 0x0036DFB6, 0xD9C53112, +0xC0360E0E, 0x4EEA0E27, 0xEDCF27C1, 0x1739D5DC, 0x22DE2CE1, 0xDCCAF633, 0x31D02417, 0xD7DCD0DA, +0xDE1DE0DC, 0xD827DD22, 0x1CDBD7EC, 0xCE171BCB, 0xEE2347CF, 0xC22C312D, 0xDBCC2A38, 0xBE0ADED4, +0xDC20CC2D, 0xD5380DB2, 0x2A32C701, 0x3EC7D41E, 0xCDD7D74C, 0xE83E2A44, 0xC12B26E6, 0xE70046D7, +0xD626D1EC, 0x35DDE41D, 0x303F27BD, 0xC94D4517, 0x31D1E229, 0xAD3529BF, 0x3AC5D21C, 0xCF1DB731, +0x2738DBEB, 0x1F382B33, 0x1ED52213, 0xFCE22CD2, 0x1330331E, 0x4A30BA0F, 0x1F38B42A, 0x2E34CB1F, +0xE3E125D5, 0x3AC72D17, 0xBD3C342C, 0x37272810, 0x1D34E4C7, 0xE5CC2EF8, 0x1E2FF1DF, 0xB9294236, +0x26F10017, 0xBDE3FBD1, 0xB7DB52D0, 0x2E3CB8E9, 0xB3343D3C, 0x3E3BDFDD, 0x1F46393A, 0x25FA20C1, +0x2D194CD1, 0xE9471D26, 0x34C3242E, 0xAE012034, 0xC8F3FED7, 0xB825362B, 0x322DC136, 0x42F41511, +0x181855C2, 0x4937D5EB, 0xE13CDC23, 0x08242A28, 0x2DCCDFC0, 0x13CEC64F, 0xB3E6F7ED, 0xD93401EE, +0x3D02DEE0, 0xCFC52300, 0xD2F1BE38, 0x2D092924, 0x253E2AF0, 0x37DACAD0, 0xDB1ECFE7, 0x40CED84D, +0x3706C42A, 0x4231D91A, 0xDD30471D, 0xBD272DC8, 0xCB1941D9, 0xC22FC7C5, 0x333F3C0C, 0x3F3D2518, +0xDDCCD143, 0xB3D834D5, 0xD231BEE4, 0x2BDB3B3D, 0x2F2754E7, 0xEAF3CE64, 0x3632E4C0, 0xD83324C2, +0x11A4D5CC, 0x00D627D3, 0xD51F2731, 0x17C92BE2, 0x1AD62E1E, 0x16DB2418, 0x16B83823, 0x2711D54B, +0xDFB02BDF, 0x28CDA600, 0x2AE9ED3E, 0xD314CD20, 0xD04F272D, 0xD0F9CD37, 0xCC1735E5, 0xD328EC37, +0xA7D31A26, 0x214BD9A5, 0xCFCB4226, 0x233C4AD5, 0x26EF37D8, 0xD83E3230, 0x3EC8C93C, 0x07B9282B, +0xD1E6DAF2, 0x31C52EDD, 0x3A0038A5, 0x56C1E0DF, 0x22E437C0, 0xDBC8143B, 0xCF1DB03F, 0x1D4BE636, +0xB8D3C23A, 0xBCC3372E, 0xAF284228, 0xDCE02F1E, 0xB9D4E3D4, 0x56D3D0D8, 0x494816C1, 0xFB1240C3, +0x23B1BDD2, 0x1236322E, 0xC2CBCB47, 0x102FE7C8, 0xBB0AE1D9, 0x3831BC29, 0x39AECBD9, 0xC7CF1ED2, +0x0AE43913, 0xDDD62F2C, 0x4FD522E6, 0x3CB90A55, 0x2101C8EC, 0x432604BD, 0x29E3E31E, 0xC25B3C29, +0x20E927D4, 0xD4300C41, 0xD9AECBD5, 0x48D8E143, 0x2CEE272F, 0xD2C11FBA, 0x2F2DB8D7, 0x1CF4DFE6, +0xCCDCCEBF, 0xE052D0EA, 0xDADDEB1E, 0xC72ACB3A, 0x332E2B1B, 0x2D26E827, 0x2A29E6A6, 0xE614D6D5, +0x221D1CC5, 0x51102031, 0x1735C248, 0x31D4DCD5, 0x3C20DC00, 0x2D231732, 0xE54AD9CD, 0x1D24D826, +0xE936373A, 0x20C0D3C9, 0x2B231520, 0xD6CED133, 0xDFC8C7B5, 0xDC2FE8B8, 0x3332249B, 0xC6E6E11F, +0xB7DA17AF, 0x1FD91321, 0xEE29CD41, 0xE1262FEF, 0xB6181DC6, 0x24F618C6, 0x3BE5DA2D, 0xFC2C35C8, +0x51C232CC, 0x36183EDF, 0x2B2CD6EF, 0x2F2DBDB9, 0x00D03413, 0xCDC9CBC4, 0xDB3309CC, 0x264EB22C, +0xCED1EAC9, 0x38D53F27, 0x2EE7D6F3, 0xC7232C23, 0xCCD42515, 0xC9C8C8E3, 0x231E3930, 0x5BBEDFCA, +0x34D7E5D7, 0x25CCE9A7, 0xCD4BF1E8, 0x5E2542E6, 0x38DCE43E, 0xDA34F0CA, 0x2EBFF841, 0xDA422D3E, +0x13CA2231, 0xD5C6DA27, 0xBAC0C6B6, 0xC82C49FF, 0x31312123, 0xBF00DFBF, 0xE8F23819, 0x2C34E81E, +0xDC4C2B0C, 0x3A5650F2, 0x2CCB0FD0, 0xC42D4C28, 0x4F19DA4B, 0xF63DE630, 0x29F51C1F, 0xD6BE14C4, +0xD2DDCDD6, 0xE0D02825, 0x2FE0E3D1, 0x41342FE8, 0x25D547ED, 0xC5A732B5, 0x19BD503F, 0x4CD9DA3D, +0x24D013BF, 0x4FE93FCA, 0x12DBE8B9, 0x33DF151F, 0x1E24AECD, 0x2E2E3656, 0x133500AD, 0x3641403C, +0xBDDF2BD4, 0xE33130E0, 0x3DC02726, 0x18390C3C, 0x26C04DC9, 0xDBF22D35, 0xC3E1EC45, 0xCED12623, +0x1CE92E39, 0xCF2FD222, 0xD8DE31E6, 0x1EE916D1, 0x35DCB621, 0x19C2EB54, 0x41B34ED4, 0xD9373BDF, +0x203ED6D8, 0x2CD4A8C8, 0x14E0C6C6, 0xDF242131, 0xCDD921CF, 0x33AACBCC, 0x2AD1A5C6, 0x3ED42B00, +0xBF181FD0, 0xC0CC2329, 0x1BD1EDC9, 0x3A2D47CB, 0xDD27D8CB, 0xD8E8BAE6, 0xD5DE3FF5, 0x2C30D641, +0xDCDCDF26, 0xC2C34433, 0x2837F53D, 0x29D8E12D, 0xBF3FEBD0, 0x34CACC45, 0x30E1DA21, 0x39DDDCB3, +0x30193518, 0xC0132E19, 0x313D3736, 0xB2D4FF34, 0xF4D92945, 0xC70D3AEA, 0x3E3034F0, 0x00DA2F07, +0x1DD415EB, 0xCC1AC4B2, 0x232EB21C, 0xD7431E16, 0x2FCE0835, 0xCF39242C, 0x1BCA2CD4, 0xD8B6D0FA, +0x18C3262F, 0x2CE3BDCB, 0xD839DC38, 0x26161D24, 0x1223B3DC, 0xD6D63515, 0xCFBABFC6, 0xC1BF18C7, +0x2637C715, 0x264020EA, 0xD024D3C4, 0x4126A11D, 0x2E34442D, 0x32BB1CC9, 0x36E7DD40, 0x3113C3C5, +0xD100C8CE, 0xD21651E8, 0xC3CFCDD9, 0x403139F1, 0xD3D02119, 0x32171AC8, 0xD2F9B62E, 0xB5B335D4, +0xC1462835, 0x1F1C2C35, 0xD8DDBF35, 0x422D2DDA, 0x38ED19D7, 0x3326BD2F, 0x4534DFCE, 0x46403132, +0x19CDD51E, 0xCBC3CBC0, 0xE3CF2139, 0xC646ECD8, 0x29E7C7DD, 0xE94CCAF8, 0xB8C6EA37, 0xEC2B09DA, +0xC8C82738, 0xC6CCDDFB, 0x3FCA3B4D, 0xC6482BD1, 0x2DE1D333, 0x3530BB3A, 0xBF4838EA, 0xE4411ACB, +0x3514D939, 0xCD372B27, 0x4BEC1C39, 0xAB21C221, 0xD8D83F37, 0xCCE0512D, 0xDA4640C2, 0x36AE1CD6, +0xBC2F303B, 0x20C3B8CD, 0xBFE6D4E0, 0xBECCC4EB, 0xC7CC1E4E, 0xCC2BD03C, 0x3738C518, 0x23B824CC, +0x2BECD0BC, 0x2107B945, 0x2AC21B00, 0xBE49F2EB, 0x31D2E3DC, 0xDAD23F11, 0xCDED3137, 0x3ABADA3A, +0xD9C0C12C, 0x36CEE8CF, 0xD0D5BDD3, 0x2AC9CFCC, 0xE61FD747, 0xC7B7B12A, 0x2BD520DF, 0xD5BC1D31, +0xE6D8423B, 0xCC21EB43, 0x1F46292D, 0x171EE038, 0xDFA5E244, 0x1BD5C4AD, 0xC622C2B5, 0x4E33CFD3, +0x3F263F30, 0x34E4CF15, 0x0041CC36, 0x4021DB29, 0xD62E2231, 0x2C22AE21, 0x1A201F44, 0xC6D7C100, +0x3A335125, 0x42473A2A, 0xDF32DA1F, 0xE5D8B51F, 0x3049E832, 0xE6DED531, 0x315DD01E, 0xDDD92034, +0x2EBF0AEB, 0x4B4639DD, 0xBED6C8DA, 0xDABA3714, 0xDD133BD7, 0xC934EACF, 0x0D35C3E2, 0xB4CCC213, +0x37EE202B, 0x0AD21AD9, 0x28D2C9CD, 0xD800DB2D, 0xD34B274A, 0xBDD33644, 0x38EFF1CC, 0xBDABD734, +0xB11E3E32, 0x2F1C23DC, 0xE80BD7DE, 0xDBE7D6F7, 0x240248BF, 0x23CEF1F6, 0x1F56E634, 0x33CD2230, +0xB4DB182F, 0xD338BA36, 0x33392B24, 0xBB3B3649, 0x282F30E7, 0x45CC35B1, 0x46261B30, 0x1FD9A722, +0x3BE3E1C3, 0x25334FF0, 0xB8BB28C0, 0xD751E2CC, 0x403600E1, 0x461FC3ED, 0xCB30C202, 0xD8D2B92A, +0x2923D71B, 0xB9DDE6CC, 0xB935CB0A, 0xEF37D723, 0xD1DA06CD, 0x303CE928, 0xF8B9BA27, 0x37370A1F, +0xD6C1DDD9, 0x18B6463F, 0x28C71FC3, 0x38D8B53A, 0xD22DE9A1, 0x18DDB236, 0x0A28D515, 0x363B263D, +0x1F3A122D, 0x202AE323, 0xC72337E8, 0x32ED08CC, 0x2658C347, 0xC6F4E200, 0x45D1C2C3, 0xF92D343A, +0x3EBE1E65, 0x10EB2FD3, 0xC64FD5E5, 0xC5D3F521, 0xE9CA1A37, 0xD736CDD6, 0xDCC7C233, 0xC9C8E2D4, +0x2B99D60A, 0x1EE3DA0D, 0x30BDD8E1, 0x16D3BE1F, 0x1C4524D4, 0xC8D5D432, 0x19AEDA3D, 0xCDD4CAD5, +0xD835332E, 0x2412DA1B, 0xD0CBEBD7, 0xC3CEF425, 0xD1D743E3, 0x000A163B, 0x23DC3129, 0x202332D1, +0x322F2216, 0x28F5131A, 0xD316CF0D, 0xD0344C30, 0x423325D7, 0x37204237, 0xEEDDC721, 0x2038E805, +0xD525C522, 0xBEDDE327, 0x3AC8BCC5, 0x45402E27, 0x34DFC1D9, 0x2DB0D049, 0x322F2ACF, 0xDB3AC3C5, +0xD8D0EB4F, 0x2A1DCCCC, 0xD0D33DC2, 0x1349DC45, 0x39CBBC32, 0x30301EBF, 0x2C00DFC0, 0x5DD0CA11, +0xD0220C3A, 0xC527CD1A, 0x31CD372C, 0x2E0ED7DC, 0xC6F92338, 0xF537E8D0, 0x3626DBBF, 0xC9C3C6C3, +0x30DDBE17, 0x50394C39, 0x3A11343B, 0x27E8DC2E, 0x0DDB303F, 0x1818BCF0, 0xC5DC17DB, 0x24C53A26, +0xECB0E7E2, 0xC21B1928, 0x15D7C920, 0x4126AACE, 0xE214D8C7, 0xD40BCD42, 0xB2CBD018, 0x554436DB, +0x3C2D25D9, 0x21CEC0DC, 0xE9251919, 0xE41ACDC3, 0xDECF67C3, 0xEDDE3225, 0xCA30EEDD, 0xCFE01E37, +0xD231BF41, 0x34DF1EBD, 0x1DD2CC2C, 0x21142E29, 0xEA322B37, 0xCEC311DE, 0xF0F738DD, 0xEBED1A40, +0xDCE640E8, 0xD0D1BA2B, 0xE906D6DB, 0xC71938B1, 0x13C59F39, 0x1ED6DBB6, 0x231BD3A9, 0x2C2B30DC, +0x0ED50000, 0x2DD4EED6, 0xD9D21BEE, 0xE1442E36, 0x38CEC4AE, 0xC626CCF4, 0xC2CD3F36, 0xD71F2BD9, +0x2F421837, 0x31B11A23, 0xD4D5282D, 0xD0E6BED7, 0x30D737CB, 0xC8142A09, 0xD8D2CFDC, 0xC22D3C44, +0xF62DF1C9, 0x3D38DBC9, 0xBFC2E5D3, 0xDCE42128, 0x3A304038, 0xDBE6D626, 0x28250FE0, 0x27B52BCF, +0xE0D8DC3C, 0xC8DA09DA, 0x2DF02FD4, 0xE539D7D1, 0xCDE729C2, 0x4816E313, 0x4E392AC5, 0x112CF50F, +0x3AD94924, 0x4B22273A, 0x43D2DE9E, 0xDA22DE30, 0x3FE324DB, 0xD9CC2811, 0x29D253D4, 0xE2BC353C, +0x0CC92147, 0xB8F0C6F5, 0x3D35DEBF, 0xED4ACBEB, 0xAC34E532, 0xEA2AC526, 0xEAC0BFC8, 0x4431D9DD, +0xC0CE4E21, 0x0000F2DD, 0xE0D8C7BA, 0xDDDC2E36, 0xDA42C22B, 0x2B312614, 0xDC391EF4, 0xCC2E31D8, +0x3DF4D630, 0xC72C21D9, 0xDB2BD531, 0xD916DB3C, 0xBEC11DD2, 0xD1D5CEA4, 0xBA072ED7, 0x402F2829, +0xE3C0F627, 0xC7CC3CBD, 0xF41D3345, 0xD706DB14, 0xB2DF36AC, 0xEBC4551F, 0x32B01929, 0xC5B6DDEC, +0xD91DE130, 0xE1213222, 0x4126D927, 0xAF52300D, 0x291B301C, 0x241A1843, 0xE43C1FDC, 0xBBCC191C, +0x2C25E011, 0xBD3EE9DB, 0xC9BF1345, 0x2F333AD2, 0x1CD822DB, 0x23BE43EA, 0x2527EADC, 0xB52E1C1E, +0x391CCF17, 0xD2C82C0C, 0x242E3830, 0xD328D808, 0x35CEF4CD, 0xD81BE035, 0xD0DF38DA, 0xD1D3C42E, +0x3A2C1EEA, 0xC6D03AD2, 0x1E362E4E, 0xE6080000, 0xD018C312, 0xEFAA323B, 0xD1294BD2, 0xBAD52C3B, +0xE0373E10, 0x260CDDE2, 0xC902E040, 0x30472BD5, 0x534BE7D2, 0x20CCB523, 0x21CCD843, 0x2259E24E, +0xDE35FDD1, 0xD4D91D3E, 0xCFCA11D5, 0x35D724BD, 0x3C3F0CB8, 0x3EC447CB, 0xE835DDC4, 0xC3C73E31, +0xDD432B2F, 0x2FDCBDC2, 0x2D3CCE17, 0x25B8AB31, 0x2ACCFFE5, 0x40E03C2B, 0xE7DA1841, 0x17E53020, +0xD44E0B2F, 0x46DA22EC, 0x33422425, 0x211840C5, 0x23C1CFD5, 0xC8350BE5, 0xD833CDD0, 0xE63DC528, +0x292ADC17, 0xD8BCD3C1, 0xCD39F02E, 0xA71EC343, 0xD6CC3A3E, 0x2E12D2CF, 0xC40B1FB1, 0x37DCDC33, +0x20E52EEA, 0x271629E5, 0xC4BEE0C2, 0x1B3CDBD6, 0x00004934, 0x18E145C7, 0x4BE93522, 0x3029C309, +0x31D1D50F, 0x3DB42C1A, 0x21A643B2, 0x3E26D8C2, 0xCDDE28D1, 0x44E835E1, 0xEDC4DED1, 0xC4F9C9ED, +0xC5E1BBCC, 0x4426C1D4, 0xD9BB372B, 0x37232E0D, 0xE5D0D0AE, 0xC9D23CC5, 0xF638E2C7, 0x2DB6E6D9, +0xC0C9B72D, 0xDF28E6D0, 0x11E2DCC8, 0xD8E2F31C, 0xEA3937DE, 0x2741B953, 0x19D5CEE6, 0x33DDC22D, +0x2BF72326, 0x2143363C, 0x13CA1A1F, 0xB9D7DAC9, 0x22C6B72E, 0xC5DA2631, 0xCB32ECCF, 0x032D15D4, +0xBB1EE613, 0x38C42452, 0xDBCD2726, 0x1AF44039, 0x22CF2EC6, 0xCAEDE6B4, 0x2823D423, 0xDCC61C39, +0xC12D19BF, 0xC612C31B, 0x31F1D32D, 0x3E1C09E4, 0xD824C5E7, 0xDFFC2839, 0x2AD40000, 0xDFCCBBBC, +0x3FC9CC12, 0xEF2626E1, 0x0FCDEA2A, 0xEBD735CF, 0x4E1A2834, 0xCDEDE1D5, 0x31CCCD29, 0x2F4618DF, +0x48C11936, 0x29DADE41, 0xD71C1AE0, 0xDDD2285A, 0xB13DCDC8, 0xF020B8DB, 0xD0B837C2, 0xDC3B48E8, +0x18C3C530, 0x192C2940, 0x2ADA3AE4, 0xEA34C55A, 0xDAB2BED4, 0x1A51E838, 0xC832AEBE, 0x10DE2DE2, +0x3B2408CC, 0x22CEBD1E, 0xC919D6BE, 0x21D2D128, 0xCFE03A2A, 0xB7DEDC3B, 0x33C630ED, 0x5A0EEAD1, +0x3CB03FCE, 0x24EC15E4, 0xD0385BBF, 0x20CB4E4B, 0x30E0C535, 0x301BCD3C, 0x3642DDD3, 0xD90FDC50, +0xCA35BBCC, 0x393B3B2F, 0xE2BE352D, 0x362BE3BF, 0x1922B73D, 0xDE3448BD, 0xF7C0C02D, 0x00002F43, +0x2FCAD0E4, 0xDE412A34, 0xFBF339DA, 0x2BB94330, 0x39B521D5, 0x2DE31F43, 0x382C4F23, 0x35314C2D, +0x2DE3DBDC, 0x3A18EAB9, 0xD0DF131C, 0x45EA41E0, 0x48BBC1BF, 0x2220D7E4, 0x29C8D0C5, 0x3C0527CA, +0xC1ED061C, 0xCB48CA3E, 0xE846E633, 0x0EB2D7CF, 0x44C42335, 0x27F0D440, 0x332FD847, 0xD72F2CE3, +0xD7ECD6C9, 0x4026D51F, 0xD334BEE6, 0xE01B40C5, 0xD62BDA2F, 0xDEEA36AF, 0xABD039C7, 0x2E123FCE, +0xFD3924A8, 0xD0C6D529, 0xD52AEED4, 0x211D2A35, 0x1EE9C5F1, 0xCECAF921, 0x38C92740, 0x3E4E2A1A, +0xB8FAC7C3, 0xF11F1C36, 0xD4DA163A, 0x2701DC38, 0x0E3019D5, 0x57DB23E1, 0x43CD26D0, 0xADCC4934, +0xE0D3D706, 0x403A0000, 0xDECED5E1, 0xDAE6CF1D, 0xD5E33C40, 0x35B3D038, 0x24D73231, 0x2EC01D40, +0xC2D23CDC, 0x44C20BC6, 0x44C1D7A8, 0xE9D1C745, 0x36E5C2C6, 0xB81B2D42, 0x413917CC, 0xD8E031BA, +0xCE3CC1C4, 0x3EC91AC5, 0x0DE406CE, 0x35D1DA27, 0xC8E5CAE3, 0x313EC127, 0xB61631CA, 0xD73B3444, +0xD834C850, 0x37D31DE2, 0xCCC9153D, 0xBF41E9CA, 0xD649F9DC, 0x3A31D501, 0x50CD1DE3, 0xC8E54012, +0x4432D4D5, 0xCBB93023, 0xE8FCD6C2, 0xCEE0CAD1, 0xE41B2E39, 0x28CC0E40, 0xDFEAEFFD, 0xB3EA2723, +0x3534B935, 0x42D12A09, 0xED3DCA0A, 0x263C352B, 0xAD224EDF, 0x2CDF2A10, 0xF0BE4CAD, 0xBD45D8D5, +0x263F27D4, 0xE2372FB4, 0xC35240DF, 0x1EF3DCDA, 0x3AD0D224, 0x27DAD527, 0x303A2CBE, 0xCDDCC829, +0xE22B35C9, 0xD5DC222F, 0xEEBDCB63, 0x2042DAD8, 0x06CC3524, 0xD11BBB3E, 0xAE2229E6, 0x1FC81E1F, +0xEF4B12DA, 0xE1D846DD, 0xBA3B1CDA, 0xE154C801, 0xD6092CD2, 0xD0F132CB, 0x3A40D027, 0x123530BB, +0x1EC5B4DC, 0xD11825CB, 0xC603DECC, 0x28BCC5ED, 0x2C03E1CD, 0xE9AA12A5, 0xDB2DD53A, 0xCA32D01E, +0x2F4A09C5, 0xFE411E26, 0x1354CEC8, 0x3736C5F4, 0xC62F3C3B, 0x252DDFB9, 0xD0353723, 0xD8DDC21E, +0xE3DF21ED, 0xDAE33AC0, 0x2ADA323E, 0xDC43E1D9, 0x3A23463E, 0xD71934F8, 0xDB1037C8, 0x38B7BCCC, +0xDA2C1CC1, 0x3EEEE349, 0x2ACB2A26, 0xD4BCBCD8, 0x4AB50000, 0x9EC941D8, 0x3824C9D0, 0x203CCD36, +0x0DCDEDD8, 0x5B333036, 0x3125C7DD, 0xD7383F30, 0xD6C72617, 0xE1C245DD, 0xBDD3E818, 0x3210422F, +0xD00ECF2E, 0x44411A3A, 0x02E72E22, 0xF106D24C, 0xCFC847CF, 0x0421AFCF, 0xD2C525A9, 0x3CBCE63A, +0xE02A1E36, 0xE036E3E4, 0xDDC22B25, 0x2EC7452E, 0xE1E3EFE3, 0xD82ED6CE, 0x36C1E115, 0xD129E026, +0x251E1C44, 0xE8E5D7CA, 0xDDE7D40F, 0xC5D8D9D8, 0xA1C52550, 0x3ACDDA25, 0x3548C4E1, 0x2913D9C8, +0x1E28243A, 0xCA3324E2, 0xD0D7D1C0, 0xBDE9D0C4, 0x35BF4FE0, 0xCA42E33C, 0xBBFA33DA, 0xD753C9CD, +0xDA2CE11D, 0xD9BEE407, 0xE31DD4C1, 0xCBCCD51B, 0x3BB8D6C9, 0x0000DDDD, 0x28D3CDDC, 0xD62445B5, +0xB3211F13, 0xD7B9BF29, 0xD429D5E5, 0xB9C23CCE, 0xC219EDC1, 0x211E0B34, 0xB8F0E1C1, 0x33C0EF4C, +0xD8D6C7D0, 0x30E8D3D8, 0xB06514D1, 0x21B9D915, 0xE2323DCD, 0xDA41311F, 0xE24AB11F, 0xE9B92BE7, +0x33EA23C3, 0x04C430C0, 0xE849EF0D, 0xD1232C2C, 0x260FD13E, 0x002DCBDD, 0xEB3129E2, 0x20B4C7C6, +0x25D32335, 0x2CCB39D0, 0xEA13DAC6, 0xCDEE2E14, 0xCDAA2CD0, 0xE1D339E6, 0x36DCD03B, 0xF5453114, +0x34D428ED, 0xEAEDF458, 0xD226CC2D, 0xEDD03AD8, 0xEE1CC83D, 0x10DBB5E5, 0xF018CBDB, 0x5E33E31E, +0xC6D9232B, 0x1A373130, 0xDFE7DDCB, 0xB21FC5C6, 0xC1CDB1B7, 0x3F2DF128, 0x482BB426, 0x323E0000, +0xF5D43741, 0xCC1C1FB9, 0x00004E2E, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x13000000, 0xC9112F26, 0xE3DF1FED, 0x284020CF, 0xC6ED13CA, 0x38B1E217, 0xD90FE8DB, +0xD7C0C3B7, 0x341336CE, 0x45E2D239, 0x3E22F0D8, 0x461D2C29, 0x3825D628, 0xD733E5F1, 0xD7B6C532, +0xC62B28C7, 0xD0BF3024, 0xF0BA3A26, 0x2D1D2836, 0x1BCF2DDE, 0xD02B251A, 0xB938CD2C, 0x34E220D9, +0xC2BEC23B, 0xCC2908CD, 0x1D080039, 0x42BB25C5, 0x32EB3206, 0x36D3D1E0, 0xC32E10C3, 0x243B13E6, +0xC02A1FF0, 0xC325D6DD, 0x23E33D2C, 0xDCD7DED5, 0x9C23C21D, 0x32E62056, 0x06314421, 0xE9E4ED24, +0xC0C9C233, 0x44BE3FDD, 0xD25134E5, 0x292EE2E7, 0x4EE0D1DF, 0x29C82E3A, 0xF5392A22, 0x4BE2D133, +0x58C2C4C8, 0xD2212920, 0x2935D4DB, 0xDECF4400, 0x31D7CCC9, 0x12DCFB2D, 0x2B2F0723, 0x2DE7B54E, +0x2AD24ADA, 0x261E2931, 0xD538CEDF, 0xE12A1C2C, 0x33DDEDE9, 0x2FFC36C4, 0xE61823CE, 0xC225E1DF, +0xC2102FEF, 0xCFD22617, 0x3EFBDA37, 0xDAD6BCD8, 0x110623E7, 0x3320E2D1, 0x1932B8D5, 0xCCEBBFC9, +0x47234011, 0x0A2B45D8, 0x25C11244, 0x00EF3221, 0xC634CC38, 0x0F34D0E6, 0x1A3F40EA, 0x2DEDC82D, +0xFFD2C8BD, 0x40E321CD, 0x24441BD3, 0xD932EDDD, 0x48362127, 0x1230EADE, 0x39E632F9, 0xD0D451DC, +0x18DD2DC0, 0xC22AC72E, 0xD71E172E, 0xAFDED12B, 0x1DBAA948, 0xF927B647, 0xD7C31C23, 0x3328E73B, +0xDBD72DD9, 0x3E23D424, 0xCB09E025, 0x16BA21CF, 0xDD00B9CB, 0x29E3CAD7, 0x3A19D011, 0xEA0EC4E0, +0xD51CDDBF, 0x2AD1C640, 0x2CD6CBD3, 0x36D6D43C, 0xA72851C2, 0xE7EE3C3F, 0x432A4721, 0x46C726E5, +0x253FD426, 0xD03B2C27, 0x1AEC343B, 0x5A2BC735, 0xCE31D2D2, 0xCFEDF30D, 0x492B4141, 0x20DC1BAD, +0xDAF81CD9, 0xD6EAD21D, 0x2339CD25, 0xA31546BB, 0xD0C0F63F, 0x382BE719, 0xDA34BFDB, 0x1EDBBADF, +0x5151E646, 0xC164D5E2, 0xD8292FCA, 0x33CF1F3B, 0x3FF531F4, 0xD3EB3453, 0xD433E236, 0x1B102B1C, +0xC6C320E8, 0xD8393C2E, 0x17EAB7EB, 0xE0C42CE5, 0x313720CC, 0x3F39C42D, 0x33374AD5, 0xCE1ED41E, +0xF7D2BE0D, 0xF114311E, 0xE22CD6EB, 0x4E23CA2A, 0xCDCF36D3, 0x463B1EC4, 0x312DE400, 0x1A1219CE, +0x0CD1E2C3, 0x3850CBEA, 0x31D7CCCD, 0x3F2D3936, 0xC518E33E, 0xC31F31B7, 0xC0AED6C9, 0x2AC6E5D9, +0xC334B8BF, 0x35EFD72E, 0xD72B3AD8, 0x31073AD7, 0x25E22D38, 0xF0CD4A64, 0x28DFDB2D, 0x22D9E714, +0xB8E43935, 0x35FCBFEC, 0x1DC1391E, 0xD6E731A5, 0xBBC8B837, 0xBD3FBE3A, 0x00BADC53, 0x28C43F33, +0x1CE0BAC2, 0xE0E125D9, 0x3BD6CB3D, 0x313230BE, 0xC4243D34, 0x1F24D2B1, 0x2058384C, 0x2AE9192D, +0x302CCCEE, 0xD435C4C7, 0xB0D53217, 0xE52D32D9, 0xE0AF2127, 0x3E47D0CA, 0x4112BFCA, 0x27D0D0BD, +0xE81E5CF9, 0xD50CBCE5, 0x2DC9B4F7, 0x3FBA33BC, 0xCBCC2821, 0xDFD51326, 0xD20ADA3A, 0x2000C3BB, +0xC4DC4BE5, 0xCD39D7A7, 0xC40FF54F, 0xCC3BD1CC, 0x2C19EACC, 0xCD2E2129, 0x44D9F0DB, 0x2B40E11C, +0x31343F4C, 0x0E142817, 0xD0104135, 0xE304CAC7, 0x259A1FD4, 0xC3EAED3C, 0x1A311AD7, 0xD8242BEE, +0x20BF4EFD, 0x3FCA16C5, 0xDDEED03A, 0x0A22C52E, 0xD53B2D3A, 0xE22A2CB5, 0x291D3228, 0x2CCC2E45, +0x48BA00D5, 0x4FE12D1D, 0xD8D91DD1, 0xCEDBEC31, 0xFBD526B9, 0x3C1DE845, 0xAFDCE91C, 0xD622D31E, +0xCF2620D9, 0x28D63427, 0x362C3DDF, 0xD72C2530, 0xD6A7C203, 0x442C3233, 0x29B24E3F, 0xDD21412C, +0x400BD6D0, 0xC8D4B831, 0x171EF12A, 0x34FFC9D0, 0x3B3ED02D, 0x0BC7E2CB, 0xC43D28C6, 0x42F6C948, +0xD24AD429, 0xCB2C2A00, 0x43E2A236, 0xBC353312, 0xD91324B5, 0x30B4D013, 0xC92FDE2F, 0xBFD6D432, +0xC82DCABC, 0xC032DC1D, 0x30C9D2CB, 0xE0341DC5, 0xDDCEBE39, 0x2CC41D58, 0xE213BF14, 0xDFCDCBD9, +0x2E3C36DD, 0xE5262833, 0xF841291D, 0x15E324F5, 0x0315D732, 0xD1C5C5CA, 0xD73144D3, 0x2ABEBA1A, +0xBCF42E2C, 0x00E1E53B, 0x4423AD2C, 0xB021CF20, 0xD8D5EEB6, 0xBD35BCCD, 0xE6D85334, 0xD549DF2D, +0x35C74D19, 0x3F4BBE3D, 0x1F3FA3EB, 0xCEB2B335, 0x35D0BCBA, 0xD5D8CF27, 0xB11DCFC4, 0x24D3D408, +0x183B35D0, 0x1C14D619, 0x35D445BB, 0xDE452444, 0xC83315C5, 0x3F2122D0, 0xB623C737, 0x33321DD0, +0xD6DF33DE, 0xDE39AA20, 0xCF00F239, 0x412410D5, 0xC5DC2339, 0x1D3BD1B6, 0xC0E3481E, 0x1030451A, +0x30EA30D1, 0xC6DCB9C7, 0x2C36DC17, 0xCBB0ED30, 0x26C20FBE, 0x35D6D528, 0xD6CC2242, 0xEDE4241E, +0xC036DED9, 0x26303627, 0xB6B6371B, 0x26E3D6DF, 0x0D36C729, 0xBEEE4FD7, 0xE3C839D1, 0xC0313031, +0xAEAD2828, 0x36323D23, 0x13342728, 0x2904EE20, 0x261DDCD6, 0x0CBCE1E1, 0xD2CBD5C3, 0xFD1C4B2C, +0x1CD8CDDB, 0xD4BE53B1, 0x2BD6CDDE, 0xC61A01E1, 0x3D41BED3, 0xE0333BD0, 0x4040E821, 0xC4A32449, +0xD3D3A8BF, 0x36E11C2C, 0x3CC1321B, 0xC5D03E1C, 0xB813D9DD, 0xD6C51838, 0xCEBED141, 0x1FEA3813, +0x3611CAC0, 0xD12EE2C6, 0xE1BFD22D, 0xD0DAE9CC, 0x0E03DB00, 0xBC37393F, 0x422BC916, 0x49C4D72A, +0xBFC0243B, 0xC1C2F1C3, 0xDF36CC32, 0x49E53EE4, 0xBFC02CDF, 0x2BEE2BE1, 0xC23224C5, 0xD63F16DA, +0x15DBC21F, 0x49E4CC57, 0xBE272CC7, 0x274E0643, 0x5C1DDBE7, 0x34B73DF0, 0xCD2D2EB9, 0x1AD43BCD, +0xFD3047D3, 0xDAC53936, 0x1328DCC8, 0xBC32331D, 0x001F2634, 0xC845410F, 0xDBDB1C2B, 0xD1D819D0, +0xEBDDE12D, 0x37E335D7, 0xCDA84635, 0x0F362FBE, 0x30C229C4, 0xBC1DC43E, 0x3CD02F3D, 0x2EF5F5F4, +0x462D15E6, 0x362F1FC5, 0xC0C9CD49, 0x14C92639, 0x2BD135D0, 0x49C6B8DA, 0xDBC7E1D9, 0xC6382328, +0xEDC217BC, 0xE4D1331C, 0xDCC741CF, 0x283A341C, 0x38B93420, 0x46001BE7, 0x3E1030C4, 0x42A8C1CD, +0xBB3339C5, 0xE538DD20, 0xDF3F2602, 0xE52BE5C1, 0xBE2B41BA, 0x3BD4D337, 0x2D39C3DB, 0xC3BB36F0, +0xD12CCF17, 0x4130B93A, 0xE31DEAEC, 0xF9DEF52D, 0xADD35231, 0xD62ED0EF, 0xBE303521, 0x1E2ADB41, +0x310AC62F, 0x22DA2DC5, 0x26E1D9D0, 0x1F4D2AC1, 0xC8E6DCE1, 0xC6B3D62E, 0xD6D20019, 0x4EDC2D39, +0x342AE224, 0x07CBD4CB, 0xE43FB3BE, 0x1BE53748, 0xDD44C8A2, 0xBC34B7BA, 0xA1DD1D43, 0x23D31827, +0x3519E93F, 0xC83B3720, 0x1BF0B72A, 0xEAC7DCC0, 0xCA4B28EC, 0xD54D242F, 0xF35435D1, 0x3DDEC824, +0xC31128CE, 0x0B0FD136, 0x442D1E2B, 0xCBD1C3EC, 0xD635341B, 0xDD1F2931, 0x3442CDD0, 0xDADD3600, +0xC31E40E3, 0xB0BD1B22, 0x38CA1F0D, 0xD42D3043, 0xE65127E4, 0x2F15C9D6, 0x3E360B30, 0xB2CB1524, +0xC7BBC4DF, 0x38D244C7, 0x483B31C0, 0xDB43C8D1, 0x43DCDBBC, 0xDCC7571D, 0x24BAC2C6, 0x3B4ED6DC, +0x3AE03245, 0x0C40E1E2, 0x493724C0, 0xD4ECC537, 0x36CC30BA, 0x1C303FC6, 0xD12F27D5, 0x00C4272F, +0xFFFD061D, 0xC2D9251D, 0xC1D7D625, 0xBFCD3AD3, 0xB42E11D4, 0xC7230E1E, 0x24CD2C21, 0x0BD436F9, +0xCECCD331, 0xE6BDE0D5, 0xD2C6C941, 0xE1D1D3EF, 0xEB4123CD, 0xDA1755E5, 0xCEE4C529, 0xDC43C5D1, +0xD8FDDFEA, 0x1AC9C317, 0x22E13DCE, 0x01D7BA29, 0x1551E449, 0x43CD363E, 0xC6281B24, 0xCBD23725, +0x3200D61C, 0x35D6CCBC, 0x262CB22C, 0xE2E43DB1, 0x26493335, 0x3AD72ACA, 0xC4244430, 0x3AD7C9C3, +0xC91ED8D1, 0x40EAD2AC, 0x38C9CDAC, 0x413BC137, 0xCD304B1F, 0xEFCA2323, 0xAC3FE4CD, 0x3616F6E0, +0x41C2272A, 0xDCD7B2E2, 0x27D9E018, 0xDEE2D943, 0xD5C01F22, 0xB0D93540, 0xB411C13D, 0xDE39CBE0, +0xE2C6F126, 0x31450828, 0xD2BC2927, 0xBACA1DD1, 0x34DDCDC3, 0xD8302AD5, 0xE2D02824, 0x0B2BE03E, +0x3BCAFD2C, 0x2E461D45, 0xBBF6F32E, 0x31E5DED2, 0x2ED4E847, 0x3BDDCD29, 0x231331D8, 0xF521CF2E, +0xD024C718, 0x20D91011, 0xDB1E0F34, 0xD931C0BB, 0xBB310837, 0x29B7C5CB, 0x3B31DEE0, 0x0836B926, +0x28CB1FD4, 0x31072A30, 0xEE41F300, 0x35CB501E, 0x603A2B47, 0x2C2739CE, 0xC0CFC4D9, 0xE0CED43C, +0x22BDC9CA, 0xBAEC122D, 0x4D16F2C5, 0xB6E5C3DA, 0x19D5C9D0, 0x1D1DDFC2, 0x223A23FB, 0xCD382B09, +0x3025C2E6, 0x3918BDD5, 0x33DFEF0E, 0x291A302B, 0x14184930, 0xD414D233, 0x473CCED7, 0xD2D318B7, +0x3E2738D2, 0x2928D537, 0x002E14BB, 0xE2E03734, 0x1B1EDFD1, 0xCF483FD8, 0x3D043844, 0xD52E1C4C, +0x2823EAD6, 0x1F2D241A, 0xBC4B22E6, 0x2EE7DFB8, 0x3424E2F0, 0xD41BD7CB, 0x2BBCDF1E, 0x155B5033, +0xB527D543, 0xE3C5E9F4, 0xD9B5C92B, 0xD3CAE0DF, 0x31C4CED7, 0x0BD33B25, 0xCF3B111D, 0xE62F241F, +0x22D93D22, 0xCF27EF43, 0xDAD2C5DD, 0xC60019BE, 0x2935D5C3, 0x2D0BCD22, 0x224714EA, 0xE7CAB817, +0xD1282222, 0x3C25EBD0, 0x45F0A8DC, 0x3ACFB92D, 0x34B4E7E6, 0xE93523E0, 0x2C292FCA, 0x44D4C7AC, +0xEA22C3FE, 0xEF37E524, 0x313ADCDA, 0x2212D846, 0x1BE0FF4B, 0x1CBC2E34, 0x174AF041, 0xD245223E, +0xE1DB2BDC, 0xF2E9A515, 0xE3C33BCC, 0x43DBD5CE, 0xF11700DB, 0xDE44DD36, 0x26E1D604, 0xC2ACE419, +0xB9D8C7D4, 0x37EFE21E, 0xE2BAC2D1, 0x3926E91A, 0xD013E8BC, 0x2C43ECD9, 0x232B30F8, 0xD6C9E0BD, +0x26A718BC, 0xEFF6C840, 0xC13332C2, 0xC4B9BD36, 0x1B4921BD, 0xD0EBECE0, 0xBCE4D647, 0x35D4DCD5, +0x1BBE4C27, 0xECC1B7CB, 0xD820284D, 0x0BC33DBF, 0x34D03140, 0x38EC3900, 0x29EBDBC9, 0xD43A3041, +0x3AE0DD0C, 0x09CFCFDB, 0x44E0C7CE, 0x20DBC4E3, 0x26DC41DE, 0xBA3AD2E5, 0x2ABA34E1, 0xD70FBEB7, +0x40E03FE2, 0xF8D62041, 0xBD47B7EA, 0xD2E03E34, 0x1FC6D2DE, 0xCF1CD155, 0x32D52630, 0x3C463D2C, +0x253130E3, 0x1ED8BB4A, 0x411BDFDD, 0x3FD8EE35, 0x33D02BBB, 0x002ECAAE, 0xDF1FDFEB, 0x2CD8DA3C, +0xB6352D59, 0xD5BDD3B9, 0x1946630D, 0xD9181731, 0xD419D31F, 0xCE2FB7D0, 0x32EFE3C3, 0xCDDB2FD3, +0xD247BB3E, 0xBA41DECA, 0x23244AD2, 0xDEAAF2B2, 0xB8D525F2, 0xD327A4D0, 0x3718C0E2, 0x2D3E20D9, +0x24CFDF12, 0x26D0BE1C, 0xC8D9282E, 0xEB54CADF, 0x44DB1AED, 0xC927BF29, 0x2E002B39, 0xBB2625E4, +0xBB4421D2, 0x18CBAA3A, 0x213ECD37, 0x0F33163C, 0x3622E432, 0xE5C7C62B, 0xDE39E7C7, 0xF3151CCA, +0x2ACED6D2, 0x2ADADFC4, 0xD6241ACC, 0xB92F0622, 0x1BC639E4, 0x33D92BC4, 0xAF14E0DD, 0xE6EEC2C9, +0x16BDCAE3, 0x272E1AC3, 0x292E1EBE, 0xDCE439B1, 0x4225E1C6, 0xCD372420, 0x27D716B1, 0xD83EE339, +0xDBCAD4B3, 0x26385033, 0xC5373528, 0x2DD2C936, 0xF9D5BAE6, 0x2E2DC7C2, 0xCD4BD045, 0x1DDF2DE8, +0x0E3740CE, 0xE5D82C36, 0x29D1360A, 0xCD03C8C6, 0x37CCCCD8, 0xD83AD330, 0xBFD619CD, 0xDEDDC432, +0xD0DADAEC, 0xD3E14F26, 0xA8CD35D9, 0xA3F325BD, 0xBC1626D7, 0x3AB81BD5, 0xBBFF1832, 0xC9DB2126, +0x16250000, 0xE003BB39, 0x35D533CE, 0x1801C610, 0xD9D44644, 0x474BD3C3, 0x1C30C51E, 0x2E3342C6, +0xB7D6B3E9, 0x5AE44BD2, 0x46D62830, 0xDBDD4B0C, 0x38CF2F1D, 0x2D331ACB, 0x36CCDED6, 0x10D7DA10, +0xD42246E0, 0x0FC73FC0, 0x2C3E1E37, 0x2CF0D1B8, 0x17412EDD, 0x2630D0DD, 0xDBD535E4, 0xD927DA43, +0xB636C11E, 0x25CBE2D8, 0x4711F64B, 0xBC2C2029, 0xD0E3F538, 0xB92C27DF, 0x272DE2D2, 0x0CC5BCEB, +0xC0BC2EDF, 0x26D131C9, 0x1F092FEE, 0x2D342B34, 0x31B825D5, 0xC6BBC9C1, 0x38F1D0E4, 0xCBF7FDC7, +0xC3CAC9B6, 0xDBC436C6, 0x19DC1FD8, 0x28CCAED1, 0x1921BDB4, 0x24BCBF33, 0x301EE244, 0x36BDBDE1, +0x31C5B724, 0x00003ECD, 0x220B1EE7, 0xDEBAD3DC, 0x21CAB942, 0xC9193B33, 0xE3CD3A0A, 0x0DC22CC3, +0x3EC0C7CB, 0x43F2BFE4, 0x0ECFE9C6, 0x3ECA2FD5, 0xCB492DD9, 0x23E7BDC9, 0xD33DC151, 0xFCBE2933, +0x5ACEC51E, 0xF2172E1C, 0x3C24DE23, 0x3320D4D5, 0x2AB53C20, 0xC328323A, 0x45EA4133, 0x24391A32, +0xC7D8DA2B, 0xF4EAAF39, 0xDFCA36E3, 0xDEBED5C8, 0x36252C36, 0x04D7DBC7, 0x30CAC23D, 0xB60BF73D, +0xEACA2A30, 0x34C12ABE, 0xE2D747D8, 0x19D21FE3, 0x1DFD24EC, 0xB6B5D9C4, 0xBF2C1DD2, 0xD2B442E0, +0x37CCE1BD, 0x2AD1E1CC, 0x18DAC6BD, 0x213AD93E, 0x2031D8CB, 0xD82F2D12, 0xD112D2F2, 0x19CD43F1, +0x36BCB9CA, 0xD7C5DDFC, 0x34011D28, 0x3BDB0000, 0xCD00E1AA, 0x5228252C, 0x3512CA34, 0x0EE53A41, +0x242CD2C2, 0xF425DD2A, 0xF02FDDF8, 0xD82026D3, 0x4ABEE7B8, 0x2DC9DDDC, 0x3BEECD3C, 0x2ED1442A, +0xC713E92A, 0x310CC12B, 0xE128D520, 0x48E5C1CF, 0xC91CE3ED, 0xCCCBC72F, 0x0B23E3E9, 0xC1D2C8B6, +0x511ED534, 0x2AC7D4C3, 0xCFDCE335, 0xD4C9F643, 0xD433EBF1, 0x1BF8DA31, 0x223FC515, 0xCC2F13C2, +0xF825FFC8, 0x35E51633, 0x36293C4A, 0xC72ACA36, 0x4544E736, 0x1BD9315C, 0xCF16DFD4, 0xD0AFEFC3, +0xCECBBDE2, 0x05D6AA32, 0xD851F045, 0x240FD948, 0x3D35B2E6, 0x17D7C7EE, 0x0B22DACE, 0xF53AD637, +0xB2372DDB, 0xF6DF14CB, 0xBED95B24, 0xD4D5190B, 0x0000CB29, 0x3DC1ECF5, 0x30C6B34F, 0x1D2629B6, +0xD429D1CC, 0xD50716E3, 0xD0C3C2CC, 0xC82CC7D4, 0x5F27C718, 0xE6201BE4, 0xDACFD42F, 0x2E2EE9D4, +0x3AD036C0, 0x3828DB20, 0x27D63439, 0xD21026DE, 0xD60710BC, 0x13AEB9E9, 0x28C41944, 0x49D5E3D7, +0x27163429, 0x1BBAD528, 0xB12A14BC, 0xC72FD9E2, 0x1F43213A, 0x133B3EE5, 0x3622FE21, 0xD438DCBE, +0x41CB25E8, 0xD0D83E2C, 0x32BFC2CE, 0x362BE1DA, 0xC3CBCE24, 0x22DECDC2, 0x30CBD5CD, 0xD42DBC26, +0xDDF6AAD0, 0xCADC0EC8, 0xDC333434, 0x333114F5, 0xCE24361A, 0xB1C5D123, 0x4B25380B, 0x2FEC3634, +0x3EE2A610, 0xB4CEE72F, 0x29BCC721, 0xB23850CD, 0xA51AE4DD, 0xC81BBC2F, 0xD4DF0000, 0x2DE5D1E8, +0x2E0A28D0, 0x29E3C1E1, 0x56F62DD6, 0x3828DD4B, 0xC41ACFDF, 0xD2390A3A, 0xDF3028CC, 0xE8C5E22B, +0xD11CDCC1, 0x44D1CBEC, 0x33C73DDC, 0x1D25B7DC, 0xE7DD0525, 0x2743C41A, 0x2AE2D3DC, 0x21D6E82A, +0x133CBAC7, 0x593F34B0, 0xDA5FE339, 0x5206252C, 0x394FD5BD, 0x21D2C92C, 0x292426E0, 0x48E0362B, +0xCC272DE4, 0xC815C4DE, 0x49BD5D37, 0x1912342F, 0x2CE9E01B, 0x30D8D2D9, 0xDEBF46E8, 0x392F473A, +0x3A18D324, 0x2FE31FD0, 0x2B2B2710, 0xB53B2AC7, 0xB3481CFF, 0x2DD7CFBC, 0x2232351A, 0xD7C91C16, +0x1CB4DA16, 0x1BCBDF3C, 0xD2213822, 0x2121DB1F, 0xDBD1C02A, 0x27DA33C7, 0x351FC4CD, 0x0000B9D8, +0xC2142C29, 0x38B9DD31, 0x54E60CDF, 0x2A4A42DB, 0x35CF2BB5, 0x0CEA3323, 0xC2D8BEE2, 0xC61F3B33, +0x10CE11D0, 0x3336CE2E, 0x303ADD25, 0x3347B7D9, 0x33222C1A, 0x1A43E4C1, 0x4326E019, 0x2AE2E92E, +0xD2C5DC40, 0xBA45D7D6, 0xDF341BDC, 0x3A361925, 0xD4FEF4D2, 0x3018DA31, 0xDDC12817, 0x3038DE24, +0xEDC0292B, 0x3E3E3336, 0xCB1BEF17, 0xE10B2EBF, 0x2B20BABF, 0xC80C421B, 0xC2411D21, 0xECD8C7D6, +0xC824E4AD, 0x65B53DD7, 0x304325D4, 0xDD1DEAE6, 0xD33131CF, 0x2F36452B, 0x23B219E9, 0xC1C23529, +0x21DC3836, 0xD618E933, 0x393E2C14, 0x362ACA3A, 0xD6E2C237, 0xD6085111, 0xD721FCB1, 0xCCE6DEBC, +0xD1DCD920, 0xC3320000, 0xEA26CB19, 0x18BB26B7, 0x233BDF4F, 0xDE23FD3F, 0x2ADA1ECB, 0x3122E839, +0xEF42D7D7, 0xCAC7202D, 0xCD4CDED1, 0x2633C824, 0xD0123E4E, 0x104429B6, 0xC8CD4B00, 0x5136B738, +0xCFC8202B, 0x163135DD, 0x2C3821E8, 0x29314CE0, 0x0F3CE4EC, 0xE5432DAF, 0xC63AE340, 0x4639DB18, +0xDF282511, 0x25B5CBD3, 0xCAF50F37, 0x1E443B33, 0xE32CD32D, 0x10DA47B9, 0xDA410526, 0x34F0E4EA, +0xCEED3134, 0xC0B31AA7, 0xD12B1AD3, 0xC722C743, 0xBFBEDD1F, 0xD328D52B, 0xCC384024, 0x18B43FB8, +0x281742BB, 0xD8322FD2, 0xB5D628C6, 0xE420C0CB, 0xC9EB391D, 0x41E6B419, 0xBCC543E1, 0x2C37DDEF, +0x1F2D41E9, 0xD0F0D205, 0x1FEAE5C5, 0x15DF14B8, 0x47E327D9, 0xD328CE25, 0x36DB2E24, 0xD92E1EBF, +0x2B3230F4, 0xD1EAD5D9, 0xC7212ADA, 0xCD1235DC, 0xC519D5DB, 0xBFC631DF, 0xD5222B35, 0x35B6DEC6, +0x153C4428, 0xC5C3E42F, 0x1B2E2D2A, 0x3CD422A6, 0xC22842CC, 0xCADAC43D, 0x2C10DAD2, 0x18C708B5, +0x36D636BD, 0xCD29C5D3, 0xBFED433A, 0xE0384939, 0x005629F2, 0x36E2C425, 0x2830DF1C, 0xC9CB351C, +0xB0D7D3E6, 0xF3CEC214, 0xDC25D1C7, 0x1BD5CBCC, 0x19DD21C9, 0xC854EE30, 0x4FE14EE3, 0x38D5D3E8, +0xC9D126E4, 0x2FDD2130, 0xCE2130D1, 0xCFCAB0C9, 0xC71F0E1A, 0x2627D4DE, 0xCBE9DACD, 0xE7121F22, +0x2CC8E435, 0x3838391D, 0xDD37242E, 0xEBBE2F10, 0x233C0000, 0xAFC91CE7, 0xCE3536F6, 0x0F25D248, +0x2D04EBE4, 0x3FF634E5, 0xE929CE26, 0x24E0BABE, 0x302CD52B, 0xD1E2073F, 0x4333D11C, 0xDA48C2D1, +0x2D33F315, 0x29B2C8C3, 0x3B26E3EB, 0x3821C6DA, 0x32163DD6, 0x1DC737BC, 0x463CCD24, 0x19D63DDD, +0x200BDDB7, 0xBDD41E22, 0xC40A444F, 0x34BF49ED, 0xD4C0C0F4, 0xA41FB721, 0xBEDF51E8, 0x15D82A17, +0x383FDF21, 0x2B2918D0, 0xE6EB4718, 0x244530DB, 0x25DD3919, 0x3BA819BE, 0xDAEFBE38, 0xEB3FCCD9, +0xD1DF2E1C, 0x2520C3E3, 0x32D0BFD5, 0x37312BD5, 0xDC29D0C9, 0xBED02432, 0x310C3A18, 0x411ED8D7, +0xA4E5CE22, 0x163CBD30, 0xC3E2BE45, 0xCFBBAAC3, 0xC8C0E4CF, 0x0000CEFC, 0xE8CC2433, 0x39ED223F, +0x243AD83B, 0xD44D39C6, 0xCABF24DE, 0x252050EB, 0x29C73B40, 0xD4F434CF, 0xCAE4D5DF, 0xC5F2EEF1, +0x2919C8D2, 0x2FC4D20B, 0x1CBF5528, 0x3DBBD52D, 0xE03AD031, 0x3D2CCA17, 0xBE23BDB8, 0xE7DA3B30, +0xD1D2D331, 0xCC1825EA, 0x2F2D39D2, 0xF9313526, 0xCFBCC2E1, 0xE5BE3AD4, 0xBF59BE1C, 0x22FFC8B5, +0x32B14015, 0x31D6BEE6, 0x46DF3843, 0xDCD1D8B2, 0xE728C8BE, 0xEA1E2A28, 0xD1D8C7D2, 0x30CAF134, +0xEDD0EADA, 0x13C1E3D0, 0xB9D7DC29, 0xEAB93624, 0x24E49F38, 0x2E3FDEDC, 0xE6D0D23D, 0x1FBB3ED2, +0x23D540DD, 0xD727D92B, 0x251E33E6, 0x4BA7EECE, 0xC1CD203C, 0xC5CFED32, 0xB9CF35C3, 0x29710000, +0x29D7C636, 0x3A3ED1D0, 0xCC1B271F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 + +hard_output0 = +0x42441F44, 0x006DFAE9, 0xDBB63AC2, 0xA3365CB3, 0xFA44372B, 0xC2603862, 0xA6C86E09, 0x416F0BF7, +0x8E58011D, 0x47C54B99, 0x269AD14C, 0x0B286902, 0x093E4C64, 0x8D84D8E1, 0xB8AE0993, 0x49567118, +0x8CEAABD2, 0x12D33409, 0xE3358237, 0x130176F6, 0x0986718F, 0xA18C83B5, 0x04EEF058, 0x59704040, +0x7478FE81, 0x01D27193, 0xEA1AD7F3, 0x21E6C2B9, 0x6478A1FF, 0xED9959AD, 0xE39E57BE, 0x4D859105, +0x056EF72D, 0xBD170BB7, 0xF01F9ADD, 0x99BF0C05, 0x44BAD09F, 0xF6ABDD61, 0xC0F8F116, 0x2972B53C, +0x0FEC944B, 0xD1675432, 0x0025F563, 0xF42B2EA8, 0x808E5C37, 0xB6E79AD5, 0x3706284D, 0xB9C0AFA5, +0xFF0E7E28, 0x5FA45C6F, 0x9CD5244E, 0xA013DDEA, 0x0D27D1A2, 0x2AE414AD, 0x41614379, 0xE6B68872, +0x5585D926, 0x5098D45B, 0xF8980ABD, 0x65821418, 0xEF8968A3, 0x301DEC3A, 0x57EF2A7F, 0xC17BE446, +0x94B65D62, 0xC9E6F350, 0x2E6130BC, 0x235F2E5E, 0xF1C13241, 0x94B291D6, 0x8C342458, 0x175B1FCA, +0xE07310FD, 0xD24934DD, 0x3CE8D053, 0x5C8F243D, 0x945B0AB3, 0x50EB8CC1, 0x8EF499D4, 0xA67801BF, +0x1680F061, 0x283FE705, 0xB8D7E773, 0x13AD3D2F, 0x4A6C305B, 0x1C1E5B12, 0x6F57D880, 0x8A666E5E, +0x26511296, 0xFFC09750, 0xFF91760A, 0xAC26795C, 0x75F321FD, 0x4221B9CB, 0x2E119188, 0x0772A832, +0x74D6036B, 0x505D6D64, 0x16A001B7, 0xF5F0D728, 0x48CBE119, 0x91C5D6B2, 0x8E1BBAB0, 0xB11BBE51, +0x52C647DC, 0x65240CE2, 0xAB3F8AAE, 0x62E0CDEA, 0x6CBE7240, 0x7F572063, 0x7FC816E6, 0xB38E5A6C, +0xDF9E2738, 0x752419CB, 0xC3A6BF9B, 0x8D48B21F, 0xA88C4AED, 0xE3C1D8BC, 0x8501353D, 0x20A99D7D, +0x8D9C6DDD, 0x77A65039, 0x834E7E57, 0x1F623FA1, 0x6CF02B26, 0x1FF0BBA6, 0x9035AC70, 0xBED818E5, +0x437CA713, 0x91011537, 0x3CD1302B, 0x7755459E, 0x5963FDA6, 0x49ECF937, 0xDEBBE0E3, 0xE873FD4F, +0x735C48C9, 0x7C70F46F, 0xA00B1543, 0x789F4159, 0xE17C343E, 0x51B3D085, 0xD9042663, 0x771933DA, +0xE183AF8C, 0xF62AC11B, 0xF776C25C, 0x22083E6C, 0x8400DDBA, 0x6D6AD2F2, 0x5DF87DBC, 0xBD7D40B4, +0x356EBF21, 0xD8972E85, 0x3A632B51, 0x4D5BFBA2, 0x58CDF1D4, 0xD1117491, 0x5906DC45, 0xF793D63A, +0x8F9D0552, 0xD261C804, 0x70BFDE9F, 0xDC77827B, 0xE9FFB130, 0x4FF18BBC, 0x17D50C32, 0xC315521E, +0x4C7D2470, 0xAB5EE34C, 0x692AC0C8, 0x15B22832, 0xD34107FE, 0xA7E6DA1E, 0x2966A2A3, 0xD0B204B4, +0x500E02F9, 0x02E5A455, 0x81EAF941, 0x6818F57A, 0x978EEC9C, 0xBFD575F3, 0x3FFC1BE8, 0x97104E07, +0x4ADF219F, 0x182EC93D, 0x386033EE, 0x87C1351A, 0x31420C6A, 0xE20B5DC8, 0x83D90D23, 0x3C13B9E8, +0xCCCD65BE, 0x7EDB17A9, 0x81C73C2A, 0xE202E332 + +c = +2 + +cab = +1 + +ea = +4918 + +eb = +4920 + +c_neg = +0 + +k_neg = +3072 + +k_pos = +3136 + +rv_index = +0 + +iter_max = +8 + +iter_min = +4 + +expected_iter_count = +8 + +ext_scale = +15 + +num_maps = +0 + +r = +0 + +code_block_mode = +0 + +op_flags = +RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN, +RTE_BBDEV_TURBO_CRC_TYPE_24B, RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP + +expected_status = +OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1190_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1190_rm.data new file mode 100644 index 0000000000..6221756ae5 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1190_rm.data @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_ENC + +input0 = +0x11D2BCAC, 0x4D + +output0 = +0xD2399179, 0x640EB999, 0x2CBAF577, 0xAF224AE2, 0x9D139927, 0xE6909B29, 0xA25B7F47, 0x2AA224CE, +0x399179F2, 0x0EB999D2, 0xBAF57764, 0x224AE22C, 0x139927AF, 0x909B299D, 0x5B7F47E6, 0xA224CEA2, +0x9179F22A, 0xB999D239, 0xF577640E, 0x4AE22CBA, 0x9927AF22, 0x9B299D13, 0x7F47E690, 0x24CEA25B, +0x79F22AA2, 0x99D23991, 0x77640EB9, 0xE22CBAF5, 0x27AF224A, 0x299D1399, 0x47E6909B, 0xCEA25B7F, +0xF22AA224, 0xD2399179, 0x640EB999, 0x2CBAF577, 0xAF224AE2, 0x24 + +e = +1190 + +k = +40 + +ncb = +192 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_RATE_MATCH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1194_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1194_rm.data new file mode 100644 index 0000000000..c569abd78b --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1194_rm.data @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_ENC + +input0 = +0x11D2BCAC, 0x4D + +output0 = +0xB3E8D6DF, 0xBC8A2889, 0x744E649E, 0x99436EA6, 0x8B6EFD1D, 0xAB889238, 0xE744E6C9, 0x39E4664A, +0xE8D6DF91, 0x8A2889B3, 0x4E649EBC, 0x436EA674, 0x6EFD1D99, 0x8892388B, 0x44E6C9AB, 0xE4664AE7, +0xD6DF9139, 0x2889B3E8, 0x649EBC8A, 0x6EA6744E, 0xFD1D9943, 0x92388B6E, 0xE6C9AB88, 0x664AE744, +0xDF9139E4, 0x89B3E8D6, 0x9EBC8A28, 0xA6744E64, 0x1D99436E, 0x388B6EFD, 0xC9AB8892, 0x4AE744E6, +0x9139E466, 0xB3E8D6DF, 0xBC8A2889, 0x744E649E, 0x99436EA6, 0xC01D + +e = +1194 + +k = +40 + +ncb = +192 + +rv_index = +2 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_RATE_MATCH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1196_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1196_rm.data new file mode 100644 index 0000000000..72be6f5d37 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1196_rm.data @@ -0,0 +1,36 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_ENC + +input0 = +0x11D2BCAC, 0x4D + +output0 = +0xBC8A2889, 0x744E649E, 0x99436EA6, 0x8B6EFD1D, 0xAB889238, 0xE744E6C9, 0x39E4664A, 0xE8D6DF91, +0x8A2889B3, 0x4E649EBC, 0x436EA674, 0x6EFD1D99, 0x8892388B, 0x44E6C9AB, 0xE4664AE7, 0xD6DF9139, +0x2889B3E8, 0x649EBC8A, 0x6EA6744E, 0xFD1D9943, 0x92388B6E, 0xE6C9AB88, 0x664AE744, 0xDF9139E4, +0x89B3E8D6, 0x9EBC8A28, 0xA6744E64, 0x1D99436E, 0x388B6EFD, 0xC9AB8892, 0x4AE744E6, 0x9139E466, +0xB3E8D6DF, 0xBC8A2889, 0x744E649E, 0x99436EA6, 0x8B6EFD1D, 0x9038 + +e = +1196 + +k = +40 + +ncb = +192 + +rv_index = +3 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_RATE_MATCH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e272_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e272_rm.data new file mode 100644 index 0000000000..883a76cf8a --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e272_rm.data @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_ENC + +input0 = +0x11d2bcac, 0x4d + +output0 = +0xd2399179, 0x640eb999, 0x2cbaf577, 0xaf224ae2, 0x9d139927, 0xe6909b29, 0xa25b7f47, 0x2aa224ce, +0x79f2 + +e = +272 + +k = +40 + +ncb = +192 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_RATE_MATCH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e120_rm_rvidx.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e120_rm_rvidx.data new file mode 100644 index 0000000000..b3867f35f2 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e120_rm_rvidx.data @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_ENC + +input0 = +0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, +0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, +0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, +0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, +0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, +0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, +0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, +0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, +0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, +0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, +0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, +0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, +0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, +0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, +0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, +0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, +0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, +0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, +0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, +0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, +0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, +0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, +0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, +0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, +0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, +0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, +0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, +0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, +0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, +0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, +0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, +0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0xfaa42c5f + +output0 = +0xd0d936d6, 0x870c26f3, 0x3f12805d, 0x4a6016 + +e = +120 + +k = +6144 + +ncb = +18528 + +rv_index = +1 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_RATE_MATCH, RTE_BBDEV_TURBO_RV_INDEX_BYPASS + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18444.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18444.data new file mode 100644 index 0000000000..dcad558788 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18444.data @@ -0,0 +1,156 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_ENC + +input0 = +0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, +0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, +0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, +0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, +0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, +0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, +0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, +0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, +0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, +0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, +0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, +0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, +0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, +0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, +0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, +0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, +0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, +0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, +0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, +0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, +0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, +0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, +0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, +0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, +0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, +0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, +0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, +0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, +0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, +0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, +0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, +0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0xfaa42c5f + +output0 = +0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, +0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, +0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, +0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, +0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, +0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, +0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, +0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, +0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, +0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, +0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, +0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, +0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, +0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, +0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, +0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, +0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, +0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, +0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, +0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, +0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, +0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, +0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, +0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, +0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, +0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, +0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, +0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, +0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, +0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, +0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, +0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0xfaa42c5f, +0x4fde636c, 0x10ea20a0, 0xe6da8721, 0xbfde5b08, 0x9c3739da, 0xb6dc015a, +0x427db088, 0xdfdb8e6f, 0x756be6c1, 0x21f5297b, 0x06135665, 0xc1602b7d, +0x049536c5, 0xbbb3b801, 0x0cdb0c19, 0x7b2ad622, 0xfee8218f, 0xc5c7f123, +0x8abd3301, 0xa15b534d, 0x29dd2053, 0xd409abf9, 0x3ef19d6b, 0x70a3cbc2, +0x7a51423a, 0x4505b2ad, 0xdc74c75e, 0x068751a9, 0xb0b56437, 0x14a10371, +0x76af806f, 0xa8a47e19, 0x7c97a26e, 0x7998a3d6, 0xdc1ad1e2, 0xb532a301, +0xca8a3e7d, 0xd0aef374, 0x204990c0, 0xc7011aec, 0xa69151ea, 0x53390026, +0x7bf0d762, 0x735c2202, 0x64159e54, 0x5a3b1a56, 0x9ef1def2, 0x0ab8a961, +0x587b0886, 0xb8cc5975, 0x2a5a0f23, 0x069d05be, 0x9cc3c207, 0x40ef1a02, +0x4fae3f5b, 0x1f127aae, 0xd4e6d411, 0x17ac43ef, 0xe4bf891b, 0xfbb21765, +0x2c560c7e, 0x8561988c, 0x73a01032, 0x0cfef73a, 0x694c4991, 0x885d7a3f, +0x4218d1ff, 0xc2efaffb, 0xaf9d9715, 0xf76de6b2, 0xcce8e8ff, 0x370e3800, +0x493675eb, 0xd8fbcbda, 0xa5b382c2, 0x86c8f1ea, 0x3d724ea4, 0xb067034c, +0x6491d87e, 0x1a745ce4, 0xbb27180b, 0x1a2f0acc, 0xac4b7b3b, 0xe324578b, +0xc87928df, 0x9c1de566, 0x0ce2a17d, 0xaf2e13ce, 0x146a8659, 0x8727f6ae, +0xe2df7d03, 0x1a8e4cb4, 0xfa590976, 0x13a7c236, 0xc07489d0, 0xbe905e17, +0xafeb3d4b, 0x201e73f2, 0x5bdca12e, 0x3e15a852, 0xbcfc3271, 0x5d398410, +0x6bfacc15, 0x011fc61f, 0x43e43fd7, 0x0640717c, 0x96bfb3ff, 0x158eac19, +0x3b852e91, 0x74f9ceda, 0xcac71326, 0xfc0e312a, 0x20e8137b, 0xa1162611, +0x239ac7fe, 0xb9d00f8a, 0xea0b5241, 0x019f0d25, 0xc5153264, 0xb48a5547, +0xe54e339f, 0x17a6cca5, 0x5065af0d, 0x5ce648b9, 0xb457b342, 0xc1cb3f0e, +0x28d03c8b, 0x5144ed7a, 0xdb80779f, 0x53ce1b87, 0xbc071147, 0xbfe46c11, +0x7296785e, 0x83e4a63e, 0xc58982e9, 0x9538c5b9, 0xf14abaaa, 0xd915124c, +0x73540cd6, 0xe333696b, 0x58f9e00a, 0xd4dad10f, 0xc0de1420, 0x355e2bdc, +0xb2faa8fd, 0xbe6a12f1, 0x45d415cc, 0x47f5aed9, 0x4754e770, 0x2bb07385, +0x41374352, 0xf80beb47, 0xef02f35c, 0xc9c1b86e, 0x94b5785b, 0xba33123f, +0x7e39f0c9, 0x028a9286, 0x7d52c9f1, 0x06f04da6, 0xbc6a68d1, 0xfc70bace, +0x95b6a129, 0xfff224bb, 0x701ef3fb, 0x3309286f, 0x544ae8c1, 0xdca62c4a, +0xf8862ee2, 0xf9e3cd29, 0x2c07cce2, 0x8d93652a, 0xf47e4611, 0x4635f586, +0x1c03e0f4, 0x819724c7, 0x96b2a3f0, 0xeeb1ad95, 0xff08e517, 0xbd4ba6ed, +0x49ddb12d, 0x365734b5, 0x5edf7459, 0x2ee117a9, 0x067b9462, 0xb703685f, +0x72499876, 0xb71dd772, 0x5d02b478, 0x4b6fed1d, 0x2df232c1, 0x733eaaff, +0x1618c029, 0x0adda94b, 0xd271e560, 0xd120ba30, 0x6dfecc73, 0x4e751af7, +0x0e7a6b63, 0xa1ad5dad, 0xb41201b1, 0x245f3e86, 0x3a5114ac, 0x5cd532c9, +0x27ff9c3a, 0x7a847392, 0x6b2d0514, 0x82d0cc45, 0x0c779ba2, 0x8690f3ef, +0x0c058474, 0x47a8ee9a, 0xac4c2475, 0x496b67a5, 0x033f43f5, 0x6e6ce3c9, +0x644f5163, 0x8f4b92d9, 0x217798ee, 0x4b8e5368, 0xce751989, 0x7ab05365, +0xe227cee3, 0xf35e2851, 0x6f304c87, 0x1389c81d, 0x6ebc3989, 0x2b32ac3e, +0x59c5d111, 0xa8e8699c, 0xa5b15150, 0x8cacebe8, 0x40c2ede6, 0x71ea78c9, +0xa9e40f49, 0x58309eab, 0xd2eb879c, 0x54b9086f, 0xce206d93, 0x47e7087a, +0xac1e1dd9, 0x1d3a7bf1, 0x07d21fd4, 0x3a84a2a7, 0xe3ce33de, 0x55c94ddf, +0xd827c1ea, 0x3b4dcf5a, 0x7d5fbeb6, 0xd71ccdae, 0x516a9035, 0x33b3bee0, +0x61201364, 0xcf344f8d, 0x8c887934, 0x1998c127, 0xe24f1190, 0x75e8ea20, +0x8a379eda, 0x8a894b14, 0xa3d7c264, 0xa62b0119, 0x87f4d316, 0xecdc5f2b, +0xbc2424ec, 0x71169a71, 0x61aa2d5d, 0xb5f5f160, 0xc15a4969, 0xc5419315, +0xbf84483e, 0x2b1687c1, 0xd1aa06df, 0x22d5befd, 0x8b09b15f, 0xa88ffc01, +0xbb33617f, 0xb01a3e2e, 0x912a939c, 0xc649d802, 0xeba14b11, 0x3c902b57, +0xbcf35a8d, 0x45a964a1, 0x0c9416ef, 0xec9ae2d1, 0xc5e56fee, 0x88bfa336, +0x653cfe85, 0x92d21037, 0x96bc60e4, 0xf5317c1e, 0x5e7118f4, 0x91a9e04b, +0x43f0cfec, 0xb763dc3c, 0xad6bac40, 0x21685f69, 0x5e4d6f70, 0xd8d5a4c4, +0x15ed5efe, 0x3bbefa38, 0xbf7cf912, 0xb1427ffd, 0x652235ff, 0x927a7046, +0x8806625f, 0x56967b59, 0x6ec3dba6, 0x0ee31e0f, 0x25111a51, 0x091c763e, +0x1867732b, 0x28365594, 0xa589c975, 0x585b906f, 0xb85c4f20, 0xced98475, +0x52f29d16, 0x1ca0de39, 0xede3c4c8, 0xda808e91, 0x449784ab, 0xe3caf590, +0xabf23939, 0xe97f259a, 0x0a879f81, 0x5c6268ac, 0x0a4f1b62, 0xfe15825e, +0xbea5e6f9, 0x0d2db98f, 0xeec8cd64, 0x1747ddf5, 0x8b4f161c, 0xd236c9f6, +0x1a5b5a2f, 0x08918e6d, 0xdde43ad9, 0x8c316d0f, 0x7f1b3342, 0x3e385cee, +0x55ff6f87, 0x89bbe534, 0x67c23afe, 0x250dc97a, 0x06b3b332, 0x61a03930, +0x2ca17159, 0x3260c4f6, 0x3c810bde, 0x28d94372, 0xa9701f5a, 0x3880475b, +0x352ff389, 0x2bf653e0, 0xa4a6cc35, 0x4d211cfc, 0xeda0b37d, 0x14c0e6d8, +0xe457aaea, 0x1c6ed15f, 0x155d3b90, 0x7f43aed4, 0x289a98f9, 0x42246910, +0x62d047f5, 0x75714462, 0xe2c2a4df, 0x9dfc0f13, 0x03361f4c, 0xc55b5ca7, +0x9dd89720, 0x17376073, 0xfb6ee849, 0x280e697e, 0x57b24f3a, 0x2089b956, +0xa8baa602, 0x5b7ab88c, 0xd69f8b56, 0x64f80d52, 0x223427b9, 0xfd393c95, +0xb074 + +e = +18444 + +k = +6144 + +ncb = +18528 + +rv_index = +0 + +code_block_mode = +1 + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18448_crc24a.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18448_crc24a.data new file mode 100644 index 0000000000..345d1410f3 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18448_crc24a.data @@ -0,0 +1,159 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_ENC + +input0 = +0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, +0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, +0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, +0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, +0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, +0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, +0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, +0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, +0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, +0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, +0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, +0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, +0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, +0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, +0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, +0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, +0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, +0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, +0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, +0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, +0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, +0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, +0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, +0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, +0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, +0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, +0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, +0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, +0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, +0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, +0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, +0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0x5f + +output0 = +0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, +0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, +0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, +0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, +0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, +0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, +0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, +0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, +0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, +0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, +0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, +0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, +0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, +0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, +0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, +0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, +0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, +0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, +0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, +0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, +0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, +0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, +0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, +0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, +0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, +0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, +0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, +0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, +0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, +0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, +0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, +0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0xa533d85f, +0x4fde63ac, 0x10ea20a0, 0xe6da8721, 0xbfde5b08, 0x9c3739da, 0xb6dc015a, +0x427db088, 0xdfdb8e6f, 0x756be6c1, 0x21f5297b, 0x06135665, 0xc1602b7d, +0x049536c5, 0xbbb3b801, 0x0cdb0c19, 0x7b2ad622, 0xfee8218f, 0xc5c7f123, +0x8abd3301, 0xa15b534d, 0x29dd2053, 0xd409abf9, 0x3ef19d6b, 0x70a3cbc2, +0x7a51423a, 0x4505b2ad, 0xdc74c75e, 0x068751a9, 0xb0b56437, 0x14a10371, +0x76af806f, 0xa8a47e19, 0x7c97a26e, 0x7998a3d6, 0xdc1ad1e2, 0xb532a301, +0xca8a3e7d, 0xd0aef374, 0x204990c0, 0xc7011aec, 0xa69151ea, 0x53390026, +0x7bf0d762, 0x735c2202, 0x64159e54, 0x5a3b1a56, 0x9ef1def2, 0x0ab8a961, +0x587b0886, 0xb8cc5975, 0x2a5a0f23, 0x069d05be, 0x9cc3c207, 0x40ef1a02, +0x4fae3f5b, 0x1f127aae, 0xd4e6d411, 0x17ac43ef, 0xe4bf891b, 0xfbb21765, +0x2c560c7e, 0x8561988c, 0x73a01032, 0x0cfef73a, 0x694c4991, 0x885d7a3f, +0x4218d1ff, 0xc2efaffb, 0xaf9d9715, 0xf76de6b2, 0xcce8e8ff, 0x370e3800, +0x493675eb, 0xd8fbcbda, 0xa5b382c2, 0x86c8f1ea, 0x3d724ea4, 0xb067034c, +0x6491d87e, 0x1a745ce4, 0xbb27180b, 0x1a2f0acc, 0xac4b7b3b, 0xe324578b, +0xc87928df, 0x9c1de566, 0x0ce2a17d, 0xaf2e13ce, 0x146a8659, 0x8727f6ae, +0xe2df7d03, 0x1a8e4cb4, 0xfa590976, 0x13a7c236, 0xc07489d0, 0xbe905e17, +0xafeb3d4b, 0x201e73f2, 0x5bdca12e, 0x3e15a852, 0xbcfc3271, 0x5d398410, +0x6bfacc15, 0x011fc61f, 0x43e43fd7, 0x0640717c, 0x96bfb3ff, 0x158eac19, +0x3b852e91, 0x74f9ceda, 0xcac71326, 0xfc0e312a, 0x20e8137b, 0xa1162611, +0x239ac7fe, 0xb9d00f8a, 0xea0b5241, 0x019f0d25, 0xc5153264, 0xb48a5547, +0xe54e339f, 0x17a6cca5, 0x5065af0d, 0x5ce648b9, 0xb457b342, 0xc1cb3f0e, +0x28d03c8b, 0x5144ed7a, 0xdb80779f, 0x53ce1b87, 0xbc071147, 0xbfe46c11, +0x7296785e, 0x83e4a63e, 0xc58982e9, 0x9538c5b9, 0xf14abaaa, 0xd915124c, +0x73540cd6, 0xe333696b, 0x58f9e00a, 0xd4dad10f, 0xc0de1420, 0x355e2bdc, +0xb2faa8fd, 0xbe6a12f1, 0x45d415cc, 0x47f5aed9, 0x4754e770, 0x2bb07385, +0x41374352, 0xf80beb47, 0xef02f35c, 0xc9c1b86e, 0x94b5785b, 0xba33123f, +0x7e39f0c9, 0x028a9286, 0x7d52c9f1, 0x06f04da6, 0xbc6a68d1, 0xfc70bace, +0x95b6a129, 0xfff224bb, 0x701ef3fb, 0x3309286f, 0x544ae8c1, 0xdca62c4a, +0xf8862ee2, 0xf9e3cd29, 0x2c07cce2, 0x8d93652a, 0xf47e4611, 0x4635f586, +0x1c03e0f4, 0x819724c7, 0x96b2a3f0, 0xeeb1ad95, 0xff08e517, 0xbd4ba6ed, +0x49ddb12d, 0x365734b5, 0x5edf7459, 0x2ee117a9, 0x067b9462, 0xb703685f, +0x72499876, 0xb71dd772, 0x5d02b478, 0x4b6fed1d, 0x2df232c1, 0xb9dea0ff, +0x1618c046, 0x0adda94b, 0xd271e560, 0xd120ba30, 0x6dfecc73, 0x4e751af7, +0x0e7a6b63, 0xa1ad5dad, 0xb41201b1, 0x245f3e86, 0x3a5114ac, 0x5cd532c9, +0x27ff9c3a, 0x7a847392, 0x6b2d0514, 0x82d0cc45, 0x30779ba2, 0x3f0c8156, +0x9bce6106, 0x3511b2b4, 0x82dbef90, 0xac19def9, 0x5f11d43e, 0xa5899170, +0xdd137ff4, 0x188077ab, 0x53cec4c0, 0x6519988d, 0x2b07a0d5, 0x269ec4ae, +0x29c2bc5a, 0x4a0206c6, 0xf8fba9f5, 0x61309433, 0x402bf26c, 0xce401562, +0xf7eb46da, 0x4d9ad0c0, 0xf99fc69b, 0x1b670e56, 0x327bb1c8, 0x5f7db32c, +0x4c96b615, 0x041e0960, 0x190ef525, 0xede526f8, 0x59eb88e1, 0x355e5454, +0x8289d63c, 0xf848c2ad, 0x5bfc881f, 0xf161d01e, 0x5a921d49, 0xc202a8ad, +0xaa9e9dc4, 0x8211e14d, 0xea945bc4, 0xa5a59180, 0x7ffd5bd0, 0xd6c107bc, +0x3d0e84af, 0x04d13d34, 0xa21f54a3, 0xfcea787b, 0xbe61865b, 0xbe0d9899, +0x336bb04d, 0xf843ae66, 0x8d400981, 0x4359b845, 0xdbda44dd, 0x27392d92, +0x05780a7b, 0xe6dd7f03, 0x13137173, 0x9b623a85, 0x2428f035, 0x996f04de, +0x74613a87, 0x924aa956, 0x4661e3ad, 0x506ce2d3, 0xa59e7aba, 0x34fd455d, +0x70d613c6, 0x094610b9, 0x06e176ee, 0xb4f0842c, 0xc53680f4, 0xd9e2920b, +0xe0ddcd46, 0x8e4c1618, 0xb5c83878, 0x7b5107a3, 0xb75c33c0, 0xa62868d3, +0x804e47d9, 0xcefc87fc, 0xca5e125d, 0x3ed40ea7, 0xe72d3663, 0x06620539, +0x314993c2, 0x99f417d9, 0x4819151c, 0x7d46c8a2, 0x95a81dc9, 0x61898a53, +0x8226bb8c, 0x4907a616, 0x91eb32f7, 0x5430c6a1, 0x390ca234, 0x599f02ff, +0x315a4cc8, 0xc15d9e2b, 0x1c7a8788, 0x2074d5ea, 0xc063a30d, 0x5532e1f5, +0xd3820192, 0x916a7b03, 0x32422c07, 0x2ae2cc41, 0x96cb84c5, 0x2bab3d29, +0x0edc0add, 0x408e4981, 0x2606b671, 0x63dca006, 0x8f4261d9, 0xbfe4623b, +0x60174b80, 0x50230b0d, 0x9d4c7af3, 0x2edb3482, 0x24d8d087, 0x1b673b02, +0xe28b7132, 0xc6c8cb36, 0x5794e3f3, 0x808c3887, 0xf9f64a32, 0xfca10213, +0xff29e373, 0x54bf19a6, 0x16014860, 0x356d4398, 0xe8d0d630, 0x4c8100c0, +0x7b68a462, 0x6cc95c68, 0x3becad35, 0xb2c6b4c3, 0x740aef1c, 0x4f37f2d5, +0xc9d3c805, 0x6e4e533d, 0xf7647967, 0x91856de5, 0x87e7e428, 0xddf2fe07, +0x69016442, 0xe0132159, 0x1afae2a2, 0x63b6d719, 0x08d20a21, 0x48ee7113, +0x2fb2d853, 0xa532ffc8, 0x8296dee2, 0x0dfaf2fa, 0x060d531c, 0xa756d04c, +0x3efed03e, 0xbe9436db, 0x5b9e8a48, 0x0a37ea61, 0x718f4362, 0xebcc9742, +0x78aa2e7c, 0x4b19f7b8, 0x308b9af0, 0x915247e9, 0xc079aa48, 0x5230e578, +0x862d6de7, 0xbe0801d0, 0x8ab11c9d, 0xaf1d7feb, 0xe9d15530, 0x44651202, +0xc006 + +e = +18448 + +k = +6144 + +ncb = +18528 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_CRC_24A_ATTACH + +expected_status = +OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e32256_crc24b_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e32256_crc24b_rm.data new file mode 100644 index 0000000000..9ce68b7231 --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e32256_crc24b_rm.data @@ -0,0 +1,180 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_ENC + +input0 = +0xe5e0a392, 0x6f5468f1, 0xc8f1c505, 0x4502caf2, 0x23df5578, 0xc2f29afe, 0x06838d34, 0x264eab9b, +0x1e97c133, 0xabad27aa, 0x684fa9b4, 0x0fed735e, 0x6ab6bcad, 0x9c3e401a, 0x66a63035, 0xa72f7f6b, +0x509d2953, 0xf03c574a, 0x48f12185, 0x27318395, 0x008fc1ce, 0x7efcf19d, 0x0120de12, 0x6ed28bff, +0x2044547a, 0x04d95124, 0x6baf2e1e, 0x60d93509, 0x299aa27f, 0x8b67d93a, 0xc33d9631, 0xe468dbe1, +0x1a82d0b6, 0x8ee2ff7b, 0x39298170, 0x33a90b6a, 0x273d17f7, 0xb4368615, 0x60c390b8, 0x24696570, +0xa1f4abcc, 0x08b68dd0, 0x91f8c883, 0xc9ceed85, 0x6467da9b, 0x48dfae24, 0xf4ff4992, 0x8c8200cf, +0xaac02792, 0xf506f71d, 0x096df98a, 0x3074be38, 0x9b675626, 0x4ccace33, 0x50f0f60d, 0xf4b59cc4, +0x748a8799, 0x9032c151, 0x1fb945f6, 0x01bd098a, 0x90a7907b, 0xe086172c, 0x7ed3dc8d, 0xea0dd126, +0xf9b35bc1, 0x8ad4e233, 0x37b5e1a1, 0x95bf8c3a, 0x9d288b43, 0x23a860f1, 0x4e993fc3, 0x3c774bd4, +0xe411be48, 0x22ab80c7, 0x9dd09a47, 0xc9e6988e, 0xb4cbf0b2, 0xb9e2a389, 0xf1494438, 0x2c87638b, +0x892468ec, 0x7915d1aa, 0x4d9cb9c4, 0x643a388e, 0x48c4358f, 0x937ad5a1, 0xdae53508, 0xa1305607, +0xbfb63a5c, 0xb4bb9324, 0x71daab0b, 0xa582346b, 0x0e5402e1, 0x75af83e7, 0x2b241b17, 0xfa17aca1, +0x9637cb2e, 0xc61fe511, 0x093934f7, 0x4b703b44, 0x992ab229, 0x4ddc99b5, 0xe2be6b60, 0xa2217861, +0x8f621931, 0x272c0ec6, 0x23a4d5b2, 0xc6f4e002, 0xb76397c0, 0xc00e3c01, 0xb89d29b3, 0x5e9bc984, +0x00391d56, 0x55fae02f, 0x4bc4bc9d, 0x9a147b22, 0x0fb492ed, 0x753dc9a6, 0x9f493eec, 0x6e135dc2, +0x0eeca515, 0x1c1512f9, 0xb88075e3, 0x326a97f0, 0xc755faf5, 0x06b7961b, 0xbd50fd69, 0x5f071c92, +0x2806c099, 0xe364f4ab, 0x2c4a114a, 0x7655b100, 0xf5e66750, 0xf9212705, 0x245e3b8d, 0xb0f1fb0d, +0xd7be9558, 0x27030e24, 0x9ea9b62e, 0xbde9be45, 0xce0adae6, 0xc28780a4, 0x1664ccde, 0xa7a62e3f, +0xa4f8ec00, 0x964e813c, 0x108c95e0, 0x097fe10b, 0x08da3505, 0xde413158, 0x046a31c0, 0xd9cdd804, +0xdfbdff9a, 0xfd77493f, 0xdffb2388, 0xe2ffa111, 0x29eb6ac7, 0xf9e1ac68, 0xc2ed68c7, 0x34d65405, +0x25f187ba, 0x3df23a2c, 0x96a2a5a9, 0x2bef4b26, 0x28d1c41d, 0xf380c0f1, 0xc4d5456e, 0x6b699c28, +0x0aafd6b3, 0xf88f3078, 0x114438d0, 0x93836544, 0xebd5767d, 0x9185b5c2, 0x593e4fe7, 0x29d3348c, +0x881f16c4, 0x77e33d03, 0x6794bbf5, 0x6b6c38f3, 0xa860673a, 0xb1d2d152, 0x08f9f310, 0x82c37500, +0xce0ae34c, 0xd5478e86, 0xcfe1adfc, 0xfaf06d37, 0xf7e21bfc, 0x3b077287, 0x45b33c08, 0x41 + +output0 = +0x25832957, 0x1235fe50, 0xa3b0b09b, 0x0bb7c797, 0xce815b03, 0x7b702251, 0x2c25fc60, 0x23ac55e0, +0x8bea35cb, 0xe33b833c, 0xec1d38a4, 0xb59acb59, 0x0f1fa8b7, 0xcb77fce6, 0x6564fc78, 0x9e6c39cc, +0x94f1bed1, 0xe02684ad, 0x074045a4, 0x4dc9b344, 0xd187bed8, 0x2a129ecb, 0xf6c5bd4d, 0xf98d5c26, +0x78addaae, 0xbe87f7d2, 0xf42a7df6, 0xa4683306, 0xbfa9b509, 0x3a67ddfe, 0x013d68d5, 0xb2a1fb8a, +0x0dfc5da7, 0x792f6b24, 0xaa220ec2, 0x6cb0a7a4, 0xd6e5ea4a, 0x1cd6156c, 0x9bac3cad, 0x926a3950, +0x658815b0, 0x2a2e4349, 0x9684d70f, 0x67a62f63, 0x7a8aae48, 0x8aa046e5, 0x3cad66d5, 0xe7e269b8, +0x95a9a8ca, 0x426f46ae, 0xf780d265, 0x2e0d244d, 0x5480bc07, 0x66554568, 0x938aeda7, 0x1144006c, +0x450320b3, 0xce9dfce9, 0x59a277a8, 0xde38cc1a, 0x1cd2bd60, 0x0079ca20, 0x58dd4633, 0x55398bbd, +0x5fcf982f, 0xdbbd3e30, 0xdcaab5e4, 0xc368c59f, 0xfba8e7d2, 0x9902b581, 0x2ec0a87f, 0x0ebea4ee, +0x13bb2fd2, 0xbc1df5be, 0xe34baa5e, 0x4a66fc5d, 0x7fc9d926, 0x1d2dc178, 0xe780752f, 0x160e82fd, +0x2e6205ba, 0x3d2fd1d7, 0x22b03620, 0x1c1ce57b, 0x5a8f8e09, 0xc9522523, 0x712e5cc0, 0xa27b10ad, +0x52d2df01, 0x3fe886d6, 0x29f37f12, 0x479e3783, 0xa37a445c, 0x338f9df1, 0x74dca176, 0x11acbbc4, +0xac50920a, 0xe9375593, 0xc483a084, 0xed281b58, 0x21ea3cd3, 0x5cf2e76a, 0x50c5e5f4, 0x68d14253, +0x374cea8e, 0xf3533631, 0xb8f1bece, 0x3a188078, 0xb15325de, 0x989b4e70, 0x40f142f9, 0x4a55cc30, +0x72a442b2, 0xe583a6c7, 0x4cb90a7d, 0xe19187c0, 0x899ea4e0, 0x42598555, 0x7d012357, 0x3e9cd281, +0x75094cbb, 0x80afef50, 0x8a834f90, 0xa6182605, 0xdfb7c49e, 0xde57caf6, 0x62720457, 0x5a40705e, +0x2728f823, 0xde22d20c, 0x8389268a, 0x2aad9f81, 0xa376314c, 0xd9288769, 0xa7a1cc5d, 0x1dcdb0ed, +0x0b23e2d8, 0x024e9165, 0x0e375ea5, 0x27c561c7, 0x48687976, 0xe97021bc, 0xbf82aea2, 0x6cb87bd3, +0xaa3f7ed5, 0x1e5c3aaf, 0xccad60b5, 0xb672d5da, 0xde0ff047, 0xf7cd4216, 0x45220a3b, 0x060d16c7, +0xb6dc8617, 0xc10d9dc7, 0x3d229a69, 0x8deea79a, 0xda6883e1, 0x610f41f9, 0xfa0f57f0, 0x6f97b547, +0xf00577ee, 0xe1be3d28, 0x809810e0, 0x7d4b8416, 0xdcc82557, 0xce6a01b1, 0xbc4cb663, 0x8bc88eac, +0xab9e918d, 0x6ec29c41, 0xbd0e745e, 0xa97bc23e, 0x1e1370c2, 0xc2744139, 0xf5d2f67b, 0x9d5ae9dd, +0x1040a10a, 0x1b54944c, 0x9a6810b1, 0xc7079d11, 0x8c89d60d, 0xc9523c76, 0x304b7adc, 0x2fd915eb, +0x076192e8, 0x8cbd3bc1, 0x90440a9c, 0x81961a26, 0x6a53f026, 0xd2b07ce5, 0xc72e767a, 0x9d47c3d9, +0xab2b7cb3, 0xf4b3aeec, 0x18441c12, 0x56b3007f, 0x81c3cfff, 0x128b72ed, 0x214dee41, 0xc735baeb, +0x89cf54e7, 0xcdfce851, 0x77cc0a00, 0x57cc6e0a, 0x7ffc8dad, 0xb036445b, 0x0699a9f7, 0x8781d7b5, +0xdd0f9d01, 0x43f01de8, 0x6a2e7dee, 0xf802d6b3, 0x10094fc1, 0x954cf6ad, 0xd7aee91a, 0x1e3369c8, +0x2acd8c15, 0x3303a61d, 0x79344e4d, 0x1253cd91, 0x34c34c77, 0xbd075dce, 0xe0fdd1cc, 0xf9015c56, +0x931b9096, 0x604f4bbf, 0x3b1d991a, 0x24007891, 0x7c0c1709, 0xe0d43230, 0x11821166, 0xf21e2558, +0x2c37009d, 0x98718786, 0xa9a112e6, 0xd7e20b10, 0xfe917f72, 0xb76101ff, 0x42a8d327, 0x9039f71b, +0x6d1628cb, 0xfd01251c, 0x6f0572a2, 0xb36a7e7a, 0x2b1a4556, 0xe679b027, 0x313573d0, 0xb5f7c20c, +0xc8d1530a, 0x338e756e, 0xe6befc47, 0xfe12dccd, 0x6ad1e5b7, 0x40b078ff, 0x96aaacba, 0xedfdeb8f, +0x8da3673a, 0xc965882e, 0xa4dec6e9, 0x7bace08f, 0xf144852a, 0xd5d787d0, 0x204d32e6, 0x733098aa, +0x12f3a53a, 0xe060086d, 0x3ab1739a, 0xd391e860, 0xc23d9687, 0x0d3a84e0, 0x855ea4cf, 0x0d0ea5b7, +0xfd082430, 0x70df7cb4, 0xe712f026, 0x84ce32ac, 0x67b04602, 0xac0b1faa, 0xed119dcd, 0x184afb0b, +0x9abbefd2, 0x41b3e2f9, 0xe18d5703, 0x6e5f4de7, 0xb47380a2, 0x239a3714, 0x810bb522, 0x5ad95c77, +0xe4b37e0c, 0x1cc200a6, 0x404c4390, 0x90533af1, 0xb49f2403, 0x1dada65f, 0x96f86d1b, 0x58f679a9, +0x1fe3c66d, 0xcc5eb28d, 0x504b7aff, 0x7c18a397, 0x47ad4d5f, 0x348f12c5, 0x80bac6e0, 0x47bb3c74, +0xccf16f02, 0xa932a5af, 0x51ebb452, 0x25808fcc, 0x47d14a43, 0xf0c2a0af, 0x30f938b5, 0x428420c7, +0x61a66d9c, 0x082caa4f, 0xd9c74e3d, 0xb4d161b9, 0xb409f331, 0x14245a44, 0xddb67f1e, 0x1018c62c, +0xc1e58e6d, 0x4ba86bd6, 0xf4a282aa, 0x4a85f90d, 0xbf0efb7b, 0x03706f08, 0xbe06a5f2, 0xe37f45f1, +0xcbc4001c, 0x14decb05, 0xf3c6050f, 0xd1df33d7, 0xdab729c7, 0x8898dad3, 0x4a44a313, 0x30bee51e, +0xd67b07ef, 0xf233eb19, 0x4c52bca3, 0x5d824a4b, 0x275faf2b, 0x428f8a95, 0x03f70c8b, 0x609e4036, +0x59ce2147, 0xc7eecc6b, 0xa22d21c2, 0xc5764d9a, 0xb4524bc6, 0x6d9bdfc9, 0x0918b4f7, 0x62bb8022, +0x7a98bdcc, 0xc963131d, 0x949036b8, 0x649ae51d, 0x93038d33, 0xe26cb45e, 0x4813516a, 0xc06c759c, +0xfa6a9793, 0xdd59c686, 0x37b4b5b0, 0x66a02fac, 0xde159ecf, 0x90cdb66e, 0x1c9f7f94, 0x3a31f69e, +0xcd93bc45, 0x32744ee0, 0x0f6ae2b1, 0x3bc9e963, 0x8cddbae4, 0x8f9517ff, 0x7d304ec1, 0x344e0357, +0x7cd2ed30, 0x1f9fa3a4, 0x9dbeb67b, 0x59253b51, 0x41b6911a, 0x12b574af, 0x62a777da, 0x9a6c834a, +0xaa16081d, 0x3f105c37, 0x6eac5dc0, 0x76e56fd1, 0x67bffbfb, 0xce069b80, 0x8fe970b1, 0x61945ee0, +0xaf9d44c2, 0xf2cd16cc, 0x07a768c5, 0xd6eecaa6, 0x6e8ce063, 0x4b30b443, 0x360822c9, 0xa6442b33, +0xf02d09a0, 0x22056421, 0xc552aa94, 0x1346ea1a, 0xab6c54a1, 0x35a69bdf, 0xfc6095ea, 0xbde0d55a, +0x1b433ec0, 0x137483a0, 0x8c1cb29d, 0xf2bc4e17, 0x45df6882, 0xbd702bc9, 0xabbead61, 0xc97ef61d, +0x01b68438, 0xbdd10231, 0x2e046323, 0x80e619bd, 0xa5126a2a, 0x74106e0d, 0x9e57b499, 0xcb275127, +0x9e01f21e, 0xbaf4a744, 0x38604f7e, 0xa85493d6, 0x9a4b4541, 0x3f397269, 0xdde71734, 0x157dfe98, +0x40334ad9, 0xc889f52f, 0xbddf4d23, 0xd2200018, 0x2a4b7180, 0x8a1a357f, 0xcd6af7e4, 0x1426b52b, +0x2a45481f, 0xfc38394c, 0x05123e4e, 0xa0215834, 0xe2c2306e, 0x4ee9fe1a, 0x6bbbf30c, 0x19a39072, +0x846b0bdf, 0xde4ef7f9, 0x47f1d67c, 0xf507e9e8, 0x14c1f617, 0xaa756ccf, 0xececc02a, 0x183cd616, +0x9d4bac81, 0xd959d1ea, 0xefb81e2b, 0xd8ca27fc, 0x5c7e9eb4, 0x64d5d550, 0x32ed3c41, 0x8f62e8a8, +0x5e2b65c5, 0x0a7e5e1b, 0x88abb657, 0x781ee74a, 0x840c27fd, 0xec83df4c, 0x163acaf0, 0xb2649960, +0x2a706f9a, 0x5226c811, 0x5bcb501c, 0xb87caa99, 0xecb4a37e, 0x8927c424, 0xfea9ac62, 0x17da41d1, +0x571c5987, 0x4217ea55, 0x5043b664, 0x18fb3ece, 0xfb2d13b9, 0xb6599d4b, 0xbb8a536d, 0xa719683f, +0x81cc2d0f, 0xc888f1d3, 0xccb0a428, 0xd2cdff48, 0x0b3440e6, 0x45700619, 0xcea80987, 0xa5ad1cc3, +0xd29deaf7, 0x4a8c95af, 0x9ac63a98, 0xf46d26b0, 0xf9a09352, 0x5f8b3fb7, 0x367c8da1, 0x3244b6a2, +0x9634b973, 0x27292ae5, 0xc4f7ae33, 0x9b73a4f7, 0x086a8bb4, 0x616cd17b, 0x74fdb210, 0x5f483d60, +0xf7666630, 0x107cd026, 0xfa2a4a07, 0x171b319e, 0x509d50c8, 0xf2d15061, 0x981d5759, 0xf23bc5c6, +0xe9befe22, 0x1e784009, 0x7cda3751, 0x1c5b2b69, 0x3ba09115, 0x756f1ef5, 0x2b47353b, 0x553a33d9, +0x1f029262, 0x6393d0ee, 0x97e01180, 0x0c53980c, 0x5da79e34, 0x1e0b53c4, 0x06a9f2ba, 0x622181b0, +0x4898ac50, 0x874c780e, 0xf8cc5072, 0x4a5a63ca, 0xf6dea6a2, 0xc3134004, 0x4505bae6, 0xc3f4b638, +0x0dda8e07, 0x0c4135bf, 0x61e80f25, 0x4b31a76c, 0xd91f0d09, 0x4ba0d577, 0xc95d0086, 0x21a61725, +0x16862c1f, 0x9588795d, 0x6ecde7c4, 0x353288cd, 0x94e4647e, 0xeceaba51, 0x7c602ff8, 0xbba48cef, +0x6556c6bf, 0xde912190, 0x86602d55, 0xf549554a, 0xd4d52081, 0x9728c5db, 0x7d09e129, 0x068008ab, +0x353a6ea4, 0x90b44e4e, 0x5c97a08a, 0x6293b3c7, 0xa3e4114b, 0x7ce44646, 0x8f2b0269, 0x291ca1bb, +0x98721528, 0xe30f5532, 0x0bbb2951, 0x7b7c390a, 0xb835b070, 0x2712e51c, 0xc20fb607, 0x5a05ce52, +0x5eb33cc2, 0x33c8b3a8, 0x81433abe, 0xb99cc5de, 0x817a5bab, 0xc76ffef0, 0xc68fb77c, 0x96c35c46, +0xef1bedc9, 0x42d84a19, 0x54440a6e, 0x3c4b7400, 0xe88bdd94, 0xe1b91c7d, 0xdcdba422, 0xc865625f, +0xaaed9adf, 0x782f8dd7, 0xd267ef7b, 0x366340af, 0x5a9b408a, 0xd6edff9b, 0x8356ad73, 0xbaaf18d0, +0xdf752a1b, 0xb246d2c0, 0xe2209cf7, 0x7b4aaa2a, 0xaeaec406, 0x5dc1665d, 0xcad3ca61, 0x9603b5c9, +0x58012ba9, 0x32945486, 0x78fda0e2, 0xfa326649, 0xe88a7466, 0x6a54aea7, 0x6a56ad08, 0x9e86cbd3, +0x8aaa7c2e, 0x66e45a99, 0x285d26f4, 0x40d2740f, 0xc87be0d2, 0x55844605, 0xd87e6a56, 0x04c036a9, +0x00321b41, 0xc99f5e34, 0x7a87eadc, 0xc3ac9125, 0xdd0be68d, 0xa70cc221, 0x6d340390, 0xb3d88bd5, +0x8cf95295, 0xeb03f3f5, 0x5a4bbedd, 0x56fcc9ad, 0x7a2e3d8c, 0x501bb88f, 0x8cfa9729, 0x4beaee02, +0xfb22ede0, 0x51ef3bb1, 0xa4eac5db, 0xc6df35be, 0x9c6da264, 0x128cf797, 0x58f7d2d1, 0x20d87f0e, +0x56a06be1, 0x127ded22, 0x6b03d2f3, 0x51be2702, 0xe898c0c1, 0x5532a2f5, 0xc2059c2c, 0x07d11ae7, +0xfd1d20ba, 0x6e682d25, 0xff27f183, 0x79339832, 0x47c475e4, 0xd8193faa, 0x1d6a37f3, 0xba4b4cc7, +0x25a910c1, 0x5335c90a, 0x084a987e, 0xb281453c, 0xce33dd8e, 0x7fae16a2, 0x5c4ecf25, 0x2d340555, +0xa4ee8816, 0x651373c3, 0xefeb3c3f, 0x0188871b, 0x55e2ad83, 0xe904173b, 0x2f948fb9, 0xc50c0314, +0x2a24ab54, 0x687a2c47, 0xabd0573e, 0x7908cc94, 0x490a1e1e, 0x555895e8, 0x30722594, 0x291dd817, +0xc0b4ebc3, 0xfa0e5597, 0xf80409f8, 0x6152a038, 0x4bec698a, 0xa56cff7d, 0x4770e57d, 0x04e72526, +0x823fa205, 0x22cd7082, 0x68a2e82d, 0xfa193898, 0x17c3a4d2, 0x7298366a, 0xcadc958d, 0x0cdb7e1a, +0x228eddd1, 0x1459b630, 0xe3552ae0, 0x1c76ec70, 0x96677752, 0x17c28b84, 0xe82a9a0e, 0xbb37fd2b, +0xe357cd86, 0xa5f3aafa, 0x0a56ebc1, 0x57adcddc, 0x007f642b, 0x2c64e1fd, 0xa2b073df, 0x60715c24, +0x6d7861d0, 0xd0796ccb, 0xa29916dc, 0x7eaad923, 0x3618dee8, 0x1094af8d, 0x70051ff6, 0x597ba4ff, +0x70e7fe76, 0xdb83025f, 0x09011eee, 0x44680188, 0x5c72d5b7, 0x1610cb8d, 0x643be6ac, 0xecc8cacb, +0x19d9b888, 0xcc19b4ea, 0x40e7e526, 0x27ecd3eb, 0x01279cba, 0x1794e331, 0x6dbf274c, 0x95de5d2f, +0x14aad0a9, 0x45c90401, 0x0611bb41, 0xd019a189, 0x68dd707c, 0xc563c798, 0xa4c79d2c, 0x5db10eb3, +0x2689fe92, 0xbb137c10, 0xa4c0c9d8, 0xa9610249, 0x056f1268, 0xcb57ae36, 0x62a7270d, 0x349c7dec, +0xc237db79, 0xebcabeba, 0xc421413f, 0x0bf08741, 0xfcfc6f35, 0x28d71e38, 0xe41e24b1, 0xa3bb1ed2, +0x4c757e5c, 0x8f1e95f8, 0xac00d0cc, 0xeca670c7, 0xdfd87ac5, 0x43b4f5c7, 0x997a0f6b, 0x785d6b90, +0xd0197018, 0xdf81defd, 0xd2e73e04, 0x603dabe6, 0xf0148c2f, 0x64df0a91, 0x9aae51c9, 0x93867ced, +0xcc58e131, 0x60daa1d2, 0xe3d43433, 0xd51c9947, 0xcc742731, 0xd0e54c33, 0x1fcddc7b, 0xc06505de, +0x0169991f, 0xb4f43bb9, 0x91a901f6, 0x8017b9d3, 0x70914002, 0x2d03c3c7, 0x1861064e, 0x51821521, +0x03d029ef, 0x7768c872, 0x2a618e19, 0xbe00911a, 0xf927772d, 0x16f0ef1f, 0x3a7d721b, 0x73bf2184, +0x81b20c99, 0x50c2d166, 0x2027da1f, 0xe6a7f756, 0x516435ab, 0x077bb2a2, 0x33076d9e, 0x2fcc1053, +0x3da5507b, 0x58e7861c, 0xcb7f34e3, 0xc1dd6cee, 0x5d7eeb2f, 0x8bf7af16, 0xcaaa0b04, 0xbffe68a9, +0x7aa6d3de, 0x86e8d238, 0x6d9c9e5c, 0x0afe48ea, 0x54a8b2c7, 0x7d081d4f, 0x24635e7d, 0x83a90ad2, +0x5faa3307, 0x86d02631, 0x3ba7090e, 0x890ea613, 0x6379381d, 0x43082edc, 0x45fadca0, 0x507a5be8, +0x4002d3e0, 0xcd47db8f, 0x016f02f7, 0x2cc37a2e, 0x6b2440e8, 0xf0a17a06, 0xd1d9ccba, 0xb4bfd01e, +0xfb2e8da1, 0x2b9eafb9, 0x78351034, 0xd5741ede, 0x0728eaf6, 0x7943413b, 0x502b32a2, 0xcd7517b8, +0xebc7a095, 0x0c604a3e, 0x3404c921, 0xa5130fc4, 0x49320039, 0x6afa45fb, 0xdfb6d1d1, 0x9f976a89, +0x6edc8665, 0x25dbf831, 0xa4f7cfec, 0x317a09b5, 0xdaf4c587, 0x28517cd4, 0x6b0c4ef3, 0xcb4307a8, +0xff2670b4, 0x53faca1c, 0x4e2b952a, 0xf8c81cb5, 0xad345402, 0x0cfa7a14, 0x8f530b2f, 0x08720c93, +0xdac62944, 0xa2fa1466, 0xecd483c0, 0x1d969b7d, 0x301f431b, 0xa245449b, 0xfbe74141, 0x61ccd26d, +0xeed80681, 0xba661d5c, 0x2aa8ba84, 0x98df402f, 0xb0bfa754, 0xf786f0eb, 0x502a3f00, 0x5714ef6b, +0x0cc031fe, 0xbd5cb04c, 0x5cf040e1, 0x3d733d6f, 0x9b721cfd, 0xa93dad7d, 0x343a8188, 0x5beea144, +0x77f00ee3, 0xb39e61bd, 0xc53b2a3f, 0xa8b4c424, 0xf5bad225, 0xa85879f2, 0xcfb028f4, 0x09643370, +0x1c7204e6, 0xcebc96e5, 0x12227cec, 0xd7a429da, 0xb5645c6c, 0xf99d4c2b, 0x417bdfb6, 0x0b289280, +0xd9cb2cb6, 0x36d1a187, 0x69839b3c, 0x59de4109, 0xd03843a6, 0x46eb3539, 0x11a526ce, 0x56c78934, +0x763909cc, 0x656ca8af, 0x5b0bdb9d, 0xfac27a43, 0xe1f96c06, 0x6cebe65d, 0xf94709d9, 0x63efc9f1, +0xc95ba413, 0xe704de3c, 0x261e2b43, 0x9c3ef6a0, 0xad4bbe93, 0x79f1cfd8, 0xe314fc58, 0x3470d507, +0xdd0e43e3, 0x394aca27, 0x6bbbf7f1, 0xb213d5e9, 0x1ba99155, 0x4bf71a64, 0x7aa72d51, 0x36a82476, +0x81d0a1c9, 0xc175a36a, 0xda05fc03, 0xfe16edc6, 0xbbbf6f57, 0xb00978f6, 0x0e17eb6c, 0xe905fe98, +0x49241c46, 0x6cc1fcda, 0x8a562cdf, 0xae6c7a70, 0x083e66ed, 0x433be4c6, 0x2092bc04, 0xb4326383, +0x92006a4a, 0x401602df, 0xa54a2952, 0xa4ae512c, 0x46153a61, 0xbaf9bdca, 0x56a95e63, 0x5eadc50f, +0xe403dc0b, 0x3708ba31, 0x21db3941, 0xeb74c1c8, 0x8d2628cf, 0xb7925cf4, 0xdb1ad60b, 0x67dfb1ea, +0x4b8893ec, 0x2d101360, 0x3036d21b, 0x9ed1eb42, 0xa1a60268, 0xe1d6502a, 0x459b4907, 0x1275e279, +0x20efb17c, 0x7f4ae419, 0xf6e4a74b, 0x35698d03, 0x5414844a, 0x2397a6b9, 0x7e41f393, 0xe78fd97d + +e = +32256 + +k = +6144 + +ncb = +18528 + +rv_index = +0 + +code_block_mode = +1 + +op_flags = +RTE_BBDEV_TURBO_RATE_MATCH, RTE_BBDEV_TURBO_CRC_24B_ATTACH + +expected_status = +OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c3_k4800_r2_e14412_crc24b.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c3_k4800_r2_e14412_crc24b.data new file mode 100644 index 0000000000..9e17429d3e --- /dev/null +++ b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c3_k4800_r2_e14412_crc24b.data @@ -0,0 +1,153 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +op_type = +RTE_BBDEV_OP_TURBO_ENC + +input0 = +0xb0fe86aa, 0xffbf2968, 0x4f55a631, 0xf2152dbc, 0x195a49a5, 0xa4aa7c6c, +0x48a7be38, 0xd32c84f2, 0xb040da60, 0xb39eb07c, 0x3443aad6, 0x19f52e13, +0xb2914341, 0x0d5dfdb3, 0x1ba8aec0, 0x62d0c7be, 0x1d55475c, 0x10f7dd79, +0x967e5333, 0xc0d524c1, 0xdca8da87, 0x1146ecf7, 0xfa09a85c, 0x83be800f, +0x11b814cc, 0x362a4704, 0x4f22e7ce, 0x9985a0e2, 0x9de4be72, 0x488a45b3, +0x6996ade2, 0xdb18c09a, 0x487d62a3, 0x94f82d13, 0xa0743f83, 0x75d2f5dd, +0x0e470346, 0x6e2ec2e5, 0x1a67fe5f, 0xc369330d, 0x860e8766, 0x42c110f6, +0x804a9985, 0x55db02b4, 0xb899fc5c, 0x57811d20, 0xda4f1f9d, 0x2a2efc30, +0x953e7487, 0x4b0c3065, 0x247d5d47, 0xdde382e7, 0x1d6d2ad7, 0x4358ac24, +0x2d0fd97f, 0x1483821e, 0xf6c74ee5, 0x23b5c2f4, 0x95d4a5fc, 0x486f370b, +0x8dbae43d, 0x248f17d5, 0x2df76099, 0xd19ec872, 0xf592aa0e, 0x8de04c3c, +0x3ada94fb, 0x9dd001a3, 0x2b4db6d1, 0x791cf495, 0x57dc764b, 0x21789f1f, +0x0d38adf5, 0xd8cefdc2, 0xed98f8bf, 0x024bc4ed, 0x4f9d3062, 0x332d27c5, +0xde70ad4e, 0xd85872d2, 0x5d0e29c0, 0xa4fd1887, 0x3fa67ba1, 0x46b9b008, +0x055bbf61, 0xf78e59f0, 0x287d2e3b, 0x5b473fe7, 0xd7ad6e04, 0x9cdf4986, +0x830432ae, 0xffded1ba, 0x35c00f77, 0xcf0a6648, 0x196c03aa, 0xba4e2dd3, +0xdaf70fe4, 0x883de2cd, 0xedc3b52e, 0x14e638c1, 0xe607103a, 0xc4cfb700, +0x4ed9843d, 0xc442a0cb, 0xc0d3bba2, 0x36789ba8, 0x9c9b7a24, 0xb943b6a4, +0x8f2c6879, 0x0fb16a0c, 0x2677bada, 0xd14f2f7e, 0x662ec398, 0x1e37b7ae, +0x8ad0312d, 0x21adb6a1, 0x072a11fd, 0x7ae828d1, 0xb510655f, 0x09f7b477, +0x10a175fc, 0xb7086f51, 0x24546af3, 0xfae81b50, 0xcb328832, 0x63693615, +0xa37c3678, 0x15fb6364, 0xb5f75a78, 0xfa9aa5f6, 0x03804a0e, 0x1d245890, +0x06d6cdcd, 0x7485a3c7, 0x35a008ae, 0x1abeaf1c, 0xd9c55966, 0x2b694666, +0x5341f2df, 0xcb647280, 0xfb88d81e, 0xf99a44d0, 0xb0585534, 0x0877b530, +0x752ab39a, 0xd493d8bc, 0xfaa6a57a, 0xccb7c008, 0x9c35994b, 0xb8 + +output0 = +0xb0fe86aa, 0xffbf2968, 0x4f55a631, 0xf2152dbc, 0x195a49a5, 0xa4aa7c6c, +0x48a7be38, 0xd32c84f2, 0xb040da60, 0xb39eb07c, 0x3443aad6, 0x19f52e13, +0xb2914341, 0x0d5dfdb3, 0x1ba8aec0, 0x62d0c7be, 0x1d55475c, 0x10f7dd79, +0x967e5333, 0xc0d524c1, 0xdca8da87, 0x1146ecf7, 0xfa09a85c, 0x83be800f, +0x11b814cc, 0x362a4704, 0x4f22e7ce, 0x9985a0e2, 0x9de4be72, 0x488a45b3, +0x6996ade2, 0xdb18c09a, 0x487d62a3, 0x94f82d13, 0xa0743f83, 0x75d2f5dd, +0x0e470346, 0x6e2ec2e5, 0x1a67fe5f, 0xc369330d, 0x860e8766, 0x42c110f6, +0x804a9985, 0x55db02b4, 0xb899fc5c, 0x57811d20, 0xda4f1f9d, 0x2a2efc30, +0x953e7487, 0x4b0c3065, 0x247d5d47, 0xdde382e7, 0x1d6d2ad7, 0x4358ac24, +0x2d0fd97f, 0x1483821e, 0xf6c74ee5, 0x23b5c2f4, 0x95d4a5fc, 0x486f370b, +0x8dbae43d, 0x248f17d5, 0x2df76099, 0xd19ec872, 0xf592aa0e, 0x8de04c3c, +0x3ada94fb, 0x9dd001a3, 0x2b4db6d1, 0x791cf495, 0x57dc764b, 0x21789f1f, +0x0d38adf5, 0xd8cefdc2, 0xed98f8bf, 0x024bc4ed, 0x4f9d3062, 0x332d27c5, +0xde70ad4e, 0xd85872d2, 0x5d0e29c0, 0xa4fd1887, 0x3fa67ba1, 0x46b9b008, +0x055bbf61, 0xf78e59f0, 0x287d2e3b, 0x5b473fe7, 0xd7ad6e04, 0x9cdf4986, +0x830432ae, 0xffded1ba, 0x35c00f77, 0xcf0a6648, 0x196c03aa, 0xba4e2dd3, +0xdaf70fe4, 0x883de2cd, 0xedc3b52e, 0x14e638c1, 0xe607103a, 0xc4cfb700, +0x4ed9843d, 0xc442a0cb, 0xc0d3bba2, 0x36789ba8, 0x9c9b7a24, 0xb943b6a4, +0x8f2c6879, 0x0fb16a0c, 0x2677bada, 0xd14f2f7e, 0x662ec398, 0x1e37b7ae, +0x8ad0312d, 0x21adb6a1, 0x072a11fd, 0x7ae828d1, 0xb510655f, 0x09f7b477, +0x10a175fc, 0xb7086f51, 0x24546af3, 0xfae81b50, 0xcb328832, 0x63693615, +0xa37c3678, 0x15fb6364, 0xb5f75a78, 0xfa9aa5f6, 0x03804a0e, 0x1d245890, +0x06d6cdcd, 0x7485a3c7, 0x35a008ae, 0x1abeaf1c, 0xd9c55966, 0x2b694666, +0x5341f2df, 0xcb647280, 0xfb88d81e, 0xf99a44d0, 0xb0585534, 0x0877b530, +0x752ab39a, 0xd493d8bc, 0xfaa6a57a, 0xccb7c008, 0x9c35994b, 0x47ee26b8, +0x94f624ac, 0xa3bd4876, 0xf7d4854e, 0x8871d433, 0x9321d942, 0x7b626be8, +0x72c934b0, 0x3b7af8a4, 0x5102c29f, 0x710e4dbc, 0x99708292, 0x1458c4c1, +0x61026bc5, 0xe776e388, 0x4a0222b3, 0x760e5aaf, 0x662f3583, 0x5ab1005b, +0xe527ef70, 0x4170d611, 0x307bebc4, 0xfdd00caf, 0xbaae1044, 0xcab4d459, +0x38281dcf, 0x90580c89, 0x49cf5986, 0xa27da769, 0xceced49b, 0x5ea37953, +0x8a7e6c1c, 0x1e01b4e2, 0xe08026ae, 0x3754534a, 0x903b0ecf, 0x65f97a55, +0x90798ed9, 0x9d1133bc, 0xe356a39f, 0xe47acbce, 0x01ccf326, 0x1954fd3d, +0x240e69f8, 0x1da20bb4, 0xe1ab1684, 0x44c65d48, 0xd265e6c2, 0x51d4ef07, +0x000970ef, 0xfeb939f4, 0x5dcc0132, 0x2bd27ae5, 0xba5dbd25, 0xa9d190e4, +0x61556bec, 0x7fd6caba, 0x7fe312cb, 0xdd319413, 0x92a5dbbf, 0x17e61915, +0x56067b67, 0x3dc348c0, 0x58c17fe0, 0xbe6bffcc, 0xd379026c, 0xc4174780, +0xcce7f026, 0xb74b7eb0, 0xe4d5f625, 0x6bc16d3b, 0xff3e300e, 0x83f0d55a, +0xf2e537df, 0x75c18f78, 0xa5458d1a, 0x47c778b0, 0x92eb8716, 0xcb5816fd, +0xc2cc7079, 0xa7f1dc75, 0xed9e5ffa, 0xb7d6747f, 0xa2dc6907, 0x99b4d187, +0x69f3138a, 0xbd285a1f, 0xb8ee18e0, 0x734b77a5, 0xc0700f69, 0x6c72a77a, +0x76609ba9, 0xcfae9b73, 0x2cd329f0, 0x0d45aa12, 0x419fbcd7, 0x03e00f00, +0x0effee99, 0x7f879eb4, 0x29a4c8df, 0x4432400a, 0x22b9cf55, 0xa1c4c645, +0x200251b0, 0xff293906, 0xe11288e2, 0xde1e8ec7, 0x675752d1, 0x9630743e, +0xd848c67e, 0x1eedfda9, 0x58b954fc, 0xa0dc7f1c, 0x0aea313e, 0x062b9449, +0x0f17e57f, 0x96def6ec, 0x2ba45f14, 0xd9a5f8c5, 0x231483c8, 0x29b8783e, +0xa6d24594, 0x1a62ffcd, 0x54c87a7f, 0x6fa9ca9a, 0xfff0f890, 0x51d6ae46, +0xa96e82b0, 0x68cd9808, 0x56214df5, 0x2169defa, 0x72c1ecce, 0x2448e3c9, +0x8eb2b3b3, 0x62c89c11, 0xbba20ee2, 0xea33f53a, 0x8b96a6b8, 0x9d33d551, +0x363bd14e, 0x5fdd2b5f, 0xf8187546, 0xb692beab, 0x8df6b4c0, 0x753e2302, +0xb90f7a37, 0x2b6bac6a, 0x13a07bc5, 0xb67f6d2b, 0x47b21569, 0xc2ab143f, +0xf86ce30a, 0xde2dab70, 0x6f258860, 0x2878735c, 0x2aaeac20, 0xda80fb3e, +0xe7a8ccf6, 0xbf011844, 0x40a610f8, 0x82f3fdf7, 0xadc4ec2c, 0xb8551030, +0x76004380, 0xa384ff18, 0x080cf587, 0x6c4991d3, 0x2daea9aa, 0xa92d0c4f, +0x4a9d117e, 0x2761f025, 0x96b40443, 0x57a82be4, 0x62374c44, 0x55dc64ae, +0x28aa9f0c, 0x03a3b963, 0x41dbaa26, 0xb3c23735, 0x971cbd31, 0x939a9f80, +0x76439fdc, 0xa9df79d6, 0x926ae3e2, 0x5ee75745, 0xf2396e52, 0xe18bd816, +0x3f9834b9, 0x816a07bc, 0x8f873310, 0x45cf9b96, 0x0ce634dd, 0xe64a16d9, +0x2733775a, 0x2b648c7e, 0xe600ee8e, 0xd99d8ae3, 0x10dadf2a, 0x904d3f87, +0x3963e9e7, 0x47fcce89, 0xc256c898, 0x7db6cb66, 0xe1611a8b, 0xed81b10d, +0x75eff974, 0x8a0a3d67, 0xa44311ff, 0x6f876783, 0x43dc93ce, 0x88616a33, +0xa8706e8f, 0x33a2cbed, 0x3a6d20c3, 0x55175086, 0x39680945, 0x2d779a7b, +0x0818a4ce, 0x55558918, 0xf7c08d35, 0x980a3038, 0x9cf068db, 0x3385d333, +0xd81b33fb, 0x188018d5, 0x47c57bd3, 0x9ec2324f, 0x6901cd77, 0xc3bac44f, +0x4d96aba8, 0x9094da5b, 0xa67a1353, 0x1fdfc4db, 0xa2fbeefa, 0xab4828e3, +0x37d1db45, 0x0d33b3e9, 0x1ad72bb9, 0x7257bf9c, 0x2ec35167, 0xa4488b7f, +0xf9dae588, 0x1038905a, 0x88ddf410, 0xaac11693, 0x24ac025d, 0x56cefbb5, +0x6afe7f59, 0xc7f989e8, 0x15872570, 0x1bf16cdb, 0xfe9c93ce, 0x1fc9a076, +0x85d37185, 0x1078cd31, 0xe1cd0327, 0x6d5315bc, 0x298cd836, 0xc8e21f06, +0xe561c32d, 0x8ec404b4, 0x4d39bfbb, 0x24ede8c8, 0x451d6034, 0x3bafeea2, +0x202f0ccf, 0x1fad37ce, 0xf04b5693, 0xeee57cd9, 0x5ef70007, 0x018e8a4f, +0xfa61c9a9, 0x09989fcf, 0xe66b558b, 0x966efd48, 0x7525021d, 0xe7978b5e, +0x7eb1d6dc, 0xa10c5e5b, 0xb7815e69, 0x7d486cfb, 0xcffdeb2a, 0x7375cb32, +0x599008dc, 0xff91c796, 0x560ed4ad, 0x14e9a876, 0xfccf6a66, 0xa58be028, +0xea9d408b, 0x3afc373b, 0xee008458, 0x19b6042e, 0x84806314, 0x431a4ba4, +0x009ad6a1, 0xd7c62bf4, 0x1bebecba, 0x5c662f69, 0x83bfdea1, 0x45872a9a, +0x00c9 + + +ea = +14412 + +eb = +14412 + +cab = +4 + +c = +4 + +c_neg = +0 + +k_pos = +4800 + +k_neg = +4736 + +ncb_pos = +14496 + +ncb_neg = +14304 + +r = +2 + +rv_index = +0 + +code_block_mode = +0 + +op_flags = +RTE_BBDEV_TURBO_CRC_24B_ATTACH + +expected_status = +OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/turbo_dec_default.data b/targets/ARCH/test-bbdev/turbo_dec_default.data new file mode 120000 index 0000000000..371cbc692d --- /dev/null +++ b/targets/ARCH/test-bbdev/turbo_dec_default.data @@ -0,0 +1 @@ +test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/turbo_enc_default.data b/targets/ARCH/test-bbdev/turbo_enc_default.data new file mode 120000 index 0000000000..a2bc833c12 --- /dev/null +++ b/targets/ARCH/test-bbdev/turbo_enc_default.data @@ -0,0 +1 @@ +test_vectors/turbo_enc_c1_k6144_r0_e18444.data \ No newline at end of file From 030aa253e8e7ab58838318942d6ad6dd398168dc Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 18 Jun 2021 15:28:04 +0200 Subject: [PATCH 002/136] adding temporarily bbdev testsuite in ldpc_decoder_offload to check t1 card connection --- cmake_targets/CMakeLists.txt | 6 +- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 432 +++++++++++++++++- openair1/PHY/CODING/nrLDPC_defs.h | 7 +- openair1/PHY/CODING/nrLDPC_extern.h | 4 + openair1/PHY/CODING/nrLDPC_load.c | 11 + openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 2 +- openair1/SIMULATION/NR_PHY/ulsim.c | 1 + targets/ARCH/test-bbdev/test_bbdev_perf.c | 10 +- targets/ARCH/test-bbdev/test_bbdev_vector.c | 8 +- 9 files changed, 457 insertions(+), 24 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 636ac6006c..2d3f422072 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -824,7 +824,8 @@ include_directories ("/usr/local/include") set(HWLIB_LDPC_OFFLOAD_SOURCE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c -# ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev.c + ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev.c +# ${OPENAIR_TARGETS}/ARCH/test-bbdev/main.c ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_perf.c ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_vector.c ) @@ -832,7 +833,7 @@ add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include") -SET(T1_DPDK_LIBS "-Wl,-rpath,/home/wang/dpdk-20.05/build/include -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_atlantic -lrte_pmd_avp -lrte_pmd_axgbe -lrte_pmd_bond -lrte_pmd_bnx2x -lrte_pmd_bnxt -lrte_pmd_cxgbe -lrte_pmd_dpaa -lrte_pmd_dpaa2 -lrte_pmd_e1000 -lrte_pmd_ena -lrte_pmd_enetc -lrte_pmd_enic -lrte_pmd_failsafe -lrte_pmd_fm10k -lrte_pmd_i40e -lrte_pmd_hinic -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_turbo_sw -lrte_pmd_bbdev_fpga_lte_fec -lrte_pmd_bbdev_fpga_5gnr_fec -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") +SET(T1_DPDK_LIBS "-Wl,-rpath,/usr/local/include -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_atlantic -lrte_pmd_avp -lrte_pmd_axgbe -lrte_pmd_bond -lrte_pmd_bnx2x -lrte_pmd_bnxt -lrte_pmd_cxgbe -lrte_pmd_dpaa -lrte_pmd_dpaa2 -lrte_pmd_e1000 -lrte_pmd_ena -lrte_pmd_enetc -lrte_pmd_enic -lrte_pmd_failsafe -lrte_pmd_fm10k -lrte_pmd_i40e -lrte_pmd_hinic -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_turbo_sw -lrte_pmd_bbdev_fpga_lte_fec -lrte_pmd_bbdev_fpga_5gnr_fec -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") TARGET_LINK_LIBRARIES(ldpc_offload ${T1_DPDK_LIBS}) TARGET_LINK_LIBRARIES(ldpc_offload pthread dl rt m numa) @@ -2818,6 +2819,7 @@ if (CUDA_FOUND) add_dependencies( nr-uesoftmodem ldpc_cuda) add_dependencies( nr-softmodem ldpc_cuda) endif (CUDA_FOUND) + ###################################" # Addexecutables for tests #################################### diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 8a54e9e8ff..6b4038a964 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -68,12 +68,14 @@ #include #include #include +#include "../../../targets/ARCH/test-bbdev/main.h" +#include "../../../targets/ARCH/test-bbdev/test_bbdev_vector.h" #define MAX_QUEUES RTE_MAX_LCORE #define TEST_REPETITIONS 1000 /* Switch between PMD and Interrupt for throughput TC */ static bool intr_enabled; - +static struct test_bbdev_vector test_vector; /* LLR arithmetic representation for numerical conversion */ static int ldpc_llr_decimals; static int ldpc_llr_size; @@ -144,7 +146,7 @@ struct thread_params { static const char tc_sep = ','; /* Declare structure for command line test parameters and options */ -/*static struct test_params { +static struct test_params { struct test_command *test_to_run[MAX_CMDLINE_TESTCASES]; unsigned int num_tests; unsigned int num_ops; @@ -164,7 +166,84 @@ add_test_command(struct test_command *t) { TAILQ_INSERT_TAIL(&commands_list, t, next); } +int +unit_test_suite_runner(struct unit_test_suite *suite) +{ + int test_result = TEST_SUCCESS; + unsigned int total = 0, skipped = 0, succeeded = 0, failed = 0; + uint64_t start, end; + printf("\n===========================================================\n"); + printf("Starting Test Suite : %s\n", suite->suite_name); + + start = rte_rdtsc_precise(); + + if (suite->setup) { + test_result = suite->setup(); + if (test_result == TEST_FAILED) { + printf(" + Test suite setup %s failed!\n", + suite->suite_name); + printf(" + ------------------------------------------------------- +\n"); + return 1; + } + if (test_result == TEST_SKIPPED) { + printf(" + Test suite setup %s skipped!\n", + suite->suite_name); + printf(" + ------------------------------------------------------- +\n"); + return 0; + } + } + + while (suite->unit_test_cases[total].testcase) { + if (suite->unit_test_cases[total].setup) + test_result = suite->unit_test_cases[total].setup(); + + if (test_result == TEST_SUCCESS) + test_result = suite->unit_test_cases[total].testcase(); + + if (suite->unit_test_cases[total].teardown) + suite->unit_test_cases[total].teardown(); + + if (test_result == TEST_SUCCESS) { + succeeded++; + printf("TestCase [%2d] : %s passed\n", total, + suite->unit_test_cases[total].name); + } else if (test_result == TEST_SKIPPED) { + skipped++; + printf("TestCase [%2d] : %s skipped\n", total, + suite->unit_test_cases[total].name); + } else { + failed++; + printf("TestCase [%2d] : %s failed\n", total, + suite->unit_test_cases[total].name); + } + + total++; + } + + /* Run test suite teardown */ + if (suite->teardown) + suite->teardown(); + + end = rte_rdtsc_precise(); + + printf(" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\n"); + printf(" + Test Suite Summary : %s\n", suite->suite_name); + printf(" + Tests Total : %2d\n", total); + printf(" + Tests Skipped : %2d\n", skipped); + printf(" + Tests Passed : %2d\n", succeeded); + printf(" + Tests Failed : %2d\n", failed); + printf(" + Tests Lasted : %lg ms\n", + ((end - start) * 1000) / (double)rte_get_tsc_hz()); + printf(" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\n"); + + return (failed > 0) ? 1 : 0; +} +const char * +get_vector_filename(void) +{ + return test_params.test_vector_filename; +} unsigned int get_num_ops(void) { @@ -200,7 +279,156 @@ get_init_device(void) { return test_params.init_device; } +static void +print_usage(const char *prog_name) +{ + struct test_command *t; + printf("***Usage: %s [EAL params] [-- [-n/--num-ops NUM_OPS]\n" + "\t[-b/--burst-size BURST_SIZE]\n" + "\t[-v/--test-vector VECTOR_FILE]\n" + "\t[-c/--test-cases TEST_CASE[,TEST_CASE,...]]]\n", + prog_name); + + printf("Available testcases: "); + TAILQ_FOREACH(t, &commands_list, next) + printf("%s ", t->command); + printf("\n"); +} + +static int +parse_args(int argc, char **argv, struct test_params *tp) +{ + int opt, option_index; + unsigned int num_tests = 0; + bool test_cases_present = false; + bool test_vector_present = false; + struct test_command *t; + char *tokens[MAX_CMDLINE_TESTCASES]; + int tc, ret; + + static struct option lgopts[] = { + { "num-ops", 1, 0, 'n' }, + { "burst-size", 1, 0, 'b' }, + { "test-cases", 1, 0, 'c' }, + { "test-vector", 1, 0, 'v' }, + { "lcores", 1, 0, 'l' }, + { "snr", 1, 0, 's' }, + { "iter_max", 6, 0, 't' }, + { "init-device", 0, 0, 'i'}, + { "help", 0, 0, 'h' }, + { NULL, 0, 0, 0 } + }; + tp->iter_max = DEFAULT_ITER; + + while ((opt = getopt_long(argc, argv, "hin:b:c:v:l:s:t:", lgopts, + &option_index)) != EOF) + switch (opt) { + case 'n': + TEST_ASSERT(strlen(optarg) > 0, + "Num of operations is not provided"); + tp->num_ops = strtol(optarg, NULL, 10); + break; + case 'b': + TEST_ASSERT(strlen(optarg) > 0, + "Burst size is not provided"); + tp->burst_sz = strtol(optarg, NULL, 10); + TEST_ASSERT(tp->burst_sz <= MAX_BURST, + "Burst size mustn't be greater than %u", + MAX_BURST); + break; + case 'c': + TEST_ASSERT(test_cases_present == false, + "Test cases provided more than once"); + test_cases_present = true; + + ret = rte_strsplit(optarg, strlen(optarg), + tokens, MAX_CMDLINE_TESTCASES, tc_sep); + + TEST_ASSERT(ret <= MAX_CMDLINE_TESTCASES, + "Too many test cases (max=%d)", + MAX_CMDLINE_TESTCASES); + + for (tc = 0; tc < ret; ++tc) { + /* Find matching test case */ + TAILQ_FOREACH(t, &commands_list, next) + if (!strcmp(tokens[tc], t->command)) + tp->test_to_run[num_tests] = t; + + TEST_ASSERT(tp->test_to_run[num_tests] != NULL, + "Unknown test case: %s", + tokens[tc]); + ++num_tests; + } + break; + case 'v': + TEST_ASSERT(test_vector_present == false, + "Test vector provided more than once"); + test_vector_present = true; + + TEST_ASSERT(strlen(optarg) > 0, + "Config file name is null"); + + snprintf(tp->test_vector_filename, + sizeof(tp->test_vector_filename), + "%s", optarg); + break; + case 's': + TEST_ASSERT(strlen(optarg) > 0, + "SNR is not provided"); + tp->snr = strtod(optarg, NULL); + break; + case 't': + TEST_ASSERT(strlen(optarg) > 0, + "Iter_max is not provided"); + tp->iter_max = strtol(optarg, NULL, 10); + break; + case 'l': + TEST_ASSERT(strlen(optarg) > 0, + "Num of lcores is not provided"); + tp->num_lcores = strtol(optarg, NULL, 10); + TEST_ASSERT(tp->num_lcores <= RTE_MAX_LCORE, + "Num of lcores mustn't be greater than %u", + RTE_MAX_LCORE); + break; + case 'i': + /* indicate fpga fec config required */ + tp->init_device = true; + break; + case 'h': + print_usage(argv[0]); + return 0; + default: + printf("ERROR: Unknown option: -%c\n", opt); + return -1; + } + + if (tp->num_ops == 0) { + printf( + "WARNING: Num of operations was not provided or was set 0. Set to default (%u)\n", + DEFAULT_OPS); + tp->num_ops = DEFAULT_OPS; + } + if (tp->burst_sz == 0) { + printf( + "WARNING: Burst size was not provided or was set 0. Set to default (%u)\n", + DEFAULT_BURST); + tp->burst_sz = DEFAULT_BURST; + } + if (tp->num_lcores == 0) { + printf( + "WARNING: Num of lcores was not provided or was set 0. Set to value from RTE config (%u)\n", + rte_lcore_count()); + tp->num_lcores = rte_lcore_count(); + } + + TEST_ASSERT(tp->burst_sz <= tp->num_ops, + "Burst size (%u) mustn't be greater than num ops (%u)", + tp->burst_sz, tp->num_ops); + + tp->num_tests = num_tests; + return 0; +} static int run_all_tests(void) { @@ -224,37 +452,221 @@ run_parsed_tests(struct test_params *tp) return ret; } -*/ -int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint32_t F, int8_t* w, int8_t* p_out) + +static void +create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op) +{ + unsigned int i; + struct op_data_entries *entry; + + op->ldpc_dec = test_vector.ldpc_dec; + entry = &test_vector.entries[DATA_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->ldpc_dec.input.length += + entry->segments[i].length; + if (test_vector.ldpc_dec.op_flags & + RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) { + entry = &test_vector.entries[DATA_HARQ_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->ldpc_dec.harq_combined_input.length += + entry->segments[i].length; + } +} +/* Read flag value 0/1 from bitmap */ +static inline bool +check_bit(uint32_t bitmap, uint32_t bitmask) +{ + return bitmap & bitmask; +} +static void +copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, + unsigned int start_idx, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *hard_outputs, + struct rte_bbdev_op_data *soft_outputs, + struct rte_bbdev_op_data *harq_inputs, + struct rte_bbdev_op_data *harq_outputs, + struct rte_bbdev_dec_op *ref_op) +{ + unsigned int i; + struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; + struct rte_mbuf *m = inputs->data; + + for (i = 0; i < n; ++i) { + if (ldpc_dec->code_block_mode == 0) { + ops[i]->ldpc_dec.tb_params.ea = + ldpc_dec->tb_params.ea; + ops[i]->ldpc_dec.tb_params.eb = + ldpc_dec->tb_params.eb; + ops[i]->ldpc_dec.tb_params.c = + ldpc_dec->tb_params.c; + ops[i]->ldpc_dec.tb_params.cab = + ldpc_dec->tb_params.cab; + ops[i]->ldpc_dec.tb_params.r = + ldpc_dec->tb_params.r; + printf("code block ea %d eb %d c %d cab %d r %d\n",ldpc_dec->tb_params.ea,ldpc_dec->tb_params.eb,ldpc_dec->tb_params.c, ldpc_dec->tb_params.cab, ldpc_dec->tb_params.r); + } else { + ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; + } + + ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; + ops[i]->ldpc_dec.z_c = ldpc_dec->z_c; + ops[i]->ldpc_dec.q_m = ldpc_dec->q_m; + ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler; + ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; + ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; + ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; + ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags; + ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; + + printf("reference bg %d zc %d qm %d nfiller n_filler, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); + +if (i<10) +printf("input %x\n",inputs[start_idx+i]); + + if (hard_outputs != NULL) + ops[i]->ldpc_dec.hard_output = + hard_outputs[start_idx + i]; + if (inputs != NULL) + ops[i]->ldpc_dec.input = + inputs[start_idx + i]; + if (soft_outputs != NULL) + ops[i]->ldpc_dec.soft_output = + soft_outputs[start_idx + i]; + if (harq_inputs != NULL) + ops[i]->ldpc_dec.harq_combined_input = + harq_inputs[start_idx + i]; + if (harq_outputs != NULL) + ops[i]->ldpc_dec.harq_combined_output = + harq_outputs[start_idx + i]; + +// if (i<10) +//printf("ldpc_dec input %x\n",*ops[i]->ldpc_dec.input->data->buf_addr); + + + + + } +} +int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats* p_profiler) +//int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint32_t F, int8_t* w, int8_t* p_out) { uint32_t numIter = 0; struct thread_params *t_params_tp; + /* Allocate memory for thread parameters structure */ uint16_t num_lcores=1; - /*uint16_t enq, deq; + /* t_params_tp = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), + RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(t_params_tp, "Failed to alloc %zuB for t_params", + RTE_ALIGN(sizeof(struct thread_params) * num_lcores, + RTE_CACHE_LINE_SIZE)); + */ + uint16_t enq, deq; const uint16_t queue_id = 1; //tp->queue_id; const uint16_t burst_sz = 128; //tp->op_params->burst_sz; const uint16_t num_ops = 128; //tp->op_params->num_to_process; struct rte_bbdev_dec_op *ops_enq[num_ops]; struct rte_bbdev_dec_op *ops_deq[num_ops]; + struct thread_params *tp=&t_params_tp[0]; + // struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; struct test_buffers *bufs = NULL; int i, j, ret; struct rte_bbdev_info info; uint16_t num_to_enq; - */ - bool extDdr = check_bit(ldpc_cap_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + +//int ret; +int argc_re=4; +char *argv_re[15]; +argv_re[0] = "./build/app/testbbdev"; +argv_re[1] = "--"; //./build/app/testbbdev"; +argv_re[2] = "-v"; +argv_re[3] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"; +printf("argcre %d argvre %s %s %s %s\n", argc_re, argv_re[0], argv_re[1], argv_re[2], argv_re[3],argv_re[4]); - /* Allocate memory for thread parameters structure */ + ret = rte_eal_init(argc_re, argv_re); + +argc_re = 3; +argv_re[0] = "--"; //./build/app/testbbdev"; +argv_re[1] = "-v"; +argv_re[2] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"; + +//printf("after ......ret %d argc %d argv %s %s %s %s\n", ret,argc, argv[0], argv[1], argv[2], argv[3],argv[4]); + /* Parse application arguments (after the EAL ones) */ + // ret = parse_args(argc_re, argv_re, &test_params); + /*if (ret < 0) { + print_usage(argv_re[0]); + return 1; + } +*/ +snprintf(test_params.test_vector_filename,sizeof(test_params.test_vector_filename),"%s", argv_re[2]); + +test_params.num_ops=128; +test_params.burst_sz=128; +test_params.num_lcores=1; +test_params.num_tests = 1; +run_all_tests(); + + /* bool extDdr = check_bit(ldpc_cap_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + bool loopback = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); + bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); t_params_tp = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), RTE_CACHE_LINE_SIZE); TEST_ASSERT_NOT_NULL(t_params_tp, "Failed to alloc %zuB for t_params", RTE_ALIGN(sizeof(struct thread_params) * num_lcores, RTE_CACHE_LINE_SIZE)); - +*/ // throughput_pmd_lcore_ldpc_dec(&t_params_tp[0]); + /* ref_op->ldpc_dec.iter_max = get_iter_max(); + ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, + bufs->harq_inputs, bufs->harq_outputs, ref_op); + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < TEST_REPETITIONS; ++i) { + for (j = 0; j < num_ops; ++j) { + if (!loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.hard_output.data); + if (hc_out || loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.harq_combined_output.data); + } + if (extDdr) { + bool preload = i == (TEST_REPETITIONS - 1); + preload_harq_ddr(tp->dev_id, queue_id, ops_enq, + num_ops, preload); + } + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + + enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + while (deq < enq) { + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + } +*/ return numIter; } diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h index 72bafbead9..8f32c9a768 100644 --- a/openair1/PHY/CODING/nrLDPC_defs.h +++ b/openair1/PHY/CODING/nrLDPC_defs.h @@ -71,7 +71,10 @@ typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,sho \param p_llrOut Output vector \param p_profiler LDPC profiler statistics */ -typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params *, int8_t *, int8_t *, t_nrLDPC_procBuf *, t_nrLDPC_time_stats * ); -typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint32_t , int8_t*, int8_t* ); + +typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); +typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); +//typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint32_t , int8_t*, int8_t* ); +typedef int32_t(*nrLDPC_dectopfunc_t)(void); #endif diff --git a/openair1/PHY/CODING/nrLDPC_extern.h b/openair1/PHY/CODING/nrLDPC_extern.h index 4aa0ed5a2b..5cf9f80aec 100644 --- a/openair1/PHY/CODING/nrLDPC_extern.h +++ b/openair1/PHY/CODING/nrLDPC_extern.h @@ -25,6 +25,7 @@ nrLDPC_decoderfunc_t nrLDPC_decoder; nrLDPC_encoderfunc_t nrLDPC_encoder; nrLDPC_initcallfunc_t nrLDPC_initcall; nrLDPC_decoffloadfunc_t nrLDPC_decoder_offload; +nrLDPC_dectopfunc_t top_testsuite; #else /* functions to load the LDPC shared lib, implemented in openair1/PHY/CODING/nrLDPC_load.c */ extern int load_nrLDPClib(char *version) ; @@ -36,6 +37,9 @@ extern nrLDPC_initcallfunc_t nrLDPC_initcall; extern nrLDPC_decoderfunc_t nrLDPC_decoder; extern nrLDPC_encoderfunc_t nrLDPC_encoder; extern nrLDPC_decoffloadfunc_t nrLDPC_decoder_offload; + +extern nrLDPC_dectopfunc_t top_testsuite; + // inline functions: #include "openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_init_mem.h" #endif diff --git a/openair1/PHY/CODING/nrLDPC_load.c b/openair1/PHY/CODING/nrLDPC_load.c index 7ac8768b63..44502193a9 100644 --- a/openair1/PHY/CODING/nrLDPC_load.c +++ b/openair1/PHY/CODING/nrLDPC_load.c @@ -81,6 +81,17 @@ int load_nrLDPClib_offload(void) { return 0; } +/*int load_nrLDPClib_offload(void) { + loader_shlibfunc_t shlib_decoffload_fdesc; + + shlib_decoffload_fdesc.fname = "top_testsuite"; + int ret=load_module_shlib("ldpc_offload",&shlib_decoffload_fdesc,1,NULL); + AssertFatal( (ret >= 0),"Error loading ldpc decoder offload"); + top_testsuite = (nrLDPC_dectopfunc_t)shlib_decoffload_fdesc.fptr; +return 0; +} +*/ + int load_nrLDPClib_ref(char *libversion, nrLDPC_encoderfunc_t * nrLDPC_encoder_ptr) { loader_shlibfunc_t shlib_encoder_fdesc; diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index e9ed278bb1..79a726b6c6 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -357,7 +357,7 @@ void nr_processULSegment(void* arg) { ////////////////////////////////// pl =====> llrProcBuf ////////////////////////////////// - no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, + no_iteration_ldpc = nrLDPC_decoder_offload(p_decoderParms, (int8_t*)&pl[0], llrProcBuf, ulsch_harq->p_nrLDPC_procBuf[r], diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 76d896a047..cfefd4e612 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -640,6 +640,7 @@ int main(int argc, char **argv) get_softmodem_params()->do_ra = 0; get_softmodem_params()->usim_test = 1; + load_nrLDPClib_offload(); if (snr1set == 0) snr1 = snr0 + 10; diff --git a/targets/ARCH/test-bbdev/test_bbdev_perf.c b/targets/ARCH/test-bbdev/test_bbdev_perf.c index 7bf4890cc7..c29c1d5a14 100644 --- a/targets/ARCH/test-bbdev/test_bbdev_perf.c +++ b/targets/ARCH/test-bbdev/test_bbdev_perf.c @@ -5050,9 +5050,9 @@ static struct unit_test_suite bbdev_interrupt_testsuite = { } }; -REGISTER_TEST_COMMAND(bler, bbdev_bler_testsuite); -REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); +//REGISTER_TEST_COMMAND(bler, bbdev_bler_testsuite); +//REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite); -REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite); -REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite); -REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite); +//REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite); +//REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite); +//REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite); diff --git a/targets/ARCH/test-bbdev/test_bbdev_vector.c b/targets/ARCH/test-bbdev/test_bbdev_vector.c index cdbc813285..cc9a47a48a 100644 --- a/targets/ARCH/test-bbdev/test_bbdev_vector.c +++ b/targets/ARCH/test-bbdev/test_bbdev_vector.c @@ -392,11 +392,11 @@ parse_data_entry(const char *key_token, char *token, printf("Unknown op type: %d!\n", type); return -1; } -printf("parse data entry \n"); +//printf("parse data entry \n"); op_data = vector->entries[type].segments; nb_ops = &vector->entries[type].nb_segments; -printf("nb segments %d\n",*nb_ops); +//printf("nb segments %d\n",*nb_ops); if (*nb_ops >= RTE_BBDEV_TURBO_MAX_CODE_BLOCKS) { printf("Too many segments (code blocks defined): %u, max %d!\n", @@ -858,7 +858,7 @@ parse_ldpc_decoder_params(const char *key_token, char *token, static int parse_entry(char *entry, struct test_bbdev_vector *vector) { -printf("parse entry \n"); +//printf("parse entry \n"); int ret = 0; char *token, *key_token; enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_NONE; @@ -1366,7 +1366,7 @@ test_bbdev_vector_read(const char *filename, FILE *fp = NULL; char *line = NULL; char *entry = NULL; - +//sprintf(filename, "/home/wang/oai/openairinterface5g/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"); fp = fopen(filename, "r"); if (fp == NULL) { printf("File %s does not exist\n", filename); From a8bee7ae21bf66fff11888c964e81ca6cde34430 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 13 Jul 2021 17:32:56 +0200 Subject: [PATCH 003/136] Update ldpc offload decoder input and output --- cmake_targets/CMakeLists.txt | 9 +- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 5160 ++++++++++++++++- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 61 +- .../test_vectors/ldpc_dec_v8480.data | 71 +- 4 files changed, 5156 insertions(+), 145 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 2d3f422072..95fee6edb4 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -780,7 +780,7 @@ set_target_properties(tcp_bridge_oai PROPERTIES COMPILE_FLAGS "-fvisibility=hidd ###################################################################### -include_directories ("/usr/include/dpdk") +#include_directories ("/usr/include/dpdk") set(HWLIB_BENETEL_4G_SOURCE ${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/benetel.c @@ -826,14 +826,14 @@ set(HWLIB_LDPC_OFFLOAD_SOURCE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev.c # ${OPENAIR_TARGETS}/ARCH/test-bbdev/main.c - ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_perf.c +# ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_perf.c ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_vector.c ) add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include") -SET(T1_DPDK_LIBS "-Wl,-rpath,/usr/local/include -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_atlantic -lrte_pmd_avp -lrte_pmd_axgbe -lrte_pmd_bond -lrte_pmd_bnx2x -lrte_pmd_bnxt -lrte_pmd_cxgbe -lrte_pmd_dpaa -lrte_pmd_dpaa2 -lrte_pmd_e1000 -lrte_pmd_ena -lrte_pmd_enetc -lrte_pmd_enic -lrte_pmd_failsafe -lrte_pmd_fm10k -lrte_pmd_i40e -lrte_pmd_hinic -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_turbo_sw -lrte_pmd_bbdev_fpga_lte_fec -lrte_pmd_bbdev_fpga_5gnr_fec -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") +SET(T1_DPDK_LIBS "-L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_fpga_5gnr_fec -lrte_pmd_hpac_sdfec_pmd -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") TARGET_LINK_LIBRARIES(ldpc_offload ${T1_DPDK_LIBS}) TARGET_LINK_LIBRARIES(ldpc_offload pthread dl rt m numa) @@ -2980,6 +2980,9 @@ add_executable(nr_ulsim ${T_SOURCE} ${SHLIB_LOADER_SOURCES} ) + +add_dependencies( nr_ulsim ldpc_orig ldpc_optim ldpc_optim8seg ldpc ldpc_offload) + target_link_libraries(nr_ulsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -lz -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI ${OPENSSL_LIBRARIES} dl diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 6b4038a964..68ec167e0a 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -58,7 +58,7 @@ #include #include "nrLDPC_offload.h" - +uint8_t count_initdev =0; #include #include @@ -68,14 +68,92 @@ #include #include #include -#include "../../../targets/ARCH/test-bbdev/main.h" +//#include "../../../targets/ARCH/test-bbdev/main.h" #include "../../../targets/ARCH/test-bbdev/test_bbdev_vector.h" + +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "main.h" +//#include "test_bbdev_vector.h" + +#define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id)) + #define MAX_QUEUES RTE_MAX_LCORE #define TEST_REPETITIONS 1000 + +#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC +#include +#define FPGA_LTE_PF_DRIVER_NAME ("intel_fpga_lte_fec_pf") +#define FPGA_LTE_VF_DRIVER_NAME ("intel_fpga_lte_fec_vf") +#define VF_UL_4G_QUEUE_VALUE 4 +#define VF_DL_4G_QUEUE_VALUE 4 +#define UL_4G_BANDWIDTH 3 +#define DL_4G_BANDWIDTH 3 +#define UL_4G_LOAD_BALANCE 128 +#define DL_4G_LOAD_BALANCE 128 +#define FLR_4G_TIMEOUT 610 +#endif + +#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC +#include +#define FPGA_5GNR_PF_DRIVER_NAME ("intel_fpga_5gnr_fec_pf") +#define FPGA_5GNR_VF_DRIVER_NAME ("intel_fpga_5gnr_fec_vf") +#define VF_UL_5G_QUEUE_VALUE 4 +#define VF_DL_5G_QUEUE_VALUE 4 +#define UL_5G_BANDWIDTH 3 +#define DL_5G_BANDWIDTH 3 +#define UL_5G_LOAD_BALANCE 128 +#define DL_5G_LOAD_BALANCE 128 +#define FLR_5G_TIMEOUT 610 +#endif + +#define OPS_CACHE_SIZE 256U +#define OPS_POOL_SIZE_MIN 511U /* 0.5K per queue */ + +#define SYNC_WAIT 0 +#define SYNC_START 1 +#define INVALID_OPAQUE -1 + +#define INVALID_QUEUE_ID -1 +/* Increment for next code block in external HARQ memory */ +#define HARQ_INCR 32768 +/* Headroom for filler LLRs insertion in HARQ buffer */ +#define FILLER_HEADROOM 1024 +/* Constants from K0 computation from 3GPP 38.212 Table 5.4.2.1-2 */ +#define N_ZC_1 66 /* N = 66 Zc for BG 1 */ +#define N_ZC_2 50 /* N = 50 Zc for BG 2 */ +#define K0_1_1 17 /* K0 fraction numerator for rv 1 and BG 1 */ +#define K0_1_2 13 /* K0 fraction numerator for rv 1 and BG 2 */ +#define K0_2_1 33 /* K0 fraction numerator for rv 2 and BG 1 */ +#define K0_2_2 25 /* K0 fraction numerator for rv 2 and BG 2 */ +#define K0_3_1 56 /* K0 fraction numerator for rv 3 and BG 1 */ +#define K0_3_2 43 /* K0 fraction numerator for rv 3 and BG 2 */ + +static struct test_bbdev_vector test_vector; +static struct test_bbdev_vector test_vector_dec; +int8_t ldpc_output[22*384]; /* Switch between PMD and Interrupt for throughput TC */ static bool intr_enabled; -static struct test_bbdev_vector test_vector; + /* LLR arithmetic representation for numerical conversion */ static int ldpc_llr_decimals; static int ldpc_llr_size; @@ -140,6 +218,4891 @@ struct thread_params { struct rte_bbdev_enc_op *enc_ops[MAX_BURST]; }; +#ifdef RTE_BBDEV_OFFLOAD_COST +/* Stores time statistics */ +struct test_time_stats { + /* Stores software enqueue total working time */ + uint64_t enq_sw_total_time; + /* Stores minimum value of software enqueue working time */ + uint64_t enq_sw_min_time; + /* Stores maximum value of software enqueue working time */ + uint64_t enq_sw_max_time; + /* Stores turbo enqueue total working time */ + uint64_t enq_acc_total_time; + /* Stores minimum value of accelerator enqueue working time */ + uint64_t enq_acc_min_time; + /* Stores maximum value of accelerator enqueue working time */ + uint64_t enq_acc_max_time; + /* Stores dequeue total working time */ + uint64_t deq_total_time; + /* Stores minimum value of dequeue working time */ + uint64_t deq_min_time; + /* Stores maximum value of dequeue working time */ + uint64_t deq_max_time; +}; +#endif + +typedef int (test_case_function)(struct active_device *ad, + struct test_op_params *op_params); + +static inline void +mbuf_reset(struct rte_mbuf *m) +{ + m->pkt_len = 0; + + do { + m->data_len = 0; + m = m->next; + } while (m != NULL); +} + +/* Read flag value 0/1 from bitmap */ +static inline bool +check_bit(uint32_t bitmap, uint32_t bitmask) +{ + return bitmap & bitmask; +} + +static inline void +set_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) +{ + ad->supported_ops |= (1 << op_type); +} + +static inline bool +is_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) +{ + return ad->supported_ops & (1 << op_type); +} + +static inline bool +flags_match(uint32_t flags_req, uint32_t flags_present) +{ + return (flags_req & flags_present) == flags_req; +} + +static void +clear_soft_out_cap(uint32_t *op_flags) +{ + *op_flags &= ~RTE_BBDEV_TURBO_SOFT_OUTPUT; + *op_flags &= ~RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT; + *op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; +} + +static int +check_dev_cap(const struct rte_bbdev_info *dev_info) +{ + unsigned int i; + unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs, + nb_harq_inputs, nb_harq_outputs; + const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities; + + nb_inputs = test_vector.entries[DATA_INPUT].nb_segments; + nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments; + nb_hard_outputs = test_vector.entries[DATA_HARD_OUTPUT].nb_segments; + nb_harq_inputs = test_vector.entries[DATA_HARQ_INPUT].nb_segments; + nb_harq_outputs = test_vector.entries[DATA_HARQ_OUTPUT].nb_segments; + + for (i = 0; op_cap->type != RTE_BBDEV_OP_NONE; ++i, ++op_cap) { + if (op_cap->type != test_vector.op_type) + continue; + + if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) { + const struct rte_bbdev_op_cap_turbo_dec *cap = + &op_cap->cap.turbo_dec; + /* Ignore lack of soft output capability, just skip + * checking if soft output is valid. + */ + if ((test_vector.turbo_dec.op_flags & + RTE_BBDEV_TURBO_SOFT_OUTPUT) && + !(cap->capability_flags & + RTE_BBDEV_TURBO_SOFT_OUTPUT)) { + printf( + "INFO: Device \"%s\" does not support soft output - soft output flags will be ignored.\n", + dev_info->dev_name); + clear_soft_out_cap( + &test_vector.turbo_dec.op_flags); + } + + if (!flags_match(test_vector.turbo_dec.op_flags, + cap->capability_flags)) + return TEST_FAILED; + if (nb_inputs > cap->num_buffers_src) { + printf("Too many inputs defined: %u, max: %u\n", + nb_inputs, cap->num_buffers_src); + return TEST_FAILED; + } + if (nb_soft_outputs > cap->num_buffers_soft_out && + (test_vector.turbo_dec.op_flags & + RTE_BBDEV_TURBO_SOFT_OUTPUT)) { + printf( + "Too many soft outputs defined: %u, max: %u\n", + nb_soft_outputs, + cap->num_buffers_soft_out); + return TEST_FAILED; + } + if (nb_hard_outputs > cap->num_buffers_hard_out) { + printf( + "Too many hard outputs defined: %u, max: %u\n", + nb_hard_outputs, + cap->num_buffers_hard_out); + return TEST_FAILED; + } + if (intr_enabled && !(cap->capability_flags & + RTE_BBDEV_TURBO_DEC_INTERRUPTS)) { + printf( + "Dequeue interrupts are not supported!\n"); + return TEST_FAILED; + } + + return TEST_SUCCESS; + } else if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) { + const struct rte_bbdev_op_cap_turbo_enc *cap = + &op_cap->cap.turbo_enc; + + if (!flags_match(test_vector.turbo_enc.op_flags, + cap->capability_flags)) + return TEST_FAILED; + if (nb_inputs > cap->num_buffers_src) { + printf("Too many inputs defined: %u, max: %u\n", + nb_inputs, cap->num_buffers_src); + return TEST_FAILED; + } + if (nb_hard_outputs > cap->num_buffers_dst) { + printf( + "Too many hard outputs defined: %u, max: %u\n", + nb_hard_outputs, cap->num_buffers_dst); + return TEST_FAILED; + } + if (intr_enabled && !(cap->capability_flags & + RTE_BBDEV_TURBO_ENC_INTERRUPTS)) { + printf( + "Dequeue interrupts are not supported!\n"); + return TEST_FAILED; + } + + return TEST_SUCCESS; + } else if (op_cap->type == RTE_BBDEV_OP_LDPC_ENC) { + const struct rte_bbdev_op_cap_ldpc_enc *cap = + &op_cap->cap.ldpc_enc; + + if (!flags_match(test_vector.ldpc_enc.op_flags, + cap->capability_flags)){ + printf("Flag Mismatch\n"); + return TEST_FAILED; + } + if (nb_inputs > cap->num_buffers_src) { + printf("Too many inputs defined: %u, max: %u\n", + nb_inputs, cap->num_buffers_src); + return TEST_FAILED; + } + if (nb_hard_outputs > cap->num_buffers_dst) { + printf( + "Too many hard outputs defined: %u, max: %u\n", + nb_hard_outputs, cap->num_buffers_dst); + return TEST_FAILED; + } + if (intr_enabled && !(cap->capability_flags & + RTE_BBDEV_LDPC_ENC_INTERRUPTS)) { + printf( + "Dequeue interrupts are not supported!\n"); + return TEST_FAILED; + } + + return TEST_SUCCESS; + } else if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) { + const struct rte_bbdev_op_cap_ldpc_dec *cap = + &op_cap->cap.ldpc_dec; + + if (!flags_match(test_vector.ldpc_dec.op_flags, + cap->capability_flags)){ + printf("Flag Mismatch\n"); + return TEST_FAILED; + } + if (nb_inputs > cap->num_buffers_src) { + printf("Too many inputs defined: %u, max: %u\n", + nb_inputs, cap->num_buffers_src); + return TEST_FAILED; + } + if (nb_hard_outputs > cap->num_buffers_hard_out) { + printf( + "Too many hard outputs defined: %u, max: %u\n", + nb_hard_outputs, + cap->num_buffers_hard_out); + return TEST_FAILED; + } + if (nb_harq_inputs > cap->num_buffers_hard_out) { + printf( + "Too many HARQ inputs defined: %u, max: %u\n", + nb_hard_outputs, + cap->num_buffers_hard_out); + return TEST_FAILED; + } + if (nb_harq_outputs > cap->num_buffers_hard_out) { + printf( + "Too many HARQ outputs defined: %u, max: %u\n", + nb_hard_outputs, + cap->num_buffers_hard_out); + return TEST_FAILED; + } + if (intr_enabled && !(cap->capability_flags & + RTE_BBDEV_LDPC_DEC_INTERRUPTS)) { + printf( + "Dequeue interrupts are not supported!\n"); + return TEST_FAILED; + } + if (intr_enabled && (test_vector.ldpc_dec.op_flags & + (RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE | + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE | + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + ))) { + printf("Skip loop-back with interrupt\n"); + return TEST_FAILED; + } + return TEST_SUCCESS; + } + } + + if ((i == 0) && (test_vector.op_type == RTE_BBDEV_OP_NONE)) + return TEST_SUCCESS; /* Special case for NULL device */ + + return TEST_FAILED; +} + +/* calculates optimal mempool size not smaller than the val */ +static unsigned int +optimal_mempool_size(unsigned int val) +{ + return rte_align32pow2(val + 1) - 1; +} + +/* allocates mbuf mempool for inputs and outputs */ +static struct rte_mempool * +create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id, + int socket_id, unsigned int mbuf_pool_size, + const char *op_type_str) +{ + unsigned int i; + uint32_t max_seg_sz = 0; + char pool_name[RTE_MEMPOOL_NAMESIZE]; + + /* find max input segment size */ + for (i = 0; i < entries->nb_segments; ++i) + if (entries->segments[i].length > max_seg_sz) + max_seg_sz = entries->segments[i].length; + + snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, + dev_id); + return rte_pktmbuf_pool_create(pool_name, mbuf_pool_size, 0, 0, + RTE_MAX(max_seg_sz + RTE_PKTMBUF_HEADROOM + + FILLER_HEADROOM, + (unsigned int)RTE_MBUF_DEFAULT_BUF_SIZE), socket_id); +} + +static int +create_mempools(struct active_device *ad, int socket_id, + enum rte_bbdev_op_type org_op_type, uint16_t num_ops) +{ + struct rte_mempool *mp; + unsigned int ops_pool_size, mbuf_pool_size = 0; + char pool_name[RTE_MEMPOOL_NAMESIZE]; + const char *op_type_str; + enum rte_bbdev_op_type op_type = org_op_type; + + struct op_data_entries *in = &test_vector.entries[DATA_INPUT]; + struct op_data_entries *hard_out = + &test_vector.entries[DATA_HARD_OUTPUT]; + struct op_data_entries *soft_out = + &test_vector.entries[DATA_SOFT_OUTPUT]; + struct op_data_entries *harq_in = + &test_vector.entries[DATA_HARQ_INPUT]; + struct op_data_entries *harq_out = + &test_vector.entries[DATA_HARQ_OUTPUT]; + + /* allocate ops mempool */ + ops_pool_size = optimal_mempool_size(RTE_MAX( + /* Ops used plus 1 reference op */ + RTE_MAX((unsigned int)(ad->nb_queues * num_ops + 1), + /* Minimal cache size plus 1 reference op */ + (unsigned int)(1.5 * rte_lcore_count() * + OPS_CACHE_SIZE + 1)), + OPS_POOL_SIZE_MIN)); + + if (org_op_type == RTE_BBDEV_OP_NONE) + op_type = RTE_BBDEV_OP_TURBO_ENC; + + op_type_str = rte_bbdev_op_type_str(op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); + + snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, + ad->dev_id); + mp = rte_bbdev_op_pool_create(pool_name, op_type, + ops_pool_size, OPS_CACHE_SIZE, socket_id); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %u items ops pool for dev %u on socket %u.", + ops_pool_size, + ad->dev_id, + socket_id); + ad->ops_mempool = mp; + + /* Do not create inputs and outputs mbufs for BaseBand Null Device */ + if (org_op_type == RTE_BBDEV_OP_NONE) + return TEST_SUCCESS; + + /* Inputs */ + if (in->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + in->nb_segments); + mp = create_mbuf_pool(in, ad->dev_id, socket_id, + mbuf_pool_size, "in"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %u items input pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->in_mbuf_pool = mp; + } + + /* Hard outputs */ + if (hard_out->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + hard_out->nb_segments); + mp = create_mbuf_pool(hard_out, ad->dev_id, socket_id, + mbuf_pool_size, + "hard_out"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %u items hard output pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->hard_out_mbuf_pool = mp; + } + + /* Soft outputs */ + if (soft_out->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + soft_out->nb_segments); + mp = create_mbuf_pool(soft_out, ad->dev_id, socket_id, + mbuf_pool_size, + "soft_out"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %uB soft output pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->soft_out_mbuf_pool = mp; + } + + /* HARQ inputs */ + if (harq_in->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + harq_in->nb_segments); + mp = create_mbuf_pool(harq_in, ad->dev_id, socket_id, + mbuf_pool_size, + "harq_in"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %uB harq input pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->harq_in_mbuf_pool = mp; + } + + /* HARQ outputs */ + if (harq_out->nb_segments > 0) { + mbuf_pool_size = optimal_mempool_size(ops_pool_size * + harq_out->nb_segments); + mp = create_mbuf_pool(harq_out, ad->dev_id, socket_id, + mbuf_pool_size, + "harq_out"); + TEST_ASSERT_NOT_NULL(mp, + "ERROR Failed to create %uB harq output pktmbuf pool for dev %u on socket %u.", + mbuf_pool_size, + ad->dev_id, + socket_id); + ad->harq_out_mbuf_pool = mp; + } + + return TEST_SUCCESS; +} + +static int +add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info, + struct test_bbdev_vector *vector) +{ + int ret; + unsigned int queue_id; + struct rte_bbdev_queue_conf qconf; + struct active_device *ad = &active_devs[nb_active_devs]; + unsigned int nb_queues; + enum rte_bbdev_op_type op_type = vector->op_type; + +/* Configure fpga lte fec with PF & VF values + * if '-i' flag is set and using fpga device + */ +#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC + if ((get_init_device() == true) && + (!strcmp(info->drv.driver_name, FPGA_LTE_PF_DRIVER_NAME))) { + struct fpga_lte_fec_conf conf; + unsigned int i; + + printf("Configure FPGA LTE FEC Driver %s with default values\n", + info->drv.driver_name); + + /* clear default configuration before initialization */ + memset(&conf, 0, sizeof(struct fpga_lte_fec_conf)); + + /* Set PF mode : + * true if PF is used for data plane + * false for VFs + */ + conf.pf_mode_en = true; + + for (i = 0; i < FPGA_LTE_FEC_NUM_VFS; ++i) { + /* Number of UL queues per VF (fpga supports 8 VFs) */ + conf.vf_ul_queues_number[i] = VF_UL_4G_QUEUE_VALUE; + /* Number of DL queues per VF (fpga supports 8 VFs) */ + conf.vf_dl_queues_number[i] = VF_DL_4G_QUEUE_VALUE; + } + + /* UL bandwidth. Needed for schedule algorithm */ + conf.ul_bandwidth = UL_4G_BANDWIDTH; + /* DL bandwidth */ + conf.dl_bandwidth = DL_4G_BANDWIDTH; + + /* UL & DL load Balance Factor to 64 */ + conf.ul_load_balance = UL_4G_LOAD_BALANCE; + conf.dl_load_balance = DL_4G_LOAD_BALANCE; + + /**< FLR timeout value */ + conf.flr_time_out = FLR_4G_TIMEOUT; + + /* setup FPGA PF with configuration information */ + ret = fpga_lte_fec_configure(info->dev_name, &conf); + TEST_ASSERT_SUCCESS(ret, + "Failed to configure 4G FPGA PF for bbdev %s", + info->dev_name); + } +#endif +#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC + if ((get_init_device() == true) && + (!strcmp(info->drv.driver_name, FPGA_5GNR_PF_DRIVER_NAME))) { + struct fpga_5gnr_fec_conf conf; + unsigned int i; + + printf("Configure FPGA 5GNR FEC Driver %s with default values\n", + info->drv.driver_name); + + /* clear default configuration before initialization */ + memset(&conf, 0, sizeof(struct fpga_5gnr_fec_conf)); + + /* Set PF mode : + * true if PF is used for data plane + * false for VFs + */ + conf.pf_mode_en = true; + + for (i = 0; i < FPGA_5GNR_FEC_NUM_VFS; ++i) { + /* Number of UL queues per VF (fpga supports 8 VFs) */ + conf.vf_ul_queues_number[i] = VF_UL_5G_QUEUE_VALUE; + /* Number of DL queues per VF (fpga supports 8 VFs) */ + conf.vf_dl_queues_number[i] = VF_DL_5G_QUEUE_VALUE; + } + + /* UL bandwidth. Needed for schedule algorithm */ + conf.ul_bandwidth = UL_5G_BANDWIDTH; + /* DL bandwidth */ + conf.dl_bandwidth = DL_5G_BANDWIDTH; + + /* UL & DL load Balance Factor to 64 */ + conf.ul_load_balance = UL_5G_LOAD_BALANCE; + conf.dl_load_balance = DL_5G_LOAD_BALANCE; + + /**< FLR timeout value */ + conf.flr_time_out = FLR_5G_TIMEOUT; + + /* setup FPGA PF with configuration information */ + ret = fpga_5gnr_fec_configure(info->dev_name, &conf); + TEST_ASSERT_SUCCESS(ret, + "Failed to configure 5G FPGA PF for bbdev %s", + info->dev_name); + } +#endif + nb_queues = RTE_MIN(rte_lcore_count(), info->drv.max_num_queues); + nb_queues = RTE_MIN(nb_queues, (unsigned int) MAX_QUEUES); + + /* setup device */ + ret = rte_bbdev_setup_queues(dev_id, nb_queues, info->socket_id); + if (ret < 0) { + printf("rte_bbdev_setup_queues(%u, %u, %d) ret %i\n", + dev_id, nb_queues, info->socket_id, ret); + return TEST_FAILED; + } + + /* configure interrupts if needed */ + if (intr_enabled) { + ret = rte_bbdev_intr_enable(dev_id); + if (ret < 0) { + printf("rte_bbdev_intr_enable(%u) ret %i\n", dev_id, + ret); + return TEST_FAILED; + } + } + + /* setup device queues */ + qconf.socket = info->socket_id; + qconf.queue_size = info->drv.default_queue_conf.queue_size; + qconf.priority = 0; + qconf.deferred_start = 0; + qconf.op_type = op_type; + + for (queue_id = 0; queue_id < nb_queues; ++queue_id) { + ret = rte_bbdev_queue_configure(dev_id, queue_id, &qconf); + if (ret != 0) { + printf( + "Allocated all queues (id=%u) at prio%u on dev%u\n", + queue_id, qconf.priority, dev_id); + qconf.priority++; + ret = rte_bbdev_queue_configure(ad->dev_id, queue_id, + &qconf); + } + if (ret != 0) { + printf("All queues on dev %u allocated: %u\n", + dev_id, queue_id); + break; + } + ad->queue_ids[queue_id] = queue_id; + } + TEST_ASSERT(queue_id != 0, + "ERROR Failed to configure any queues on dev %u", + dev_id); + ad->nb_queues = queue_id; + + set_avail_op(ad, op_type); + + return TEST_SUCCESS; +} + +static int +add_active_device(uint8_t dev_id, struct rte_bbdev_info *info, + struct test_bbdev_vector *vector) +{ + int ret; + + active_devs[nb_active_devs].driver_name = info->drv.driver_name; + active_devs[nb_active_devs].dev_id = dev_id; + + ret = add_bbdev_dev(dev_id, info, vector); + if (ret == TEST_SUCCESS) + ++nb_active_devs; + return ret; +} + +static uint8_t +populate_active_devices(void) +{ + int ret; + uint8_t dev_id; + uint8_t nb_devs_added = 0; + struct rte_bbdev_info info; + + RTE_BBDEV_FOREACH(dev_id) { + rte_bbdev_info_get(dev_id, &info); + + if (check_dev_cap(&info)) { + printf( + "Device %d (%s) does not support specified capabilities\n", + dev_id, info.dev_name); + continue; + } + + ret = add_active_device(dev_id, &info, &test_vector); + if (ret != 0) { + printf("Adding active bbdev %s skipped\n", + info.dev_name); + continue; + } + nb_devs_added++; + } + + return nb_devs_added; +} + +static int +read_test_vector(void) +{ + int ret; +uint16_t Z=72; + memset(&test_vector, 0, sizeof(test_vector)); + printf("Test vector file = %s\n", get_vector_filename()); + ret = test_bbdev_vector_read(get_vector_filename(), &test_vector); + +struct op_data_entries *ref_entries = + &test_vector.entries[0]; +struct op_data_entries *ref_entries_dec = + &test_vector_dec.entries[0]; +struct op_data_buf *seg = &ref_entries->segments[0]; +struct op_data_buf *seg_dec = &ref_entries_dec->segments[0]; +memcpy(seg->addr, seg_dec->addr, seg->length); + +//printf("seg addr %p seg dec addr %p llr %x llr dec %x\n",seg->addr,seg_dec->addr,*(seg->addr), *(seg_dec->addr)); + + + + TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n", + get_vector_filename()); + + return TEST_SUCCESS; +} + +static int +testsuite_setup(void) +{ + TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); +if (count_initdev ==0) { +count_initdev++; + if (populate_active_devices() == 0) { + printf("No suitable devices found!\n"); + return TEST_SKIPPED; + } +} + return TEST_SUCCESS; +} + +static int +interrupt_testsuite_setup(void) +{ + TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); + + /* Enable interrupts */ + intr_enabled = true; + + /* Special case for NULL device (RTE_BBDEV_OP_NONE) */ + if (populate_active_devices() == 0 || + test_vector.op_type == RTE_BBDEV_OP_NONE) { + intr_enabled = false; + printf("No suitable devices found!\n"); + return TEST_SKIPPED; + } + + return TEST_SUCCESS; +} + +static void +testsuite_teardown(void) +{ + uint8_t dev_id; +printf("testsuite teardown \n"); + /* Unconfigure devices */ +// RTE_BBDEV_FOREACH(dev_id) +// rte_bbdev_close(dev_id); + + /* Clear active devices structs. */ +// memset(active_devs, 0, sizeof(active_devs)); +// nb_active_devs = 0; + + /* Disable interrupts */ +// intr_enabled = false; +} + +static int +ut_setup(void) +{ + uint8_t i, dev_id; + + for (i = 0; i < nb_active_devs; i++) { + dev_id = active_devs[i].dev_id; + /* reset bbdev stats */ + TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), + "Failed to reset stats of bbdev %u", dev_id); + /* start the device */ + TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), + "Failed to start bbdev %u", dev_id); + } + + return TEST_SUCCESS; +} + +static void +ut_teardown(void) +{ + uint8_t i, dev_id; + struct rte_bbdev_stats stats; + + for (i = 0; i < nb_active_devs; i++) { + dev_id = active_devs[i].dev_id; + /* read stats and print */ + rte_bbdev_stats_get(dev_id, &stats); + /* Stop the device */ + //rte_bbdev_stop(dev_id); + } +} + +static int +init_op_data_objs(struct rte_bbdev_op_data *bufs, + struct op_data_entries *ref_entries, + struct rte_mempool *mbuf_pool, const uint16_t n, + enum op_data_type op_type, uint16_t min_alignment) +{ + int ret; + unsigned int i, j; + bool large_input = false; + + for (i = 0; i < n; ++i) { + char *data; + struct op_data_buf *seg = &ref_entries->segments[0]; + struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); + TEST_ASSERT_NOT_NULL(m_head, + "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", + op_type, n * ref_entries->nb_segments, + mbuf_pool->size); + + if (seg->length > RTE_BBDEV_LDPC_E_MAX_MBUF) { + /* + * Special case when DPDK mbuf cannot handle + * the required input size + */ + printf("Warning: Larger input size than DPDK mbuf %d\n", + seg->length); + large_input = true; + } + bufs[i].data = m_head; + bufs[i].offset = 0; + bufs[i].length = 0; + + if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) { + if ((op_type == DATA_INPUT) && large_input) { + /* Allocate a fake overused mbuf */ + data = rte_malloc(NULL, seg->length, 0); + memcpy(data, seg->addr, seg->length); + m_head->buf_addr = data; + m_head->buf_iova = rte_malloc_virt2iova(data); + m_head->data_off = 0; + m_head->data_len = seg->length; + } else { + data = rte_pktmbuf_append(m_head, seg->length); + TEST_ASSERT_NOT_NULL(data, + "Couldn't append %u bytes to mbuf from %d data type mbuf pool", + seg->length, op_type); + + TEST_ASSERT(data == RTE_PTR_ALIGN( + data, min_alignment), + "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", + data, min_alignment); + rte_memcpy(data, seg->addr, seg->length); + } + + bufs[i].length += seg->length; + + for (j = 1; j < ref_entries->nb_segments; ++j) { + struct rte_mbuf *m_tail = + rte_pktmbuf_alloc(mbuf_pool); + TEST_ASSERT_NOT_NULL(m_tail, + "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", + op_type, + n * ref_entries->nb_segments, + mbuf_pool->size); + seg += 1; + + data = rte_pktmbuf_append(m_tail, seg->length); + TEST_ASSERT_NOT_NULL(data, + "Couldn't append %u bytes to mbuf from %d data type mbuf pool", + seg->length, op_type); + + TEST_ASSERT(data == RTE_PTR_ALIGN(data, + min_alignment), + "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", + data, min_alignment); + rte_memcpy(data, seg->addr, seg->length); + bufs[i].length += seg->length; + + ret = rte_pktmbuf_chain(m_head, m_tail); + TEST_ASSERT_SUCCESS(ret, + "Couldn't chain mbufs from %d data type mbuf pool", + op_type); + } + } else { + + /* allocate chained-mbuf for output buffer */ + for (j = 1; j < ref_entries->nb_segments; ++j) { + struct rte_mbuf *m_tail = + rte_pktmbuf_alloc(mbuf_pool); + TEST_ASSERT_NOT_NULL(m_tail, + "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", + op_type, + n * ref_entries->nb_segments, + mbuf_pool->size); + + ret = rte_pktmbuf_chain(m_head, m_tail); + TEST_ASSERT_SUCCESS(ret, + "Couldn't chain mbufs from %d data type mbuf pool", + op_type); + } + } + } + + return 0; +} + +static int +allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len, + const int socket) +{ + int i; + + *buffers = rte_zmalloc_socket(NULL, len, 0, socket); + if (*buffers == NULL) { + printf("WARNING: Failed to allocate op_data on socket %d\n", + socket); + /* try to allocate memory on other detected sockets */ + for (i = 0; i < socket; i++) { + *buffers = rte_zmalloc_socket(NULL, len, 0, i); + if (*buffers != NULL) + break; + } + } + + return (*buffers == NULL) ? TEST_FAILED : TEST_SUCCESS; +} + +static void +limit_input_llr_val_range(struct rte_bbdev_op_data *input_ops, + const uint16_t n, const int8_t max_llr_modulus) +{ + uint16_t i, byte_idx; + + for (i = 0; i < n; ++i) { + struct rte_mbuf *m = input_ops[i].data; + while (m != NULL) { + int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, + input_ops[i].offset); + for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); + ++byte_idx) + llr[byte_idx] = round((double)max_llr_modulus * + llr[byte_idx] / INT8_MAX); + + m = m->next; + } + } +} + +/* + * We may have to insert filler bits + * when they are required by the HARQ assumption + */ +static void +ldpc_add_filler(struct rte_bbdev_op_data *input_ops, + const uint16_t n, struct test_op_params *op_params) +{ + struct rte_bbdev_op_ldpc_dec dec = op_params->ref_dec_op->ldpc_dec; + + if (input_ops == NULL) + return; + /* No need to add filler if not required by device */ + if (!(ldpc_cap_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS)) + return; + /* No need to add filler for loopback operation */ + if (dec.op_flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) + return; + + uint16_t i, j, parity_offset; + for (i = 0; i < n; ++i) { + struct rte_mbuf *m = input_ops[i].data; + int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, + input_ops[i].offset); + parity_offset = (dec.basegraph == 1 ? 20 : 8) + * dec.z_c - dec.n_filler; + uint16_t new_hin_size = input_ops[i].length + dec.n_filler; + m->data_len = new_hin_size; + input_ops[i].length = new_hin_size; + for (j = new_hin_size - 1; j >= parity_offset + dec.n_filler; + j--) + llr[j] = llr[j - dec.n_filler]; + uint16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; + for (j = 0; j < dec.n_filler; j++) + llr[parity_offset + j] = llr_max_pre_scaling; + } +} + +static void +ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops, + const uint16_t n, const int8_t llr_size, + const int8_t llr_decimals) +{ + if (input_ops == NULL) + return; + + uint16_t i, byte_idx; + + int16_t llr_max, llr_min, llr_tmp; + llr_max = (1 << (llr_size - 1)) - 1; + llr_min = -llr_max; + for (i = 0; i < n; ++i) { + struct rte_mbuf *m = input_ops[i].data; + while (m != NULL) { + int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, + input_ops[i].offset); + for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); + ++byte_idx) { + + llr_tmp = llr[byte_idx]; + if (llr_decimals == 4) + llr_tmp *= 8; + else if (llr_decimals == 2) + llr_tmp *= 2; + else if (llr_decimals == 0) + llr_tmp /= 2; + llr_tmp = RTE_MIN(llr_max, + RTE_MAX(llr_min, llr_tmp)); + llr[byte_idx] = (int8_t) llr_tmp; + } + + m = m->next; + } + } +} + + + +static int +fill_queue_buffers(struct test_op_params *op_params, + struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp, + struct rte_mempool *soft_out_mp, + struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp, + uint16_t queue_id, + const struct rte_bbdev_op_cap *capabilities, + uint16_t min_alignment, const int socket_id) +{ + int ret; + enum op_data_type type; + const uint16_t n = op_params->num_to_process; + + struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { + in_mp, + soft_out_mp, + hard_out_mp, + harq_in_mp, + harq_out_mp, + }; + + struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = { + &op_params->q_bufs[socket_id][queue_id].inputs, + &op_params->q_bufs[socket_id][queue_id].soft_outputs, + &op_params->q_bufs[socket_id][queue_id].hard_outputs, + &op_params->q_bufs[socket_id][queue_id].harq_inputs, + &op_params->q_bufs[socket_id][queue_id].harq_outputs, + }; + + for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { + struct op_data_entries *ref_entries = + &test_vector.entries[type]; +/*struct op_data_buf *seg = &ref_entries->segments[0]; + struct op_data_entries *ref_entries_dec = + &test_vector_dec.entries[type]; +struct op_data_buf *seg_dec = &ref_entries_dec->segments[0]; +*/ +//memcpy(seg->addr, seg_dec->addr, seg->length); + +// printf("fill queue ref seg data %x addr %p \n", *ref_entries->segments[0].addr, ref_entries->segments[0].addr); + if (ref_entries->nb_segments == 0) + continue; + + ret = allocate_buffers_on_socket(queue_ops[type], + n * sizeof(struct rte_bbdev_op_data), + socket_id); + TEST_ASSERT_SUCCESS(ret, + "Couldn't allocate memory for rte_bbdev_op_data structs"); + + ret = init_op_data_objs(*queue_ops[type], ref_entries, + mbuf_pools[type], n, type, min_alignment); + TEST_ASSERT_SUCCESS(ret, + "Couldn't init rte_bbdev_op_data structs"); + } + + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) + limit_input_llr_val_range(*queue_ops[DATA_INPUT], n, + capabilities->cap.turbo_dec.max_llr_modulus); + + if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { + bool loopback = op_params->ref_dec_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; + bool llr_comp = op_params->ref_dec_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_LLR_COMPRESSION; + bool harq_comp = op_params->ref_dec_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + ldpc_llr_decimals = capabilities->cap.ldpc_dec.llr_decimals; + ldpc_llr_size = capabilities->cap.ldpc_dec.llr_size; + ldpc_cap_flags = capabilities->cap.ldpc_dec.capability_flags; + if (!loopback && !llr_comp) + ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n, + ldpc_llr_size, ldpc_llr_decimals); + if (!loopback && !harq_comp) + ldpc_input_llr_scaling(*queue_ops[DATA_HARQ_INPUT], n, + ldpc_llr_size, ldpc_llr_decimals); + if (!loopback) + ldpc_add_filler(*queue_ops[DATA_HARQ_INPUT], n, + op_params); + } + + return 0; +} + +static void +free_buffers(struct active_device *ad, struct test_op_params *op_params) +{ + unsigned int i, j; + + rte_mempool_free(ad->ops_mempool); + rte_mempool_free(ad->in_mbuf_pool); + rte_mempool_free(ad->hard_out_mbuf_pool); + rte_mempool_free(ad->soft_out_mbuf_pool); + rte_mempool_free(ad->harq_in_mbuf_pool); + rte_mempool_free(ad->harq_out_mbuf_pool); + + for (i = 0; i < rte_lcore_count(); ++i) { + for (j = 0; j < RTE_MAX_NUMA_NODES; ++j) { + rte_free(op_params->q_bufs[j][i].inputs); + rte_free(op_params->q_bufs[j][i].hard_outputs); + rte_free(op_params->q_bufs[j][i].soft_outputs); + rte_free(op_params->q_bufs[j][i].harq_inputs); + rte_free(op_params->q_bufs[j][i].harq_outputs); + } + } +} + +static void +copy_reference_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, + unsigned int start_idx, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *hard_outputs, + struct rte_bbdev_op_data *soft_outputs, + struct rte_bbdev_dec_op *ref_op) +{ + unsigned int i; + struct rte_bbdev_op_turbo_dec *turbo_dec = &ref_op->turbo_dec; + + for (i = 0; i < n; ++i) { + if (turbo_dec->code_block_mode == 0) { + ops[i]->turbo_dec.tb_params.ea = + turbo_dec->tb_params.ea; + ops[i]->turbo_dec.tb_params.eb = + turbo_dec->tb_params.eb; + ops[i]->turbo_dec.tb_params.k_pos = + turbo_dec->tb_params.k_pos; + ops[i]->turbo_dec.tb_params.k_neg = + turbo_dec->tb_params.k_neg; + ops[i]->turbo_dec.tb_params.c = + turbo_dec->tb_params.c; + ops[i]->turbo_dec.tb_params.c_neg = + turbo_dec->tb_params.c_neg; + ops[i]->turbo_dec.tb_params.cab = + turbo_dec->tb_params.cab; + ops[i]->turbo_dec.tb_params.r = + turbo_dec->tb_params.r; + } else { + ops[i]->turbo_dec.cb_params.e = turbo_dec->cb_params.e; + ops[i]->turbo_dec.cb_params.k = turbo_dec->cb_params.k; + } + + ops[i]->turbo_dec.ext_scale = turbo_dec->ext_scale; + ops[i]->turbo_dec.iter_max = turbo_dec->iter_max; + ops[i]->turbo_dec.iter_min = turbo_dec->iter_min; + ops[i]->turbo_dec.op_flags = turbo_dec->op_flags; + ops[i]->turbo_dec.rv_index = turbo_dec->rv_index; + ops[i]->turbo_dec.num_maps = turbo_dec->num_maps; + ops[i]->turbo_dec.code_block_mode = turbo_dec->code_block_mode; + + ops[i]->turbo_dec.hard_output = hard_outputs[start_idx + i]; + ops[i]->turbo_dec.input = inputs[start_idx + i]; + if (soft_outputs != NULL) + ops[i]->turbo_dec.soft_output = + soft_outputs[start_idx + i]; + } +} + +static void +copy_reference_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, + unsigned int start_idx, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *outputs, + struct rte_bbdev_enc_op *ref_op) +{ + unsigned int i; + struct rte_bbdev_op_turbo_enc *turbo_enc = &ref_op->turbo_enc; + for (i = 0; i < n; ++i) { + if (turbo_enc->code_block_mode == 0) { + ops[i]->turbo_enc.tb_params.ea = + turbo_enc->tb_params.ea; + ops[i]->turbo_enc.tb_params.eb = + turbo_enc->tb_params.eb; + ops[i]->turbo_enc.tb_params.k_pos = + turbo_enc->tb_params.k_pos; + ops[i]->turbo_enc.tb_params.k_neg = + turbo_enc->tb_params.k_neg; + ops[i]->turbo_enc.tb_params.c = + turbo_enc->tb_params.c; + ops[i]->turbo_enc.tb_params.c_neg = + turbo_enc->tb_params.c_neg; + ops[i]->turbo_enc.tb_params.cab = + turbo_enc->tb_params.cab; + ops[i]->turbo_enc.tb_params.ncb_pos = + turbo_enc->tb_params.ncb_pos; + ops[i]->turbo_enc.tb_params.ncb_neg = + turbo_enc->tb_params.ncb_neg; + ops[i]->turbo_enc.tb_params.r = turbo_enc->tb_params.r; + } else { + ops[i]->turbo_enc.cb_params.e = turbo_enc->cb_params.e; + ops[i]->turbo_enc.cb_params.k = turbo_enc->cb_params.k; + ops[i]->turbo_enc.cb_params.ncb = + turbo_enc->cb_params.ncb; + } + ops[i]->turbo_enc.rv_index = turbo_enc->rv_index; + ops[i]->turbo_enc.op_flags = turbo_enc->op_flags; + ops[i]->turbo_enc.code_block_mode = turbo_enc->code_block_mode; + + ops[i]->turbo_enc.output = outputs[start_idx + i]; + ops[i]->turbo_enc.input = inputs[start_idx + i]; + } +} + + +/* Returns a random number drawn from a normal distribution + * with mean of 0 and variance of 1 + * Marsaglia algorithm + */ +static double +randn(int n) +{ + double S, Z, U1, U2, u, v, fac; + + do { + U1 = (double)rand() / RAND_MAX; + U2 = (double)rand() / RAND_MAX; + u = 2. * U1 - 1.; + v = 2. * U2 - 1.; + S = u * u + v * v; + } while (S >= 1 || S == 0); + fac = sqrt(-2. * log(S) / S); + Z = (n % 2) ? u * fac : v * fac; + return Z; +} + +static inline double +maxstar(double A, double B) +{ + if (fabs(A - B) > 5) + return RTE_MAX(A, B); + else + return RTE_MAX(A, B) + log1p(exp(-fabs(A - B))); +} + +/* + * Generate Qm LLRS for Qm==8 + * Modulation, AWGN and LLR estimation from max log development + */ +static void +gen_qm8_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) +{ + int qm = 8; + int qam = 256; + int m, k; + double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; + /* 5.1.4 of TS38.211 */ + const double symbols_I[256] = { + 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 5, + 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 11, + 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, 15, 13, 13, + 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, + 15, 13, 13, 15, 15, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, + 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, + 1, 3, 3, 1, 1, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, + 15, 15, 13, 13, 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, + 13, 13, 15, 15, 13, 13, 15, 15, -5, -5, -7, -7, -5, + -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, + -7, -7, -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, + -1, -1, -11, -11, -9, -9, -11, -11, -9, -9, -13, + -13, -15, -15, -13, -13, -15, -15, -11, -11, -9, + -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, + -13, -15, -15, -5, -5, -7, -7, -5, -5, -7, -7, -3, + -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, -5, -5, + -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -11, -11, + -9, -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, + -13, -15, -15, -11, -11, -9, -9, -11, -11, -9, -9, + -13, -13, -15, -15, -13, -13, -15, -15}; + const double symbols_Q[256] = { + 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, + 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, 13, + 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, + 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, + 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, -5, + -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, + -15, -13, -15, -11, -9, -11, -9, -13, -15, -13, + -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, -5, + -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, + -13, -15, -11, -9, -11, -9, -13, -15, -13, -15, 5, + 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, + 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, + 13, 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, + 3, 1, 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, + 13, 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, + -5, -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, + -13, -15, -13, -15, -11, -9, -11, -9, -13, -15, + -13, -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, + -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, + -13, -15, -11, -9, -11, -9, -13, -15, -13, -15}; + /* Average constellation point energy */ + N0 *= 170.0; + for (k = 0; k < qm; k++) + b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; + /* 5.1.4 of TS38.211 */ + I = (1 - 2 * b[0]) * (8 - (1 - 2 * b[2]) * + (4 - (1 - 2 * b[4]) * (2 - (1 - 2 * b[6])))); + Q = (1 - 2 * b[1]) * (8 - (1 - 2 * b[3]) * + (4 - (1 - 2 * b[5]) * (2 - (1 - 2 * b[7])))); + /* AWGN channel */ + I += sqrt(N0 / 2) * randn(0); + Q += sqrt(N0 / 2) * randn(1); + /* + * Calculate the log of the probability that each of + * the constellation points was transmitted + */ + for (m = 0; m < qam; m++) + log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) + + pow(Q - symbols_Q[m], 2.0)) / N0; + /* Calculate an LLR for each of the k_64QAM bits in the set */ + for (k = 0; k < qm; k++) { + p0 = -999999; + p1 = -999999; + /* For each constellation point */ + for (m = 0; m < qam; m++) { + if ((m >> (qm - k - 1)) & 1) + p1 = maxstar(p1, log_syml_prob[m]); + else + p0 = maxstar(p0, log_syml_prob[m]); + } + /* Calculate the LLR */ + llr_ = p0 - p1; + llr_ *= (1 << ldpc_llr_decimals); + llr_ = round(llr_); + if (llr_ > llr_max) + llr_ = llr_max; + if (llr_ < -llr_max) + llr_ = -llr_max; + llrs[qm * i + k] = (int8_t) llr_; + } +} + + +/* + * Generate Qm LLRS for Qm==6 + * Modulation, AWGN and LLR estimation from max log development + */ +static void +gen_qm6_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) +{ + int qm = 6; + int qam = 64; + int m, k; + double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; + /* 5.1.4 of TS38.211 */ + const double symbols_I[64] = { + 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, + 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, + -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, + -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, + -5, -5, -7, -7, -5, -5, -7, -7}; + const double symbols_Q[64] = { + 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, + -3, -1, -3, -1, -5, -7, -5, -7, -3, -1, -3, -1, + -5, -7, -5, -7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, + 5, 7, 5, 7, -3, -1, -3, -1, -5, -7, -5, -7, + -3, -1, -3, -1, -5, -7, -5, -7}; + /* Average constellation point energy */ + N0 *= 42.0; + for (k = 0; k < qm; k++) + b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; + /* 5.1.4 of TS38.211 */ + I = (1 - 2 * b[0])*(4 - (1 - 2 * b[2]) * (2 - (1 - 2 * b[4]))); + Q = (1 - 2 * b[1])*(4 - (1 - 2 * b[3]) * (2 - (1 - 2 * b[5]))); + /* AWGN channel */ + I += sqrt(N0 / 2) * randn(0); + Q += sqrt(N0 / 2) * randn(1); + /* + * Calculate the log of the probability that each of + * the constellation points was transmitted + */ + for (m = 0; m < qam; m++) + log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) + + pow(Q - symbols_Q[m], 2.0)) / N0; + /* Calculate an LLR for each of the k_64QAM bits in the set */ + for (k = 0; k < qm; k++) { + p0 = -999999; + p1 = -999999; + /* For each constellation point */ + for (m = 0; m < qam; m++) { + if ((m >> (qm - k - 1)) & 1) + p1 = maxstar(p1, log_syml_prob[m]); + else + p0 = maxstar(p0, log_syml_prob[m]); + } + /* Calculate the LLR */ + llr_ = p0 - p1; + llr_ *= (1 << ldpc_llr_decimals); + llr_ = round(llr_); + if (llr_ > llr_max) + llr_ = llr_max; + if (llr_ < -llr_max) + llr_ = -llr_max; + llrs[qm * i + k] = (int8_t) llr_; + } +} + +/* + * Generate Qm LLRS for Qm==4 + * Modulation, AWGN and LLR estimation from max log development + */ +static void +gen_qm4_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) +{ + int qm = 4; + int qam = 16; + int m, k; + double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; + /* 5.1.4 of TS38.211 */ + const double symbols_I[16] = {1, 1, 3, 3, 1, 1, 3, 3, + -1, -1, -3, -3, -1, -1, -3, -3}; + const double symbols_Q[16] = {1, 3, 1, 3, -1, -3, -1, -3, + 1, 3, 1, 3, -1, -3, -1, -3}; + /* Average constellation point energy */ + N0 *= 10.0; + for (k = 0; k < qm; k++) + b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; + /* 5.1.4 of TS38.211 */ + I = (1 - 2 * b[0]) * (2 - (1 - 2 * b[2])); + Q = (1 - 2 * b[1]) * (2 - (1 - 2 * b[3])); + /* AWGN channel */ + I += sqrt(N0 / 2) * randn(0); + Q += sqrt(N0 / 2) * randn(1); + /* + * Calculate the log of the probability that each of + * the constellation points was transmitted + */ + for (m = 0; m < qam; m++) + log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) + + pow(Q - symbols_Q[m], 2.0)) / N0; + /* Calculate an LLR for each of the k_64QAM bits in the set */ + for (k = 0; k < qm; k++) { + p0 = -999999; + p1 = -999999; + /* For each constellation point */ + for (m = 0; m < qam; m++) { + if ((m >> (qm - k - 1)) & 1) + p1 = maxstar(p1, log_syml_prob[m]); + else + p0 = maxstar(p0, log_syml_prob[m]); + } + /* Calculate the LLR */ + llr_ = p0 - p1; + llr_ *= (1 << ldpc_llr_decimals); + llr_ = round(llr_); + if (llr_ > llr_max) + llr_ = llr_max; + if (llr_ < -llr_max) + llr_ = -llr_max; + llrs[qm * i + k] = (int8_t) llr_; + } +} + +static void +gen_qm2_llr(int8_t *llrs, uint32_t j, double N0, double llr_max) +{ + double b, b1, n; + double coeff = 2.0 * sqrt(N0); + + /* Ignore in vectors rare quasi null LLRs not to be saturated */ + if (llrs[j] < 8 && llrs[j] > -8) + return; + + /* Note don't change sign here */ + n = randn(j % 2); + b1 = ((llrs[j] > 0 ? 2.0 : -2.0) + + coeff * n) / N0; + b = b1 * (1 << ldpc_llr_decimals); + b = round(b); + if (b > llr_max) + b = llr_max; + if (b < -llr_max) + b = -llr_max; + llrs[j] = (int8_t) b; +} + +/* Generate LLR for a given SNR */ +static void +generate_llr_input(uint16_t n, struct rte_bbdev_op_data *inputs, + struct rte_bbdev_dec_op *ref_op) +{ + struct rte_mbuf *m; + uint16_t qm; + uint32_t i, j, e, range; + double N0, llr_max; + + e = ref_op->ldpc_dec.cb_params.e; + qm = ref_op->ldpc_dec.q_m; + llr_max = (1 << (ldpc_llr_size - 1)) - 1; + range = e / qm; + N0 = 1.0 / pow(10.0, get_snr() / 10.0); + + for (i = 0; i < n; ++i) { + m = inputs[i].data; + int8_t *llrs = rte_pktmbuf_mtod_offset(m, int8_t *, 0); + if (qm == 8) { + for (j = 0; j < range; ++j) + gen_qm8_llr(llrs, j, N0, llr_max); + } else if (qm == 6) { + for (j = 0; j < range; ++j) + gen_qm6_llr(llrs, j, N0, llr_max); + } else if (qm == 4) { + for (j = 0; j < range; ++j) + gen_qm4_llr(llrs, j, N0, llr_max); + } else { + for (j = 0; j < e; ++j) + gen_qm2_llr(llrs, j, N0, llr_max); + } + } +} + +static void +copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, + unsigned int start_idx, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *hard_outputs, + struct rte_bbdev_op_data *soft_outputs, + struct rte_bbdev_op_data *harq_inputs, + struct rte_bbdev_op_data *harq_outputs, + struct rte_bbdev_dec_op *ref_op) +{ + unsigned int i; + struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; + struct rte_mbuf *m = inputs->data; + + for (i = 0; i < n; ++i) { + if (ldpc_dec->code_block_mode == 0) { + ops[i]->ldpc_dec.tb_params.ea = + ldpc_dec->tb_params.ea; + ops[i]->ldpc_dec.tb_params.eb = + ldpc_dec->tb_params.eb; + ops[i]->ldpc_dec.tb_params.c = + ldpc_dec->tb_params.c; + ops[i]->ldpc_dec.tb_params.cab = + ldpc_dec->tb_params.cab; + ops[i]->ldpc_dec.tb_params.r = + ldpc_dec->tb_params.r; + printf("code block ea %d eb %d c %d cab %d r %d\n",ldpc_dec->tb_params.ea,ldpc_dec->tb_params.eb,ldpc_dec->tb_params.c, ldpc_dec->tb_params.cab, ldpc_dec->tb_params.r); + } else { + ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; + } + + ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; + ops[i]->ldpc_dec.z_c = ldpc_dec->z_c; + ops[i]->ldpc_dec.q_m = ldpc_dec->q_m; + ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler; + ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; + ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; + ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; + ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags; + ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; + + //printf("reference bg %d zc %d qm %d nfiller n_filler, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); + +//if (i<10) +//printf("input %x\n",inputs[start_idx+i]); + + if (hard_outputs != NULL) + ops[i]->ldpc_dec.hard_output = + hard_outputs[start_idx + i]; + if (inputs != NULL) + ops[i]->ldpc_dec.input = + inputs[start_idx + i]; + if (soft_outputs != NULL) + ops[i]->ldpc_dec.soft_output = + soft_outputs[start_idx + i]; + if (harq_inputs != NULL) + ops[i]->ldpc_dec.harq_combined_input = + harq_inputs[start_idx + i]; + if (harq_outputs != NULL) + ops[i]->ldpc_dec.harq_combined_output = + harq_outputs[start_idx + i]; + + // if (i<10) +//printf("ldpc_dec input %x\n",*ops[i]->ldpc_dec.input->data->buf_addr); + + + + + } +} + + +static void +copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, + unsigned int start_idx, + struct rte_bbdev_op_data *inputs, + struct rte_bbdev_op_data *outputs, + struct rte_bbdev_enc_op *ref_op) +{ + unsigned int i; + struct rte_bbdev_op_ldpc_enc *ldpc_enc = &ref_op->ldpc_enc; + for (i = 0; i < n; ++i) { + if (ldpc_enc->code_block_mode == 0) { + ops[i]->ldpc_enc.tb_params.ea = ldpc_enc->tb_params.ea; + ops[i]->ldpc_enc.tb_params.eb = ldpc_enc->tb_params.eb; + ops[i]->ldpc_enc.tb_params.cab = + ldpc_enc->tb_params.cab; + ops[i]->ldpc_enc.tb_params.c = ldpc_enc->tb_params.c; + ops[i]->ldpc_enc.tb_params.r = ldpc_enc->tb_params.r; + } else { + ops[i]->ldpc_enc.cb_params.e = ldpc_enc->cb_params.e; + } + ops[i]->ldpc_enc.basegraph = ldpc_enc->basegraph; + ops[i]->ldpc_enc.z_c = ldpc_enc->z_c; + ops[i]->ldpc_enc.q_m = ldpc_enc->q_m; + ops[i]->ldpc_enc.n_filler = ldpc_enc->n_filler; + ops[i]->ldpc_enc.n_cb = ldpc_enc->n_cb; + ops[i]->ldpc_enc.rv_index = ldpc_enc->rv_index; + ops[i]->ldpc_enc.op_flags = ldpc_enc->op_flags; + ops[i]->ldpc_enc.code_block_mode = ldpc_enc->code_block_mode; + ops[i]->ldpc_enc.output = outputs[start_idx + i]; + ops[i]->ldpc_enc.input = inputs[start_idx + i]; + } +} + +static int +check_dec_status_and_ordering(struct rte_bbdev_dec_op *op, + unsigned int order_idx, const int expected_status) +{ + int status = op->status; + /* ignore parity mismatch false alarms for long iterations */ + if (get_iter_max() >= 10) { + if (!(expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) && + (status & (1 << RTE_BBDEV_SYNDROME_ERROR))) { + printf("WARNING: Ignore Syndrome Check mismatch\n"); + status -= (1 << RTE_BBDEV_SYNDROME_ERROR); + } + if ((expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) && + !(status & (1 << RTE_BBDEV_SYNDROME_ERROR))) { + printf("WARNING: Ignore Syndrome Check mismatch\n"); + status += (1 << RTE_BBDEV_SYNDROME_ERROR); + } + } + + TEST_ASSERT(status == expected_status, + "op_status (%d) != expected_status (%d)", + op->status, expected_status); + + TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, + "Ordering error, expected %p, got %p", + (void *)(uintptr_t)order_idx, op->opaque_data); + + return TEST_SUCCESS; +} + +static int +check_enc_status_and_ordering(struct rte_bbdev_enc_op *op, + unsigned int order_idx, const int expected_status) +{ + TEST_ASSERT(op->status == expected_status, + "op_status (%d) != expected_status (%d)", + op->status, expected_status); + + if (op->opaque_data != (void *)(uintptr_t)INVALID_OPAQUE) + TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, + "Ordering error, expected %p, got %p", + (void *)(uintptr_t)order_idx, op->opaque_data); + + return TEST_SUCCESS; +} + +static inline int +validate_op_chain(struct rte_bbdev_op_data *op, + struct op_data_entries *orig_op) +{ + uint8_t i; + struct rte_mbuf *m = op->data; + uint8_t nb_dst_segments = orig_op->nb_segments; + uint32_t total_data_size = 0; +char *data = m->buf_addr; +memcpy(ldpc_output, data+128, (rte_pktmbuf_data_len(m) - op->offset)); +//ldpc_output = (int8_t *)(m->buf_addr); +/*printf("validate op chain nb segs %d offset %d data off %d\n",m->nb_segs, op->offset, m->data_off); + +int l=0; +for (l=0;l<16;l++) +{ +printf(" data[%d] = %x\n",l, *(data+l+128)); + +} +*/ + TEST_ASSERT(nb_dst_segments == m->nb_segs, + "Number of segments differ in original (%u) and filled (%u) op", + nb_dst_segments, m->nb_segs); + + /* Validate each mbuf segment length */ + for (i = 0; i < nb_dst_segments; ++i) { + /* Apply offset to the first mbuf segment */ + uint16_t offset = (i == 0) ? op->offset : 0; + uint16_t data_len = rte_pktmbuf_data_len(m) - offset; + total_data_size += orig_op->segments[i].length; + +//printf("segment %d offset %d length %d\n",i, offset,total_data_size); +// TEST_ASSERT(orig_op->segments[i].length == data_len, +// "Length of segment differ in original (%u) and filled (%u) op", +// orig_op->segments[i].length, data_len); + /* TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, + rte_pktmbuf_mtod_offset(m, uint32_t *, offset), + data_len, + "Output buffers (CB=%u) are not equal", i); +*/ + m = m->next; + } + + /* Validate total mbuf pkt length */ + uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; + TEST_ASSERT(total_data_size == pkt_len, + "Length of data differ in original (%u) and filled (%u) op", + total_data_size, pkt_len); + + return TEST_SUCCESS; +} + +/* + * Compute K0 for a given configuration for HARQ output length computation + * As per definition in 3GPP 38.212 Table 5.4.2.1-2 + */ +static inline uint16_t +get_k0(uint16_t n_cb, uint16_t z_c, uint8_t bg, uint8_t rv_index) +{ + if (rv_index == 0) + return 0; + uint16_t n = (bg == 1 ? N_ZC_1 : N_ZC_2) * z_c; + if (n_cb == n) { + if (rv_index == 1) + return (bg == 1 ? K0_1_1 : K0_1_2) * z_c; + else if (rv_index == 2) + return (bg == 1 ? K0_2_1 : K0_2_2) * z_c; + else + return (bg == 1 ? K0_3_1 : K0_3_2) * z_c; + } + /* LBRM case - includes a division by N */ + if (rv_index == 1) + return (((bg == 1 ? K0_1_1 : K0_1_2) * n_cb) + / n) * z_c; + else if (rv_index == 2) + return (((bg == 1 ? K0_2_1 : K0_2_2) * n_cb) + / n) * z_c; + else + return (((bg == 1 ? K0_3_1 : K0_3_2) * n_cb) + / n) * z_c; +} + +/* HARQ output length including the Filler bits */ +static inline uint16_t +compute_harq_len(struct rte_bbdev_op_ldpc_dec *ops_ld) +{ + uint16_t k0 = 0; + uint8_t max_rv = (ops_ld->rv_index == 1) ? 3 : ops_ld->rv_index; + k0 = get_k0(ops_ld->n_cb, ops_ld->z_c, ops_ld->basegraph, max_rv); + /* Compute RM out size and number of rows */ + uint16_t parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) + * ops_ld->z_c - ops_ld->n_filler; + uint16_t deRmOutSize = RTE_MIN( + k0 + ops_ld->cb_params.e + + ((k0 > parity_offset) ? + 0 : ops_ld->n_filler), + ops_ld->n_cb); + uint16_t numRows = ((deRmOutSize + ops_ld->z_c - 1) + / ops_ld->z_c); + uint16_t harq_output_len = numRows * ops_ld->z_c; + return harq_output_len; +} + +static inline int +validate_op_harq_chain(struct rte_bbdev_op_data *op, + struct op_data_entries *orig_op, + struct rte_bbdev_op_ldpc_dec *ops_ld) +{ + uint8_t i; + uint32_t j, jj, k; + struct rte_mbuf *m = op->data; + uint8_t nb_dst_segments = orig_op->nb_segments; + uint32_t total_data_size = 0; + int8_t *harq_orig, *harq_out, abs_harq_origin; + uint32_t byte_error = 0, cum_error = 0, error; + int16_t llr_max = (1 << (ldpc_llr_size - ldpc_llr_decimals)) - 1; + int16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; + uint16_t parity_offset; + + TEST_ASSERT(nb_dst_segments == m->nb_segs, + "Number of segments differ in original (%u) and filled (%u) op", + nb_dst_segments, m->nb_segs); + + /* Validate each mbuf segment length */ + for (i = 0; i < nb_dst_segments; ++i) { + /* Apply offset to the first mbuf segment */ + uint16_t offset = (i == 0) ? op->offset : 0; + uint16_t data_len = rte_pktmbuf_data_len(m) - offset; + total_data_size += orig_op->segments[i].length; + + TEST_ASSERT(orig_op->segments[i].length < + (uint32_t)(data_len + 64), + "Length of segment differ in original (%u) and filled (%u) op", + orig_op->segments[i].length, data_len); + harq_orig = (int8_t *) orig_op->segments[i].addr; + harq_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset); + + if (!(ldpc_cap_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS + ) || (ops_ld->op_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { + data_len -= ops_ld->z_c; + parity_offset = data_len; + } else { + /* Compute RM out size and number of rows */ + parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) + * ops_ld->z_c - ops_ld->n_filler; + uint16_t deRmOutSize = compute_harq_len(ops_ld) - + ops_ld->n_filler; + if (data_len > deRmOutSize) + data_len = deRmOutSize; + if (data_len > orig_op->segments[i].length) + data_len = orig_op->segments[i].length; + } + /* + * HARQ output can have minor differences + * due to integer representation and related scaling + */ + for (j = 0, jj = 0; j < data_len; j++, jj++) { + if (j == parity_offset) { + /* Special Handling of the filler bits */ + for (k = 0; k < ops_ld->n_filler; k++) { + if (harq_out[jj] != + llr_max_pre_scaling) { + printf("HARQ Filler issue %d: %d %d\n", + jj, harq_out[jj], + llr_max); + byte_error++; + } + jj++; + } + } + if (!(ops_ld->op_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { + if (ldpc_llr_decimals > 1) + harq_out[jj] = (harq_out[jj] + 1) + >> (ldpc_llr_decimals - 1); + /* Saturated to S7 */ + if (harq_orig[j] > llr_max) + harq_orig[j] = llr_max; + if (harq_orig[j] < -llr_max) + harq_orig[j] = -llr_max; + } + if (harq_orig[j] != harq_out[jj]) { + error = (harq_orig[j] > harq_out[jj]) ? + harq_orig[j] - harq_out[jj] : + harq_out[jj] - harq_orig[j]; + abs_harq_origin = harq_orig[j] > 0 ? + harq_orig[j] : + -harq_orig[j]; + /* Residual quantization error */ + if ((error > 8 && (abs_harq_origin < + (llr_max - 16))) || + (error > 16)) { + printf("HARQ mismatch %d: exp %d act %d => %d\n", + j, harq_orig[j], + harq_out[jj], error); + byte_error++; + cum_error += error; + } + } + } + m = m->next; + } + + if (byte_error) + TEST_ASSERT(byte_error <= 1, + "HARQ output mismatch (%d) %d", + byte_error, cum_error); + + /* Validate total mbuf pkt length */ + uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; + TEST_ASSERT(total_data_size < pkt_len + 64, + "Length of data differ in original (%u) and filled (%u) op", + total_data_size, pkt_len); + + return TEST_SUCCESS; +} + +static int +validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, + struct rte_bbdev_dec_op *ref_op, const int vector_mask) +{ + unsigned int i; + int ret; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + struct op_data_entries *soft_data_orig = + &test_vector.entries[DATA_SOFT_OUTPUT]; + struct rte_bbdev_op_turbo_dec *ops_td; + struct rte_bbdev_op_data *hard_output; + struct rte_bbdev_op_data *soft_output; + struct rte_bbdev_op_turbo_dec *ref_td = &ref_op->turbo_dec; + + for (i = 0; i < n; ++i) { + ops_td = &ops[i]->turbo_dec; + hard_output = &ops_td->hard_output; + soft_output = &ops_td->soft_output; + + if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) + TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, + "Returned iter_count (%d) > expected iter_count (%d)", + ops_td->iter_count, ref_td->iter_count); + ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); + TEST_ASSERT_SUCCESS(ret, + "Checking status and ordering for decoder failed"); + + TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, + hard_data_orig), + "Hard output buffers (CB=%u) are not equal", + i); + + if (ref_op->turbo_dec.op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) + TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, + soft_data_orig), + "Soft output buffers (CB=%u) are not equal", + i); + } + + return TEST_SUCCESS; +} + +/* Check Number of code blocks errors */ +static int +validate_ldpc_bler(struct rte_bbdev_dec_op **ops, const uint16_t n) +{ + unsigned int i; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + struct rte_bbdev_op_ldpc_dec *ops_td; + struct rte_bbdev_op_data *hard_output; + int errors = 0; + struct rte_mbuf *m; + + for (i = 0; i < n; ++i) { + ops_td = &ops[i]->ldpc_dec; + hard_output = &ops_td->hard_output; + m = hard_output->data; + if (memcmp(rte_pktmbuf_mtod_offset(m, uint32_t *, 0), + hard_data_orig->segments[0].addr, + hard_data_orig->segments[0].length)) + errors++; + } + return errors; +} + +static int +validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, + struct rte_bbdev_dec_op *ref_op, const int vector_mask) +{ +printf("validate ldpc dec op \n"); + + unsigned int i; + int ret; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + struct op_data_entries *soft_data_orig = + &test_vector.entries[DATA_SOFT_OUTPUT]; + struct op_data_entries *harq_data_orig = + &test_vector.entries[DATA_HARQ_OUTPUT]; + struct rte_bbdev_op_ldpc_dec *ops_td; + struct rte_bbdev_op_data *hard_output; + struct rte_bbdev_op_data *harq_output; + struct rte_bbdev_op_data *soft_output; + struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec; + + for (i = 0; i < n; ++i) { + ops_td = &ops[i]->ldpc_dec; + hard_output = &ops_td->hard_output; + harq_output = &ops_td->harq_combined_output; + soft_output = &ops_td->soft_output; + + /* ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); + TEST_ASSERT_SUCCESS(ret, + "Checking status and ordering for decoder failed"); + if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) + TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, + "Returned iter_count (%d) > expected iter_count (%d)", + ops_td->iter_count, ref_td->iter_count); +*/ + /* + * We can ignore output data when the decoding failed to + * converge or for loop-back cases + */ +/* if (!check_bit(ops[i]->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + ) && ( + ops[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR + )) == 0) +*/ +TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, + hard_data_orig), + "Hard output buffers (CB=%u) are not equal", + i); + + if (ref_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) + TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, + soft_data_orig), + "Soft output buffers (CB=%u) are not equal", + i); + if (ref_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) { + TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, + harq_data_orig, ops_td), + "HARQ output buffers (CB=%u) are not equal", + i); + } + if (ref_op->ldpc_dec.op_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) + TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, + harq_data_orig, ops_td), + "HARQ output buffers (CB=%u) are not equal", + i); + + } + + return TEST_SUCCESS; +} + + +static int +validate_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, + struct rte_bbdev_enc_op *ref_op) +{ + unsigned int i; + int ret; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + + for (i = 0; i < n; ++i) { + ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); + TEST_ASSERT_SUCCESS(ret, + "Checking status and ordering for encoder failed"); + TEST_ASSERT_SUCCESS(validate_op_chain( + &ops[i]->turbo_enc.output, + hard_data_orig), + "Output buffers (CB=%u) are not equal", + i); + } + + return TEST_SUCCESS; +} + +static int +validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, + struct rte_bbdev_enc_op *ref_op) +{ + unsigned int i; + int ret; + struct op_data_entries *hard_data_orig = + &test_vector.entries[DATA_HARD_OUTPUT]; + + for (i = 0; i < n; ++i) { + ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); + TEST_ASSERT_SUCCESS(ret, + "Checking status and ordering for encoder failed"); + TEST_ASSERT_SUCCESS(validate_op_chain( + &ops[i]->ldpc_enc.output, + hard_data_orig), + "Output buffers (CB=%u) are not equal", + i); + } + + return TEST_SUCCESS; +} + +static void +create_reference_dec_op(struct rte_bbdev_dec_op *op) +{ + unsigned int i; + struct op_data_entries *entry; + + op->turbo_dec = test_vector.turbo_dec; + entry = &test_vector.entries[DATA_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->turbo_dec.input.length += + entry->segments[i].length; +} + +static void +create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op) +{ + unsigned int i; + struct op_data_entries *entry; + + op->ldpc_dec = test_vector.ldpc_dec; + entry = &test_vector.entries[DATA_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->ldpc_dec.input.length += + entry->segments[i].length; + if (test_vector.ldpc_dec.op_flags & + RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) { + entry = &test_vector.entries[DATA_HARQ_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->ldpc_dec.harq_combined_input.length += + entry->segments[i].length; + } +} + + +static void +create_reference_enc_op(struct rte_bbdev_enc_op *op) +{ + unsigned int i; + struct op_data_entries *entry; + + op->turbo_enc = test_vector.turbo_enc; + entry = &test_vector.entries[DATA_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->turbo_enc.input.length += + entry->segments[i].length; +} + +static void +create_reference_ldpc_enc_op(struct rte_bbdev_enc_op *op) +{ + unsigned int i; + struct op_data_entries *entry; + + op->ldpc_enc = test_vector.ldpc_enc; + entry = &test_vector.entries[DATA_INPUT]; + for (i = 0; i < entry->nb_segments; ++i) + op->ldpc_enc.input.length += + entry->segments[i].length; +} + +static uint32_t +calc_dec_TB_size(struct rte_bbdev_dec_op *op) +{ + uint8_t i; + uint32_t c, r, tb_size = 0; + + if (op->turbo_dec.code_block_mode) { + tb_size = op->turbo_dec.tb_params.k_neg; + } else { + c = op->turbo_dec.tb_params.c; + r = op->turbo_dec.tb_params.r; + for (i = 0; i < c-r; i++) + tb_size += (r < op->turbo_dec.tb_params.c_neg) ? + op->turbo_dec.tb_params.k_neg : + op->turbo_dec.tb_params.k_pos; + } + return tb_size; +} + +static uint32_t +calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) +{ + uint8_t i; + uint32_t c, r, tb_size = 0; + uint16_t sys_cols = (op->ldpc_dec.basegraph == 1) ? 22 : 10; + + if (op->ldpc_dec.code_block_mode) { + tb_size = sys_cols * op->ldpc_dec.z_c - op->ldpc_dec.n_filler; + } else { + c = op->ldpc_dec.tb_params.c; + r = op->ldpc_dec.tb_params.r; + for (i = 0; i < c-r; i++) + tb_size += sys_cols * op->ldpc_dec.z_c + - op->ldpc_dec.n_filler; + printf("calc tb c %d r %d sys cols %d tb_size %d\n",c,r,sys_cols,tb_size); + } + return tb_size; +} + +static uint32_t +calc_enc_TB_size(struct rte_bbdev_enc_op *op) +{ + uint8_t i; + uint32_t c, r, tb_size = 0; + + if (op->turbo_enc.code_block_mode) { + tb_size = op->turbo_enc.tb_params.k_neg; + } else { + c = op->turbo_enc.tb_params.c; + r = op->turbo_enc.tb_params.r; + for (i = 0; i < c-r; i++) + tb_size += (r < op->turbo_enc.tb_params.c_neg) ? + op->turbo_enc.tb_params.k_neg : + op->turbo_enc.tb_params.k_pos; + } + return tb_size; +} + +static uint32_t +calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op *op) +{ + uint8_t i; + uint32_t c, r, tb_size = 0; + uint16_t sys_cols = (op->ldpc_enc.basegraph == 1) ? 22 : 10; + + if (op->turbo_enc.code_block_mode) { + tb_size = sys_cols * op->ldpc_enc.z_c - op->ldpc_enc.n_filler; + } else { + c = op->turbo_enc.tb_params.c; + r = op->turbo_enc.tb_params.r; + for (i = 0; i < c-r; i++) + tb_size += sys_cols * op->ldpc_enc.z_c + - op->ldpc_enc.n_filler; + } + return tb_size; +} + + +static int +init_test_op_params(struct test_op_params *op_params, + enum rte_bbdev_op_type op_type, const int expected_status, + const int vector_mask, struct rte_mempool *ops_mp, + uint16_t burst_sz, uint16_t num_to_process, uint16_t num_lcores) +{ + int ret = 0; + if (op_type == RTE_BBDEV_OP_TURBO_DEC || + op_type == RTE_BBDEV_OP_LDPC_DEC) + ret = rte_bbdev_dec_op_alloc_bulk(ops_mp, + &op_params->ref_dec_op, 1); + else + ret = rte_bbdev_enc_op_alloc_bulk(ops_mp, + &op_params->ref_enc_op, 1); + + TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed"); + + op_params->mp = ops_mp; + op_params->burst_sz = burst_sz; + op_params->num_to_process = num_to_process; + op_params->num_lcores = num_lcores; + op_params->vector_mask = vector_mask; + if (op_type == RTE_BBDEV_OP_TURBO_DEC || + op_type == RTE_BBDEV_OP_LDPC_DEC) + op_params->ref_dec_op->status = expected_status; + else if (op_type == RTE_BBDEV_OP_TURBO_ENC + || op_type == RTE_BBDEV_OP_LDPC_ENC) + op_params->ref_enc_op->status = expected_status; + return 0; +} + +static int +run_test_case_on_device(test_case_function *test_case_func, uint8_t dev_id, + struct test_op_params *op_params) +{ + +printf("run test case on device\n"); + int t_ret, f_ret, socket_id = SOCKET_ID_ANY; + unsigned int i; + struct active_device *ad; + unsigned int burst_sz = get_burst_sz(); + +test_vector.op_type= RTE_BBDEV_OP_LDPC_DEC; + +enum rte_bbdev_op_type op_type = test_vector.op_type; + const struct rte_bbdev_op_cap *capabilities = NULL; + + ad = &active_devs[dev_id]; + + /* Check if device supports op_type */ + if (!is_avail_op(ad, test_vector.op_type)) + return TEST_SUCCESS; + + struct rte_bbdev_info info; + rte_bbdev_info_get(ad->dev_id, &info); + socket_id = GET_SOCKET(info.socket_id); + + f_ret = create_mempools(ad, socket_id, op_type, + get_num_ops()); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't create mempools"); + goto fail; + } + if (op_type == RTE_BBDEV_OP_NONE) + op_type = RTE_BBDEV_OP_TURBO_ENC; + + f_ret = init_test_op_params(op_params, test_vector.op_type, + test_vector.expected_status, + test_vector.mask, + ad->ops_mempool, + burst_sz, + get_num_ops(), + get_num_lcores()); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't init test op params"); + goto fail; + } + + + /* Find capabilities */ + const struct rte_bbdev_op_cap *cap = info.drv.capabilities; + for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { + if (cap->type == test_vector.op_type) { + capabilities = cap; + break; + } + cap++; + } + TEST_ASSERT_NOT_NULL(capabilities, + "Couldn't find capabilities"); + + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { + create_reference_dec_op(op_params->ref_dec_op); + } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) + create_reference_enc_op(op_params->ref_enc_op); + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + create_reference_ldpc_enc_op(op_params->ref_enc_op); + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + create_reference_ldpc_dec_op(op_params->ref_dec_op); + + for (i = 0; i < ad->nb_queues; ++i) { + f_ret = fill_queue_buffers(op_params, + ad->in_mbuf_pool, + ad->hard_out_mbuf_pool, + ad->soft_out_mbuf_pool, + ad->harq_in_mbuf_pool, + ad->harq_out_mbuf_pool, + ad->queue_ids[i], + capabilities, + info.drv.min_alignment, + socket_id); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't init queue buffers"); + goto fail; + } + } + + /* Run test case function */ + t_ret = test_case_func(ad, op_params); + + /* Free active device resources and return */ + free_buffers(ad, op_params); + return t_ret; + +fail: + free_buffers(ad, op_params); + return TEST_FAILED; +} + +/* Run given test function per active device per supported op type + * per burst size. + */ +static int +run_test_case(test_case_function *test_case_func) +{ +printf("run test case\n"); + int ret = 0; + uint8_t dev; + + /* Alloc op_params */ + struct test_op_params *op_params = rte_zmalloc(NULL, + sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", + RTE_ALIGN(sizeof(struct test_op_params), + RTE_CACHE_LINE_SIZE)); +printf("nb_active_devs %d\n",nb_active_devs); + /* For each device run test case function */ + for (dev = 0; dev < nb_active_devs; ++dev) + ret |= run_test_case_on_device(test_case_func, dev, op_params); + + rte_free(op_params); + + return ret; +} + + +/* Push back the HARQ output from DDR to host */ +static void +retrieve_harq_ddr(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_dec_op **ops, + const uint16_t n) +{ + uint16_t j; + int save_status, ret; + uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * 1024; + struct rte_bbdev_dec_op *ops_deq[MAX_BURST]; + uint32_t flags = ops[0]->ldpc_dec.op_flags; + bool loopback = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; + bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; + bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + for (j = 0; j < n; ++j) { + if ((loopback && mem_out) || hc_out) { + save_status = ops[j]->status; + ops[j]->ldpc_dec.op_flags = + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; + if (h_comp) + ops[j]->ldpc_dec.op_flags += + RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + ops[j]->ldpc_dec.harq_combined_input.offset = + harq_offset; + ops[j]->ldpc_dec.harq_combined_output.offset = 0; + harq_offset += HARQ_INCR; + if (!loopback) + ops[j]->ldpc_dec.harq_combined_input.length = + ops[j]->ldpc_dec.harq_combined_output.length; + rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, + &ops[j], 1); + ret = 0; + while (ret == 0) + ret = rte_bbdev_dequeue_ldpc_dec_ops( + dev_id, queue_id, + &ops_deq[j], 1); + ops[j]->ldpc_dec.op_flags = flags; + ops[j]->status = save_status; + } + } +} + +/* + * Push back the HARQ output from HW DDR to Host + * Preload HARQ memory input and adjust HARQ offset + */ +static void +preload_harq_ddr(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_dec_op **ops, const uint16_t n, + bool preload) +{ + uint16_t j; + int ret; + uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * 1024; + struct rte_bbdev_op_data save_hc_in, save_hc_out; + struct rte_bbdev_dec_op *ops_deq[MAX_BURST]; + uint32_t flags = ops[0]->ldpc_dec.op_flags; + bool mem_in = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; + bool hc_in = flags & RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE; + bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; + bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + for (j = 0; j < n; ++j) { + if ((mem_in || hc_in) && preload) { + save_hc_in = ops[j]->ldpc_dec.harq_combined_input; + save_hc_out = ops[j]->ldpc_dec.harq_combined_output; + ops[j]->ldpc_dec.op_flags = + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + if (h_comp) + ops[j]->ldpc_dec.op_flags += + RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; + ops[j]->ldpc_dec.harq_combined_output.offset = + harq_offset; + ops[j]->ldpc_dec.harq_combined_input.offset = 0; + rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, + &ops[j], 1); + ret = 0; + while (ret == 0) + ret = rte_bbdev_dequeue_ldpc_dec_ops( + dev_id, queue_id, &ops_deq[j], 1); + ops[j]->ldpc_dec.op_flags = flags; + ops[j]->ldpc_dec.harq_combined_input = save_hc_in; + ops[j]->ldpc_dec.harq_combined_output = save_hc_out; + } + /* Adjust HARQ offset when we reach external DDR */ + if (mem_in || hc_in) + ops[j]->ldpc_dec.harq_combined_input.offset + = harq_offset; + if (mem_out || hc_out) + ops[j]->ldpc_dec.harq_combined_output.offset + = harq_offset; + harq_offset += HARQ_INCR; + } +} + +static void +dequeue_event_callback(uint16_t dev_id, + enum rte_bbdev_event_type event, void *cb_arg, + void *ret_param) +{ + int ret; + uint16_t i; + uint64_t total_time; + uint16_t deq, burst_sz, num_ops; + uint16_t queue_id = *(uint16_t *) ret_param; + struct rte_bbdev_info info; + double tb_len_bits; + struct thread_params *tp = cb_arg; + + /* Find matching thread params using queue_id */ + for (i = 0; i < MAX_QUEUES; ++i, ++tp) + if (tp->queue_id == queue_id) + break; + + if (i == MAX_QUEUES) { + printf("%s: Queue_id from interrupt details was not found!\n", + __func__); + return; + } + + if (unlikely(event != RTE_BBDEV_EVENT_DEQUEUE)) { + rte_atomic16_set(&tp->processing_status, TEST_FAILED); + printf( + "Dequeue interrupt handler called for incorrect event!\n"); + return; + } + + burst_sz = rte_atomic16_read(&tp->burst_sz); + num_ops = tp->op_params->num_to_process; + + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) + deq = rte_bbdev_dequeue_dec_ops(dev_id, queue_id, + &tp->dec_ops[ + rte_atomic16_read(&tp->nb_dequeued)], + burst_sz); + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + deq = rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, + &tp->dec_ops[ + rte_atomic16_read(&tp->nb_dequeued)], + burst_sz); + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + deq = rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, + &tp->enc_ops[ + rte_atomic16_read(&tp->nb_dequeued)], + burst_sz); + else /*RTE_BBDEV_OP_TURBO_ENC*/ + deq = rte_bbdev_dequeue_enc_ops(dev_id, queue_id, + &tp->enc_ops[ + rte_atomic16_read(&tp->nb_dequeued)], + burst_sz); + + if (deq < burst_sz) { + printf( + "After receiving the interrupt all operations should be dequeued. Expected: %u, got: %u\n", + burst_sz, deq); + rte_atomic16_set(&tp->processing_status, TEST_FAILED); + return; + } + + if (rte_atomic16_read(&tp->nb_dequeued) + deq < num_ops) { + rte_atomic16_add(&tp->nb_dequeued, deq); + return; + } + + total_time = rte_rdtsc_precise() - tp->start_time; + + rte_bbdev_info_get(dev_id, &info); + + ret = TEST_SUCCESS; + + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + ret = validate_dec_op(tp->dec_ops, num_ops, ref_op, + tp->op_params->vector_mask); + /* get the max of iter_count for all dequeued ops */ + for (i = 0; i < num_ops; ++i) + tp->iter_count = RTE_MAX( + tp->dec_ops[i]->turbo_dec.iter_count, + tp->iter_count); + rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); + } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) { + struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; + ret = validate_enc_op(tp->enc_ops, num_ops, ref_op); + rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); + } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) { + struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; + ret = validate_ldpc_enc_op(tp->enc_ops, num_ops, ref_op); + rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); + } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + ret = validate_ldpc_dec_op(tp->dec_ops, num_ops, ref_op, + tp->op_params->vector_mask); + rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); + } + + if (ret) { + printf("Buffers validation failed\n"); + rte_atomic16_set(&tp->processing_status, TEST_FAILED); + } + + switch (test_vector.op_type) { + case RTE_BBDEV_OP_TURBO_DEC: + tb_len_bits = calc_dec_TB_size(tp->op_params->ref_dec_op); + break; + case RTE_BBDEV_OP_TURBO_ENC: + tb_len_bits = calc_enc_TB_size(tp->op_params->ref_enc_op); + break; + case RTE_BBDEV_OP_LDPC_DEC: + tb_len_bits = calc_ldpc_dec_TB_size(tp->op_params->ref_dec_op); + break; + case RTE_BBDEV_OP_LDPC_ENC: + tb_len_bits = calc_ldpc_enc_TB_size(tp->op_params->ref_enc_op); + break; + case RTE_BBDEV_OP_NONE: + tb_len_bits = 0.0; + break; + default: + printf("Unknown op type: %d\n", test_vector.op_type); + rte_atomic16_set(&tp->processing_status, TEST_FAILED); + return; + } + + tp->ops_per_sec += ((double)num_ops) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps += (((double)(num_ops * tb_len_bits)) / 1000000.0) / + ((double)total_time / (double)rte_get_tsc_hz()); + + rte_atomic16_add(&tp->nb_dequeued, deq); +} + +static int +throughput_intr_lcore_ldpc_dec(void *arg) +{ + struct thread_params *tp = arg; + unsigned int enqueued; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_to_process = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops[num_to_process]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + int ret, i, j; + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + uint16_t num_to_enq, enq; + + bool loopback = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); + bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), + "Failed to enable interrupts for dev: %u, queue_id: %u", + tp->dev_id, queue_id); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + +char *addrb = &bufs->inputs[0].data->buf_addr; + +unsigned int lm; +for (lm=0; lm<16;lm++ ){ +printf("bufs len %d data %x addr orig %p addr %p\n",bufs->inputs[0].data->data_len,*(addrb+lm+256),(addrb+lm),(addrb+lm+256)); +} + + + rte_atomic16_clear(&tp->processing_status); + rte_atomic16_clear(&tp->nb_dequeued); + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, + num_to_process); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_to_process); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops, num_to_process, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, + bufs->harq_inputs, bufs->harq_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_to_process; ++j) + ops[j]->opaque_data = (void *)(uintptr_t)j; + + for (j = 0; j < TEST_REPETITIONS; ++j) { + for (i = 0; i < num_to_process; ++i) { + if (!loopback) + rte_pktmbuf_reset( + ops[i]->ldpc_dec.hard_output.data); + if (hc_out || loopback) + mbuf_reset( + ops[i]->ldpc_dec.harq_combined_output.data); + } + + tp->start_time = rte_rdtsc_precise(); + for (enqueued = 0; enqueued < num_to_process;) { + num_to_enq = burst_sz; + + if (unlikely(num_to_process - enqueued < num_to_enq)) + num_to_enq = num_to_process - enqueued; + + enq = 0; + do { + enq += rte_bbdev_enqueue_ldpc_dec_ops( + tp->dev_id, + queue_id, &ops[enqueued], + num_to_enq); + } while (unlikely(num_to_enq != enq)); + enqueued += enq; + + /* Write to thread burst_sz current number of enqueued + * descriptors. It ensures that proper number of + * descriptors will be dequeued in callback + * function - needed for last batch in case where + * the number of operations is not a multiple of + * burst size. + */ + rte_atomic16_set(&tp->burst_sz, num_to_enq); + + /* Wait until processing of previous batch is + * completed + */ + while (rte_atomic16_read(&tp->nb_dequeued) != + (int16_t) enqueued) + rte_pause(); + } + if (j != TEST_REPETITIONS - 1) + rte_atomic16_clear(&tp->nb_dequeued); + } + + return TEST_SUCCESS; +} + +static int +throughput_intr_lcore_dec(void *arg) +{ + struct thread_params *tp = arg; + unsigned int enqueued; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_to_process = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops[num_to_process]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + int ret, i, j; + uint16_t num_to_enq, enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), + "Failed to enable interrupts for dev: %u, queue_id: %u", + tp->dev_id, queue_id); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + rte_atomic16_clear(&tp->processing_status); + rte_atomic16_clear(&tp->nb_dequeued); + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, + num_to_process); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_to_process); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_dec_op(ops, num_to_process, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, + tp->op_params->ref_dec_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_to_process; ++j) + ops[j]->opaque_data = (void *)(uintptr_t)j; + + for (j = 0; j < TEST_REPETITIONS; ++j) { + for (i = 0; i < num_to_process; ++i) + rte_pktmbuf_reset(ops[i]->turbo_dec.hard_output.data); + + tp->start_time = rte_rdtsc_precise(); + for (enqueued = 0; enqueued < num_to_process;) { + num_to_enq = burst_sz; + + if (unlikely(num_to_process - enqueued < num_to_enq)) + num_to_enq = num_to_process - enqueued; + + enq = 0; + do { + enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, + queue_id, &ops[enqueued], + num_to_enq); + } while (unlikely(num_to_enq != enq)); + enqueued += enq; + + /* Write to thread burst_sz current number of enqueued + * descriptors. It ensures that proper number of + * descriptors will be dequeued in callback + * function - needed for last batch in case where + * the number of operations is not a multiple of + * burst size. + */ + rte_atomic16_set(&tp->burst_sz, num_to_enq); + + /* Wait until processing of previous batch is + * completed + */ + while (rte_atomic16_read(&tp->nb_dequeued) != + (int16_t) enqueued) + rte_pause(); + } + if (j != TEST_REPETITIONS - 1) + rte_atomic16_clear(&tp->nb_dequeued); + } + + return TEST_SUCCESS; +} + +static int +throughput_intr_lcore_enc(void *arg) +{ + struct thread_params *tp = arg; + unsigned int enqueued; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_to_process = tp->op_params->num_to_process; + struct rte_bbdev_enc_op *ops[num_to_process]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + int ret, i, j; + uint16_t num_to_enq, enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), + "Failed to enable interrupts for dev: %u, queue_id: %u", + tp->dev_id, queue_id); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + rte_atomic16_clear(&tp->processing_status); + rte_atomic16_clear(&tp->nb_dequeued); + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, + num_to_process); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_to_process); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_enc_op(ops, num_to_process, 0, bufs->inputs, + bufs->hard_outputs, tp->op_params->ref_enc_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_to_process; ++j) + ops[j]->opaque_data = (void *)(uintptr_t)j; + + for (j = 0; j < TEST_REPETITIONS; ++j) { + for (i = 0; i < num_to_process; ++i) + rte_pktmbuf_reset(ops[i]->turbo_enc.output.data); + + tp->start_time = rte_rdtsc_precise(); + for (enqueued = 0; enqueued < num_to_process;) { + num_to_enq = burst_sz; + + if (unlikely(num_to_process - enqueued < num_to_enq)) + num_to_enq = num_to_process - enqueued; + + enq = 0; + do { + enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, + queue_id, &ops[enqueued], + num_to_enq); + } while (unlikely(enq != num_to_enq)); + enqueued += enq; + + /* Write to thread burst_sz current number of enqueued + * descriptors. It ensures that proper number of + * descriptors will be dequeued in callback + * function - needed for last batch in case where + * the number of operations is not a multiple of + * burst size. + */ + rte_atomic16_set(&tp->burst_sz, num_to_enq); + + /* Wait until processing of previous batch is + * completed + */ + while (rte_atomic16_read(&tp->nb_dequeued) != + (int16_t) enqueued) + rte_pause(); + } + if (j != TEST_REPETITIONS - 1) + rte_atomic16_clear(&tp->nb_dequeued); + } + + return TEST_SUCCESS; +} + + +static int +throughput_intr_lcore_ldpc_enc(void *arg) +{ + struct thread_params *tp = arg; + unsigned int enqueued; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_to_process = tp->op_params->num_to_process; + struct rte_bbdev_enc_op *ops[num_to_process]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + int ret, i, j; + uint16_t num_to_enq, enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), + "Failed to enable interrupts for dev: %u, queue_id: %u", + tp->dev_id, queue_id); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + rte_atomic16_clear(&tp->processing_status); + rte_atomic16_clear(&tp->nb_dequeued); + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, + num_to_process); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_to_process); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_enc_op(ops, num_to_process, 0, + bufs->inputs, bufs->hard_outputs, + tp->op_params->ref_enc_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_to_process; ++j) + ops[j]->opaque_data = (void *)(uintptr_t)j; + + for (j = 0; j < TEST_REPETITIONS; ++j) { + for (i = 0; i < num_to_process; ++i) + rte_pktmbuf_reset(ops[i]->turbo_enc.output.data); + + tp->start_time = rte_rdtsc_precise(); + for (enqueued = 0; enqueued < num_to_process;) { + num_to_enq = burst_sz; + + if (unlikely(num_to_process - enqueued < num_to_enq)) + num_to_enq = num_to_process - enqueued; + + enq = 0; + do { + enq += rte_bbdev_enqueue_ldpc_enc_ops( + tp->dev_id, + queue_id, &ops[enqueued], + num_to_enq); + } while (unlikely(enq != num_to_enq)); + enqueued += enq; + + /* Write to thread burst_sz current number of enqueued + * descriptors. It ensures that proper number of + * descriptors will be dequeued in callback + * function - needed for last batch in case where + * the number of operations is not a multiple of + * burst size. + */ + rte_atomic16_set(&tp->burst_sz, num_to_enq); + + /* Wait until processing of previous batch is + * completed + */ + while (rte_atomic16_read(&tp->nb_dequeued) != + (int16_t) enqueued) + rte_pause(); + } + if (j != TEST_REPETITIONS - 1) + rte_atomic16_clear(&tp->nb_dequeued); + } + + return TEST_SUCCESS; +} + +static int +throughput_pmd_lcore_dec(void *arg) +{ + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops_enq[num_ops]; + struct rte_bbdev_dec_op *ops_deq[num_ops]; + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + struct rte_bbdev_info info; + uint16_t num_to_enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < TEST_REPETITIONS; ++i) { + + for (j = 0; j < num_ops; ++j) + mbuf_reset(ops_enq[j]->turbo_dec.hard_output.data); + + start_time = rte_rdtsc_precise(); + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + tp->iter_count = 0; + /* get the max of iter_count for all dequeued ops */ + for (i = 0; i < num_ops; ++i) { + tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count, + tp->iter_count); + } + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_dec_op(ops_deq, num_ops, ref_op, + tp->op_params->vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_dec_TB_size(ref_op); + + tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / + 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static int +bler_pmd_lcore_ldpc_dec(void *arg) +{ + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops_enq[num_ops]; + struct rte_bbdev_dec_op *ops_deq[num_ops]; + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + float parity_bler = 0; + struct rte_bbdev_info info; + uint16_t num_to_enq; + bool extDdr = check_bit(ldpc_cap_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + bool loopback = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); + bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); + + /* For BLER tests we need to enable early termination */ + if (!check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) + ref_op->ldpc_dec.op_flags += + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ref_op->ldpc_dec.iter_max = get_iter_max(); + ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, + bufs->harq_inputs, bufs->harq_outputs, ref_op); + generate_llr_input(num_ops, bufs->inputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < 1; ++i) { /* Could add more iterations */ + for (j = 0; j < num_ops; ++j) { + if (!loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.hard_output.data); + if (hc_out || loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.harq_combined_output.data); + } + if (extDdr) { + bool preload = i == (TEST_REPETITIONS - 1); + preload_harq_ddr(tp->dev_id, queue_id, ops_enq, + num_ops, preload); + } + start_time = rte_rdtsc_precise(); + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + tp->iter_count = 0; + tp->iter_average = 0; + /* get the max of iter_count for all dequeued ops */ + for (i = 0; i < num_ops; ++i) { + tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, + tp->iter_count); + tp->iter_average += (double) ops_enq[i]->ldpc_dec.iter_count; + if (ops_enq[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR)) + parity_bler += 1.0; + } + + parity_bler /= num_ops; /* This one is based on SYND */ + tp->iter_average /= num_ops; + tp->bler = (double) validate_ldpc_bler(ops_deq, num_ops) / num_ops; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE + && tp->bler == 0 + && parity_bler == 0 + && !hc_out) { + ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, + tp->op_params->vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); + tp->ops_per_sec = ((double)num_ops * 1) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * 1 * tb_len_bits)) / + 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static int +throughput_pmd_lcore_ldpc_dec(void *arg) +{ + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_dec_op *ops_enq[num_ops]; + struct rte_bbdev_dec_op *ops_deq[num_ops]; + struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + struct rte_bbdev_info info; + uint16_t num_to_enq; + + struct rte_bbdev_op_data *hard_output; + struct rte_bbdev_op_ldpc_dec *ops_td; + + bool extDdr = check_bit(ldpc_cap_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + bool loopback = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); + bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + //&op_params->q_bufs[socket_id][queue_id].inputs +//printf("bufs len %d\n",bufs->input.data->data_len); + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); + + /* For throughput tests we need to disable early termination */ + if (check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) + ref_op->ldpc_dec.op_flags -= + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ref_op->ldpc_dec.iter_max = get_iter_max(); + ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, bufs->soft_outputs, + bufs->harq_inputs, bufs->harq_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < TEST_REPETITIONS; ++i) { + for (j = 0; j < num_ops; ++j) { + if (!loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.hard_output.data); + if (hc_out || loopback) + mbuf_reset( + ops_enq[j]->ldpc_dec.harq_combined_output.data); + } + if (extDdr) { + bool preload = i == (TEST_REPETITIONS - 1); + preload_harq_ddr(tp->dev_id, queue_id, ops_enq, + num_ops, preload); + } + start_time = rte_rdtsc_precise(); + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + //printf("pmd lcore ldpc dec data %x\n", *ops_enq[enq]->ldpc_dec.input.addr); + + enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + +/* ops_td = &ops_deq[enq]->ldpc_dec; + hard_output = &ops_td->hard_output; + struct rte_mbuf *m = hard_output->data; + printf("deq nb segs %d\n", m->nb_segs); +*/ + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + tp->iter_count = 0; + /* get the max of iter_count for all dequeued ops */ + for (i = 0; i < num_ops; ++i) { + tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, + tp->iter_count); + } + if (extDdr) { + /* Read loopback is not thread safe */ + retrieve_harq_ddr(tp->dev_id, queue_id, ops_enq, num_ops); + } + + //if (test_vector.op_type != RTE_BBDEV_OP_NONE) { +//printf("op type != OP NONE\n"); +ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, + tp->op_params->vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + //} + + rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); + + tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / + 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static int +throughput_pmd_lcore_enc(void *arg) +{ + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_enc_op *ops_enq[num_ops]; + struct rte_bbdev_enc_op *ops_deq[num_ops]; + struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + struct rte_bbdev_info info; + uint16_t num_to_enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, + num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_ops); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_enc_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < TEST_REPETITIONS; ++i) { + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + for (j = 0; j < num_ops; ++j) + mbuf_reset(ops_enq[j]->turbo_enc.output.data); + + start_time = rte_rdtsc_precise(); + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_enc_op(ops_deq, num_ops, ref_op); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_enc_TB_size(ref_op); + + tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) + / 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static int +throughput_pmd_lcore_ldpc_enc(void *arg) +{ + struct thread_params *tp = arg; + uint16_t enq, deq; + uint64_t total_time = 0, start_time; + const uint16_t queue_id = tp->queue_id; + const uint16_t burst_sz = tp->op_params->burst_sz; + const uint16_t num_ops = tp->op_params->num_to_process; + struct rte_bbdev_enc_op *ops_enq[num_ops]; + struct rte_bbdev_enc_op *ops_deq[num_ops]; + struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; + struct test_buffers *bufs = NULL; + int i, j, ret; + struct rte_bbdev_info info; + uint16_t num_to_enq; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(tp->dev_id, &info); + + TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), + "NUM_OPS cannot exceed %u for this device", + info.drv.queue_size_lim); + + bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) + rte_pause(); + + ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, + num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", + num_ops); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_enc_op(ops_enq, num_ops, 0, bufs->inputs, + bufs->hard_outputs, ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < num_ops; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + for (i = 0; i < TEST_REPETITIONS; ++i) { + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + for (j = 0; j < num_ops; ++j) + mbuf_reset(ops_enq[j]->turbo_enc.output.data); + + start_time = rte_rdtsc_precise(); + + for (enq = 0, deq = 0; enq < num_ops;) { + num_to_enq = burst_sz; + + if (unlikely(num_ops - enq < num_to_enq)) + num_to_enq = num_ops - enq; + + enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id, + queue_id, &ops_enq[enq], num_to_enq); + + deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + /* dequeue the remaining */ + while (deq < enq) { + deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, + queue_id, &ops_deq[deq], enq - deq); + } + + total_time += rte_rdtsc_precise() - start_time; + } + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_ldpc_enc_op(ops_deq, num_ops, ref_op); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); + + double tb_len_bits = calc_ldpc_enc_TB_size(ref_op); + + tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / + ((double)total_time / (double)rte_get_tsc_hz()); + tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) + / 1000000.0) / ((double)total_time / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +static void +print_enc_throughput(struct thread_params *t_params, unsigned int used_cores) +{ + unsigned int iter = 0; + double total_mops = 0, total_mbps = 0; + + for (iter = 0; iter < used_cores; iter++) { + printf( + "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps\n", + t_params[iter].lcore_id, t_params[iter].ops_per_sec, + t_params[iter].mbps); + total_mops += t_params[iter].ops_per_sec; + total_mbps += t_params[iter].mbps; + } + printf( + "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps\n", + used_cores, total_mops, total_mbps); +} + +/* Aggregate the performance results over the number of cores used */ +static void +print_dec_throughput(struct thread_params *t_params, unsigned int used_cores) +{ + unsigned int core_idx = 0; + double total_mops = 0, total_mbps = 0; + uint8_t iter_count = 0; + + for (core_idx = 0; core_idx < used_cores; core_idx++) { + printf( + "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps @ max %u iterations\n", + t_params[core_idx].lcore_id, + t_params[core_idx].ops_per_sec, + t_params[core_idx].mbps, + t_params[core_idx].iter_count); + total_mops += t_params[core_idx].ops_per_sec; + total_mbps += t_params[core_idx].mbps; + iter_count = RTE_MAX(iter_count, + t_params[core_idx].iter_count); + } + printf( + "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps @ max %u iterations\n", + used_cores, total_mops, total_mbps, iter_count); +} + +/* Aggregate the performance results over the number of cores used */ +static void +print_dec_bler(struct thread_params *t_params, unsigned int used_cores) +{ + unsigned int core_idx = 0; + double total_mbps = 0, total_bler = 0, total_iter = 0; + double snr = get_snr(); + + for (core_idx = 0; core_idx < used_cores; core_idx++) { + printf("Core%u BLER %.1f %% - Iters %.1f - Tp %.1f Mbps %s\n", + t_params[core_idx].lcore_id, + t_params[core_idx].bler * 100, + t_params[core_idx].iter_average, + t_params[core_idx].mbps, + get_vector_filename()); + total_mbps += t_params[core_idx].mbps; + total_bler += t_params[core_idx].bler; + total_iter += t_params[core_idx].iter_average; + } + total_bler /= used_cores; + total_iter /= used_cores; + + printf("SNR %.2f BLER %.1f %% - Iterations %.1f %d - Tp %.1f Mbps %s\n", + snr, total_bler * 100, total_iter, get_iter_max(), + total_mbps, get_vector_filename()); +} + +/* + * Test function that determines BLER wireless performance + */ +static int +bler_test(struct active_device *ad, + struct test_op_params *op_params) +{ + int ret; + unsigned int lcore_id, used_cores = 0; + struct thread_params *t_params; + struct rte_bbdev_info info; + lcore_function_t *bler_function; + uint16_t num_lcores; + const char *op_type_str; + + rte_bbdev_info_get(ad->dev_id, &info); + + op_type_str = rte_bbdev_op_type_str(test_vector.op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", + test_vector.op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== test: bler\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", + info.dev_name, ad->nb_queues, op_params->burst_sz, + op_params->num_to_process, op_params->num_lcores, + op_type_str, + intr_enabled ? "Interrupt mode" : "PMD mode", + (double)rte_get_tsc_hz() / 1000000000.0); + + /* Set number of lcores */ + num_lcores = (ad->nb_queues < (op_params->num_lcores)) + ? ad->nb_queues + : op_params->num_lcores; + + /* Allocate memory for thread parameters structure */ + t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), + RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", + RTE_ALIGN(sizeof(struct thread_params) * num_lcores, + RTE_CACHE_LINE_SIZE)); + + if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + bler_function = bler_pmd_lcore_ldpc_dec; + else + return TEST_SKIPPED; + + rte_atomic16_set(&op_params->sync, SYNC_WAIT); + + /* Master core is set at first entry */ + t_params[0].dev_id = ad->dev_id; + t_params[0].lcore_id = rte_lcore_id(); + t_params[0].op_params = op_params; + t_params[0].queue_id = ad->queue_ids[used_cores++]; + t_params[0].iter_count = 0; + + RTE_LCORE_FOREACH_SLAVE(lcore_id) { + if (used_cores >= num_lcores) + break; + + t_params[used_cores].dev_id = ad->dev_id; + t_params[used_cores].lcore_id = lcore_id; + t_params[used_cores].op_params = op_params; + t_params[used_cores].queue_id = ad->queue_ids[used_cores]; + t_params[used_cores].iter_count = 0; + + rte_eal_remote_launch(bler_function, + &t_params[used_cores++], lcore_id); + } + + rte_atomic16_set(&op_params->sync, SYNC_START); + ret = bler_function(&t_params[0]); + + /* Master core is always used */ + for (used_cores = 1; used_cores < num_lcores; used_cores++) + ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); + + print_dec_bler(t_params, num_lcores); + + /* Return if test failed */ + if (ret) { + rte_free(t_params); + return ret; + } + + /* Function to print something here*/ + rte_free(t_params); + return ret; +} + +/* + * Test function that determines how long an enqueue + dequeue of a burst + * takes on available lcores. + */ +static int +throughput_test(struct active_device *ad, + struct test_op_params *op_params) +{ + int ret; + unsigned int lcore_id, used_cores = 0; + struct thread_params *t_params, *tp; + struct rte_bbdev_info info; + lcore_function_t *throughput_function; + uint16_t num_lcores; + const char *op_type_str; + + rte_bbdev_info_get(ad->dev_id, &info); + + op_type_str = rte_bbdev_op_type_str(test_vector.op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", + test_vector.op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== new test: throughput\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", + info.dev_name, ad->nb_queues, op_params->burst_sz, + op_params->num_to_process, op_params->num_lcores, + op_type_str, + intr_enabled ? "Interrupt mode" : "PMD mode", + (double)rte_get_tsc_hz() / 1000000000.0); + + /* Set number of lcores */ + num_lcores = (ad->nb_queues < (op_params->num_lcores)) + ? ad->nb_queues + : op_params->num_lcores; + + /* Allocate memory for thread parameters structure */ + t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), + RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", + RTE_ALIGN(sizeof(struct thread_params) * num_lcores, + RTE_CACHE_LINE_SIZE)); + + if (intr_enabled) { + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) + throughput_function = throughput_intr_lcore_dec; + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + throughput_function = throughput_intr_lcore_ldpc_dec; + else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) + throughput_function = throughput_intr_lcore_enc; + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + throughput_function = throughput_intr_lcore_ldpc_enc; + else + throughput_function = throughput_intr_lcore_enc; + + /* Dequeue interrupt callback registration */ + ret = rte_bbdev_callback_register(ad->dev_id, + RTE_BBDEV_EVENT_DEQUEUE, dequeue_event_callback, + t_params); + if (ret < 0) { + rte_free(t_params); + return ret; + } + } else { + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) + throughput_function = throughput_pmd_lcore_dec; + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + throughput_function = throughput_pmd_lcore_ldpc_dec; + else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) + throughput_function = throughput_pmd_lcore_enc; + else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + throughput_function = throughput_pmd_lcore_ldpc_enc; + else + throughput_function = throughput_pmd_lcore_enc; + } + + rte_atomic16_set(&op_params->sync, SYNC_WAIT); + + /* Master core is set at first entry */ + t_params[0].dev_id = ad->dev_id; + t_params[0].lcore_id = rte_lcore_id(); + t_params[0].op_params = op_params; + t_params[0].queue_id = ad->queue_ids[used_cores++]; + t_params[0].iter_count = 0; + + RTE_LCORE_FOREACH_SLAVE(lcore_id) { + if (used_cores >= num_lcores) + break; + + t_params[used_cores].dev_id = ad->dev_id; + t_params[used_cores].lcore_id = lcore_id; + t_params[used_cores].op_params = op_params; + t_params[used_cores].queue_id = ad->queue_ids[used_cores]; + t_params[used_cores].iter_count = 0; + + rte_eal_remote_launch(throughput_function, + &t_params[used_cores++], lcore_id); + } + + rte_atomic16_set(&op_params->sync, SYNC_START); + ret = throughput_function(&t_params[0]); + + /* Master core is always used */ + for (used_cores = 1; used_cores < num_lcores; used_cores++) + ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); + + /* Return if test failed */ + if (ret) { + rte_free(t_params); + return ret; + } + + /* Print throughput if interrupts are disabled and test passed */ + if (!intr_enabled) { + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || + test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + print_dec_throughput(t_params, num_lcores); + else + print_enc_throughput(t_params, num_lcores); + rte_free(t_params); + return ret; + } + + /* In interrupt TC we need to wait for the interrupt callback to deqeue + * all pending operations. Skip waiting for queues which reported an + * error using processing_status variable. + * Wait for master lcore operations. + */ + tp = &t_params[0]; + while ((rte_atomic16_read(&tp->nb_dequeued) < + op_params->num_to_process) && + (rte_atomic16_read(&tp->processing_status) != + TEST_FAILED)) + rte_pause(); + + tp->ops_per_sec /= TEST_REPETITIONS; + tp->mbps /= TEST_REPETITIONS; + ret |= (int)rte_atomic16_read(&tp->processing_status); + + /* Wait for slave lcores operations */ + for (used_cores = 1; used_cores < num_lcores; used_cores++) { + tp = &t_params[used_cores]; + + while ((rte_atomic16_read(&tp->nb_dequeued) < + op_params->num_to_process) && + (rte_atomic16_read(&tp->processing_status) != + TEST_FAILED)) + rte_pause(); + + tp->ops_per_sec /= TEST_REPETITIONS; + tp->mbps /= TEST_REPETITIONS; + ret |= (int)rte_atomic16_read(&tp->processing_status); + } + + /* Print throughput if test passed */ + if (!ret) { + if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || + test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) + print_dec_throughput(t_params, num_lcores); + else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC || + test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) + print_enc_throughput(t_params, num_lcores); + } + + rte_free(t_params); + return ret; +} + +static int +latency_test_dec(struct rte_mempool *mempool, + struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, + int vector_mask, uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) +{ + int ret = TEST_SUCCESS; + uint16_t i, j, dequeued; + struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t start_time = 0, last_time = 0; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + bool first_time = true; + last_time = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_dec_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_dec_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + bufs->soft_outputs, + ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < burst_sz; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + start_time = rte_rdtsc_precise(); + + enq = rte_bbdev_enqueue_dec_ops(dev_id, queue_id, &ops_enq[enq], + burst_sz); + TEST_ASSERT(enq == burst_sz, + "Error enqueueing burst, expected %u, got %u", + burst_sz, enq); + + /* Dequeue */ + do { + deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + if (likely(first_time && (deq > 0))) { + last_time = rte_rdtsc_precise() - start_time; + first_time = false; + } + } while (unlikely(burst_sz != deq)); + + *max_time = RTE_MAX(*max_time, last_time); + *min_time = RTE_MIN(*min_time, last_time); + *total_time += last_time; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_dec_op(ops_deq, burst_sz, ref_op, + vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +latency_test_ldpc_dec(struct rte_mempool *mempool, + struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, + int vector_mask, uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) +{ + int ret = TEST_SUCCESS; + uint16_t i, j, dequeued; + struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t start_time = 0, last_time = 0; + bool extDdr = ldpc_cap_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + bool first_time = true; + last_time = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_dec_op_alloc_bulk() failed"); + + /* For latency tests we need to disable early termination */ + if (check_bit(ref_op->ldpc_dec.op_flags, + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) + ref_op->ldpc_dec.op_flags -= + RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ref_op->ldpc_dec.iter_max = get_iter_max(); + ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + bufs->soft_outputs, + bufs->harq_inputs, + bufs->harq_outputs, + ref_op); + + if (extDdr) + preload_harq_ddr(dev_id, queue_id, ops_enq, + burst_sz, true); + + /* Set counter to validate the ordering */ + for (j = 0; j < burst_sz; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + start_time = rte_rdtsc_precise(); + + enq = rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz); + TEST_ASSERT(enq == burst_sz, + "Error enqueueing burst, expected %u, got %u", + burst_sz, enq); + + /* Dequeue */ + do { + deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + if (likely(first_time && (deq > 0))) { + last_time = rte_rdtsc_precise() - start_time; + first_time = false; + } + } while (unlikely(burst_sz != deq)); + + *max_time = RTE_MAX(*max_time, last_time); + *min_time = RTE_MIN(*min_time, last_time); + *total_time += last_time; + + if (extDdr) + retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_ldpc_dec_op(ops_deq, burst_sz, ref_op, + vector_mask); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + return i; +} + +static int +latency_test_enc(struct rte_mempool *mempool, + struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, + uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) +{ + int ret = TEST_SUCCESS; + uint16_t i, j, dequeued; + struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t start_time = 0, last_time = 0; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + bool first_time = true; + last_time = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_enc_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_enc_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < burst_sz; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + start_time = rte_rdtsc_precise(); + + enq = rte_bbdev_enqueue_enc_ops(dev_id, queue_id, &ops_enq[enq], + burst_sz); + TEST_ASSERT(enq == burst_sz, + "Error enqueueing burst, expected %u, got %u", + burst_sz, enq); + + /* Dequeue */ + do { + deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + if (likely(first_time && (deq > 0))) { + last_time += rte_rdtsc_precise() - start_time; + first_time = false; + } + } while (unlikely(burst_sz != deq)); + + *max_time = RTE_MAX(*max_time, last_time); + *min_time = RTE_MIN(*min_time, last_time); + *total_time += last_time; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_enc_op(ops_deq, burst_sz, ref_op); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_enc_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +latency_test_ldpc_enc(struct rte_mempool *mempool, + struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, + uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) +{ + int ret = TEST_SUCCESS; + uint16_t i, j, dequeued; + struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t start_time = 0, last_time = 0; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + bool first_time = true; + last_time = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_enc_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + ref_op); + + /* Set counter to validate the ordering */ + for (j = 0; j < burst_sz; ++j) + ops_enq[j]->opaque_data = (void *)(uintptr_t)j; + + start_time = rte_rdtsc_precise(); + + enq = rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz); + TEST_ASSERT(enq == burst_sz, + "Error enqueueing burst, expected %u, got %u", + burst_sz, enq); + + /* Dequeue */ + do { + deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + if (likely(first_time && (deq > 0))) { + last_time += rte_rdtsc_precise() - start_time; + first_time = false; + } + } while (unlikely(burst_sz != deq)); + + *max_time = RTE_MAX(*max_time, last_time); + *min_time = RTE_MIN(*min_time, last_time); + *total_time += last_time; + + if (test_vector.op_type != RTE_BBDEV_OP_NONE) { + ret = validate_enc_op(ops_deq, burst_sz, ref_op); + TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + + rte_bbdev_enc_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +latency_test(struct active_device *ad, + struct test_op_params *op_params) +{ + int iter; + uint16_t burst_sz = op_params->burst_sz; + const uint16_t num_to_process = op_params->num_to_process; + const enum rte_bbdev_op_type op_type = test_vector.op_type; + const uint16_t queue_id = ad->queue_ids[0]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + uint64_t total_time, min_time, max_time; + const char *op_type_str; + + total_time = max_time = 0; + min_time = UINT64_MAX; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(ad->dev_id, &info); + bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + op_type_str = rte_bbdev_op_type_str(op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== test: validation/latency\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", + info.dev_name, burst_sz, num_to_process, op_type_str); + + if (op_type == RTE_BBDEV_OP_TURBO_DEC) + iter = latency_test_dec(op_params->mp, bufs, + op_params->ref_dec_op, op_params->vector_mask, + ad->dev_id, queue_id, num_to_process, + burst_sz, &total_time, &min_time, &max_time); + else if (op_type == RTE_BBDEV_OP_TURBO_ENC) + iter = latency_test_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &total_time, + &min_time, &max_time); + else if (op_type == RTE_BBDEV_OP_LDPC_ENC) + iter = latency_test_ldpc_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &total_time, + &min_time, &max_time); + else if (op_type == RTE_BBDEV_OP_LDPC_DEC) + iter = latency_test_ldpc_dec(op_params->mp, bufs, + op_params->ref_dec_op, op_params->vector_mask, + ad->dev_id, queue_id, num_to_process, + burst_sz, &total_time, &min_time, &max_time); + else + iter = latency_test_enc(op_params->mp, bufs, + op_params->ref_enc_op, + ad->dev_id, queue_id, + num_to_process, burst_sz, &total_time, + &min_time, &max_time); + + if (iter <= 0) + return TEST_FAILED; + + printf("Operation latency:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n", + (double)total_time / (double)iter, + (double)(total_time * 1000000) / (double)iter / + (double)rte_get_tsc_hz(), (double)min_time, + (double)(min_time * 1000000) / (double)rte_get_tsc_hz(), + (double)max_time, (double)(max_time * 1000000) / + (double)rte_get_tsc_hz()); + + return TEST_SUCCESS; +} + +#ifdef RTE_BBDEV_OFFLOAD_COST +static int +get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id, + struct rte_bbdev_stats *stats) +{ + struct rte_bbdev *dev = &rte_bbdev_devices[dev_id]; + struct rte_bbdev_stats *q_stats; + + if (queue_id >= dev->data->num_queues) + return -1; + + q_stats = &dev->data->queues[queue_id].queue_stats; + + stats->enqueued_count = q_stats->enqueued_count; + stats->dequeued_count = q_stats->dequeued_count; + stats->enqueue_err_count = q_stats->enqueue_err_count; + stats->dequeue_err_count = q_stats->dequeue_err_count; + stats->acc_offload_cycles = q_stats->acc_offload_cycles; + + return 0; +} + +static int +offload_latency_test_dec(struct rte_mempool *mempool, struct test_buffers *bufs, + struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, + uint16_t queue_id, const uint16_t num_to_process, + uint16_t burst_sz, struct test_time_stats *time_st) +{ + int i, dequeued, ret; + struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t enq_start_time, deq_start_time; + uint64_t enq_sw_last_time, deq_last_time; + struct rte_bbdev_stats stats; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_dec_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + bufs->soft_outputs, + ref_op); + + /* Start time meas for enqueue function offload latency */ + enq_start_time = rte_rdtsc_precise(); + do { + enq += rte_bbdev_enqueue_dec_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz - enq); + } while (unlikely(burst_sz != enq)); + + ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); + TEST_ASSERT_SUCCESS(ret, + "Failed to get stats for queue (%u) of device (%u)", + queue_id, dev_id); + + enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - + stats.acc_offload_cycles; + time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, + enq_sw_last_time); + time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, + enq_sw_last_time); + time_st->enq_sw_total_time += enq_sw_last_time; + + time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, + stats.acc_offload_cycles); + time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, + stats.acc_offload_cycles); + time_st->enq_acc_total_time += stats.acc_offload_cycles; + + /* give time for device to process ops */ + rte_delay_us(200); + + /* Start time meas for dequeue function offload latency */ + deq_start_time = rte_rdtsc_precise(); + /* Dequeue one operation */ + do { + deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, + &ops_deq[deq], 1); + } while (unlikely(deq != 1)); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, + deq_last_time); + time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, + deq_last_time); + time_st->deq_total_time += deq_last_time; + + /* Dequeue remaining operations if needed*/ + while (burst_sz != deq) + deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + + rte_bbdev_dec_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +offload_latency_test_ldpc_dec(struct rte_mempool *mempool, + struct test_buffers *bufs, + struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, + uint16_t queue_id, const uint16_t num_to_process, + uint16_t burst_sz, struct test_time_stats *time_st) +{ + int i, dequeued, ret; + struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t enq_start_time, deq_start_time; + uint64_t enq_sw_last_time, deq_last_time; + struct rte_bbdev_stats stats; + bool extDdr = ldpc_cap_flags & + RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + bufs->soft_outputs, + bufs->harq_inputs, + bufs->harq_outputs, + ref_op); + + if (extDdr) + preload_harq_ddr(dev_id, queue_id, ops_enq, + burst_sz, true); + + /* Start time meas for enqueue function offload latency */ + enq_start_time = rte_rdtsc_precise(); + do { + enq += rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz - enq); + } while (unlikely(burst_sz != enq)); + + enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; + ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); + TEST_ASSERT_SUCCESS(ret, + "Failed to get stats for queue (%u) of device (%u)", + queue_id, dev_id); + + enq_sw_last_time -= stats.acc_offload_cycles; + time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, + enq_sw_last_time); + time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, + enq_sw_last_time); + time_st->enq_sw_total_time += enq_sw_last_time; + + time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, + stats.acc_offload_cycles); + time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, + stats.acc_offload_cycles); + time_st->enq_acc_total_time += stats.acc_offload_cycles; + + /* give time for device to process ops */ + rte_delay_us(200); + + /* Start time meas for dequeue function offload latency */ + deq_start_time = rte_rdtsc_precise(); + /* Dequeue one operation */ + do { + deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, + &ops_deq[deq], 1); + } while (unlikely(deq != 1)); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, + deq_last_time); + time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, + deq_last_time); + time_st->deq_total_time += deq_last_time; + + /* Dequeue remaining operations if needed*/ + while (burst_sz != deq) + deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + + if (extDdr) { + /* Read loopback is not thread safe */ + retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); + } + + rte_bbdev_dec_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +offload_latency_test_enc(struct rte_mempool *mempool, struct test_buffers *bufs, + struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, + uint16_t queue_id, const uint16_t num_to_process, + uint16_t burst_sz, struct test_time_stats *time_st) +{ + int i, dequeued, ret; + struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t enq_start_time, deq_start_time; + uint64_t enq_sw_last_time, deq_last_time; + struct rte_bbdev_stats stats; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_enc_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_enc_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + ref_op); + + /* Start time meas for enqueue function offload latency */ + enq_start_time = rte_rdtsc_precise(); + do { + enq += rte_bbdev_enqueue_enc_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz - enq); + } while (unlikely(burst_sz != enq)); + + enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; + + ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); + TEST_ASSERT_SUCCESS(ret, + "Failed to get stats for queue (%u) of device (%u)", + queue_id, dev_id); + enq_sw_last_time -= stats.acc_offload_cycles; + time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, + enq_sw_last_time); + time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, + enq_sw_last_time); + time_st->enq_sw_total_time += enq_sw_last_time; + + time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, + stats.acc_offload_cycles); + time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, + stats.acc_offload_cycles); + time_st->enq_acc_total_time += stats.acc_offload_cycles; + + /* give time for device to process ops */ + rte_delay_us(200); + + /* Start time meas for dequeue function offload latency */ + deq_start_time = rte_rdtsc_precise(); + /* Dequeue one operation */ + do { + deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, + &ops_deq[deq], 1); + } while (unlikely(deq != 1)); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, + deq_last_time); + time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, + deq_last_time); + time_st->deq_total_time += deq_last_time; + + while (burst_sz != deq) + deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + + rte_bbdev_enc_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} + +static int +offload_latency_test_ldpc_enc(struct rte_mempool *mempool, + struct test_buffers *bufs, + struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, + uint16_t queue_id, const uint16_t num_to_process, + uint16_t burst_sz, struct test_time_stats *time_st) +{ + int i, dequeued, ret; + struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; + uint64_t enq_start_time, deq_start_time; + uint64_t enq_sw_last_time, deq_last_time; + struct rte_bbdev_stats stats; + + for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { + uint16_t enq = 0, deq = 0; + + if (unlikely(num_to_process - dequeued < burst_sz)) + burst_sz = num_to_process - dequeued; + + ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); + TEST_ASSERT_SUCCESS(ret, + "rte_bbdev_enc_op_alloc_bulk() failed"); + if (test_vector.op_type != RTE_BBDEV_OP_NONE) + copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, + bufs->inputs, + bufs->hard_outputs, + ref_op); + + /* Start time meas for enqueue function offload latency */ + enq_start_time = rte_rdtsc_precise(); + do { + enq += rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, + &ops_enq[enq], burst_sz - enq); + } while (unlikely(burst_sz != enq)); + + enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; + ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); + TEST_ASSERT_SUCCESS(ret, + "Failed to get stats for queue (%u) of device (%u)", + queue_id, dev_id); + + enq_sw_last_time -= stats.acc_offload_cycles; + time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, + enq_sw_last_time); + time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, + enq_sw_last_time); + time_st->enq_sw_total_time += enq_sw_last_time; + + time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, + stats.acc_offload_cycles); + time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, + stats.acc_offload_cycles); + time_st->enq_acc_total_time += stats.acc_offload_cycles; + + /* give time for device to process ops */ + rte_delay_us(200); + + /* Start time meas for dequeue function offload latency */ + deq_start_time = rte_rdtsc_precise(); + /* Dequeue one operation */ + do { + deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, + &ops_deq[deq], 1); + } while (unlikely(deq != 1)); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, + deq_last_time); + time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, + deq_last_time); + time_st->deq_total_time += deq_last_time; + + while (burst_sz != deq) + deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, + &ops_deq[deq], burst_sz - deq); + + rte_bbdev_enc_op_free_bulk(ops_enq, deq); + dequeued += deq; + } + + return i; +} +#endif + +static int +offload_cost_test(struct active_device *ad, + struct test_op_params *op_params) +{ +#ifndef RTE_BBDEV_OFFLOAD_COST + RTE_SET_USED(ad); + RTE_SET_USED(op_params); + printf("Offload latency test is disabled.\n"); + printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); + return TEST_SKIPPED; +#else + int iter; + uint16_t burst_sz = op_params->burst_sz; + const uint16_t num_to_process = op_params->num_to_process; + const enum rte_bbdev_op_type op_type = test_vector.op_type; + const uint16_t queue_id = ad->queue_ids[0]; + struct test_buffers *bufs = NULL; + struct rte_bbdev_info info; + const char *op_type_str; + struct test_time_stats time_st; + + memset(&time_st, 0, sizeof(struct test_time_stats)); + time_st.enq_sw_min_time = UINT64_MAX; + time_st.enq_acc_min_time = UINT64_MAX; + time_st.deq_min_time = UINT64_MAX; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(ad->dev_id, &info); + bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; + + op_type_str = rte_bbdev_op_type_str(op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== test: offload latency test\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", + info.dev_name, burst_sz, num_to_process, op_type_str); + + if (op_type == RTE_BBDEV_OP_TURBO_DEC) + iter = offload_latency_test_dec(op_params->mp, bufs, + op_params->ref_dec_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + else if (op_type == RTE_BBDEV_OP_TURBO_ENC) + iter = offload_latency_test_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + else if (op_type == RTE_BBDEV_OP_LDPC_ENC) + iter = offload_latency_test_ldpc_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + else if (op_type == RTE_BBDEV_OP_LDPC_DEC) + iter = offload_latency_test_ldpc_dec(op_params->mp, bufs, + op_params->ref_dec_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + else + iter = offload_latency_test_enc(op_params->mp, bufs, + op_params->ref_enc_op, ad->dev_id, queue_id, + num_to_process, burst_sz, &time_st); + + if (iter <= 0) + return TEST_FAILED; + + printf("Enqueue driver offload cost latency:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n" + "Enqueue accelerator offload cost latency:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n", + (double)time_st.enq_sw_total_time / (double)iter, + (double)(time_st.enq_sw_total_time * 1000000) / + (double)iter / (double)rte_get_tsc_hz(), + (double)time_st.enq_sw_min_time, + (double)(time_st.enq_sw_min_time * 1000000) / + rte_get_tsc_hz(), (double)time_st.enq_sw_max_time, + (double)(time_st.enq_sw_max_time * 1000000) / + rte_get_tsc_hz(), (double)time_st.enq_acc_total_time / + (double)iter, + (double)(time_st.enq_acc_total_time * 1000000) / + (double)iter / (double)rte_get_tsc_hz(), + (double)time_st.enq_acc_min_time, + (double)(time_st.enq_acc_min_time * 1000000) / + rte_get_tsc_hz(), (double)time_st.enq_acc_max_time, + (double)(time_st.enq_acc_max_time * 1000000) / + rte_get_tsc_hz()); + + printf("Dequeue offload cost latency - one op:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n", + (double)time_st.deq_total_time / (double)iter, + (double)(time_st.deq_total_time * 1000000) / + (double)iter / (double)rte_get_tsc_hz(), + (double)time_st.deq_min_time, + (double)(time_st.deq_min_time * 1000000) / + rte_get_tsc_hz(), (double)time_st.deq_max_time, + (double)(time_st.deq_max_time * 1000000) / + rte_get_tsc_hz()); + + return TEST_SUCCESS; +#endif +} + +#ifdef RTE_BBDEV_OFFLOAD_COST +static int +offload_latency_empty_q_test_dec(uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *deq_total_time, uint64_t *deq_min_time, + uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) +{ + int i, deq_total; + struct rte_bbdev_dec_op *ops[MAX_BURST]; + uint64_t deq_start_time, deq_last_time; + + /* Test deq offload latency from an empty queue */ + + for (i = 0, deq_total = 0; deq_total < num_to_process; + ++i, deq_total += burst_sz) { + deq_start_time = rte_rdtsc_precise(); + + if (unlikely(num_to_process - deq_total < burst_sz)) + burst_sz = num_to_process - deq_total; + if (op_type == RTE_BBDEV_OP_LDPC_DEC) + rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, ops, + burst_sz); + else + rte_bbdev_dequeue_dec_ops(dev_id, queue_id, ops, + burst_sz); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); + *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); + *deq_total_time += deq_last_time; + } + + return i; +} + +static int +offload_latency_empty_q_test_enc(uint16_t dev_id, uint16_t queue_id, + const uint16_t num_to_process, uint16_t burst_sz, + uint64_t *deq_total_time, uint64_t *deq_min_time, + uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) +{ + int i, deq_total; + struct rte_bbdev_enc_op *ops[MAX_BURST]; + uint64_t deq_start_time, deq_last_time; + + /* Test deq offload latency from an empty queue */ + for (i = 0, deq_total = 0; deq_total < num_to_process; + ++i, deq_total += burst_sz) { + deq_start_time = rte_rdtsc_precise(); + + if (unlikely(num_to_process - deq_total < burst_sz)) + burst_sz = num_to_process - deq_total; + if (op_type == RTE_BBDEV_OP_LDPC_ENC) + rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, ops, + burst_sz); + else + rte_bbdev_dequeue_enc_ops(dev_id, queue_id, ops, + burst_sz); + + deq_last_time = rte_rdtsc_precise() - deq_start_time; + *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); + *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); + *deq_total_time += deq_last_time; + } + + return i; +} + +#endif + +static int +offload_latency_empty_q_test(struct active_device *ad, + struct test_op_params *op_params) +{ +#ifndef RTE_BBDEV_OFFLOAD_COST + RTE_SET_USED(ad); + RTE_SET_USED(op_params); + printf("Offload latency empty dequeue test is disabled.\n"); + printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); + return TEST_SKIPPED; +#else + int iter; + uint64_t deq_total_time, deq_min_time, deq_max_time; + uint16_t burst_sz = op_params->burst_sz; + const uint16_t num_to_process = op_params->num_to_process; + const enum rte_bbdev_op_type op_type = test_vector.op_type; + const uint16_t queue_id = ad->queue_ids[0]; + struct rte_bbdev_info info; + const char *op_type_str; + + deq_total_time = deq_max_time = 0; + deq_min_time = UINT64_MAX; + + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), + "BURST_SIZE should be <= %u", MAX_BURST); + + rte_bbdev_info_get(ad->dev_id, &info); + + op_type_str = rte_bbdev_op_type_str(op_type); + TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); + + printf("+ ------------------------------------------------------- +\n"); + printf("== test: offload latency empty dequeue\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", + info.dev_name, burst_sz, num_to_process, op_type_str); + + if (op_type == RTE_BBDEV_OP_TURBO_DEC || + op_type == RTE_BBDEV_OP_LDPC_DEC) + iter = offload_latency_empty_q_test_dec(ad->dev_id, queue_id, + num_to_process, burst_sz, &deq_total_time, + &deq_min_time, &deq_max_time, op_type); + else + iter = offload_latency_empty_q_test_enc(ad->dev_id, queue_id, + num_to_process, burst_sz, &deq_total_time, + &deq_min_time, &deq_max_time, op_type); + + if (iter <= 0) + return TEST_FAILED; + + printf("Empty dequeue offload:\n" + "\tavg: %lg cycles, %lg us\n" + "\tmin: %lg cycles, %lg us\n" + "\tmax: %lg cycles, %lg us\n", + (double)deq_total_time / (double)iter, + (double)(deq_total_time * 1000000) / (double)iter / + (double)rte_get_tsc_hz(), (double)deq_min_time, + (double)(deq_min_time * 1000000) / rte_get_tsc_hz(), + (double)deq_max_time, (double)(deq_max_time * 1000000) / + rte_get_tsc_hz()); + + return TEST_SUCCESS; +#endif +} + +static int +bler_tc(void) +{ + return run_test_case(bler_test); +} + +static int +throughput_tc(void) +{ + return run_test_case(throughput_test); +} + +static int +offload_cost_tc(void) +{ + return run_test_case(offload_cost_test); +} + +static int +offload_latency_empty_q_tc(void) +{ + return run_test_case(offload_latency_empty_q_test); +} + +static int +latency_tc(void) +{ + return run_test_case(latency_test); +} + +static int +interrupt_tc(void) +{ + return run_test_case(throughput_test); +} + +static struct unit_test_suite bbdev_bler_testsuite = { + .suite_name = "BBdev BLER Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, bler_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_throughput_testsuite = { + .suite_name = "BBdev Throughput Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, throughput_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_validation_testsuite = { + .suite_name = "BBdev Validation Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_latency_testsuite = { + .suite_name = "BBdev Latency Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_offload_cost_testsuite = { + .suite_name = "BBdev Offload Cost Tests", + .setup = testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, offload_cost_tc), + TEST_CASE_ST(ut_setup, ut_teardown, offload_latency_empty_q_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +static struct unit_test_suite bbdev_interrupt_testsuite = { + .suite_name = "BBdev Interrupt Tests", + .setup = interrupt_testsuite_setup, + .teardown = testsuite_teardown, + .unit_test_cases = { + TEST_CASE_ST(ut_setup, ut_teardown, interrupt_tc), + TEST_CASES_END() /**< NULL terminate unit test array */ + } +}; + +//REGISTER_TEST_COMMAND(bler, bbdev_bler_testsuite); +REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); +//REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite); +//REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite); +//REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite); +//REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite); + + +#define MAX_QUEUES RTE_MAX_LCORE +#define TEST_REPETITIONS 1000 +/* Switch between PMD and Interrupt for throughput TC */ +static bool intr_enabled; +static struct test_bbdev_vector test_vector; +/* LLR arithmetic representation for numerical conversion */ +static int ldpc_llr_decimals; +static int ldpc_llr_size; +/* Keep track of the LDPC decoder device capability flag */ +static uint32_t ldpc_cap_flags; + + /* Defines how many testcases can be specified as cmdline args */ #define MAX_CMDLINE_TESTCASES 8 @@ -201,8 +5164,8 @@ unit_test_suite_runner(struct unit_test_suite *suite) if (test_result == TEST_SUCCESS) test_result = suite->unit_test_cases[total].testcase(); - if (suite->unit_test_cases[total].teardown) - suite->unit_test_cases[total].teardown(); + // if (suite->unit_test_cases[total].teardown) + // suite->unit_test_cases[total].teardown(); if (test_result == TEST_SUCCESS) { succeeded++; @@ -453,101 +5416,9 @@ run_parsed_tests(struct test_params *tp) return ret; } -static void -create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op) -{ - unsigned int i; - struct op_data_entries *entry; - op->ldpc_dec = test_vector.ldpc_dec; - entry = &test_vector.entries[DATA_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->ldpc_dec.input.length += - entry->segments[i].length; - if (test_vector.ldpc_dec.op_flags & - RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) { - entry = &test_vector.entries[DATA_HARQ_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->ldpc_dec.harq_combined_input.length += - entry->segments[i].length; - } -} -/* Read flag value 0/1 from bitmap */ -static inline bool -check_bit(uint32_t bitmap, uint32_t bitmask) -{ - return bitmap & bitmask; -} -static void -copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, - unsigned int start_idx, - struct rte_bbdev_op_data *inputs, - struct rte_bbdev_op_data *hard_outputs, - struct rte_bbdev_op_data *soft_outputs, - struct rte_bbdev_op_data *harq_inputs, - struct rte_bbdev_op_data *harq_outputs, - struct rte_bbdev_dec_op *ref_op) -{ - unsigned int i; - struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; - struct rte_mbuf *m = inputs->data; +int count_init = 0; - for (i = 0; i < n; ++i) { - if (ldpc_dec->code_block_mode == 0) { - ops[i]->ldpc_dec.tb_params.ea = - ldpc_dec->tb_params.ea; - ops[i]->ldpc_dec.tb_params.eb = - ldpc_dec->tb_params.eb; - ops[i]->ldpc_dec.tb_params.c = - ldpc_dec->tb_params.c; - ops[i]->ldpc_dec.tb_params.cab = - ldpc_dec->tb_params.cab; - ops[i]->ldpc_dec.tb_params.r = - ldpc_dec->tb_params.r; - printf("code block ea %d eb %d c %d cab %d r %d\n",ldpc_dec->tb_params.ea,ldpc_dec->tb_params.eb,ldpc_dec->tb_params.c, ldpc_dec->tb_params.cab, ldpc_dec->tb_params.r); - } else { - ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; - } - - ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; - ops[i]->ldpc_dec.z_c = ldpc_dec->z_c; - ops[i]->ldpc_dec.q_m = ldpc_dec->q_m; - ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler; - ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; - ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; - ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; - ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags; - ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; - - printf("reference bg %d zc %d qm %d nfiller n_filler, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); - -if (i<10) -printf("input %x\n",inputs[start_idx+i]); - - if (hard_outputs != NULL) - ops[i]->ldpc_dec.hard_output = - hard_outputs[start_idx + i]; - if (inputs != NULL) - ops[i]->ldpc_dec.input = - inputs[start_idx + i]; - if (soft_outputs != NULL) - ops[i]->ldpc_dec.soft_output = - soft_outputs[start_idx + i]; - if (harq_inputs != NULL) - ops[i]->ldpc_dec.harq_combined_input = - harq_inputs[start_idx + i]; - if (harq_outputs != NULL) - ops[i]->ldpc_dec.harq_combined_output = - harq_outputs[start_idx + i]; - -// if (i<10) -//printf("ldpc_dec input %x\n",*ops[i]->ldpc_dec.input->data->buf_addr); - - - - - } -} int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats* p_profiler) //int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint32_t F, int8_t* w, int8_t* p_out) { @@ -559,7 +5430,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, in RTE_CACHE_LINE_SIZE); TEST_ASSERT_NOT_NULL(t_params_tp, "Failed to alloc %zuB for t_params", RTE_ALIGN(sizeof(struct thread_params) * num_lcores, - RTE_CACHE_LINE_SIZE)); + RTE_CACHE_LINE_SIZE)); */ uint16_t enq, deq; const uint16_t queue_id = 1; //tp->queue_id; @@ -574,50 +5445,79 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, in int i, j, ret; struct rte_bbdev_info info; uint16_t num_to_enq; - +// bufs->inputs->data->buf_addr = p_llr; +// ops_enq[i]->ldpc_dec.input.data->buf_addr = p_llr; + +//int count_init = 0; //int ret; int argc_re=4; char *argv_re[15]; -argv_re[0] = "./build/app/testbbdev"; +argv_re[0] = "/home/wang/dpdk2005/dpdk-20.05/build/app/testbbdev"; argv_re[1] = "--"; //./build/app/testbbdev"; +//argv_re[2] = "-c"; +//argv_re[3] = "throughput"; argv_re[2] = "-v"; argv_re[3] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"; +if (count_init == 0) { + printf("argcre %d argvre %s %s %s %s\n", argc_re, argv_re[0], argv_re[1], argv_re[2], argv_re[3],argv_re[4]); - +count_init++; ret = rte_eal_init(argc_re, argv_re); - +} argc_re = 3; -argv_re[0] = "--"; //./build/app/testbbdev"; +argv_re[0] = "--"; argv_re[1] = "-v"; argv_re[2] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"; //printf("after ......ret %d argc %d argv %s %s %s %s\n", ret,argc, argv[0], argv[1], argv[2], argv[3],argv[4]); /* Parse application arguments (after the EAL ones) */ - // ret = parse_args(argc_re, argv_re, &test_params); - /*if (ret < 0) { + /* ret = parse_args(argc_re, argv_re, &test_params); + if (ret < 0) { print_usage(argv_re[0]); return 1; } */ +struct op_data_entries *ref_entries = + &test_vector_dec.entries[0]; +ref_entries->segments[0].addr = (int32_t *)p_llr; + +//memcpy(ref_entries->segments[0].addr, p_llr, 8448); + +/*printf("ref seg addr %p +384 %p data %x\n", ref_entries->segments[0].addr,(ref_entries->segments[0].addr+384), *(ref_entries->segments[0].addr+384)); +int l=0; +for (l=0;l<8;l++) +printf("ref seg addr +384 %p data %x\n", (ref_entries->segments[0].addr+384+l), *(ref_entries->segments[0].addr+384+l)); +*/ + snprintf(test_params.test_vector_filename,sizeof(test_params.test_vector_filename),"%s", argv_re[2]); -test_params.num_ops=128; -test_params.burst_sz=128; +test_params.num_ops=32; +test_params.burst_sz=32; test_params.num_lcores=1; test_params.num_tests = 1; run_all_tests(); +p_out = ldpc_output; - /* bool extDdr = check_bit(ldpc_cap_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); - bool loopback = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); - bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); - t_params_tp = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), +/*for (i=0;i<8;i++) +printf("p_out[%d] = %x addr %p\n",i,p_out[i],p_out+i); +*/ + bool extDdr = false; //check_bit(ldpc_cap_flags, + //RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + bool loopback = true; //false; //check_bit(ref_op->ldpc_dec.op_flags, + // RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); + bool hc_out = false; //check_bit(ref_op->ldpc_dec.op_flags, + //RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); +/* t_params_tp = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), RTE_CACHE_LINE_SIZE); TEST_ASSERT_NOT_NULL(t_params_tp, "Failed to alloc %zuB for t_params", RTE_ALIGN(sizeof(struct thread_params) * num_lcores, RTE_CACHE_LINE_SIZE)); + while (rte_atomic16_read(&t_params_tp->op_params->sync) == 0) //SYNC_WAIT) + rte_pause(); + +ret = rte_bbdev_dec_op_alloc_bulk(t_params_tp->op_params->mp, ops_enq, num_ops); + TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); + */ // throughput_pmd_lcore_ldpc_dec(&t_params_tp[0]); /* ref_op->ldpc_dec.iter_max = get_iter_max(); @@ -627,18 +5527,18 @@ run_all_tests(); copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs, bufs->harq_outputs, ref_op); +*/ +// for (j = 0; j < num_ops; ++j) +// ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < TEST_REPETITIONS; ++i) { +// for (i = 0; i < TEST_REPETITIONS; ++i) { for (j = 0; j < num_ops; ++j) { if (!loopback) mbuf_reset( ops_enq[j]->ldpc_dec.hard_output.data); - if (hc_out || loopback) - mbuf_reset( - ops_enq[j]->ldpc_dec.harq_combined_output.data); + // if (hc_out || loopback) + // mbuf_reset( + // ops_enq[j]->ldpc_dec.harq_combined_output.data); } if (extDdr) { bool preload = i == (TEST_REPETITIONS - 1); @@ -646,10 +5546,16 @@ run_all_tests(); num_ops, preload); } - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; +//printf("ops enq buff addr %d\n",ops_enq[0]->ldpc_dec.input.data->buf_addr); - if (unlikely(num_ops - enq < num_to_enq)) +// for (enq = 0, deq = 0; enq < num_ops;) { +// num_to_enq = burst_sz; + + //ops_enq[enq]->ldpc_dec.input.data->buf_addr = p_llr; + //memcpy(ops_enq[enq]->ldpc_dec.input.data->buf_addr, p_llr, 128); + + +/* if (unlikely(num_ops - enq < num_to_enq)) num_to_enq = num_ops - enq; @@ -664,9 +5570,9 @@ run_all_tests(); deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, queue_id, &ops_deq[deq], enq - deq); } - - } */ +// } + return numIter; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 79a726b6c6..fa65a54a42 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -240,15 +240,21 @@ void nr_processULSegment(void* arg) { uint32_t Tbslbrm = rdata->Tbslbrm; short* ulsch_llr = rdata->ulsch_llr; int max_ldpc_iterations = p_decoderParms->numMaxIter; - int8_t llrProcBuf[OAI_UL_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))); + int8_t llrProcBuf[OAI_UL_LDPC_MAX_NUM_LLR]; // __attribute__ ((aligned(32))); int16_t z [68*384 + 16] __attribute__ ((aligned(16))); int8_t l [68*384 + 16] __attribute__ ((aligned(16))); + int16_t z_ol [68*384]; + int8_t l_ol [68*384]; __m128i *pv = (__m128i*)&z; __m128i *pl = (__m128i*)&l; + __m128i *pv_ol128 = (__m128i*)&z_ol; + __m128i *pl_ol128 = (__m128i*)&l_ol; +// int16_t *pv = &z; uint8_t Ilbrm = 0; + // int8_t *pl = &l; Kr = ulsch_harq->K; Kr_bytes = Kr>>3; @@ -276,15 +282,13 @@ void nr_processULSegment(void* arg) { stop_meas(&phy_vars_gNB->ulsch_deinterleaving_stats); - /*LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", - harq_pid,r, G, + printf(" segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, rv %d, round %d)...\n", + r, A, Kr*3, ulsch_harq->TBS, Qm, - nb_rb, - n_layers, - pusch_pdu->pusch_data.rv_index, - ulsch_harq->round);*/ + rv_index, + ulsch_harq->round); ////////////////////////////////////////////////////////////////////////////////////////// @@ -332,6 +336,13 @@ void nr_processULSegment(void* arg) { crc_type = CRC24_B; length_dec = (ulsch_harq->B+24*ulsch_harq->C)/ulsch_harq->C; } +/*LOG_I(PHY,"decoder input(segment %u) :",r); + for (int i=0;i<16;i++) + LOG_I(PHY,"%d : %d\n",i,ulsch_harq->d[r][i]); + LOG_I(PHY,"\n"); +printf("LDPC lifting size Z %d F %d E %d\n",ulsch_harq->Z,ulsch_harq->F,E); +*/ +//printf("input data %x\n",pl+ulsch_harq->Z); //start_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats); @@ -348,6 +359,23 @@ void nr_processULSegment(void* arg) { { pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); } + + + //memcpy((&z_ol[0]+2*ulsch_harq->Z),ulsch_harq->d[r],(K_bits_F-2*ulsch_harq->Z)*sizeof(int16_t)); + //memcpy((&z_ol[0]),ulsch_harq->e[r],(kc*ulsch_harq->Z)*sizeof(int16_t)); + memcpy((&z_ol[0]),ulsch_llr,E*sizeof(int16_t)); +for (i=0, j=0; j < ((kc*ulsch_harq->Z)>>4)+1; i+=2, j++) + { + pl_ol128[j] = _mm_packs_epi16(pv_ol128[i],pv_ol128[i+1]); + } + + +//int8_t *pl_ol=(int8_t*)&z_ol[0]; +/*for (i=0;i<8;i++){ +printf("input addr z @ %p data %d \n", (&z[0]+2*ulsch_harq->Z+i), *(&z[0]+2*ulsch_harq->Z+i)); +printf("input addr p @ %p data %d\n", (pl_ol128), *(pl_ol128)); +} +*/ ////////////////////////////////////////////////////////////////////////////////////////// @@ -358,11 +386,18 @@ void nr_processULSegment(void* arg) { ////////////////////////////////// pl =====> llrProcBuf ////////////////////////////////// no_iteration_ldpc = nrLDPC_decoder_offload(p_decoderParms, + (int8_t*)&pl_ol128[0], //pl_ol, + llrProcBuf, + ulsch_harq->p_nrLDPC_procBuf[r],// 3 + p_procTime); + + +/*no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, (int8_t*)&pl[0], llrProcBuf, ulsch_harq->p_nrLDPC_procBuf[r], p_procTime); - +*/ if (check_crc((uint8_t*)llrProcBuf,length_dec,ulsch_harq->F,crc_type)) { #ifdef PRINT_CRC_CHECK LOG_I(PHY, "Segment %d CRC OK, iterations %d/%d\n",r,no_iteration_ldpc,max_ldpc_iterations); @@ -379,8 +414,14 @@ void nr_processULSegment(void* arg) { for (int m=0; m < Kr>>3; m ++) { ulsch_harq->c[r][m]= (uint8_t) llrProcBuf[m]; } - - //stop_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats); +/*for (int k=0;k<16;k++) +{ + printf("output decoder [%d] = 0x%02x \n", k, ulsch_harq->c[r][k]); + printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k+128], llrProcBuf+k+128); + } + printf("no_iterations_ldpc %d \n",no_iteration_ldpc); +} +*/ } uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data index ddebf7bee1..6101f40239 100644 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data +++ b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data @@ -30,11 +30,72 @@ input0 = 0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x81817F81, 0x7F817F81, 0x81818181, 0x7F7F8181, 0x817F817F, 0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, 0x81818181, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, 0x7F818181, 0x817F8181, 0x817F817F, 0x7F7F817F, -0x7F817F81 +0x7E817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F71, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, +0x7F817F81, 0x81818181 output0 = -0x76332859, 0x417B1254, 0xEC8A8CFE, 0xE7EFCD06, 0x43C5BDA2, 0x2EACD776, 0x6CD515AC, 0x6D6E04AC, -0xBC2D9F85, 0xD3643553, 0xD0C8DF8E, 0x235B434A, 0xD7AB7643, 0xA4D9C420, 0x372FA858, 0xF813CE10, +0x66667859, 0x417B1254, 0xEC8A8CFE, 0xE7EFCD06, 0x43C5BDA2, 0x2EACD776, 0x6CD515AC, 0x6D6E04AC, +0xB9999F85, 0xD3643553, 0xD0C8DF8E, 0x235B434A, 0xD7AB7643, 0xA4D9C420, 0x372FA858, 0xF813CE10, 0xE0C238F6, 0x07853FD4, 0xE04E40F2, 0x0EE765A9, 0x6EEAFCBC, 0xA7059C68, 0xFBBC basegraph= @@ -50,10 +111,10 @@ q_m= 2 n_filler= -0 +176 e = -804 +2760 rv_index = 0 From 6639ad24fc2d2f1708dbdf51a39dbee833868820 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 20 Jul 2021 10:31:19 +0200 Subject: [PATCH 004/136] removing test vector config file --- cmake_targets/CMakeLists.txt | 4 +- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 213 +++++++++++++++--- 2 files changed, 186 insertions(+), 31 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 95fee6edb4..b099611139 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -824,10 +824,10 @@ include_directories ("/usr/local/include") set(HWLIB_LDPC_OFFLOAD_SOURCE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c - ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev.c +# ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev.c # ${OPENAIR_TARGETS}/ARCH/test-bbdev/main.c # ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_perf.c - ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_vector.c +# ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_vector.c ) add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 68ec167e0a..12ca341990 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -635,8 +635,9 @@ add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info, struct rte_bbdev_queue_conf qconf; struct active_device *ad = &active_devs[nb_active_devs]; unsigned int nb_queues; - enum rte_bbdev_op_type op_type = vector->op_type; + enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; +//test_vector_dec.op_type= RTE_BBDEV_OP_LDPC_DEC; /* Configure fpga lte fec with PF & VF values * if '-i' flag is set and using fpga device */ @@ -815,7 +816,7 @@ populate_active_devices(void) dev_id, info.dev_name); continue; } - +test_vector.op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; ret = add_active_device(dev_id, &info, &test_vector); if (ret != 0) { printf("Adding active bbdev %s skipped\n", @@ -832,10 +833,31 @@ static int read_test_vector(void) { int ret; -uint16_t Z=72; memset(&test_vector, 0, sizeof(test_vector)); - printf("Test vector file = %s\n", get_vector_filename()); - ret = test_bbdev_vector_read(get_vector_filename(), &test_vector); + +ret= init_entry(&test_vector, 0); +ret= init_entry(&test_vector, 2); + + +struct rte_bbdev_op_ldpc_dec *ldpc_dec = &test_vector.ldpc_dec; +test_vector.op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; +test_vector.expected_status = 0; +//printf("test vector expected status %d\n",test_vector.expected_status); + + ldpc_dec->cb_params.e = 2760; //ldpc_dec->cb_params.e; +ldpc_dec->iter_count = 3; + ldpc_dec->basegraph = 2; //ldpc_dec->basegraph; + ldpc_dec->z_c = 72; //ldpc_dec->z_c; + ldpc_dec->q_m = 2; //ldpc_dec->q_m; + ldpc_dec->n_filler = 176; //ldpc_dec->n_filler; + ldpc_dec->n_cb = 3600; //ldpc_dec->n_cb; + ldpc_dec->iter_max = 8; //ldpc_dec->iter_max; + ldpc_dec->rv_index = 0; //ldpc_dec->rv_index; + + ldpc_dec->op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; //ldpc_dec->op_flags; + ldpc_dec->code_block_mode = 1; //ldpc_dec->code_block_mode; + +//printf("reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); struct op_data_entries *ref_entries = &test_vector.entries[0]; @@ -843,12 +865,14 @@ struct op_data_entries *ref_entries_dec = &test_vector_dec.entries[0]; struct op_data_buf *seg = &ref_entries->segments[0]; struct op_data_buf *seg_dec = &ref_entries_dec->segments[0]; + +//printf("before seg addr %p seg dec addr %p nb segments %d\n",seg->addr,seg_dec->addr,ref_entries->nb_segments); + memcpy(seg->addr, seg_dec->addr, seg->length); +//printf("seg addr %p length %d seg dec addr %p \n",seg->addr,seg->length, seg_dec->addr); //printf("seg addr %p seg dec addr %p llr %x llr dec %x\n",seg->addr,seg_dec->addr,*(seg->addr), *(seg_dec->addr)); - - TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n", get_vector_filename()); @@ -1684,8 +1708,9 @@ copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, { unsigned int i; struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; - struct rte_mbuf *m = inputs->data; - + //struct rte_mbuf *m = inputs[0].data; +// struct rte_mbuf *mldpc = ops[0]->ldpc_dec.input.data; +//struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); for (i = 0; i < n; ++i) { if (ldpc_dec->code_block_mode == 0) { ops[i]->ldpc_dec.tb_params.ea = @@ -1700,23 +1725,32 @@ copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ldpc_dec->tb_params.r; printf("code block ea %d eb %d c %d cab %d r %d\n",ldpc_dec->tb_params.ea,ldpc_dec->tb_params.eb,ldpc_dec->tb_params.c, ldpc_dec->tb_params.cab, ldpc_dec->tb_params.r); } else { - ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; + ops[i]->ldpc_dec.cb_params.e = 2760; //ldpc_dec->cb_params.e; } - ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; - ops[i]->ldpc_dec.z_c = ldpc_dec->z_c; - ops[i]->ldpc_dec.q_m = ldpc_dec->q_m; - ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler; - ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; - ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; - ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; - ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags; - ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; + ops[i]->ldpc_dec.basegraph = 2; //ldpc_dec->basegraph; + ops[i]->ldpc_dec.z_c = 72; //ldpc_dec->z_c; + ops[i]->ldpc_dec.q_m = 2; //ldpc_dec->q_m; + ops[i]->ldpc_dec.n_filler = 176; //ldpc_dec->n_filler; + ops[i]->ldpc_dec.n_cb = 3600; //ldpc_dec->n_cb; + ops[i]->ldpc_dec.iter_max = 8; //ldpc_dec->iter_max; + ops[i]->ldpc_dec.rv_index = 0; //ldpc_dec->rv_index; + ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; //ldpc_dec->op_flags; + ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; //printf("reference bg %d zc %d qm %d nfiller n_filler, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); +/*char *data; +data = m->buf_addr; +if (i<1) +for (int j=0; j<8; j++) +{printf("input length %d\n",inputs[0].length); +printf("input %p \n",m->buf_addr); +printf("input %p data %x\n",data, *(data+j+256)); -//if (i<10) -//printf("input %x\n",inputs[start_idx+i]); + +} +*/ +//printf("input %p data %x\n",inputs[0].buf_addr, *(inputs[0].buf_addr+j)); if (hard_outputs != NULL) ops[i]->ldpc_dec.hard_output = @@ -1734,9 +1768,22 @@ copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ops[i]->ldpc_dec.harq_combined_output = harq_outputs[start_idx + i]; - // if (i<10) -//printf("ldpc_dec input %x\n",*ops[i]->ldpc_dec.input->data->buf_addr); +// if (i<10) +//printf("ldpc_dec input %x\n",*ops[i]->ldpc_dec.input.data->buf_addr); +//printf("ldpc_dec input %x\n",mldpc->buf_addr); +// struct rte_mbuf *mldpc = ops[i]->ldpc_dec.input.data; +//char *dataldpc; +//dataldpc = (mldpc->buf_addr); +//if (i<10) +//for (int l=0; l<10; l++) +{//printf("input length %d\n",inputs[0].length); +//printf("input mldpc %p \n",mldpc->buf_addr); +//printf("input %p data %x\n",dataldpc, *(dataldpc+l+256)); +//printf("input mlpdc %p \n",dataldpc); + + +} @@ -5416,7 +5463,112 @@ run_parsed_tests(struct test_params *tp) return ret; } +static int +init_input(uint32_t **data, uint32_t *data_length) +{ + uint32_t n_values = 0; + uint32_t data_size = 32; + uint32_t *values, *values_resized; + + values = (uint32_t *) + rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0); + if (values == NULL) + return -1; + + values_resized = NULL; + + +*data_length = 2760; +n_values = 690; +//printf("data len %d n %d\n",*data_length,n_values); + values_resized = (uint32_t *) rte_realloc(values, + sizeof(uint32_t) * (n_values), 0); + +//printf("resized values addr %p\n",values_resized); + if (values_resized == NULL) { + rte_free(values); + return -1; + } + + *data = values_resized; + + return 0; +} + +static int +init_output(uint32_t **data, uint32_t *data_length) +{ + uint32_t n_values = 0; + uint32_t data_size = 32; + + uint32_t *values, *values_resized; + + values = (uint32_t *) + rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0); + if (values == NULL) + return -1; + + values_resized = NULL; + + +*data_length = 2760; +n_values = 690; +//printf("data len %d n %d\n",*data_length,n_values); + values_resized = (uint32_t *) rte_realloc(values, + sizeof(uint32_t) * (n_values), 0); + +//printf("resized values addr %p\n",values_resized); + if (values_resized == NULL) { + rte_free(values); + return -1; + } + + *data = values_resized; + + return 0; +} + +int +init_entry(struct test_bbdev_vector *vector, enum op_data_type type) +{ + int ret; + uint32_t data_length = 0; + uint32_t *data = NULL; + unsigned int id; + struct op_data_buf *op_data; + unsigned int *nb_ops; + + if (type >= DATA_NUM_TYPES) { + printf("Unknown op type: %d!\n", type); + return -1; + } + + op_data = vector->entries[type].segments; + nb_ops = &vector->entries[type].nb_segments; + + if (*nb_ops >= RTE_BBDEV_TURBO_MAX_CODE_BLOCKS) { + printf("Too many segments (code blocks defined): %u, max %d!\n", + *nb_ops, RTE_BBDEV_TURBO_MAX_CODE_BLOCKS); + return -1; + } + + + /* Clear new op data struct */ + memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf)); +if (type == 0) + ret = init_input(&data, &data_length); +else + ret = init_output(&data, &data_length); + + if (!ret) { + op_data[*nb_ops].addr = data; + op_data[*nb_ops].length = data_length; + ++(*nb_ops); + } + + return ret; +} int count_init = 0; int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats* p_profiler) @@ -5434,8 +5586,8 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, in */ uint16_t enq, deq; const uint16_t queue_id = 1; //tp->queue_id; - const uint16_t burst_sz = 128; //tp->op_params->burst_sz; - const uint16_t num_ops = 128; //tp->op_params->num_to_process; + const uint16_t burst_sz = 32; //tp->op_params->burst_sz; + const uint16_t num_ops = 32; //tp->op_params->num_to_process; struct rte_bbdev_dec_op *ops_enq[num_ops]; struct rte_bbdev_dec_op *ops_deq[num_ops]; struct thread_params *tp=&t_params_tp[0]; @@ -5496,11 +5648,14 @@ test_params.burst_sz=32; test_params.num_lcores=1; test_params.num_tests = 1; run_all_tests(); -p_out = ldpc_output; +char *data = ldpc_output; +memcpy(&p_out[0], data, 2760); + +//p_out = ldpc_output; + +//for (i=0;i<8;i++) +//printf("p_out[%d] = %x addr %p ldpcout addr %p\n",i,p_out[i],p_out+i,ldpc_output+i); -/*for (i=0;i<8;i++) -printf("p_out[%d] = %x addr %p\n",i,p_out[i],p_out+i); -*/ bool extDdr = false; //check_bit(ldpc_cap_flags, //RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); bool loopback = true; //false; //check_bit(ref_op->ldpc_dec.op_flags, From aed61728dc1e46323dad37e8eef5058696aa9092 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 20 Jul 2021 16:28:16 +0200 Subject: [PATCH 005/136] removing hardcoded parameters --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 116 ++++++++++-------- openair1/PHY/CODING/nrLDPC_defs.h | 4 +- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 20 ++- 3 files changed, 83 insertions(+), 57 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 12ca341990..588c56bace 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -148,8 +148,8 @@ uint8_t count_initdev =0; #define K0_3_1 56 /* K0 fraction numerator for rv 3 and BG 1 */ #define K0_3_2 43 /* K0 fraction numerator for rv 3 and BG 2 */ -static struct test_bbdev_vector test_vector; -static struct test_bbdev_vector test_vector_dec; +struct test_bbdev_vector test_vector; +struct test_bbdev_vector test_vector_dec; int8_t ldpc_output[22*384]; /* Switch between PMD and Interrupt for throughput TC */ static bool intr_enabled; @@ -833,31 +833,32 @@ static int read_test_vector(void) { int ret; - memset(&test_vector, 0, sizeof(test_vector)); - -ret= init_entry(&test_vector, 0); -ret= init_entry(&test_vector, 2); - - + memset(&test_vector, 0, sizeof(struct test_bbdev_vector)); struct rte_bbdev_op_ldpc_dec *ldpc_dec = &test_vector.ldpc_dec; +struct rte_bbdev_op_ldpc_dec *ldpc_dec_ref = &test_vector_dec.ldpc_dec; test_vector.op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; test_vector.expected_status = 0; //printf("test vector expected status %d\n",test_vector.expected_status); +//uint8_t *rv_index = &ldpc_dec_ref->rv_index; +//rv_index = ldpc_dec_ref->rv_index; - ldpc_dec->cb_params.e = 2760; //ldpc_dec->cb_params.e; -ldpc_dec->iter_count = 3; - ldpc_dec->basegraph = 2; //ldpc_dec->basegraph; - ldpc_dec->z_c = 72; //ldpc_dec->z_c; - ldpc_dec->q_m = 2; //ldpc_dec->q_m; - ldpc_dec->n_filler = 176; //ldpc_dec->n_filler; - ldpc_dec->n_cb = 3600; //ldpc_dec->n_cb; - ldpc_dec->iter_max = 8; //ldpc_dec->iter_max; - ldpc_dec->rv_index = 0; //ldpc_dec->rv_index; - - ldpc_dec->op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; //ldpc_dec->op_flags; - ldpc_dec->code_block_mode = 1; //ldpc_dec->code_block_mode; + ldpc_dec->rv_index = 0; //*rv_index; + ldpc_dec->cb_params.e = ldpc_dec_ref->cb_params.e; + ldpc_dec->iter_count = 3; + ldpc_dec->basegraph = ldpc_dec_ref->basegraph; + ldpc_dec->z_c = ldpc_dec_ref->z_c; + ldpc_dec->q_m = ldpc_dec_ref->q_m; + ldpc_dec->n_filler = ldpc_dec_ref->n_filler; + ldpc_dec->n_cb = ldpc_dec_ref->n_cb; + ldpc_dec->iter_max = ldpc_dec_ref->iter_max; +// ldpc_dec->rv_index = ldpc_dec_ref->rv_index; + ldpc_dec->op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ldpc_dec->code_block_mode = 1; -//printf("reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); +ret= init_entry(&test_vector, 0, ldpc_dec->cb_params.e); +ret= init_entry(&test_vector, 2, ldpc_dec->cb_params.e); +//printf("read test reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec_ref->basegraph, ldpc_dec_ref->z_c, ldpc_dec_ref->q_m,ldpc_dec_ref->n_filler,ldpc_dec_ref->n_cb,ldpc_dec_ref->iter_max,rv_index); +//printf("read test reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec_ref->basegraph, ldpc_dec_ref->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); struct op_data_entries *ref_entries = &test_vector.entries[0]; @@ -869,13 +870,11 @@ struct op_data_buf *seg_dec = &ref_entries_dec->segments[0]; //printf("before seg addr %p seg dec addr %p nb segments %d\n",seg->addr,seg_dec->addr,ref_entries->nb_segments); memcpy(seg->addr, seg_dec->addr, seg->length); +//memcpy(ldpc_dec, ldpc_dec_ref, sizeof(struct rte_bbdev_op_ldpc_dec)); //printf("seg addr %p length %d seg dec addr %p \n",seg->addr,seg->length, seg_dec->addr); //printf("seg addr %p seg dec addr %p llr %x llr dec %x\n",seg->addr,seg_dec->addr,*(seg->addr), *(seg_dec->addr)); - TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n", - get_vector_filename()); - return TEST_SUCCESS; } @@ -1725,18 +1724,18 @@ copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ldpc_dec->tb_params.r; printf("code block ea %d eb %d c %d cab %d r %d\n",ldpc_dec->tb_params.ea,ldpc_dec->tb_params.eb,ldpc_dec->tb_params.c, ldpc_dec->tb_params.cab, ldpc_dec->tb_params.r); } else { - ops[i]->ldpc_dec.cb_params.e = 2760; //ldpc_dec->cb_params.e; + ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; } - ops[i]->ldpc_dec.basegraph = 2; //ldpc_dec->basegraph; - ops[i]->ldpc_dec.z_c = 72; //ldpc_dec->z_c; - ops[i]->ldpc_dec.q_m = 2; //ldpc_dec->q_m; - ops[i]->ldpc_dec.n_filler = 176; //ldpc_dec->n_filler; - ops[i]->ldpc_dec.n_cb = 3600; //ldpc_dec->n_cb; - ops[i]->ldpc_dec.iter_max = 8; //ldpc_dec->iter_max; - ops[i]->ldpc_dec.rv_index = 0; //ldpc_dec->rv_index; + ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; + ops[i]->ldpc_dec.z_c = ldpc_dec->z_c; + ops[i]->ldpc_dec.q_m = ldpc_dec->q_m; + ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler; + ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; + ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; + ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; //ldpc_dec->op_flags; - ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; + ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; //printf("reference bg %d zc %d qm %d nfiller n_filler, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); /*char *data; @@ -5142,7 +5141,7 @@ REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); #define TEST_REPETITIONS 1000 /* Switch between PMD and Interrupt for throughput TC */ static bool intr_enabled; -static struct test_bbdev_vector test_vector; +//static struct test_bbdev_vector test_vector; /* LLR arithmetic representation for numerical conversion */ static int ldpc_llr_decimals; static int ldpc_llr_size; @@ -5464,7 +5463,7 @@ run_parsed_tests(struct test_params *tp) } static int -init_input(uint32_t **data, uint32_t *data_length) +init_input(uint32_t **data, uint32_t data_length) { uint32_t n_values = 0; uint32_t data_size = 32; @@ -5479,11 +5478,10 @@ init_input(uint32_t **data, uint32_t *data_length) values_resized = NULL; -*data_length = 2760; -n_values = 690; + n_values = data_length>>2; //printf("data len %d n %d\n",*data_length,n_values); values_resized = (uint32_t *) rte_realloc(values, - sizeof(uint32_t) * (n_values), 0); + sizeof(uint32_t) * (n_values+1), 0); //printf("resized values addr %p\n",values_resized); if (values_resized == NULL) { @@ -5497,7 +5495,7 @@ n_values = 690; } static int -init_output(uint32_t **data, uint32_t *data_length) +init_output(uint32_t **data, uint32_t data_length) { uint32_t n_values = 0; uint32_t data_size = 32; @@ -5512,11 +5510,10 @@ init_output(uint32_t **data, uint32_t *data_length) values_resized = NULL; -*data_length = 2760; -n_values = 690; +n_values = data_length>>2; //printf("data len %d n %d\n",*data_length,n_values); values_resized = (uint32_t *) rte_realloc(values, - sizeof(uint32_t) * (n_values), 0); + sizeof(uint32_t) * (n_values+1), 0); //printf("resized values addr %p\n",values_resized); if (values_resized == NULL) { @@ -5530,10 +5527,9 @@ n_values = 690; } int -init_entry(struct test_bbdev_vector *vector, enum op_data_type type) +init_entry(struct test_bbdev_vector *vector, enum op_data_type type, uint32_t data_length) { int ret; - uint32_t data_length = 0; uint32_t *data = NULL; unsigned int id; struct op_data_buf *op_data; @@ -5557,9 +5553,9 @@ init_entry(struct test_bbdev_vector *vector, enum op_data_type type) /* Clear new op data struct */ memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf)); if (type == 0) - ret = init_input(&data, &data_length); + ret = init_input(&data, data_length); else - ret = init_output(&data, &data_length); + ret = init_output(&data, data_length); if (!ret) { op_data[*nb_ops].addr = data; @@ -5571,8 +5567,8 @@ else } int count_init = 0; -int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats* p_profiler) -//int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint32_t F, int8_t* w, int8_t* p_out) +//int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, int8_t* p_llr, int8_t* p_out, t_nrLDPC_procBuf* p_procBuf, t_nrLDPC_time_stats* p_profiler) +int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint16_t F, uint32_t E, uint8_t Qm, int8_t* p_llr, int8_t* p_out) { uint32_t numIter = 0; struct thread_params *t_params_tp; @@ -5629,6 +5625,28 @@ argv_re[2] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data" return 1; } */ + + memset(&test_vector_dec, 0, sizeof(struct test_bbdev_vector)); + +struct rte_bbdev_op_ldpc_dec *ldpc_dec = &test_vector_dec.ldpc_dec; +test_vector.op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; +test_vector.expected_status = 0; +//printf("test vector expected status %d\n",test_vector.expected_status); + + ldpc_dec->cb_params.e = E; +ldpc_dec->iter_count = 3; + ldpc_dec->basegraph = p_decParams->BG; + ldpc_dec->z_c = p_decParams->Z; + ldpc_dec->q_m = Qm; + ldpc_dec->n_filler = F; + ldpc_dec->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); + ldpc_dec->iter_max = 8; + ldpc_dec->rv_index = rv; + ldpc_dec->op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ldpc_dec->code_block_mode = 1; + +printf("reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); + struct op_data_entries *ref_entries = &test_vector_dec.entries[0]; ref_entries->segments[0].addr = (int32_t *)p_llr; @@ -5649,7 +5667,7 @@ test_params.num_lcores=1; test_params.num_tests = 1; run_all_tests(); char *data = ldpc_output; -memcpy(&p_out[0], data, 2760); +memcpy(&p_out[0], data, E); //p_out = ldpc_output; diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h index 8f32c9a768..f793e92b62 100644 --- a/openair1/PHY/CODING/nrLDPC_defs.h +++ b/openair1/PHY/CODING/nrLDPC_defs.h @@ -73,8 +73,8 @@ typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,sho */ typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); -typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); -//typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint32_t , int8_t*, int8_t* ); +//typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); +typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint16_t, uint32_t, uint8_t, int8_t*, int8_t* ); typedef int32_t(*nrLDPC_dectopfunc_t)(void); #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index fa65a54a42..3dd5248993 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -384,15 +384,24 @@ printf("input addr p @ %p data %d\n", (pl_ol128), *(pl_ol128)); ////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// pl =====> llrProcBuf ////////////////////////////////// - - no_iteration_ldpc = nrLDPC_decoder_offload(p_decoderParms, +/* no_iteration_ldpc = nrLDPC_decoder_offload(p_decoderParms, (int8_t*)&pl_ol128[0], //pl_ol, llrProcBuf, ulsch_harq->p_nrLDPC_procBuf[r],// 3 p_procTime); +*/ + no_iteration_ldpc = nrLDPC_decoder_offload(p_decoderParms, + ulsch_harq->C, + (uint8_t)rv_index, + ulsch_harq->F, + E, + Qm, + (int8_t*)&pl_ol128[0], + llrProcBuf); +/* -/*no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, +no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, (int8_t*)&pl[0], llrProcBuf, ulsch_harq->p_nrLDPC_procBuf[r], @@ -415,12 +424,11 @@ printf("input addr p @ %p data %d\n", (pl_ol128), *(pl_ol128)); ulsch_harq->c[r][m]= (uint8_t) llrProcBuf[m]; } /*for (int k=0;k<16;k++) -{ + { printf("output decoder [%d] = 0x%02x \n", k, ulsch_harq->c[r][k]); - printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k+128], llrProcBuf+k+128); + printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); } printf("no_iterations_ldpc %d \n",no_iteration_ldpc); -} */ } From 4238ff04c56d5e0e1aad8f7fa2eb92ebfb8ead6a Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 26 Jul 2021 16:29:59 +0200 Subject: [PATCH 006/136] moving ldpc offload to ulsch decoding function --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 104 ++++++++---- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 156 +++++++++++------- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 9 +- 3 files changed, 172 insertions(+), 97 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 588c56bace..81de818dd2 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -841,9 +841,18 @@ test_vector.expected_status = 0; //printf("test vector expected status %d\n",test_vector.expected_status); //uint8_t *rv_index = &ldpc_dec_ref->rv_index; //rv_index = ldpc_dec_ref->rv_index; - - ldpc_dec->rv_index = 0; //*rv_index; + ldpc_dec->code_block_mode = 1; //ldpc_dec_ref->code_block_mode; +if (ldpc_dec->code_block_mode == 0) { + ldpc_dec->tb_params.ea = ldpc_dec_ref->tb_params.ea; + ldpc_dec->tb_params.eb = ldpc_dec_ref->tb_params.eb; + ldpc_dec->tb_params.c = ldpc_dec_ref->tb_params.c; + ldpc_dec->tb_params.cab = ldpc_dec_ref->tb_params.cab; + ldpc_dec->tb_params.r = ldpc_dec_ref->tb_params.r; +} else { ldpc_dec->cb_params.e = ldpc_dec_ref->cb_params.e; +} + + ldpc_dec->rv_index = 0; //*rv_index; ldpc_dec->iter_count = 3; ldpc_dec->basegraph = ldpc_dec_ref->basegraph; ldpc_dec->z_c = ldpc_dec_ref->z_c; @@ -853,23 +862,35 @@ test_vector.expected_status = 0; ldpc_dec->iter_max = ldpc_dec_ref->iter_max; // ldpc_dec->rv_index = ldpc_dec_ref->rv_index; ldpc_dec->op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - ldpc_dec->code_block_mode = 1; + // ldpc_dec->code_block_mode = 1; //ldpc_dec_ref->code_block_mode; + +struct op_data_entries *ref_entries = + &test_vector.entries[0]; + +struct op_data_entries *ref_entries_dec = + &test_vector_dec.entries[0]; + +//ref_entries->nb_segments = ref_entries_dec->nb_segments; ret= init_entry(&test_vector, 0, ldpc_dec->cb_params.e); ret= init_entry(&test_vector, 2, ldpc_dec->cb_params.e); //printf("read test reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec_ref->basegraph, ldpc_dec_ref->z_c, ldpc_dec_ref->q_m,ldpc_dec_ref->n_filler,ldpc_dec_ref->n_cb,ldpc_dec_ref->iter_max,rv_index); //printf("read test reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec_ref->basegraph, ldpc_dec_ref->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); -struct op_data_entries *ref_entries = - &test_vector.entries[0]; -struct op_data_entries *ref_entries_dec = - &test_vector_dec.entries[0]; -struct op_data_buf *seg = &ref_entries->segments[0]; -struct op_data_buf *seg_dec = &ref_entries_dec->segments[0]; +printf("read test nb segments %d ref %d\n",ref_entries->nb_segments, ref_entries_dec->nb_segments); +uint8_t nbs = 1; +if (ldpc_dec->code_block_mode ==0) nbs =2; +//for (int i=0;inb_segments;i++) { +for (int i=0;isegments[i]; +struct op_data_buf *seg_dec = &ref_entries_dec->segments[i]; +memcpy(seg->addr, seg_dec->addr, seg->length); +} + //printf("before seg addr %p seg dec addr %p nb segments %d\n",seg->addr,seg_dec->addr,ref_entries->nb_segments); -memcpy(seg->addr, seg_dec->addr, seg->length); //memcpy(ldpc_dec, ldpc_dec_ref, sizeof(struct rte_bbdev_op_ldpc_dec)); //printf("seg addr %p length %d seg dec addr %p \n",seg->addr,seg->length, seg_dec->addr); @@ -1877,11 +1898,13 @@ validate_op_chain(struct rte_bbdev_op_data *op, struct rte_mbuf *m = op->data; uint8_t nb_dst_segments = orig_op->nb_segments; uint32_t total_data_size = 0; -char *data = m->buf_addr; -memcpy(ldpc_output, data+128, (rte_pktmbuf_data_len(m) - op->offset)); + + uint32_t r_offset = 0; +char *data; // = m->buf_addr; +//memcpy(ldpc_output, data+128, (rte_pktmbuf_data_len(m) - op->offset)); //ldpc_output = (int8_t *)(m->buf_addr); -/*printf("validate op chain nb segs %d offset %d data off %d\n",m->nb_segs, op->offset, m->data_off); - +printf("validate op chain nb segs %d offset %d data off %d\n",m->nb_segs, op->offset, m->data_off); +/* int l=0; for (l=0;l<16;l++) { @@ -1898,17 +1921,20 @@ printf(" data[%d] = %x\n",l, *(data+l+128)); /* Apply offset to the first mbuf segment */ uint16_t offset = (i == 0) ? op->offset : 0; uint16_t data_len = rte_pktmbuf_data_len(m) - offset; - total_data_size += orig_op->segments[i].length; + total_data_size += orig_op->segments[i].length; -//printf("segment %d offset %d length %d\n",i, offset,total_data_size); + data = m->buf_addr; + memcpy(ldpc_output+r_offset, data+m->data_off, data_len); + r_offset +=data_len; +printf("segment %d offset %d length %d data length %d\n",i, offset,total_data_size,data_len); // TEST_ASSERT(orig_op->segments[i].length == data_len, // "Length of segment differ in original (%u) and filled (%u) op", // orig_op->segments[i].length, data_len); - /* TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, + TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, rte_pktmbuf_mtod_offset(m, uint32_t *, offset), data_len, "Output buffers (CB=%u) are not equal", i); -*/ + m = m->next; } @@ -3990,7 +4016,7 @@ throughput_test(struct active_device *ad, t_params[used_cores].queue_id = ad->queue_ids[used_cores]; t_params[used_cores].iter_count = 0; - rte_eal_remote_launch(throughput_function, + rte_eal_remote_launch(throughput_pmd_lcore_ldpc_dec, &t_params[used_cores++], lcore_id); } @@ -5542,25 +5568,30 @@ init_entry(struct test_bbdev_vector *vector, enum op_data_type type, uint32_t da op_data = vector->entries[type].segments; nb_ops = &vector->entries[type].nb_segments; - +printf("init entry nb segs %d\n",*nb_ops); if (*nb_ops >= RTE_BBDEV_TURBO_MAX_CODE_BLOCKS) { printf("Too many segments (code blocks defined): %u, max %d!\n", *nb_ops, RTE_BBDEV_TURBO_MAX_CODE_BLOCKS); return -1; } - +//(*nb_ops)--; /* Clear new op data struct */ memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf)); +//for (int i=0; iqueue_id; - const uint16_t burst_sz = 32; //tp->op_params->burst_sz; - const uint16_t num_ops = 32; //tp->op_params->num_to_process; + const uint16_t burst_sz = 2; //tp->op_params->burst_sz; + const uint16_t num_ops = 2; //tp->op_params->num_to_process; struct rte_bbdev_dec_op *ops_enq[num_ops]; struct rte_bbdev_dec_op *ops_deq[num_ops]; struct thread_params *tp=&t_params_tp[0]; @@ -5593,6 +5624,9 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ int i, j, ret; struct rte_bbdev_info info; uint16_t num_to_enq; + uint32_t offset=0; + uint32_t data_len=0; + // bufs->inputs->data->buf_addr = p_llr; // ops_enq[i]->ldpc_dec.input.data->buf_addr = p_llr; @@ -5643,14 +5677,22 @@ ldpc_dec->iter_count = 3; ldpc_dec->iter_max = 8; ldpc_dec->rv_index = rv; ldpc_dec->op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - ldpc_dec->code_block_mode = 1; + ldpc_dec->code_block_mode = (C>1)?1:0; +ldpc_dec->tb_params.ea = E; +ldpc_dec->tb_params.eb = E; +ldpc_dec->tb_params.c = C; +ldpc_dec->tb_params.r = 0; printf("reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); struct op_data_entries *ref_entries = &test_vector_dec.entries[0]; -ref_entries->segments[0].addr = (int32_t *)p_llr; +ref_entries->nb_segments = C; +for (i=0;isegments[i].addr = (int32_t *)(p_llr+offset); +offset += E; +} //memcpy(ref_entries->segments[0].addr, p_llr, 8448); /*printf("ref seg addr %p +384 %p data %x\n", ref_entries->segments[0].addr,(ref_entries->segments[0].addr+384), *(ref_entries->segments[0].addr+384)); @@ -5661,14 +5703,14 @@ printf("ref seg addr +384 %p data %x\n", (ref_entries->segments[0].addr+384+l), snprintf(test_params.test_vector_filename,sizeof(test_params.test_vector_filename),"%s", argv_re[2]); -test_params.num_ops=32; -test_params.burst_sz=32; +test_params.num_ops=2; +test_params.burst_sz=2; test_params.num_lcores=1; test_params.num_tests = 1; run_all_tests(); char *data = ldpc_output; -memcpy(&p_out[0], data, E); - +data_len = (p_decParams->BG==1)?(22*p_decParams->Z):(10*p_decParams->Z); +memcpy(&p_out[0], data, C*data_len); //p_out = ldpc_output; //for (i=0;i<8;i++) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 3dd5248993..804903a84f 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -240,21 +240,15 @@ void nr_processULSegment(void* arg) { uint32_t Tbslbrm = rdata->Tbslbrm; short* ulsch_llr = rdata->ulsch_llr; int max_ldpc_iterations = p_decoderParms->numMaxIter; - int8_t llrProcBuf[OAI_UL_LDPC_MAX_NUM_LLR]; // __attribute__ ((aligned(32))); + int8_t llrProcBuf[OAI_UL_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))); int16_t z [68*384 + 16] __attribute__ ((aligned(16))); int8_t l [68*384 + 16] __attribute__ ((aligned(16))); - int16_t z_ol [68*384]; - int8_t l_ol [68*384]; __m128i *pv = (__m128i*)&z; __m128i *pl = (__m128i*)&l; - __m128i *pv_ol128 = (__m128i*)&z_ol; - __m128i *pl_ol128 = (__m128i*)&l_ol; -// int16_t *pv = &z; uint8_t Ilbrm = 0; - // int8_t *pl = &l; Kr = ulsch_harq->K; Kr_bytes = Kr>>3; @@ -282,13 +276,15 @@ void nr_processULSegment(void* arg) { stop_meas(&phy_vars_gNB->ulsch_deinterleaving_stats); - printf(" segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, rv %d, round %d)...\n", - r, A, + /*LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", + harq_pid,r, G, Kr*3, ulsch_harq->TBS, Qm, - rv_index, - ulsch_harq->round); + nb_rb, + n_layers, + pusch_pdu->pusch_data.rv_index, + ulsch_harq->round);*/ ////////////////////////////////////////////////////////////////////////////////////////// @@ -336,13 +332,6 @@ void nr_processULSegment(void* arg) { crc_type = CRC24_B; length_dec = (ulsch_harq->B+24*ulsch_harq->C)/ulsch_harq->C; } -/*LOG_I(PHY,"decoder input(segment %u) :",r); - for (int i=0;i<16;i++) - LOG_I(PHY,"%d : %d\n",i,ulsch_harq->d[r][i]); - LOG_I(PHY,"\n"); -printf("LDPC lifting size Z %d F %d E %d\n",ulsch_harq->Z,ulsch_harq->F,E); -*/ -//printf("input data %x\n",pl+ulsch_harq->Z); //start_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats); @@ -359,23 +348,6 @@ printf("LDPC lifting size Z %d F %d E %d\n",ulsch_harq->Z,ulsch_harq->F,E); { pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); } - - - //memcpy((&z_ol[0]+2*ulsch_harq->Z),ulsch_harq->d[r],(K_bits_F-2*ulsch_harq->Z)*sizeof(int16_t)); - //memcpy((&z_ol[0]),ulsch_harq->e[r],(kc*ulsch_harq->Z)*sizeof(int16_t)); - memcpy((&z_ol[0]),ulsch_llr,E*sizeof(int16_t)); -for (i=0, j=0; j < ((kc*ulsch_harq->Z)>>4)+1; i+=2, j++) - { - pl_ol128[j] = _mm_packs_epi16(pv_ol128[i],pv_ol128[i+1]); - } - - -//int8_t *pl_ol=(int8_t*)&z_ol[0]; -/*for (i=0;i<8;i++){ -printf("input addr z @ %p data %d \n", (&z[0]+2*ulsch_harq->Z+i), *(&z[0]+2*ulsch_harq->Z+i)); -printf("input addr p @ %p data %d\n", (pl_ol128), *(pl_ol128)); -} -*/ ////////////////////////////////////////////////////////////////////////////////////////// @@ -384,29 +356,13 @@ printf("input addr p @ %p data %d\n", (pl_ol128), *(pl_ol128)); ////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// pl =====> llrProcBuf ////////////////////////////////// -/* no_iteration_ldpc = nrLDPC_decoder_offload(p_decoderParms, - (int8_t*)&pl_ol128[0], //pl_ol, - llrProcBuf, - ulsch_harq->p_nrLDPC_procBuf[r],// 3 - p_procTime); -*/ - no_iteration_ldpc = nrLDPC_decoder_offload(p_decoderParms, - ulsch_harq->C, - (uint8_t)rv_index, - ulsch_harq->F, - E, - Qm, - (int8_t*)&pl_ol128[0], - llrProcBuf); -/* - -no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, + no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, (int8_t*)&pl[0], llrProcBuf, ulsch_harq->p_nrLDPC_procBuf[r], p_procTime); -*/ + if (check_crc((uint8_t*)llrProcBuf,length_dec,ulsch_harq->F,crc_type)) { #ifdef PRINT_CRC_CHECK LOG_I(PHY, "Segment %d CRC OK, iterations %d/%d\n",r,no_iteration_ldpc,max_ldpc_iterations); @@ -423,13 +379,8 @@ no_iteration_ldpc = nrLDPC_decoder(p_decoderParms, for (int m=0; m < Kr>>3; m ++) { ulsch_harq->c[r][m]= (uint8_t) llrProcBuf[m]; } -/*for (int k=0;k<16;k++) - { - printf("output decoder [%d] = 0x%02x \n", k, ulsch_harq->c[r][k]); - printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); - } - printf("no_iterations_ldpc %d \n",no_iteration_ldpc); -*/ + + //stop_meas(&phy_vars_gNB->ulsch_ldpc_decoding_stats); } uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, @@ -449,7 +400,17 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, int kc; int Tbslbrm; int E; - + int8_t llrProcBuf[22*384]; + int ret = 0; + int i,j; + int8_t enable_ldpc_offload = 1; + int16_t z_ol [68*384]; + int8_t l_ol [68*384]; + __m128i *pv_ol128 = (__m128i*)&z_ol; + __m128i *pl_ol128 = (__m128i*)&l_ol; + int no_iteration_ldpc; + int length_dec; + uint8_t crc_type; #ifdef PRINT_CRC_CHECK prnt_crc_cnt++; #endif @@ -613,12 +574,82 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, Kr = harq_process->K; Kr_bytes = Kr>>3; offset = 0; + + if (enable_ldpc_offload) { + memset(harq_process->c[0],0,Kr_bytes); + + if (harq_process->C == 1) { + if (A > 3824) + crc_type = CRC24_A; + else + crc_type = CRC16; + + length_dec = harq_process->B; + } + else { + crc_type = CRC24_B; + length_dec = (harq_process->B+24*harq_process->C)/harq_process->C; + } + + + E = nr_get_E(G, harq_process->C, Qm, n_layers, 0); + + memcpy((&z_ol[0]),ulsch_llr,G*sizeof(int16_t)); + + for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) + { + pl_ol128[j] = _mm_packs_epi16(pv_ol128[i],pv_ol128[i+1]); + } + + ret = nrLDPC_decoder_offload(p_decParams, + harq_process->C, + pusch_pdu->pusch_data.rv_index, + harq_process->F, + E, + Qm, + (int8_t*)&pl_ol128[0], + llrProcBuf); + + for (r=0; rC; r++) { + + for (int m=0; m < Kr>>3; m ++) { + harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; + } + + if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) { +#ifdef PRINT_CRC_CHECK + LOG_I(PHY, "Segment %d CRC OK\n",r); +#endif + no_iteration_ldpc = 2; + } else { +#ifdef PRINT_CRC_CHECK + LOG_I(PHY, "CRC NOK\n"); +#endif + no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; + } + for (int k=0;k<8;k++) + { + printf("output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); + printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); + } + + + memcpy(harq_process->b+offset, + harq_process->c[r], + Kr_bytes - (harq_process->F>>3) -((harq_process->C>1)?3:0)); + offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0)); + + } + + + } + else { void (*nr_processULSegment_ptr)(void*) = &nr_processULSegment; for (r=0; rC; r++) { E = nr_get_E(G, harq_process->C, Qm, n_layers, r); - +printf("rm length %d seg %d\n", E,r); union ldpcReqUnion id = {.s={ulsch->rnti,frame,nr_tti_rx,0,0}}; notifiedFIFO_elt_t *req=newNotifiedFIFO_elt(sizeof(ldpcDecode_t), id.p, phy_vars_gNB->respDecode, nr_processULSegment_ptr); ldpcDecode_t * rdata=(ldpcDecode_t *) NotifiedFifoData(req); @@ -648,5 +679,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0)); ////////////////////////////////////////////////////////////////////////////////////////// } + } return 1; } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 1ddf4b0d07..78d509848c 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -308,7 +308,7 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH uint8_t l, number_dmrs_symbols = 0; uint32_t G; uint16_t start_symbol, number_symbols, nb_re_dmrs; - + uint8_t enable_ldpc_offload = 1; start_symbol = pusch_pdu->start_symbol_index; number_symbols = pusch_pdu->nr_of_symbols; @@ -365,12 +365,13 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH slot_rx, harq_pid, G); - - while (gNB->nbDecode > 0) { + if (enable_ldpc_offload ==0) { + while (gNB->nbDecode > 0) { notifiedFIFO_elt_t *req=pullTpool(gNB->respDecode, gNB->threadPool); nr_postDecode(gNB, req); delNotifiedFIFO_elt(req); - } + } + } stop_meas(&gNB->ulsch_decoding_stats); } From 52450c449f1d4652a7c13290406e7ff4ebf81ea5 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 27 Jul 2021 14:32:15 +0200 Subject: [PATCH 007/136] code cleanup ldpc offload --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 1959 +---------------- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 4 +- 2 files changed, 14 insertions(+), 1949 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 81de818dd2..66f6a244e6 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -1930,11 +1930,11 @@ printf("segment %d offset %d length %d data length %d\n",i, offset,total_data_si // TEST_ASSERT(orig_op->segments[i].length == data_len, // "Length of segment differ in original (%u) and filled (%u) op", // orig_op->segments[i].length, data_len); - TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, +/* TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, rte_pktmbuf_mtod_offset(m, uint32_t *, offset), data_len, "Output buffers (CB=%u) are not equal", i); - +*/ m = m->next; } @@ -2157,29 +2157,6 @@ validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, return TEST_SUCCESS; } -/* Check Number of code blocks errors */ -static int -validate_ldpc_bler(struct rte_bbdev_dec_op **ops, const uint16_t n) -{ - unsigned int i; - struct op_data_entries *hard_data_orig = - &test_vector.entries[DATA_HARD_OUTPUT]; - struct rte_bbdev_op_ldpc_dec *ops_td; - struct rte_bbdev_op_data *hard_output; - int errors = 0; - struct rte_mbuf *m; - - for (i = 0; i < n; ++i) { - ops_td = &ops[i]->ldpc_dec; - hard_output = &ops_td->hard_output; - m = hard_output->data; - if (memcmp(rte_pktmbuf_mtod_offset(m, uint32_t *, 0), - hard_data_orig->segments[0].addr, - hard_data_orig->segments[0].length)) - errors++; - } - return errors; -} static int validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, @@ -2939,506 +2916,7 @@ printf("bufs len %d data %x addr orig %p addr %p\n",bufs->inputs[0].data->data_l return TEST_SUCCESS; } -static int -throughput_intr_lcore_dec(void *arg) -{ - struct thread_params *tp = arg; - unsigned int enqueued; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_to_process = tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops[num_to_process]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - int ret, i, j; - uint16_t num_to_enq, enq; - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), - "Failed to enable interrupts for dev: %u, queue_id: %u", - tp->dev_id, queue_id); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - rte_atomic16_clear(&tp->processing_status); - rte_atomic16_clear(&tp->nb_dequeued); - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, - num_to_process); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_to_process); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_dec_op(ops, num_to_process, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, - tp->op_params->ref_dec_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_to_process; ++j) - ops[j]->opaque_data = (void *)(uintptr_t)j; - - for (j = 0; j < TEST_REPETITIONS; ++j) { - for (i = 0; i < num_to_process; ++i) - rte_pktmbuf_reset(ops[i]->turbo_dec.hard_output.data); - - tp->start_time = rte_rdtsc_precise(); - for (enqueued = 0; enqueued < num_to_process;) { - num_to_enq = burst_sz; - - if (unlikely(num_to_process - enqueued < num_to_enq)) - num_to_enq = num_to_process - enqueued; - - enq = 0; - do { - enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, - queue_id, &ops[enqueued], - num_to_enq); - } while (unlikely(num_to_enq != enq)); - enqueued += enq; - - /* Write to thread burst_sz current number of enqueued - * descriptors. It ensures that proper number of - * descriptors will be dequeued in callback - * function - needed for last batch in case where - * the number of operations is not a multiple of - * burst size. - */ - rte_atomic16_set(&tp->burst_sz, num_to_enq); - - /* Wait until processing of previous batch is - * completed - */ - while (rte_atomic16_read(&tp->nb_dequeued) != - (int16_t) enqueued) - rte_pause(); - } - if (j != TEST_REPETITIONS - 1) - rte_atomic16_clear(&tp->nb_dequeued); - } - - return TEST_SUCCESS; -} - -static int -throughput_intr_lcore_enc(void *arg) -{ - struct thread_params *tp = arg; - unsigned int enqueued; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_to_process = tp->op_params->num_to_process; - struct rte_bbdev_enc_op *ops[num_to_process]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - int ret, i, j; - uint16_t num_to_enq, enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), - "Failed to enable interrupts for dev: %u, queue_id: %u", - tp->dev_id, queue_id); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - rte_atomic16_clear(&tp->processing_status); - rte_atomic16_clear(&tp->nb_dequeued); - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, - num_to_process); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_to_process); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_enc_op(ops, num_to_process, 0, bufs->inputs, - bufs->hard_outputs, tp->op_params->ref_enc_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_to_process; ++j) - ops[j]->opaque_data = (void *)(uintptr_t)j; - - for (j = 0; j < TEST_REPETITIONS; ++j) { - for (i = 0; i < num_to_process; ++i) - rte_pktmbuf_reset(ops[i]->turbo_enc.output.data); - - tp->start_time = rte_rdtsc_precise(); - for (enqueued = 0; enqueued < num_to_process;) { - num_to_enq = burst_sz; - - if (unlikely(num_to_process - enqueued < num_to_enq)) - num_to_enq = num_to_process - enqueued; - - enq = 0; - do { - enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, - queue_id, &ops[enqueued], - num_to_enq); - } while (unlikely(enq != num_to_enq)); - enqueued += enq; - - /* Write to thread burst_sz current number of enqueued - * descriptors. It ensures that proper number of - * descriptors will be dequeued in callback - * function - needed for last batch in case where - * the number of operations is not a multiple of - * burst size. - */ - rte_atomic16_set(&tp->burst_sz, num_to_enq); - - /* Wait until processing of previous batch is - * completed - */ - while (rte_atomic16_read(&tp->nb_dequeued) != - (int16_t) enqueued) - rte_pause(); - } - if (j != TEST_REPETITIONS - 1) - rte_atomic16_clear(&tp->nb_dequeued); - } - - return TEST_SUCCESS; -} - - -static int -throughput_intr_lcore_ldpc_enc(void *arg) -{ - struct thread_params *tp = arg; - unsigned int enqueued; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_to_process = tp->op_params->num_to_process; - struct rte_bbdev_enc_op *ops[num_to_process]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - int ret, i, j; - uint16_t num_to_enq, enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), - "Failed to enable interrupts for dev: %u, queue_id: %u", - tp->dev_id, queue_id); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - rte_atomic16_clear(&tp->processing_status); - rte_atomic16_clear(&tp->nb_dequeued); - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, - num_to_process); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_to_process); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_enc_op(ops, num_to_process, 0, - bufs->inputs, bufs->hard_outputs, - tp->op_params->ref_enc_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_to_process; ++j) - ops[j]->opaque_data = (void *)(uintptr_t)j; - - for (j = 0; j < TEST_REPETITIONS; ++j) { - for (i = 0; i < num_to_process; ++i) - rte_pktmbuf_reset(ops[i]->turbo_enc.output.data); - - tp->start_time = rte_rdtsc_precise(); - for (enqueued = 0; enqueued < num_to_process;) { - num_to_enq = burst_sz; - - if (unlikely(num_to_process - enqueued < num_to_enq)) - num_to_enq = num_to_process - enqueued; - - enq = 0; - do { - enq += rte_bbdev_enqueue_ldpc_enc_ops( - tp->dev_id, - queue_id, &ops[enqueued], - num_to_enq); - } while (unlikely(enq != num_to_enq)); - enqueued += enq; - - /* Write to thread burst_sz current number of enqueued - * descriptors. It ensures that proper number of - * descriptors will be dequeued in callback - * function - needed for last batch in case where - * the number of operations is not a multiple of - * burst size. - */ - rte_atomic16_set(&tp->burst_sz, num_to_enq); - - /* Wait until processing of previous batch is - * completed - */ - while (rte_atomic16_read(&tp->nb_dequeued) != - (int16_t) enqueued) - rte_pause(); - } - if (j != TEST_REPETITIONS - 1) - rte_atomic16_clear(&tp->nb_dequeued); - } - - return TEST_SUCCESS; -} - -static int -throughput_pmd_lcore_dec(void *arg) -{ - struct thread_params *tp = arg; - uint16_t enq, deq; - uint64_t total_time = 0, start_time; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_ops = tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops_enq[num_ops]; - struct rte_bbdev_dec_op *ops_deq[num_ops]; - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - struct rte_bbdev_info info; - uint16_t num_to_enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < TEST_REPETITIONS; ++i) { - - for (j = 0; j < num_ops; ++j) - mbuf_reset(ops_enq[j]->turbo_dec.hard_output.data); - - start_time = rte_rdtsc_precise(); - - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; - - if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; - - enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - /* dequeue the remaining */ - while (deq < enq) { - deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - total_time += rte_rdtsc_precise() - start_time; - } - - tp->iter_count = 0; - /* get the max of iter_count for all dequeued ops */ - for (i = 0; i < num_ops; ++i) { - tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count, - tp->iter_count); - } - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_dec_op(ops_deq, num_ops, ref_op, - tp->op_params->vector_mask); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); - - double tb_len_bits = calc_dec_TB_size(ref_op); - - tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / - 1000000.0) / ((double)total_time / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} - -static int -bler_pmd_lcore_ldpc_dec(void *arg) -{ - struct thread_params *tp = arg; - uint16_t enq, deq; - uint64_t total_time = 0, start_time; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_ops = tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops_enq[num_ops]; - struct rte_bbdev_dec_op *ops_deq[num_ops]; - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - float parity_bler = 0; - struct rte_bbdev_info info; - uint16_t num_to_enq; - bool extDdr = check_bit(ldpc_cap_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); - bool loopback = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); - bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); - - /* For BLER tests we need to enable early termination */ - if (!check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) - ref_op->ldpc_dec.op_flags += - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - ref_op->ldpc_dec.iter_max = get_iter_max(); - ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op); - generate_llr_input(num_ops, bufs->inputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < 1; ++i) { /* Could add more iterations */ - for (j = 0; j < num_ops; ++j) { - if (!loopback) - mbuf_reset( - ops_enq[j]->ldpc_dec.hard_output.data); - if (hc_out || loopback) - mbuf_reset( - ops_enq[j]->ldpc_dec.harq_combined_output.data); - } - if (extDdr) { - bool preload = i == (TEST_REPETITIONS - 1); - preload_harq_ddr(tp->dev_id, queue_id, ops_enq, - num_ops, preload); - } - start_time = rte_rdtsc_precise(); - - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; - - if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; - - enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - /* dequeue the remaining */ - while (deq < enq) { - deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - total_time += rte_rdtsc_precise() - start_time; - } - - tp->iter_count = 0; - tp->iter_average = 0; - /* get the max of iter_count for all dequeued ops */ - for (i = 0; i < num_ops; ++i) { - tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, - tp->iter_count); - tp->iter_average += (double) ops_enq[i]->ldpc_dec.iter_count; - if (ops_enq[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR)) - parity_bler += 1.0; - } - - parity_bler /= num_ops; /* This one is based on SYND */ - tp->iter_average /= num_ops; - tp->bler = (double) validate_ldpc_bler(ops_deq, num_ops) / num_ops; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE - && tp->bler == 0 - && parity_bler == 0 - && !hc_out) { - ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, - tp->op_params->vector_mask); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); - - double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); - tp->ops_per_sec = ((double)num_ops * 1) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps = (((double)(num_ops * 1 * tb_len_bits)) / - 1000000.0) / ((double)total_time / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} static int throughput_pmd_lcore_ldpc_dec(void *arg) @@ -3580,97 +3058,6 @@ ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, return TEST_SUCCESS; } -static int -throughput_pmd_lcore_enc(void *arg) -{ - struct thread_params *tp = arg; - uint16_t enq, deq; - uint64_t total_time = 0, start_time; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_ops = tp->op_params->num_to_process; - struct rte_bbdev_enc_op *ops_enq[num_ops]; - struct rte_bbdev_enc_op *ops_deq[num_ops]; - struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - struct rte_bbdev_info info; - uint16_t num_to_enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, - num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_ops); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_enc_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < TEST_REPETITIONS; ++i) { - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - for (j = 0; j < num_ops; ++j) - mbuf_reset(ops_enq[j]->turbo_enc.output.data); - - start_time = rte_rdtsc_precise(); - - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; - - if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; - - enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - /* dequeue the remaining */ - while (deq < enq) { - deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - total_time += rte_rdtsc_precise() - start_time; - } - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_enc_op(ops_deq, num_ops, ref_op); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); - - double tb_len_bits = calc_enc_TB_size(ref_op); - - tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) - / 1000000.0) / ((double)total_time / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} - static int throughput_pmd_lcore_ldpc_enc(void *arg) { @@ -3833,94 +3220,6 @@ print_dec_bler(struct thread_params *t_params, unsigned int used_cores) total_mbps, get_vector_filename()); } -/* - * Test function that determines BLER wireless performance - */ -static int -bler_test(struct active_device *ad, - struct test_op_params *op_params) -{ - int ret; - unsigned int lcore_id, used_cores = 0; - struct thread_params *t_params; - struct rte_bbdev_info info; - lcore_function_t *bler_function; - uint16_t num_lcores; - const char *op_type_str; - - rte_bbdev_info_get(ad->dev_id, &info); - - op_type_str = rte_bbdev_op_type_str(test_vector.op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", - test_vector.op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== test: bler\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", - info.dev_name, ad->nb_queues, op_params->burst_sz, - op_params->num_to_process, op_params->num_lcores, - op_type_str, - intr_enabled ? "Interrupt mode" : "PMD mode", - (double)rte_get_tsc_hz() / 1000000000.0); - - /* Set number of lcores */ - num_lcores = (ad->nb_queues < (op_params->num_lcores)) - ? ad->nb_queues - : op_params->num_lcores; - - /* Allocate memory for thread parameters structure */ - t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), - RTE_CACHE_LINE_SIZE); - TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", - RTE_ALIGN(sizeof(struct thread_params) * num_lcores, - RTE_CACHE_LINE_SIZE)); - - if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - bler_function = bler_pmd_lcore_ldpc_dec; - else - return TEST_SKIPPED; - - rte_atomic16_set(&op_params->sync, SYNC_WAIT); - - /* Master core is set at first entry */ - t_params[0].dev_id = ad->dev_id; - t_params[0].lcore_id = rte_lcore_id(); - t_params[0].op_params = op_params; - t_params[0].queue_id = ad->queue_ids[used_cores++]; - t_params[0].iter_count = 0; - - RTE_LCORE_FOREACH_SLAVE(lcore_id) { - if (used_cores >= num_lcores) - break; - - t_params[used_cores].dev_id = ad->dev_id; - t_params[used_cores].lcore_id = lcore_id; - t_params[used_cores].op_params = op_params; - t_params[used_cores].queue_id = ad->queue_ids[used_cores]; - t_params[used_cores].iter_count = 0; - - rte_eal_remote_launch(bler_function, - &t_params[used_cores++], lcore_id); - } - - rte_atomic16_set(&op_params->sync, SYNC_START); - ret = bler_function(&t_params[0]); - - /* Master core is always used */ - for (used_cores = 1; used_cores < num_lcores; used_cores++) - ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); - - print_dec_bler(t_params, num_lcores); - - /* Return if test failed */ - if (ret) { - rte_free(t_params); - return ret; - } - - /* Function to print something here*/ - rte_free(t_params); - return ret; -} /* * Test function that determines how long an enqueue + dequeue of a burst @@ -3964,39 +3263,6 @@ throughput_test(struct active_device *ad, RTE_ALIGN(sizeof(struct thread_params) * num_lcores, RTE_CACHE_LINE_SIZE)); - if (intr_enabled) { - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) - throughput_function = throughput_intr_lcore_dec; - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - throughput_function = throughput_intr_lcore_ldpc_dec; - else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) - throughput_function = throughput_intr_lcore_enc; - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - throughput_function = throughput_intr_lcore_ldpc_enc; - else - throughput_function = throughput_intr_lcore_enc; - - /* Dequeue interrupt callback registration */ - ret = rte_bbdev_callback_register(ad->dev_id, - RTE_BBDEV_EVENT_DEQUEUE, dequeue_event_callback, - t_params); - if (ret < 0) { - rte_free(t_params); - return ret; - } - } else { - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) - throughput_function = throughput_pmd_lcore_dec; - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - throughput_function = throughput_pmd_lcore_ldpc_dec; - else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) - throughput_function = throughput_pmd_lcore_enc; - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - throughput_function = throughput_pmd_lcore_ldpc_enc; - else - throughput_function = throughput_pmd_lcore_enc; - } - rte_atomic16_set(&op_params->sync, SYNC_WAIT); /* Master core is set at first entry */ @@ -4021,7 +3287,7 @@ throughput_test(struct active_device *ad, } rte_atomic16_set(&op_params->sync, SYNC_START); - ret = throughput_function(&t_params[0]); + ret = throughput_pmd_lcore_ldpc_dec(&t_params[0]); /* Master core is always used */ for (used_cores = 1; used_cores < num_lcores; used_cores++) @@ -4089,1004 +3355,13 @@ throughput_test(struct active_device *ad, return ret; } -static int -latency_test_dec(struct rte_mempool *mempool, - struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, - int vector_mask, uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) -{ - int ret = TEST_SUCCESS; - uint16_t i, j, dequeued; - struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t start_time = 0, last_time = 0; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - bool first_time = true; - last_time = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_dec_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_dec_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - bufs->soft_outputs, - ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < burst_sz; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - start_time = rte_rdtsc_precise(); - - enq = rte_bbdev_enqueue_dec_ops(dev_id, queue_id, &ops_enq[enq], - burst_sz); - TEST_ASSERT(enq == burst_sz, - "Error enqueueing burst, expected %u, got %u", - burst_sz, enq); - - /* Dequeue */ - do { - deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - if (likely(first_time && (deq > 0))) { - last_time = rte_rdtsc_precise() - start_time; - first_time = false; - } - } while (unlikely(burst_sz != deq)); - - *max_time = RTE_MAX(*max_time, last_time); - *min_time = RTE_MIN(*min_time, last_time); - *total_time += last_time; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_dec_op(ops_deq, burst_sz, ref_op, - vector_mask); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -latency_test_ldpc_dec(struct rte_mempool *mempool, - struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, - int vector_mask, uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) -{ - int ret = TEST_SUCCESS; - uint16_t i, j, dequeued; - struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t start_time = 0, last_time = 0; - bool extDdr = ldpc_cap_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - bool first_time = true; - last_time = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_dec_op_alloc_bulk() failed"); - - /* For latency tests we need to disable early termination */ - if (check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) - ref_op->ldpc_dec.op_flags -= - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - ref_op->ldpc_dec.iter_max = get_iter_max(); - ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - bufs->soft_outputs, - bufs->harq_inputs, - bufs->harq_outputs, - ref_op); - - if (extDdr) - preload_harq_ddr(dev_id, queue_id, ops_enq, - burst_sz, true); - - /* Set counter to validate the ordering */ - for (j = 0; j < burst_sz; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - start_time = rte_rdtsc_precise(); - - enq = rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz); - TEST_ASSERT(enq == burst_sz, - "Error enqueueing burst, expected %u, got %u", - burst_sz, enq); - - /* Dequeue */ - do { - deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - if (likely(first_time && (deq > 0))) { - last_time = rte_rdtsc_precise() - start_time; - first_time = false; - } - } while (unlikely(burst_sz != deq)); - - *max_time = RTE_MAX(*max_time, last_time); - *min_time = RTE_MIN(*min_time, last_time); - *total_time += last_time; - - if (extDdr) - retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_ldpc_dec_op(ops_deq, burst_sz, ref_op, - vector_mask); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - return i; -} - -static int -latency_test_enc(struct rte_mempool *mempool, - struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, - uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) -{ - int ret = TEST_SUCCESS; - uint16_t i, j, dequeued; - struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t start_time = 0, last_time = 0; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - bool first_time = true; - last_time = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_enc_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_enc_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < burst_sz; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - start_time = rte_rdtsc_precise(); - - enq = rte_bbdev_enqueue_enc_ops(dev_id, queue_id, &ops_enq[enq], - burst_sz); - TEST_ASSERT(enq == burst_sz, - "Error enqueueing burst, expected %u, got %u", - burst_sz, enq); - - /* Dequeue */ - do { - deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - if (likely(first_time && (deq > 0))) { - last_time += rte_rdtsc_precise() - start_time; - first_time = false; - } - } while (unlikely(burst_sz != deq)); - - *max_time = RTE_MAX(*max_time, last_time); - *min_time = RTE_MIN(*min_time, last_time); - *total_time += last_time; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_enc_op(ops_deq, burst_sz, ref_op); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_enc_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -latency_test_ldpc_enc(struct rte_mempool *mempool, - struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, - uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) -{ - int ret = TEST_SUCCESS; - uint16_t i, j, dequeued; - struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t start_time = 0, last_time = 0; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - bool first_time = true; - last_time = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_enc_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < burst_sz; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - start_time = rte_rdtsc_precise(); - - enq = rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz); - TEST_ASSERT(enq == burst_sz, - "Error enqueueing burst, expected %u, got %u", - burst_sz, enq); - - /* Dequeue */ - do { - deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - if (likely(first_time && (deq > 0))) { - last_time += rte_rdtsc_precise() - start_time; - first_time = false; - } - } while (unlikely(burst_sz != deq)); - - *max_time = RTE_MAX(*max_time, last_time); - *min_time = RTE_MIN(*min_time, last_time); - *total_time += last_time; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_enc_op(ops_deq, burst_sz, ref_op); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_enc_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -latency_test(struct active_device *ad, - struct test_op_params *op_params) -{ - int iter; - uint16_t burst_sz = op_params->burst_sz; - const uint16_t num_to_process = op_params->num_to_process; - const enum rte_bbdev_op_type op_type = test_vector.op_type; - const uint16_t queue_id = ad->queue_ids[0]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - uint64_t total_time, min_time, max_time; - const char *op_type_str; - - total_time = max_time = 0; - min_time = UINT64_MAX; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(ad->dev_id, &info); - bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - op_type_str = rte_bbdev_op_type_str(op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== test: validation/latency\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", - info.dev_name, burst_sz, num_to_process, op_type_str); - - if (op_type == RTE_BBDEV_OP_TURBO_DEC) - iter = latency_test_dec(op_params->mp, bufs, - op_params->ref_dec_op, op_params->vector_mask, - ad->dev_id, queue_id, num_to_process, - burst_sz, &total_time, &min_time, &max_time); - else if (op_type == RTE_BBDEV_OP_TURBO_ENC) - iter = latency_test_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &total_time, - &min_time, &max_time); - else if (op_type == RTE_BBDEV_OP_LDPC_ENC) - iter = latency_test_ldpc_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &total_time, - &min_time, &max_time); - else if (op_type == RTE_BBDEV_OP_LDPC_DEC) - iter = latency_test_ldpc_dec(op_params->mp, bufs, - op_params->ref_dec_op, op_params->vector_mask, - ad->dev_id, queue_id, num_to_process, - burst_sz, &total_time, &min_time, &max_time); - else - iter = latency_test_enc(op_params->mp, bufs, - op_params->ref_enc_op, - ad->dev_id, queue_id, - num_to_process, burst_sz, &total_time, - &min_time, &max_time); - - if (iter <= 0) - return TEST_FAILED; - - printf("Operation latency:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n", - (double)total_time / (double)iter, - (double)(total_time * 1000000) / (double)iter / - (double)rte_get_tsc_hz(), (double)min_time, - (double)(min_time * 1000000) / (double)rte_get_tsc_hz(), - (double)max_time, (double)(max_time * 1000000) / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} - -#ifdef RTE_BBDEV_OFFLOAD_COST -static int -get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id, - struct rte_bbdev_stats *stats) -{ - struct rte_bbdev *dev = &rte_bbdev_devices[dev_id]; - struct rte_bbdev_stats *q_stats; - - if (queue_id >= dev->data->num_queues) - return -1; - - q_stats = &dev->data->queues[queue_id].queue_stats; - - stats->enqueued_count = q_stats->enqueued_count; - stats->dequeued_count = q_stats->dequeued_count; - stats->enqueue_err_count = q_stats->enqueue_err_count; - stats->dequeue_err_count = q_stats->dequeue_err_count; - stats->acc_offload_cycles = q_stats->acc_offload_cycles; - - return 0; -} - -static int -offload_latency_test_dec(struct rte_mempool *mempool, struct test_buffers *bufs, - struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, - uint16_t queue_id, const uint16_t num_to_process, - uint16_t burst_sz, struct test_time_stats *time_st) -{ - int i, dequeued, ret; - struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t enq_start_time, deq_start_time; - uint64_t enq_sw_last_time, deq_last_time; - struct rte_bbdev_stats stats; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_dec_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - bufs->soft_outputs, - ref_op); - - /* Start time meas for enqueue function offload latency */ - enq_start_time = rte_rdtsc_precise(); - do { - enq += rte_bbdev_enqueue_dec_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz - enq); - } while (unlikely(burst_sz != enq)); - - ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); - TEST_ASSERT_SUCCESS(ret, - "Failed to get stats for queue (%u) of device (%u)", - queue_id, dev_id); - - enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - - stats.acc_offload_cycles; - time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, - enq_sw_last_time); - time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, - enq_sw_last_time); - time_st->enq_sw_total_time += enq_sw_last_time; - - time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, - stats.acc_offload_cycles); - time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, - stats.acc_offload_cycles); - time_st->enq_acc_total_time += stats.acc_offload_cycles; - - /* give time for device to process ops */ - rte_delay_us(200); - - /* Start time meas for dequeue function offload latency */ - deq_start_time = rte_rdtsc_precise(); - /* Dequeue one operation */ - do { - deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, - &ops_deq[deq], 1); - } while (unlikely(deq != 1)); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, - deq_last_time); - time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, - deq_last_time); - time_st->deq_total_time += deq_last_time; - - /* Dequeue remaining operations if needed*/ - while (burst_sz != deq) - deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - - rte_bbdev_dec_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -offload_latency_test_ldpc_dec(struct rte_mempool *mempool, - struct test_buffers *bufs, - struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, - uint16_t queue_id, const uint16_t num_to_process, - uint16_t burst_sz, struct test_time_stats *time_st) -{ - int i, dequeued, ret; - struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t enq_start_time, deq_start_time; - uint64_t enq_sw_last_time, deq_last_time; - struct rte_bbdev_stats stats; - bool extDdr = ldpc_cap_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - bufs->soft_outputs, - bufs->harq_inputs, - bufs->harq_outputs, - ref_op); - - if (extDdr) - preload_harq_ddr(dev_id, queue_id, ops_enq, - burst_sz, true); - - /* Start time meas for enqueue function offload latency */ - enq_start_time = rte_rdtsc_precise(); - do { - enq += rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz - enq); - } while (unlikely(burst_sz != enq)); - - enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; - ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); - TEST_ASSERT_SUCCESS(ret, - "Failed to get stats for queue (%u) of device (%u)", - queue_id, dev_id); - - enq_sw_last_time -= stats.acc_offload_cycles; - time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, - enq_sw_last_time); - time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, - enq_sw_last_time); - time_st->enq_sw_total_time += enq_sw_last_time; - - time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, - stats.acc_offload_cycles); - time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, - stats.acc_offload_cycles); - time_st->enq_acc_total_time += stats.acc_offload_cycles; - - /* give time for device to process ops */ - rte_delay_us(200); - - /* Start time meas for dequeue function offload latency */ - deq_start_time = rte_rdtsc_precise(); - /* Dequeue one operation */ - do { - deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, - &ops_deq[deq], 1); - } while (unlikely(deq != 1)); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, - deq_last_time); - time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, - deq_last_time); - time_st->deq_total_time += deq_last_time; - - /* Dequeue remaining operations if needed*/ - while (burst_sz != deq) - deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - - if (extDdr) { - /* Read loopback is not thread safe */ - retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -offload_latency_test_enc(struct rte_mempool *mempool, struct test_buffers *bufs, - struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, - uint16_t queue_id, const uint16_t num_to_process, - uint16_t burst_sz, struct test_time_stats *time_st) -{ - int i, dequeued, ret; - struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t enq_start_time, deq_start_time; - uint64_t enq_sw_last_time, deq_last_time; - struct rte_bbdev_stats stats; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_enc_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_enc_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - ref_op); - - /* Start time meas for enqueue function offload latency */ - enq_start_time = rte_rdtsc_precise(); - do { - enq += rte_bbdev_enqueue_enc_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz - enq); - } while (unlikely(burst_sz != enq)); - - enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; - - ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); - TEST_ASSERT_SUCCESS(ret, - "Failed to get stats for queue (%u) of device (%u)", - queue_id, dev_id); - enq_sw_last_time -= stats.acc_offload_cycles; - time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, - enq_sw_last_time); - time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, - enq_sw_last_time); - time_st->enq_sw_total_time += enq_sw_last_time; - - time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, - stats.acc_offload_cycles); - time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, - stats.acc_offload_cycles); - time_st->enq_acc_total_time += stats.acc_offload_cycles; - - /* give time for device to process ops */ - rte_delay_us(200); - - /* Start time meas for dequeue function offload latency */ - deq_start_time = rte_rdtsc_precise(); - /* Dequeue one operation */ - do { - deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, - &ops_deq[deq], 1); - } while (unlikely(deq != 1)); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, - deq_last_time); - time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, - deq_last_time); - time_st->deq_total_time += deq_last_time; - - while (burst_sz != deq) - deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - - rte_bbdev_enc_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -offload_latency_test_ldpc_enc(struct rte_mempool *mempool, - struct test_buffers *bufs, - struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, - uint16_t queue_id, const uint16_t num_to_process, - uint16_t burst_sz, struct test_time_stats *time_st) -{ - int i, dequeued, ret; - struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t enq_start_time, deq_start_time; - uint64_t enq_sw_last_time, deq_last_time; - struct rte_bbdev_stats stats; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_enc_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - ref_op); - - /* Start time meas for enqueue function offload latency */ - enq_start_time = rte_rdtsc_precise(); - do { - enq += rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz - enq); - } while (unlikely(burst_sz != enq)); - - enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; - ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); - TEST_ASSERT_SUCCESS(ret, - "Failed to get stats for queue (%u) of device (%u)", - queue_id, dev_id); - - enq_sw_last_time -= stats.acc_offload_cycles; - time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, - enq_sw_last_time); - time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, - enq_sw_last_time); - time_st->enq_sw_total_time += enq_sw_last_time; - - time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, - stats.acc_offload_cycles); - time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, - stats.acc_offload_cycles); - time_st->enq_acc_total_time += stats.acc_offload_cycles; - - /* give time for device to process ops */ - rte_delay_us(200); - - /* Start time meas for dequeue function offload latency */ - deq_start_time = rte_rdtsc_precise(); - /* Dequeue one operation */ - do { - deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, - &ops_deq[deq], 1); - } while (unlikely(deq != 1)); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, - deq_last_time); - time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, - deq_last_time); - time_st->deq_total_time += deq_last_time; - - while (burst_sz != deq) - deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - - rte_bbdev_enc_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} -#endif - -static int -offload_cost_test(struct active_device *ad, - struct test_op_params *op_params) -{ -#ifndef RTE_BBDEV_OFFLOAD_COST - RTE_SET_USED(ad); - RTE_SET_USED(op_params); - printf("Offload latency test is disabled.\n"); - printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); - return TEST_SKIPPED; -#else - int iter; - uint16_t burst_sz = op_params->burst_sz; - const uint16_t num_to_process = op_params->num_to_process; - const enum rte_bbdev_op_type op_type = test_vector.op_type; - const uint16_t queue_id = ad->queue_ids[0]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - const char *op_type_str; - struct test_time_stats time_st; - - memset(&time_st, 0, sizeof(struct test_time_stats)); - time_st.enq_sw_min_time = UINT64_MAX; - time_st.enq_acc_min_time = UINT64_MAX; - time_st.deq_min_time = UINT64_MAX; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(ad->dev_id, &info); - bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - op_type_str = rte_bbdev_op_type_str(op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== test: offload latency test\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", - info.dev_name, burst_sz, num_to_process, op_type_str); - - if (op_type == RTE_BBDEV_OP_TURBO_DEC) - iter = offload_latency_test_dec(op_params->mp, bufs, - op_params->ref_dec_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - else if (op_type == RTE_BBDEV_OP_TURBO_ENC) - iter = offload_latency_test_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - else if (op_type == RTE_BBDEV_OP_LDPC_ENC) - iter = offload_latency_test_ldpc_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - else if (op_type == RTE_BBDEV_OP_LDPC_DEC) - iter = offload_latency_test_ldpc_dec(op_params->mp, bufs, - op_params->ref_dec_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - else - iter = offload_latency_test_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - - if (iter <= 0) - return TEST_FAILED; - - printf("Enqueue driver offload cost latency:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n" - "Enqueue accelerator offload cost latency:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n", - (double)time_st.enq_sw_total_time / (double)iter, - (double)(time_st.enq_sw_total_time * 1000000) / - (double)iter / (double)rte_get_tsc_hz(), - (double)time_st.enq_sw_min_time, - (double)(time_st.enq_sw_min_time * 1000000) / - rte_get_tsc_hz(), (double)time_st.enq_sw_max_time, - (double)(time_st.enq_sw_max_time * 1000000) / - rte_get_tsc_hz(), (double)time_st.enq_acc_total_time / - (double)iter, - (double)(time_st.enq_acc_total_time * 1000000) / - (double)iter / (double)rte_get_tsc_hz(), - (double)time_st.enq_acc_min_time, - (double)(time_st.enq_acc_min_time * 1000000) / - rte_get_tsc_hz(), (double)time_st.enq_acc_max_time, - (double)(time_st.enq_acc_max_time * 1000000) / - rte_get_tsc_hz()); - - printf("Dequeue offload cost latency - one op:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n", - (double)time_st.deq_total_time / (double)iter, - (double)(time_st.deq_total_time * 1000000) / - (double)iter / (double)rte_get_tsc_hz(), - (double)time_st.deq_min_time, - (double)(time_st.deq_min_time * 1000000) / - rte_get_tsc_hz(), (double)time_st.deq_max_time, - (double)(time_st.deq_max_time * 1000000) / - rte_get_tsc_hz()); - - return TEST_SUCCESS; -#endif -} - -#ifdef RTE_BBDEV_OFFLOAD_COST -static int -offload_latency_empty_q_test_dec(uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *deq_total_time, uint64_t *deq_min_time, - uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) -{ - int i, deq_total; - struct rte_bbdev_dec_op *ops[MAX_BURST]; - uint64_t deq_start_time, deq_last_time; - - /* Test deq offload latency from an empty queue */ - - for (i = 0, deq_total = 0; deq_total < num_to_process; - ++i, deq_total += burst_sz) { - deq_start_time = rte_rdtsc_precise(); - - if (unlikely(num_to_process - deq_total < burst_sz)) - burst_sz = num_to_process - deq_total; - if (op_type == RTE_BBDEV_OP_LDPC_DEC) - rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, ops, - burst_sz); - else - rte_bbdev_dequeue_dec_ops(dev_id, queue_id, ops, - burst_sz); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); - *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); - *deq_total_time += deq_last_time; - } - - return i; -} - -static int -offload_latency_empty_q_test_enc(uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *deq_total_time, uint64_t *deq_min_time, - uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) -{ - int i, deq_total; - struct rte_bbdev_enc_op *ops[MAX_BURST]; - uint64_t deq_start_time, deq_last_time; - - /* Test deq offload latency from an empty queue */ - for (i = 0, deq_total = 0; deq_total < num_to_process; - ++i, deq_total += burst_sz) { - deq_start_time = rte_rdtsc_precise(); - - if (unlikely(num_to_process - deq_total < burst_sz)) - burst_sz = num_to_process - deq_total; - if (op_type == RTE_BBDEV_OP_LDPC_ENC) - rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, ops, - burst_sz); - else - rte_bbdev_dequeue_enc_ops(dev_id, queue_id, ops, - burst_sz); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); - *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); - *deq_total_time += deq_last_time; - } - - return i; -} - -#endif - -static int -offload_latency_empty_q_test(struct active_device *ad, - struct test_op_params *op_params) -{ -#ifndef RTE_BBDEV_OFFLOAD_COST - RTE_SET_USED(ad); - RTE_SET_USED(op_params); - printf("Offload latency empty dequeue test is disabled.\n"); - printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); - return TEST_SKIPPED; -#else - int iter; - uint64_t deq_total_time, deq_min_time, deq_max_time; - uint16_t burst_sz = op_params->burst_sz; - const uint16_t num_to_process = op_params->num_to_process; - const enum rte_bbdev_op_type op_type = test_vector.op_type; - const uint16_t queue_id = ad->queue_ids[0]; - struct rte_bbdev_info info; - const char *op_type_str; - - deq_total_time = deq_max_time = 0; - deq_min_time = UINT64_MAX; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(ad->dev_id, &info); - - op_type_str = rte_bbdev_op_type_str(op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== test: offload latency empty dequeue\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", - info.dev_name, burst_sz, num_to_process, op_type_str); - - if (op_type == RTE_BBDEV_OP_TURBO_DEC || - op_type == RTE_BBDEV_OP_LDPC_DEC) - iter = offload_latency_empty_q_test_dec(ad->dev_id, queue_id, - num_to_process, burst_sz, &deq_total_time, - &deq_min_time, &deq_max_time, op_type); - else - iter = offload_latency_empty_q_test_enc(ad->dev_id, queue_id, - num_to_process, burst_sz, &deq_total_time, - &deq_min_time, &deq_max_time, op_type); - - if (iter <= 0) - return TEST_FAILED; - - printf("Empty dequeue offload:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n", - (double)deq_total_time / (double)iter, - (double)(deq_total_time * 1000000) / (double)iter / - (double)rte_get_tsc_hz(), (double)deq_min_time, - (double)(deq_min_time * 1000000) / rte_get_tsc_hz(), - (double)deq_max_time, (double)(deq_max_time * 1000000) / - rte_get_tsc_hz()); - - return TEST_SUCCESS; -#endif -} - -static int -bler_tc(void) -{ - return run_test_case(bler_test); -} - static int throughput_tc(void) { return run_test_case(throughput_test); } -static int -offload_cost_tc(void) -{ - return run_test_case(offload_cost_test); -} -static int -offload_latency_empty_q_tc(void) -{ - return run_test_case(offload_latency_empty_q_test); -} - -static int -latency_tc(void) -{ - return run_test_case(latency_test); -} static int interrupt_tc(void) @@ -5094,16 +3369,6 @@ interrupt_tc(void) return run_test_case(throughput_test); } -static struct unit_test_suite bbdev_bler_testsuite = { - .suite_name = "BBdev BLER Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, bler_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - static struct unit_test_suite bbdev_throughput_testsuite = { .suite_name = "BBdev Throughput Tests", .setup = testsuite_setup, @@ -5114,53 +3379,8 @@ static struct unit_test_suite bbdev_throughput_testsuite = { } }; -static struct unit_test_suite bbdev_validation_testsuite = { - .suite_name = "BBdev Validation Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; -static struct unit_test_suite bbdev_latency_testsuite = { - .suite_name = "BBdev Latency Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -static struct unit_test_suite bbdev_offload_cost_testsuite = { - .suite_name = "BBdev Offload Cost Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, offload_cost_tc), - TEST_CASE_ST(ut_setup, ut_teardown, offload_latency_empty_q_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -static struct unit_test_suite bbdev_interrupt_testsuite = { - .suite_name = "BBdev Interrupt Tests", - .setup = interrupt_testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, interrupt_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -//REGISTER_TEST_COMMAND(bler, bbdev_bler_testsuite); REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); -//REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite); -//REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite); -//REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite); -//REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite); #define MAX_QUEUES RTE_MAX_LCORE @@ -5331,162 +3551,6 @@ print_usage(const char *prog_name) printf("\n"); } -static int -parse_args(int argc, char **argv, struct test_params *tp) -{ - int opt, option_index; - unsigned int num_tests = 0; - bool test_cases_present = false; - bool test_vector_present = false; - struct test_command *t; - char *tokens[MAX_CMDLINE_TESTCASES]; - int tc, ret; - - static struct option lgopts[] = { - { "num-ops", 1, 0, 'n' }, - { "burst-size", 1, 0, 'b' }, - { "test-cases", 1, 0, 'c' }, - { "test-vector", 1, 0, 'v' }, - { "lcores", 1, 0, 'l' }, - { "snr", 1, 0, 's' }, - { "iter_max", 6, 0, 't' }, - { "init-device", 0, 0, 'i'}, - { "help", 0, 0, 'h' }, - { NULL, 0, 0, 0 } - }; - tp->iter_max = DEFAULT_ITER; - - while ((opt = getopt_long(argc, argv, "hin:b:c:v:l:s:t:", lgopts, - &option_index)) != EOF) - switch (opt) { - case 'n': - TEST_ASSERT(strlen(optarg) > 0, - "Num of operations is not provided"); - tp->num_ops = strtol(optarg, NULL, 10); - break; - case 'b': - TEST_ASSERT(strlen(optarg) > 0, - "Burst size is not provided"); - tp->burst_sz = strtol(optarg, NULL, 10); - TEST_ASSERT(tp->burst_sz <= MAX_BURST, - "Burst size mustn't be greater than %u", - MAX_BURST); - break; - case 'c': - TEST_ASSERT(test_cases_present == false, - "Test cases provided more than once"); - test_cases_present = true; - - ret = rte_strsplit(optarg, strlen(optarg), - tokens, MAX_CMDLINE_TESTCASES, tc_sep); - - TEST_ASSERT(ret <= MAX_CMDLINE_TESTCASES, - "Too many test cases (max=%d)", - MAX_CMDLINE_TESTCASES); - - for (tc = 0; tc < ret; ++tc) { - /* Find matching test case */ - TAILQ_FOREACH(t, &commands_list, next) - if (!strcmp(tokens[tc], t->command)) - tp->test_to_run[num_tests] = t; - - TEST_ASSERT(tp->test_to_run[num_tests] != NULL, - "Unknown test case: %s", - tokens[tc]); - ++num_tests; - } - break; - case 'v': - TEST_ASSERT(test_vector_present == false, - "Test vector provided more than once"); - test_vector_present = true; - - TEST_ASSERT(strlen(optarg) > 0, - "Config file name is null"); - - snprintf(tp->test_vector_filename, - sizeof(tp->test_vector_filename), - "%s", optarg); - break; - case 's': - TEST_ASSERT(strlen(optarg) > 0, - "SNR is not provided"); - tp->snr = strtod(optarg, NULL); - break; - case 't': - TEST_ASSERT(strlen(optarg) > 0, - "Iter_max is not provided"); - tp->iter_max = strtol(optarg, NULL, 10); - break; - case 'l': - TEST_ASSERT(strlen(optarg) > 0, - "Num of lcores is not provided"); - tp->num_lcores = strtol(optarg, NULL, 10); - TEST_ASSERT(tp->num_lcores <= RTE_MAX_LCORE, - "Num of lcores mustn't be greater than %u", - RTE_MAX_LCORE); - break; - case 'i': - /* indicate fpga fec config required */ - tp->init_device = true; - break; - case 'h': - print_usage(argv[0]); - return 0; - default: - printf("ERROR: Unknown option: -%c\n", opt); - return -1; - } - - if (tp->num_ops == 0) { - printf( - "WARNING: Num of operations was not provided or was set 0. Set to default (%u)\n", - DEFAULT_OPS); - tp->num_ops = DEFAULT_OPS; - } - if (tp->burst_sz == 0) { - printf( - "WARNING: Burst size was not provided or was set 0. Set to default (%u)\n", - DEFAULT_BURST); - tp->burst_sz = DEFAULT_BURST; - } - if (tp->num_lcores == 0) { - printf( - "WARNING: Num of lcores was not provided or was set 0. Set to value from RTE config (%u)\n", - rte_lcore_count()); - tp->num_lcores = rte_lcore_count(); - } - - TEST_ASSERT(tp->burst_sz <= tp->num_ops, - "Burst size (%u) mustn't be greater than num ops (%u)", - tp->burst_sz, tp->num_ops); - - tp->num_tests = num_tests; - return 0; -} -static int -run_all_tests(void) -{ - int ret = TEST_SUCCESS; - struct test_command *t; - - TAILQ_FOREACH(t, &commands_list, next) - ret |= (int) t->callback(); - - return ret; -} - -static int -run_parsed_tests(struct test_params *tp) -{ - int ret = TEST_SUCCESS; - unsigned int i; - - for (i = 0; i < tp->num_tests; ++i) - ret |= (int) tp->test_to_run[i]->callback(); - - return ret; -} static int init_input(uint32_t **data, uint32_t data_length) @@ -5652,13 +3716,6 @@ argv_re[1] = "-v"; argv_re[2] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"; //printf("after ......ret %d argc %d argv %s %s %s %s\n", ret,argc, argv[0], argv[1], argv[2], argv[3],argv[4]); - /* Parse application arguments (after the EAL ones) */ - /* ret = parse_args(argc_re, argv_re, &test_params); - if (ret < 0) { - print_usage(argv_re[0]); - return 1; - } -*/ memset(&test_vector_dec, 0, sizeof(struct test_bbdev_vector)); @@ -5707,11 +3764,19 @@ test_params.num_ops=2; test_params.burst_sz=2; test_params.num_lcores=1; test_params.num_tests = 1; -run_all_tests(); +//run_all_tests(); + +testsuite_setup(); +ut_setup(); + +throughput_tc(); + + char *data = ldpc_output; data_len = (p_decParams->BG==1)?(22*p_decParams->Z):(10*p_decParams->Z); memcpy(&p_out[0], data, C*data_len); //p_out = ldpc_output; +ut_teardown(); //for (i=0;i<8;i++) //printf("p_out[%d] = %x addr %p ldpcout addr %p\n",i,p_out[i],p_out+i,ldpc_output+i); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 804903a84f..cf11e434e3 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -627,12 +627,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, #endif no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; } - for (int k=0;k<8;k++) + /*for (int k=0;k<8;k++) { printf("output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); } - + */ memcpy(harq_process->b+offset, harq_process->c[r], From c739337e66446cd186bfaa05da39ec654ccb131d Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 6 Aug 2021 10:54:31 +0200 Subject: [PATCH 008/136] adding offload multiple segments --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 2282 +---------------- .../PHY/CODING/nrLDPC_decoder/nrLDPC_types.h | 14 + openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 15 +- 3 files changed, 162 insertions(+), 2149 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 66f6a244e6..c0fe83ec19 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -39,7 +39,6 @@ #include "nrLDPC_bnProc.h" #define NR_LDPC_ENABLE_PARITY_CHECK -//#define NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_DEBUG_MODE #include "nrLDPC_tools/nrLDPC_debug.h" @@ -72,33 +71,10 @@ uint8_t count_initdev =0; #include "../../../targets/ARCH/test-bbdev/test_bbdev_vector.h" -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2017 Intel Corporation - */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//#include "main.h" -//#include "test_bbdev_vector.h" - #define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id)) #define MAX_QUEUES RTE_MAX_LCORE -#define TEST_REPETITIONS 1000 +#define TEST_REPETITIONS 1 #ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC #include @@ -138,19 +114,9 @@ uint8_t count_initdev =0; #define HARQ_INCR 32768 /* Headroom for filler LLRs insertion in HARQ buffer */ #define FILLER_HEADROOM 1024 -/* Constants from K0 computation from 3GPP 38.212 Table 5.4.2.1-2 */ -#define N_ZC_1 66 /* N = 66 Zc for BG 1 */ -#define N_ZC_2 50 /* N = 50 Zc for BG 2 */ -#define K0_1_1 17 /* K0 fraction numerator for rv 1 and BG 1 */ -#define K0_1_2 13 /* K0 fraction numerator for rv 1 and BG 2 */ -#define K0_2_1 33 /* K0 fraction numerator for rv 2 and BG 1 */ -#define K0_2_2 25 /* K0 fraction numerator for rv 2 and BG 2 */ -#define K0_3_1 56 /* K0 fraction numerator for rv 3 and BG 1 */ -#define K0_3_2 43 /* K0 fraction numerator for rv 3 and BG 2 */ struct test_bbdev_vector test_vector; struct test_bbdev_vector test_vector_dec; -int8_t ldpc_output[22*384]; /* Switch between PMD and Interrupt for throughput TC */ static bool intr_enabled; @@ -281,191 +247,30 @@ flags_match(uint32_t flags_req, uint32_t flags_present) return (flags_req & flags_present) == flags_req; } -static void -clear_soft_out_cap(uint32_t *op_flags) -{ - *op_flags &= ~RTE_BBDEV_TURBO_SOFT_OUTPUT; - *op_flags &= ~RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT; - *op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; -} static int check_dev_cap(const struct rte_bbdev_info *dev_info) { unsigned int i; - unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs, - nb_harq_inputs, nb_harq_outputs; const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities; - nb_inputs = test_vector.entries[DATA_INPUT].nb_segments; - nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments; - nb_hard_outputs = test_vector.entries[DATA_HARD_OUTPUT].nb_segments; - nb_harq_inputs = test_vector.entries[DATA_HARQ_INPUT].nb_segments; - nb_harq_outputs = test_vector.entries[DATA_HARQ_OUTPUT].nb_segments; - for (i = 0; op_cap->type != RTE_BBDEV_OP_NONE; ++i, ++op_cap) { - if (op_cap->type != test_vector.op_type) + if (op_cap->type != RTE_BBDEV_OP_LDPC_DEC) continue; - if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) { - const struct rte_bbdev_op_cap_turbo_dec *cap = - &op_cap->cap.turbo_dec; - /* Ignore lack of soft output capability, just skip - * checking if soft output is valid. - */ - if ((test_vector.turbo_dec.op_flags & - RTE_BBDEV_TURBO_SOFT_OUTPUT) && - !(cap->capability_flags & - RTE_BBDEV_TURBO_SOFT_OUTPUT)) { - printf( - "INFO: Device \"%s\" does not support soft output - soft output flags will be ignored.\n", - dev_info->dev_name); - clear_soft_out_cap( - &test_vector.turbo_dec.op_flags); - } - - if (!flags_match(test_vector.turbo_dec.op_flags, - cap->capability_flags)) - return TEST_FAILED; - if (nb_inputs > cap->num_buffers_src) { - printf("Too many inputs defined: %u, max: %u\n", - nb_inputs, cap->num_buffers_src); - return TEST_FAILED; - } - if (nb_soft_outputs > cap->num_buffers_soft_out && - (test_vector.turbo_dec.op_flags & - RTE_BBDEV_TURBO_SOFT_OUTPUT)) { - printf( - "Too many soft outputs defined: %u, max: %u\n", - nb_soft_outputs, - cap->num_buffers_soft_out); - return TEST_FAILED; - } - if (nb_hard_outputs > cap->num_buffers_hard_out) { - printf( - "Too many hard outputs defined: %u, max: %u\n", - nb_hard_outputs, - cap->num_buffers_hard_out); - return TEST_FAILED; - } - if (intr_enabled && !(cap->capability_flags & - RTE_BBDEV_TURBO_DEC_INTERRUPTS)) { - printf( - "Dequeue interrupts are not supported!\n"); - return TEST_FAILED; - } - - return TEST_SUCCESS; - } else if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) { - const struct rte_bbdev_op_cap_turbo_enc *cap = - &op_cap->cap.turbo_enc; - - if (!flags_match(test_vector.turbo_enc.op_flags, - cap->capability_flags)) - return TEST_FAILED; - if (nb_inputs > cap->num_buffers_src) { - printf("Too many inputs defined: %u, max: %u\n", - nb_inputs, cap->num_buffers_src); - return TEST_FAILED; - } - if (nb_hard_outputs > cap->num_buffers_dst) { - printf( - "Too many hard outputs defined: %u, max: %u\n", - nb_hard_outputs, cap->num_buffers_dst); - return TEST_FAILED; - } - if (intr_enabled && !(cap->capability_flags & - RTE_BBDEV_TURBO_ENC_INTERRUPTS)) { - printf( - "Dequeue interrupts are not supported!\n"); - return TEST_FAILED; - } - - return TEST_SUCCESS; - } else if (op_cap->type == RTE_BBDEV_OP_LDPC_ENC) { - const struct rte_bbdev_op_cap_ldpc_enc *cap = - &op_cap->cap.ldpc_enc; - - if (!flags_match(test_vector.ldpc_enc.op_flags, - cap->capability_flags)){ - printf("Flag Mismatch\n"); - return TEST_FAILED; - } - if (nb_inputs > cap->num_buffers_src) { - printf("Too many inputs defined: %u, max: %u\n", - nb_inputs, cap->num_buffers_src); - return TEST_FAILED; - } - if (nb_hard_outputs > cap->num_buffers_dst) { - printf( - "Too many hard outputs defined: %u, max: %u\n", - nb_hard_outputs, cap->num_buffers_dst); - return TEST_FAILED; - } - if (intr_enabled && !(cap->capability_flags & - RTE_BBDEV_LDPC_ENC_INTERRUPTS)) { - printf( - "Dequeue interrupts are not supported!\n"); - return TEST_FAILED; - } - - return TEST_SUCCESS; - } else if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) { + if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) { const struct rte_bbdev_op_cap_ldpc_dec *cap = &op_cap->cap.ldpc_dec; - if (!flags_match(test_vector.ldpc_dec.op_flags, + if (!flags_match(RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, cap->capability_flags)){ printf("Flag Mismatch\n"); return TEST_FAILED; } - if (nb_inputs > cap->num_buffers_src) { - printf("Too many inputs defined: %u, max: %u\n", - nb_inputs, cap->num_buffers_src); - return TEST_FAILED; - } - if (nb_hard_outputs > cap->num_buffers_hard_out) { - printf( - "Too many hard outputs defined: %u, max: %u\n", - nb_hard_outputs, - cap->num_buffers_hard_out); - return TEST_FAILED; - } - if (nb_harq_inputs > cap->num_buffers_hard_out) { - printf( - "Too many HARQ inputs defined: %u, max: %u\n", - nb_hard_outputs, - cap->num_buffers_hard_out); - return TEST_FAILED; - } - if (nb_harq_outputs > cap->num_buffers_hard_out) { - printf( - "Too many HARQ outputs defined: %u, max: %u\n", - nb_hard_outputs, - cap->num_buffers_hard_out); - return TEST_FAILED; - } - if (intr_enabled && !(cap->capability_flags & - RTE_BBDEV_LDPC_DEC_INTERRUPTS)) { - printf( - "Dequeue interrupts are not supported!\n"); - return TEST_FAILED; - } - if (intr_enabled && (test_vector.ldpc_dec.op_flags & - (RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE | - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE | - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK - ))) { - printf("Skip loop-back with interrupt\n"); - return TEST_FAILED; - } return TEST_SUCCESS; } } - if ((i == 0) && (test_vector.op_type == RTE_BBDEV_OP_NONE)) - return TEST_SUCCESS; /* Special case for NULL device */ - return TEST_FAILED; } @@ -478,7 +283,7 @@ optimal_mempool_size(unsigned int val) /* allocates mbuf mempool for inputs and outputs */ static struct rte_mempool * -create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id, +create_mbuf_pool(uint32_t length, uint8_t dev_id, int socket_id, unsigned int mbuf_pool_size, const char *op_type_str) { @@ -487,9 +292,9 @@ create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id, char pool_name[RTE_MEMPOOL_NAMESIZE]; /* find max input segment size */ - for (i = 0; i < entries->nb_segments; ++i) - if (entries->segments[i].length > max_seg_sz) - max_seg_sz = entries->segments[i].length; + //for (i = 0; i < entries->nb_segments; ++i) + if (length > max_seg_sz) + max_seg_sz = length; snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, dev_id); @@ -501,24 +306,16 @@ create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id, static int create_mempools(struct active_device *ad, int socket_id, - enum rte_bbdev_op_type org_op_type, uint16_t num_ops) + enum rte_bbdev_op_type org_op_type, uint16_t num_ops, t_nrLDPCoffload_params *p_offloadParams) { struct rte_mempool *mp; unsigned int ops_pool_size, mbuf_pool_size = 0; char pool_name[RTE_MEMPOOL_NAMESIZE]; const char *op_type_str; enum rte_bbdev_op_type op_type = org_op_type; - - struct op_data_entries *in = &test_vector.entries[DATA_INPUT]; - struct op_data_entries *hard_out = - &test_vector.entries[DATA_HARD_OUTPUT]; - struct op_data_entries *soft_out = - &test_vector.entries[DATA_SOFT_OUTPUT]; - struct op_data_entries *harq_in = - &test_vector.entries[DATA_HARQ_INPUT]; - struct op_data_entries *harq_out = - &test_vector.entries[DATA_HARQ_OUTPUT]; - + uint8_t nb_segments = 1; + uint32_t data_len; + /* allocate ops mempool */ ops_pool_size = optimal_mempool_size(RTE_MAX( /* Ops used plus 1 reference op */ @@ -548,12 +345,12 @@ create_mempools(struct active_device *ad, int socket_id, /* Do not create inputs and outputs mbufs for BaseBand Null Device */ if (org_op_type == RTE_BBDEV_OP_NONE) return TEST_SUCCESS; - + data_len = (p_offloadParams->BG==1)?(22*p_offloadParams->Z):(10*p_offloadParams->Z); /* Inputs */ - if (in->nb_segments > 0) { + if (nb_segments > 0) { mbuf_pool_size = optimal_mempool_size(ops_pool_size * - in->nb_segments); - mp = create_mbuf_pool(in, ad->dev_id, socket_id, + nb_segments); + mp = create_mbuf_pool(p_offloadParams->E, ad->dev_id, socket_id, mbuf_pool_size, "in"); TEST_ASSERT_NOT_NULL(mp, "ERROR Failed to create %u items input pktmbuf pool for dev %u on socket %u.", @@ -564,10 +361,10 @@ create_mempools(struct active_device *ad, int socket_id, } /* Hard outputs */ - if (hard_out->nb_segments > 0) { + if (nb_segments > 0) { mbuf_pool_size = optimal_mempool_size(ops_pool_size * - hard_out->nb_segments); - mp = create_mbuf_pool(hard_out, ad->dev_id, socket_id, + nb_segments); + mp = create_mbuf_pool(data_len, ad->dev_id, socket_id, mbuf_pool_size, "hard_out"); TEST_ASSERT_NOT_NULL(mp, @@ -578,66 +375,19 @@ create_mempools(struct active_device *ad, int socket_id, ad->hard_out_mbuf_pool = mp; } - /* Soft outputs */ - if (soft_out->nb_segments > 0) { - mbuf_pool_size = optimal_mempool_size(ops_pool_size * - soft_out->nb_segments); - mp = create_mbuf_pool(soft_out, ad->dev_id, socket_id, - mbuf_pool_size, - "soft_out"); - TEST_ASSERT_NOT_NULL(mp, - "ERROR Failed to create %uB soft output pktmbuf pool for dev %u on socket %u.", - mbuf_pool_size, - ad->dev_id, - socket_id); - ad->soft_out_mbuf_pool = mp; - } - - /* HARQ inputs */ - if (harq_in->nb_segments > 0) { - mbuf_pool_size = optimal_mempool_size(ops_pool_size * - harq_in->nb_segments); - mp = create_mbuf_pool(harq_in, ad->dev_id, socket_id, - mbuf_pool_size, - "harq_in"); - TEST_ASSERT_NOT_NULL(mp, - "ERROR Failed to create %uB harq input pktmbuf pool for dev %u on socket %u.", - mbuf_pool_size, - ad->dev_id, - socket_id); - ad->harq_in_mbuf_pool = mp; - } - - /* HARQ outputs */ - if (harq_out->nb_segments > 0) { - mbuf_pool_size = optimal_mempool_size(ops_pool_size * - harq_out->nb_segments); - mp = create_mbuf_pool(harq_out, ad->dev_id, socket_id, - mbuf_pool_size, - "harq_out"); - TEST_ASSERT_NOT_NULL(mp, - "ERROR Failed to create %uB harq output pktmbuf pool for dev %u on socket %u.", - mbuf_pool_size, - ad->dev_id, - socket_id); - ad->harq_out_mbuf_pool = mp; - } - return TEST_SUCCESS; } static int -add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info, - struct test_bbdev_vector *vector) +add_dev(uint8_t dev_id, struct rte_bbdev_info *info) { int ret; unsigned int queue_id; struct rte_bbdev_queue_conf qconf; struct active_device *ad = &active_devs[nb_active_devs]; unsigned int nb_queues; - enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; + enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; -//test_vector_dec.op_type= RTE_BBDEV_OP_LDPC_DEC; /* Configure fpga lte fec with PF & VF values * if '-i' flag is set and using fpga device */ @@ -785,15 +535,14 @@ add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info, } static int -add_active_device(uint8_t dev_id, struct rte_bbdev_info *info, - struct test_bbdev_vector *vector) +add_active_device(uint8_t dev_id, struct rte_bbdev_info *info) { int ret; active_devs[nb_active_devs].driver_name = info->drv.driver_name; active_devs[nb_active_devs].dev_id = dev_id; - ret = add_bbdev_dev(dev_id, info, vector); + ret = add_dev(dev_id, info); if (ret == TEST_SUCCESS) ++nb_active_devs; return ret; @@ -816,8 +565,7 @@ populate_active_devices(void) dev_id, info.dev_name); continue; } -test_vector.op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; - ret = add_active_device(dev_id, &info, &test_vector); + ret = add_active_device(dev_id, &info); if (ret != 0) { printf("Adding active bbdev %s skipped\n", info.dev_name); @@ -830,79 +578,8 @@ test_vector.op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; } static int -read_test_vector(void) +device_setup(void) { - int ret; - memset(&test_vector, 0, sizeof(struct test_bbdev_vector)); -struct rte_bbdev_op_ldpc_dec *ldpc_dec = &test_vector.ldpc_dec; -struct rte_bbdev_op_ldpc_dec *ldpc_dec_ref = &test_vector_dec.ldpc_dec; -test_vector.op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; -test_vector.expected_status = 0; -//printf("test vector expected status %d\n",test_vector.expected_status); -//uint8_t *rv_index = &ldpc_dec_ref->rv_index; -//rv_index = ldpc_dec_ref->rv_index; - ldpc_dec->code_block_mode = 1; //ldpc_dec_ref->code_block_mode; -if (ldpc_dec->code_block_mode == 0) { - ldpc_dec->tb_params.ea = ldpc_dec_ref->tb_params.ea; - ldpc_dec->tb_params.eb = ldpc_dec_ref->tb_params.eb; - ldpc_dec->tb_params.c = ldpc_dec_ref->tb_params.c; - ldpc_dec->tb_params.cab = ldpc_dec_ref->tb_params.cab; - ldpc_dec->tb_params.r = ldpc_dec_ref->tb_params.r; -} else { - ldpc_dec->cb_params.e = ldpc_dec_ref->cb_params.e; -} - - ldpc_dec->rv_index = 0; //*rv_index; - ldpc_dec->iter_count = 3; - ldpc_dec->basegraph = ldpc_dec_ref->basegraph; - ldpc_dec->z_c = ldpc_dec_ref->z_c; - ldpc_dec->q_m = ldpc_dec_ref->q_m; - ldpc_dec->n_filler = ldpc_dec_ref->n_filler; - ldpc_dec->n_cb = ldpc_dec_ref->n_cb; - ldpc_dec->iter_max = ldpc_dec_ref->iter_max; -// ldpc_dec->rv_index = ldpc_dec_ref->rv_index; - ldpc_dec->op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - // ldpc_dec->code_block_mode = 1; //ldpc_dec_ref->code_block_mode; - -struct op_data_entries *ref_entries = - &test_vector.entries[0]; - -struct op_data_entries *ref_entries_dec = - &test_vector_dec.entries[0]; - -//ref_entries->nb_segments = ref_entries_dec->nb_segments; - -ret= init_entry(&test_vector, 0, ldpc_dec->cb_params.e); -ret= init_entry(&test_vector, 2, ldpc_dec->cb_params.e); -//printf("read test reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec_ref->basegraph, ldpc_dec_ref->z_c, ldpc_dec_ref->q_m,ldpc_dec_ref->n_filler,ldpc_dec_ref->n_cb,ldpc_dec_ref->iter_max,rv_index); -//printf("read test reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec_ref->basegraph, ldpc_dec_ref->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); - -printf("read test nb segments %d ref %d\n",ref_entries->nb_segments, ref_entries_dec->nb_segments); -uint8_t nbs = 1; -if (ldpc_dec->code_block_mode ==0) nbs =2; -//for (int i=0;inb_segments;i++) { -for (int i=0;isegments[i]; -struct op_data_buf *seg_dec = &ref_entries_dec->segments[i]; -memcpy(seg->addr, seg_dec->addr, seg->length); -} - - -//printf("before seg addr %p seg dec addr %p nb segments %d\n",seg->addr,seg_dec->addr,ref_entries->nb_segments); - -//memcpy(ldpc_dec, ldpc_dec_ref, sizeof(struct rte_bbdev_op_ldpc_dec)); - -//printf("seg addr %p length %d seg dec addr %p \n",seg->addr,seg->length, seg_dec->addr); -//printf("seg addr %p seg dec addr %p llr %x llr dec %x\n",seg->addr,seg_dec->addr,*(seg->addr), *(seg_dec->addr)); - - return TEST_SUCCESS; -} - -static int -testsuite_setup(void) -{ - TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); if (count_initdev ==0) { count_initdev++; if (populate_active_devices() == 0) { @@ -913,24 +590,6 @@ count_initdev++; return TEST_SUCCESS; } -static int -interrupt_testsuite_setup(void) -{ - TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); - - /* Enable interrupts */ - intr_enabled = true; - - /* Special case for NULL device (RTE_BBDEV_OP_NONE) */ - if (populate_active_devices() == 0 || - test_vector.op_type == RTE_BBDEV_OP_NONE) { - intr_enabled = false; - printf("No suitable devices found!\n"); - return TEST_SKIPPED; - } - - return TEST_SUCCESS; -} static void testsuite_teardown(void) @@ -983,31 +642,31 @@ ut_teardown(void) } static int -init_op_data_objs(struct rte_bbdev_op_data *bufs, - struct op_data_entries *ref_entries, +init_op_data_objs(struct rte_bbdev_op_data *bufs, + int8_t* p_llr, uint32_t data_len, struct rte_mempool *mbuf_pool, const uint16_t n, enum op_data_type op_type, uint16_t min_alignment) { int ret; unsigned int i, j; bool large_input = false; + uint8_t nb_segments = 1; for (i = 0; i < n; ++i) { char *data; - struct op_data_buf *seg = &ref_entries->segments[0]; struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); TEST_ASSERT_NOT_NULL(m_head, "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", - op_type, n * ref_entries->nb_segments, + op_type, n * nb_segments, mbuf_pool->size); - if (seg->length > RTE_BBDEV_LDPC_E_MAX_MBUF) { + if (data_len > RTE_BBDEV_LDPC_E_MAX_MBUF) { /* * Special case when DPDK mbuf cannot handle * the required input size */ printf("Warning: Larger input size than DPDK mbuf %d\n", - seg->length); + data_len); large_input = true; } bufs[i].data = m_head; @@ -1017,48 +676,48 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) { if ((op_type == DATA_INPUT) && large_input) { /* Allocate a fake overused mbuf */ - data = rte_malloc(NULL, seg->length, 0); - memcpy(data, seg->addr, seg->length); + data = rte_malloc(NULL, data_len, 0); + memcpy(data, p_llr, data_len); m_head->buf_addr = data; m_head->buf_iova = rte_malloc_virt2iova(data); m_head->data_off = 0; - m_head->data_len = seg->length; + m_head->data_len = data_len; } else { - data = rte_pktmbuf_append(m_head, seg->length); + data = rte_pktmbuf_append(m_head, data_len); TEST_ASSERT_NOT_NULL(data, "Couldn't append %u bytes to mbuf from %d data type mbuf pool", - seg->length, op_type); + data_len, op_type); TEST_ASSERT(data == RTE_PTR_ALIGN( data, min_alignment), "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", data, min_alignment); - rte_memcpy(data, seg->addr, seg->length); + rte_memcpy(data, p_llr, data_len); } - bufs[i].length += seg->length; + bufs[i].length += data_len; - for (j = 1; j < ref_entries->nb_segments; ++j) { + for (j = 1; j < nb_segments; ++j) { struct rte_mbuf *m_tail = rte_pktmbuf_alloc(mbuf_pool); TEST_ASSERT_NOT_NULL(m_tail, "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", op_type, - n * ref_entries->nb_segments, + n * nb_segments, mbuf_pool->size); - seg += 1; + //seg += 1; - data = rte_pktmbuf_append(m_tail, seg->length); + data = rte_pktmbuf_append(m_tail, data_len); TEST_ASSERT_NOT_NULL(data, "Couldn't append %u bytes to mbuf from %d data type mbuf pool", - seg->length, op_type); + data_len, op_type); TEST_ASSERT(data == RTE_PTR_ALIGN(data, min_alignment), "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", data, min_alignment); - rte_memcpy(data, seg->addr, seg->length); - bufs[i].length += seg->length; + rte_memcpy(data, p_llr, data_len); + bufs[i].length += data_len; ret = rte_pktmbuf_chain(m_head, m_tail); TEST_ASSERT_SUCCESS(ret, @@ -1068,13 +727,13 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, } else { /* allocate chained-mbuf for output buffer */ - for (j = 1; j < ref_entries->nb_segments; ++j) { + for (j = 1; j < nb_segments; ++j) { struct rte_mbuf *m_tail = rte_pktmbuf_alloc(mbuf_pool); TEST_ASSERT_NOT_NULL(m_tail, "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", op_type, - n * ref_entries->nb_segments, + n * nb_segments, mbuf_pool->size); ret = rte_pktmbuf_chain(m_head, m_tail); @@ -1109,26 +768,6 @@ allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len, return (*buffers == NULL) ? TEST_FAILED : TEST_SUCCESS; } -static void -limit_input_llr_val_range(struct rte_bbdev_op_data *input_ops, - const uint16_t n, const int8_t max_llr_modulus) -{ - uint16_t i, byte_idx; - - for (i = 0; i < n; ++i) { - struct rte_mbuf *m = input_ops[i].data; - while (m != NULL) { - int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, - input_ops[i].offset); - for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); - ++byte_idx) - llr[byte_idx] = round((double)max_llr_modulus * - llr[byte_idx] / INT8_MAX); - - m = m->next; - } - } -} /* * We may have to insert filler bits @@ -1210,7 +849,7 @@ ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops, static int -fill_queue_buffers(struct test_op_params *op_params, +fill_queue_buffers(struct test_op_params *op_params,int8_t* p_llr, uint32_t data_len, struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp, struct rte_mempool *soft_out_mp, struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp, @@ -1238,19 +877,7 @@ fill_queue_buffers(struct test_op_params *op_params, &op_params->q_bufs[socket_id][queue_id].harq_outputs, }; - for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { - struct op_data_entries *ref_entries = - &test_vector.entries[type]; -/*struct op_data_buf *seg = &ref_entries->segments[0]; - struct op_data_entries *ref_entries_dec = - &test_vector_dec.entries[type]; -struct op_data_buf *seg_dec = &ref_entries_dec->segments[0]; -*/ -//memcpy(seg->addr, seg_dec->addr, seg->length); - -// printf("fill queue ref seg data %x addr %p \n", *ref_entries->segments[0].addr, ref_entries->segments[0].addr); - if (ref_entries->nb_segments == 0) - continue; + for (type = DATA_INPUT; type < 3; type+=2) { ret = allocate_buffers_on_socket(queue_ops[type], n * sizeof(struct rte_bbdev_op_data), @@ -1258,17 +885,13 @@ struct op_data_buf *seg_dec = &ref_entries_dec->segments[0]; TEST_ASSERT_SUCCESS(ret, "Couldn't allocate memory for rte_bbdev_op_data structs"); - ret = init_op_data_objs(*queue_ops[type], ref_entries, + ret = init_op_data_objs(*queue_ops[type], p_llr, data_len, mbuf_pools[type], n, type, min_alignment); TEST_ASSERT_SUCCESS(ret, "Couldn't init rte_bbdev_op_data structs"); } - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) - limit_input_llr_val_range(*queue_ops[DATA_INPUT], n, - capabilities->cap.turbo_dec.max_llr_modulus); - - if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { +// if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { bool loopback = op_params->ref_dec_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; bool llr_comp = op_params->ref_dec_op->ldpc_dec.op_flags & @@ -1287,7 +910,7 @@ struct op_data_buf *seg_dec = &ref_entries_dec->segments[0]; if (!loopback) ldpc_add_filler(*queue_ops[DATA_HARQ_INPUT], n, op_params); - } +// } return 0; } @@ -1315,122 +938,7 @@ free_buffers(struct active_device *ad, struct test_op_params *op_params) } } -static void -copy_reference_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, - unsigned int start_idx, - struct rte_bbdev_op_data *inputs, - struct rte_bbdev_op_data *hard_outputs, - struct rte_bbdev_op_data *soft_outputs, - struct rte_bbdev_dec_op *ref_op) -{ - unsigned int i; - struct rte_bbdev_op_turbo_dec *turbo_dec = &ref_op->turbo_dec; - for (i = 0; i < n; ++i) { - if (turbo_dec->code_block_mode == 0) { - ops[i]->turbo_dec.tb_params.ea = - turbo_dec->tb_params.ea; - ops[i]->turbo_dec.tb_params.eb = - turbo_dec->tb_params.eb; - ops[i]->turbo_dec.tb_params.k_pos = - turbo_dec->tb_params.k_pos; - ops[i]->turbo_dec.tb_params.k_neg = - turbo_dec->tb_params.k_neg; - ops[i]->turbo_dec.tb_params.c = - turbo_dec->tb_params.c; - ops[i]->turbo_dec.tb_params.c_neg = - turbo_dec->tb_params.c_neg; - ops[i]->turbo_dec.tb_params.cab = - turbo_dec->tb_params.cab; - ops[i]->turbo_dec.tb_params.r = - turbo_dec->tb_params.r; - } else { - ops[i]->turbo_dec.cb_params.e = turbo_dec->cb_params.e; - ops[i]->turbo_dec.cb_params.k = turbo_dec->cb_params.k; - } - - ops[i]->turbo_dec.ext_scale = turbo_dec->ext_scale; - ops[i]->turbo_dec.iter_max = turbo_dec->iter_max; - ops[i]->turbo_dec.iter_min = turbo_dec->iter_min; - ops[i]->turbo_dec.op_flags = turbo_dec->op_flags; - ops[i]->turbo_dec.rv_index = turbo_dec->rv_index; - ops[i]->turbo_dec.num_maps = turbo_dec->num_maps; - ops[i]->turbo_dec.code_block_mode = turbo_dec->code_block_mode; - - ops[i]->turbo_dec.hard_output = hard_outputs[start_idx + i]; - ops[i]->turbo_dec.input = inputs[start_idx + i]; - if (soft_outputs != NULL) - ops[i]->turbo_dec.soft_output = - soft_outputs[start_idx + i]; - } -} - -static void -copy_reference_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, - unsigned int start_idx, - struct rte_bbdev_op_data *inputs, - struct rte_bbdev_op_data *outputs, - struct rte_bbdev_enc_op *ref_op) -{ - unsigned int i; - struct rte_bbdev_op_turbo_enc *turbo_enc = &ref_op->turbo_enc; - for (i = 0; i < n; ++i) { - if (turbo_enc->code_block_mode == 0) { - ops[i]->turbo_enc.tb_params.ea = - turbo_enc->tb_params.ea; - ops[i]->turbo_enc.tb_params.eb = - turbo_enc->tb_params.eb; - ops[i]->turbo_enc.tb_params.k_pos = - turbo_enc->tb_params.k_pos; - ops[i]->turbo_enc.tb_params.k_neg = - turbo_enc->tb_params.k_neg; - ops[i]->turbo_enc.tb_params.c = - turbo_enc->tb_params.c; - ops[i]->turbo_enc.tb_params.c_neg = - turbo_enc->tb_params.c_neg; - ops[i]->turbo_enc.tb_params.cab = - turbo_enc->tb_params.cab; - ops[i]->turbo_enc.tb_params.ncb_pos = - turbo_enc->tb_params.ncb_pos; - ops[i]->turbo_enc.tb_params.ncb_neg = - turbo_enc->tb_params.ncb_neg; - ops[i]->turbo_enc.tb_params.r = turbo_enc->tb_params.r; - } else { - ops[i]->turbo_enc.cb_params.e = turbo_enc->cb_params.e; - ops[i]->turbo_enc.cb_params.k = turbo_enc->cb_params.k; - ops[i]->turbo_enc.cb_params.ncb = - turbo_enc->cb_params.ncb; - } - ops[i]->turbo_enc.rv_index = turbo_enc->rv_index; - ops[i]->turbo_enc.op_flags = turbo_enc->op_flags; - ops[i]->turbo_enc.code_block_mode = turbo_enc->code_block_mode; - - ops[i]->turbo_enc.output = outputs[start_idx + i]; - ops[i]->turbo_enc.input = inputs[start_idx + i]; - } -} - - -/* Returns a random number drawn from a normal distribution - * with mean of 0 and variance of 1 - * Marsaglia algorithm - */ -static double -randn(int n) -{ - double S, Z, U1, U2, u, v, fac; - - do { - U1 = (double)rand() / RAND_MAX; - U2 = (double)rand() / RAND_MAX; - u = 2. * U1 - 1.; - v = 2. * U2 - 1.; - S = u * u + v * v; - } while (S >= 1 || S == 0); - fac = sqrt(-2. * log(S) / S); - Z = (n % 2) ? u * fac : v * fac; - return Z; -} static inline double maxstar(double A, double B) @@ -1441,281 +949,6 @@ maxstar(double A, double B) return RTE_MAX(A, B) + log1p(exp(-fabs(A - B))); } -/* - * Generate Qm LLRS for Qm==8 - * Modulation, AWGN and LLR estimation from max log development - */ -static void -gen_qm8_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) -{ - int qm = 8; - int qam = 256; - int m, k; - double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; - /* 5.1.4 of TS38.211 */ - const double symbols_I[256] = { - 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 5, - 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 11, - 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, 15, 13, 13, - 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, - 15, 13, 13, 15, 15, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, - 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, - 1, 3, 3, 1, 1, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, - 15, 15, 13, 13, 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, - 13, 13, 15, 15, 13, 13, 15, 15, -5, -5, -7, -7, -5, - -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, - -7, -7, -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, - -1, -1, -11, -11, -9, -9, -11, -11, -9, -9, -13, - -13, -15, -15, -13, -13, -15, -15, -11, -11, -9, - -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, - -13, -15, -15, -5, -5, -7, -7, -5, -5, -7, -7, -3, - -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, -5, -5, - -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -11, -11, - -9, -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, - -13, -15, -15, -11, -11, -9, -9, -11, -11, -9, -9, - -13, -13, -15, -15, -13, -13, -15, -15}; - const double symbols_Q[256] = { - 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, - 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, 13, - 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, - 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, - 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, -5, - -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, - -15, -13, -15, -11, -9, -11, -9, -13, -15, -13, - -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, -5, - -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, - -13, -15, -11, -9, -11, -9, -13, -15, -13, -15, 5, - 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, - 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, - 13, 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, - 3, 1, 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, - 13, 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, - -5, -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, - -13, -15, -13, -15, -11, -9, -11, -9, -13, -15, - -13, -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, - -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, - -13, -15, -11, -9, -11, -9, -13, -15, -13, -15}; - /* Average constellation point energy */ - N0 *= 170.0; - for (k = 0; k < qm; k++) - b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; - /* 5.1.4 of TS38.211 */ - I = (1 - 2 * b[0]) * (8 - (1 - 2 * b[2]) * - (4 - (1 - 2 * b[4]) * (2 - (1 - 2 * b[6])))); - Q = (1 - 2 * b[1]) * (8 - (1 - 2 * b[3]) * - (4 - (1 - 2 * b[5]) * (2 - (1 - 2 * b[7])))); - /* AWGN channel */ - I += sqrt(N0 / 2) * randn(0); - Q += sqrt(N0 / 2) * randn(1); - /* - * Calculate the log of the probability that each of - * the constellation points was transmitted - */ - for (m = 0; m < qam; m++) - log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) - + pow(Q - symbols_Q[m], 2.0)) / N0; - /* Calculate an LLR for each of the k_64QAM bits in the set */ - for (k = 0; k < qm; k++) { - p0 = -999999; - p1 = -999999; - /* For each constellation point */ - for (m = 0; m < qam; m++) { - if ((m >> (qm - k - 1)) & 1) - p1 = maxstar(p1, log_syml_prob[m]); - else - p0 = maxstar(p0, log_syml_prob[m]); - } - /* Calculate the LLR */ - llr_ = p0 - p1; - llr_ *= (1 << ldpc_llr_decimals); - llr_ = round(llr_); - if (llr_ > llr_max) - llr_ = llr_max; - if (llr_ < -llr_max) - llr_ = -llr_max; - llrs[qm * i + k] = (int8_t) llr_; - } -} - - -/* - * Generate Qm LLRS for Qm==6 - * Modulation, AWGN and LLR estimation from max log development - */ -static void -gen_qm6_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) -{ - int qm = 6; - int qam = 64; - int m, k; - double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; - /* 5.1.4 of TS38.211 */ - const double symbols_I[64] = { - 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, - 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, - -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, - -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, - -5, -5, -7, -7, -5, -5, -7, -7}; - const double symbols_Q[64] = { - 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, - -3, -1, -3, -1, -5, -7, -5, -7, -3, -1, -3, -1, - -5, -7, -5, -7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, - 5, 7, 5, 7, -3, -1, -3, -1, -5, -7, -5, -7, - -3, -1, -3, -1, -5, -7, -5, -7}; - /* Average constellation point energy */ - N0 *= 42.0; - for (k = 0; k < qm; k++) - b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; - /* 5.1.4 of TS38.211 */ - I = (1 - 2 * b[0])*(4 - (1 - 2 * b[2]) * (2 - (1 - 2 * b[4]))); - Q = (1 - 2 * b[1])*(4 - (1 - 2 * b[3]) * (2 - (1 - 2 * b[5]))); - /* AWGN channel */ - I += sqrt(N0 / 2) * randn(0); - Q += sqrt(N0 / 2) * randn(1); - /* - * Calculate the log of the probability that each of - * the constellation points was transmitted - */ - for (m = 0; m < qam; m++) - log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) - + pow(Q - symbols_Q[m], 2.0)) / N0; - /* Calculate an LLR for each of the k_64QAM bits in the set */ - for (k = 0; k < qm; k++) { - p0 = -999999; - p1 = -999999; - /* For each constellation point */ - for (m = 0; m < qam; m++) { - if ((m >> (qm - k - 1)) & 1) - p1 = maxstar(p1, log_syml_prob[m]); - else - p0 = maxstar(p0, log_syml_prob[m]); - } - /* Calculate the LLR */ - llr_ = p0 - p1; - llr_ *= (1 << ldpc_llr_decimals); - llr_ = round(llr_); - if (llr_ > llr_max) - llr_ = llr_max; - if (llr_ < -llr_max) - llr_ = -llr_max; - llrs[qm * i + k] = (int8_t) llr_; - } -} - -/* - * Generate Qm LLRS for Qm==4 - * Modulation, AWGN and LLR estimation from max log development - */ -static void -gen_qm4_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) -{ - int qm = 4; - int qam = 16; - int m, k; - double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; - /* 5.1.4 of TS38.211 */ - const double symbols_I[16] = {1, 1, 3, 3, 1, 1, 3, 3, - -1, -1, -3, -3, -1, -1, -3, -3}; - const double symbols_Q[16] = {1, 3, 1, 3, -1, -3, -1, -3, - 1, 3, 1, 3, -1, -3, -1, -3}; - /* Average constellation point energy */ - N0 *= 10.0; - for (k = 0; k < qm; k++) - b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; - /* 5.1.4 of TS38.211 */ - I = (1 - 2 * b[0]) * (2 - (1 - 2 * b[2])); - Q = (1 - 2 * b[1]) * (2 - (1 - 2 * b[3])); - /* AWGN channel */ - I += sqrt(N0 / 2) * randn(0); - Q += sqrt(N0 / 2) * randn(1); - /* - * Calculate the log of the probability that each of - * the constellation points was transmitted - */ - for (m = 0; m < qam; m++) - log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) - + pow(Q - symbols_Q[m], 2.0)) / N0; - /* Calculate an LLR for each of the k_64QAM bits in the set */ - for (k = 0; k < qm; k++) { - p0 = -999999; - p1 = -999999; - /* For each constellation point */ - for (m = 0; m < qam; m++) { - if ((m >> (qm - k - 1)) & 1) - p1 = maxstar(p1, log_syml_prob[m]); - else - p0 = maxstar(p0, log_syml_prob[m]); - } - /* Calculate the LLR */ - llr_ = p0 - p1; - llr_ *= (1 << ldpc_llr_decimals); - llr_ = round(llr_); - if (llr_ > llr_max) - llr_ = llr_max; - if (llr_ < -llr_max) - llr_ = -llr_max; - llrs[qm * i + k] = (int8_t) llr_; - } -} - -static void -gen_qm2_llr(int8_t *llrs, uint32_t j, double N0, double llr_max) -{ - double b, b1, n; - double coeff = 2.0 * sqrt(N0); - - /* Ignore in vectors rare quasi null LLRs not to be saturated */ - if (llrs[j] < 8 && llrs[j] > -8) - return; - - /* Note don't change sign here */ - n = randn(j % 2); - b1 = ((llrs[j] > 0 ? 2.0 : -2.0) - + coeff * n) / N0; - b = b1 * (1 << ldpc_llr_decimals); - b = round(b); - if (b > llr_max) - b = llr_max; - if (b < -llr_max) - b = -llr_max; - llrs[j] = (int8_t) b; -} - -/* Generate LLR for a given SNR */ -static void -generate_llr_input(uint16_t n, struct rte_bbdev_op_data *inputs, - struct rte_bbdev_dec_op *ref_op) -{ - struct rte_mbuf *m; - uint16_t qm; - uint32_t i, j, e, range; - double N0, llr_max; - - e = ref_op->ldpc_dec.cb_params.e; - qm = ref_op->ldpc_dec.q_m; - llr_max = (1 << (ldpc_llr_size - 1)) - 1; - range = e / qm; - N0 = 1.0 / pow(10.0, get_snr() / 10.0); - - for (i = 0; i < n; ++i) { - m = inputs[i].data; - int8_t *llrs = rte_pktmbuf_mtod_offset(m, int8_t *, 0); - if (qm == 8) { - for (j = 0; j < range; ++j) - gen_qm8_llr(llrs, j, N0, llr_max); - } else if (qm == 6) { - for (j = 0; j < range; ++j) - gen_qm6_llr(llrs, j, N0, llr_max); - } else if (qm == 4) { - for (j = 0; j < range; ++j) - gen_qm4_llr(llrs, j, N0, llr_max); - } else { - for (j = 0; j < e; ++j) - gen_qm2_llr(llrs, j, N0, llr_max); - } - } -} - static void copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, unsigned int start_idx, @@ -1724,15 +957,13 @@ copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, struct rte_bbdev_op_data *soft_outputs, struct rte_bbdev_op_data *harq_inputs, struct rte_bbdev_op_data *harq_outputs, - struct rte_bbdev_dec_op *ref_op) + struct rte_bbdev_dec_op *ref_op, + t_nrLDPCoffload_params *p_offloadParams) { unsigned int i; struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; - //struct rte_mbuf *m = inputs[0].data; -// struct rte_mbuf *mldpc = ops[0]->ldpc_dec.input.data; -//struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); for (i = 0; i < n; ++i) { - if (ldpc_dec->code_block_mode == 0) { + /* if (ldpc_dec->code_block_mode == 0) { ops[i]->ldpc_dec.tb_params.ea = ldpc_dec->tb_params.ea; ops[i]->ldpc_dec.tb_params.eb = @@ -1744,33 +975,20 @@ copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ops[i]->ldpc_dec.tb_params.r = ldpc_dec->tb_params.r; printf("code block ea %d eb %d c %d cab %d r %d\n",ldpc_dec->tb_params.ea,ldpc_dec->tb_params.eb,ldpc_dec->tb_params.c, ldpc_dec->tb_params.cab, ldpc_dec->tb_params.r); - } else { - ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; - } + } else { */ + ops[i]->ldpc_dec.cb_params.e = p_offloadParams->E; + //} - ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; - ops[i]->ldpc_dec.z_c = ldpc_dec->z_c; - ops[i]->ldpc_dec.q_m = ldpc_dec->q_m; - ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler; - ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; - ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; - ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; - ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; //ldpc_dec->op_flags; - ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; + ops[i]->ldpc_dec.basegraph = p_offloadParams->BG; + ops[i]->ldpc_dec.z_c = p_offloadParams->Z; + ops[i]->ldpc_dec.q_m = p_offloadParams->Qm; + ops[i]->ldpc_dec.n_filler = p_offloadParams->F; + ops[i]->ldpc_dec.n_cb = p_offloadParams->n_cb; + ops[i]->ldpc_dec.iter_max = 8; + ops[i]->ldpc_dec.rv_index = p_offloadParams->rv; + ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; - //printf("reference bg %d zc %d qm %d nfiller n_filler, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); -/*char *data; -data = m->buf_addr; -if (i<1) -for (int j=0; j<8; j++) -{printf("input length %d\n",inputs[0].length); -printf("input %p \n",m->buf_addr); -printf("input %p data %x\n",data, *(data+j+256)); - - -} -*/ -//printf("input %p data %x\n",inputs[0].buf_addr, *(inputs[0].buf_addr+j)); if (hard_outputs != NULL) ops[i]->ldpc_dec.hard_output = @@ -1787,62 +1005,11 @@ printf("input %p data %x\n",data, *(data+j+256)); if (harq_outputs != NULL) ops[i]->ldpc_dec.harq_combined_output = harq_outputs[start_idx + i]; - -// if (i<10) -//printf("ldpc_dec input %x\n",*ops[i]->ldpc_dec.input.data->buf_addr); -//printf("ldpc_dec input %x\n",mldpc->buf_addr); - -// struct rte_mbuf *mldpc = ops[i]->ldpc_dec.input.data; -//char *dataldpc; -//dataldpc = (mldpc->buf_addr); -//if (i<10) -//for (int l=0; l<10; l++) -{//printf("input length %d\n",inputs[0].length); -//printf("input mldpc %p \n",mldpc->buf_addr); -//printf("input %p data %x\n",dataldpc, *(dataldpc+l+256)); -//printf("input mlpdc %p \n",dataldpc); - - -} - - } } -static void -copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, - unsigned int start_idx, - struct rte_bbdev_op_data *inputs, - struct rte_bbdev_op_data *outputs, - struct rte_bbdev_enc_op *ref_op) -{ - unsigned int i; - struct rte_bbdev_op_ldpc_enc *ldpc_enc = &ref_op->ldpc_enc; - for (i = 0; i < n; ++i) { - if (ldpc_enc->code_block_mode == 0) { - ops[i]->ldpc_enc.tb_params.ea = ldpc_enc->tb_params.ea; - ops[i]->ldpc_enc.tb_params.eb = ldpc_enc->tb_params.eb; - ops[i]->ldpc_enc.tb_params.cab = - ldpc_enc->tb_params.cab; - ops[i]->ldpc_enc.tb_params.c = ldpc_enc->tb_params.c; - ops[i]->ldpc_enc.tb_params.r = ldpc_enc->tb_params.r; - } else { - ops[i]->ldpc_enc.cb_params.e = ldpc_enc->cb_params.e; - } - ops[i]->ldpc_enc.basegraph = ldpc_enc->basegraph; - ops[i]->ldpc_enc.z_c = ldpc_enc->z_c; - ops[i]->ldpc_enc.q_m = ldpc_enc->q_m; - ops[i]->ldpc_enc.n_filler = ldpc_enc->n_filler; - ops[i]->ldpc_enc.n_cb = ldpc_enc->n_cb; - ops[i]->ldpc_enc.rv_index = ldpc_enc->rv_index; - ops[i]->ldpc_enc.op_flags = ldpc_enc->op_flags; - ops[i]->ldpc_enc.code_block_mode = ldpc_enc->code_block_mode; - ops[i]->ldpc_enc.output = outputs[start_idx + i]; - ops[i]->ldpc_enc.input = inputs[start_idx + i]; - } -} static int check_dec_status_and_ordering(struct rte_bbdev_dec_op *op, @@ -1874,7 +1041,7 @@ check_dec_status_and_ordering(struct rte_bbdev_dec_op *op, return TEST_SUCCESS; } -static int +/*static int check_enc_status_and_ordering(struct rte_bbdev_enc_op *op, unsigned int order_idx, const int expected_status) { @@ -1889,301 +1056,28 @@ check_enc_status_and_ordering(struct rte_bbdev_enc_op *op, return TEST_SUCCESS; } - -static inline int -validate_op_chain(struct rte_bbdev_op_data *op, - struct op_data_entries *orig_op) -{ - uint8_t i; - struct rte_mbuf *m = op->data; - uint8_t nb_dst_segments = orig_op->nb_segments; - uint32_t total_data_size = 0; - - uint32_t r_offset = 0; -char *data; // = m->buf_addr; -//memcpy(ldpc_output, data+128, (rte_pktmbuf_data_len(m) - op->offset)); -//ldpc_output = (int8_t *)(m->buf_addr); -printf("validate op chain nb segs %d offset %d data off %d\n",m->nb_segs, op->offset, m->data_off); -/* -int l=0; -for (l=0;l<16;l++) -{ -printf(" data[%d] = %x\n",l, *(data+l+128)); - -} */ - TEST_ASSERT(nb_dst_segments == m->nb_segs, - "Number of segments differ in original (%u) and filled (%u) op", - nb_dst_segments, m->nb_segs); - - /* Validate each mbuf segment length */ - for (i = 0; i < nb_dst_segments; ++i) { - /* Apply offset to the first mbuf segment */ - uint16_t offset = (i == 0) ? op->offset : 0; - uint16_t data_len = rte_pktmbuf_data_len(m) - offset; - total_data_size += orig_op->segments[i].length; - - data = m->buf_addr; - memcpy(ldpc_output+r_offset, data+m->data_off, data_len); - r_offset +=data_len; -printf("segment %d offset %d length %d data length %d\n",i, offset,total_data_size,data_len); -// TEST_ASSERT(orig_op->segments[i].length == data_len, -// "Length of segment differ in original (%u) and filled (%u) op", -// orig_op->segments[i].length, data_len); -/* TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, - rte_pktmbuf_mtod_offset(m, uint32_t *, offset), - data_len, - "Output buffers (CB=%u) are not equal", i); -*/ - m = m->next; - } - - /* Validate total mbuf pkt length */ - uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; - TEST_ASSERT(total_data_size == pkt_len, - "Length of data differ in original (%u) and filled (%u) op", - total_data_size, pkt_len); - - return TEST_SUCCESS; -} - -/* - * Compute K0 for a given configuration for HARQ output length computation - * As per definition in 3GPP 38.212 Table 5.4.2.1-2 - */ -static inline uint16_t -get_k0(uint16_t n_cb, uint16_t z_c, uint8_t bg, uint8_t rv_index) -{ - if (rv_index == 0) - return 0; - uint16_t n = (bg == 1 ? N_ZC_1 : N_ZC_2) * z_c; - if (n_cb == n) { - if (rv_index == 1) - return (bg == 1 ? K0_1_1 : K0_1_2) * z_c; - else if (rv_index == 2) - return (bg == 1 ? K0_2_1 : K0_2_2) * z_c; - else - return (bg == 1 ? K0_3_1 : K0_3_2) * z_c; - } - /* LBRM case - includes a division by N */ - if (rv_index == 1) - return (((bg == 1 ? K0_1_1 : K0_1_2) * n_cb) - / n) * z_c; - else if (rv_index == 2) - return (((bg == 1 ? K0_2_1 : K0_2_2) * n_cb) - / n) * z_c; - else - return (((bg == 1 ? K0_3_1 : K0_3_2) * n_cb) - / n) * z_c; -} - -/* HARQ output length including the Filler bits */ -static inline uint16_t -compute_harq_len(struct rte_bbdev_op_ldpc_dec *ops_ld) -{ - uint16_t k0 = 0; - uint8_t max_rv = (ops_ld->rv_index == 1) ? 3 : ops_ld->rv_index; - k0 = get_k0(ops_ld->n_cb, ops_ld->z_c, ops_ld->basegraph, max_rv); - /* Compute RM out size and number of rows */ - uint16_t parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) - * ops_ld->z_c - ops_ld->n_filler; - uint16_t deRmOutSize = RTE_MIN( - k0 + ops_ld->cb_params.e + - ((k0 > parity_offset) ? - 0 : ops_ld->n_filler), - ops_ld->n_cb); - uint16_t numRows = ((deRmOutSize + ops_ld->z_c - 1) - / ops_ld->z_c); - uint16_t harq_output_len = numRows * ops_ld->z_c; - return harq_output_len; -} - -static inline int -validate_op_harq_chain(struct rte_bbdev_op_data *op, - struct op_data_entries *orig_op, - struct rte_bbdev_op_ldpc_dec *ops_ld) -{ - uint8_t i; - uint32_t j, jj, k; - struct rte_mbuf *m = op->data; - uint8_t nb_dst_segments = orig_op->nb_segments; - uint32_t total_data_size = 0; - int8_t *harq_orig, *harq_out, abs_harq_origin; - uint32_t byte_error = 0, cum_error = 0, error; - int16_t llr_max = (1 << (ldpc_llr_size - ldpc_llr_decimals)) - 1; - int16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; - uint16_t parity_offset; - - TEST_ASSERT(nb_dst_segments == m->nb_segs, - "Number of segments differ in original (%u) and filled (%u) op", - nb_dst_segments, m->nb_segs); - - /* Validate each mbuf segment length */ - for (i = 0; i < nb_dst_segments; ++i) { - /* Apply offset to the first mbuf segment */ - uint16_t offset = (i == 0) ? op->offset : 0; - uint16_t data_len = rte_pktmbuf_data_len(m) - offset; - total_data_size += orig_op->segments[i].length; - - TEST_ASSERT(orig_op->segments[i].length < - (uint32_t)(data_len + 64), - "Length of segment differ in original (%u) and filled (%u) op", - orig_op->segments[i].length, data_len); - harq_orig = (int8_t *) orig_op->segments[i].addr; - harq_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset); - - if (!(ldpc_cap_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS - ) || (ops_ld->op_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { - data_len -= ops_ld->z_c; - parity_offset = data_len; - } else { - /* Compute RM out size and number of rows */ - parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) - * ops_ld->z_c - ops_ld->n_filler; - uint16_t deRmOutSize = compute_harq_len(ops_ld) - - ops_ld->n_filler; - if (data_len > deRmOutSize) - data_len = deRmOutSize; - if (data_len > orig_op->segments[i].length) - data_len = orig_op->segments[i].length; - } - /* - * HARQ output can have minor differences - * due to integer representation and related scaling - */ - for (j = 0, jj = 0; j < data_len; j++, jj++) { - if (j == parity_offset) { - /* Special Handling of the filler bits */ - for (k = 0; k < ops_ld->n_filler; k++) { - if (harq_out[jj] != - llr_max_pre_scaling) { - printf("HARQ Filler issue %d: %d %d\n", - jj, harq_out[jj], - llr_max); - byte_error++; - } - jj++; - } - } - if (!(ops_ld->op_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { - if (ldpc_llr_decimals > 1) - harq_out[jj] = (harq_out[jj] + 1) - >> (ldpc_llr_decimals - 1); - /* Saturated to S7 */ - if (harq_orig[j] > llr_max) - harq_orig[j] = llr_max; - if (harq_orig[j] < -llr_max) - harq_orig[j] = -llr_max; - } - if (harq_orig[j] != harq_out[jj]) { - error = (harq_orig[j] > harq_out[jj]) ? - harq_orig[j] - harq_out[jj] : - harq_out[jj] - harq_orig[j]; - abs_harq_origin = harq_orig[j] > 0 ? - harq_orig[j] : - -harq_orig[j]; - /* Residual quantization error */ - if ((error > 8 && (abs_harq_origin < - (llr_max - 16))) || - (error > 16)) { - printf("HARQ mismatch %d: exp %d act %d => %d\n", - j, harq_orig[j], - harq_out[jj], error); - byte_error++; - cum_error += error; - } - } - } - m = m->next; - } - - if (byte_error) - TEST_ASSERT(byte_error <= 1, - "HARQ output mismatch (%d) %d", - byte_error, cum_error); - - /* Validate total mbuf pkt length */ - uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; - TEST_ASSERT(total_data_size < pkt_len + 64, - "Length of data differ in original (%u) and filled (%u) op", - total_data_size, pkt_len); - - return TEST_SUCCESS; -} - -static int -validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, - struct rte_bbdev_dec_op *ref_op, const int vector_mask) -{ - unsigned int i; - int ret; - struct op_data_entries *hard_data_orig = - &test_vector.entries[DATA_HARD_OUTPUT]; - struct op_data_entries *soft_data_orig = - &test_vector.entries[DATA_SOFT_OUTPUT]; - struct rte_bbdev_op_turbo_dec *ops_td; - struct rte_bbdev_op_data *hard_output; - struct rte_bbdev_op_data *soft_output; - struct rte_bbdev_op_turbo_dec *ref_td = &ref_op->turbo_dec; - - for (i = 0; i < n; ++i) { - ops_td = &ops[i]->turbo_dec; - hard_output = &ops_td->hard_output; - soft_output = &ops_td->soft_output; - - if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) - TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, - "Returned iter_count (%d) > expected iter_count (%d)", - ops_td->iter_count, ref_td->iter_count); - ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); - TEST_ASSERT_SUCCESS(ret, - "Checking status and ordering for decoder failed"); - - TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, - hard_data_orig), - "Hard output buffers (CB=%u) are not equal", - i); - - if (ref_op->turbo_dec.op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) - TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, - soft_data_orig), - "Soft output buffers (CB=%u) are not equal", - i); - } - - return TEST_SUCCESS; -} - static int validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, - struct rte_bbdev_dec_op *ref_op, const int vector_mask) + struct rte_bbdev_dec_op *ref_op, const int vector_mask, + int8_t* p_out) { -printf("validate ldpc dec op \n"); - unsigned int i; int ret; - struct op_data_entries *hard_data_orig = - &test_vector.entries[DATA_HARD_OUTPUT]; - struct op_data_entries *soft_data_orig = - &test_vector.entries[DATA_SOFT_OUTPUT]; - struct op_data_entries *harq_data_orig = - &test_vector.entries[DATA_HARQ_OUTPUT]; + struct op_data_entries *hard_data_orig ; struct rte_bbdev_op_ldpc_dec *ops_td; struct rte_bbdev_op_data *hard_output; struct rte_bbdev_op_data *harq_output; struct rte_bbdev_op_data *soft_output; struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec; + struct rte_mbuf *m; + char *data; for (i = 0; i < n; ++i) { ops_td = &ops[i]->ldpc_dec; hard_output = &ops_td->hard_output; - harq_output = &ops_td->harq_combined_output; - soft_output = &ops_td->soft_output; - + m = hard_output->data; /* ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); TEST_ASSERT_SUCCESS(ret, "Checking status and ordering for decoder failed"); @@ -2192,39 +1086,11 @@ printf("validate ldpc dec op \n"); "Returned iter_count (%d) > expected iter_count (%d)", ops_td->iter_count, ref_td->iter_count); */ - /* - * We can ignore output data when the decoding failed to - * converge or for loop-back cases - */ -/* if (!check_bit(ops[i]->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK - ) && ( - ops[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR - )) == 0) -*/ -TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, - hard_data_orig), - "Hard output buffers (CB=%u) are not equal", - i); + uint16_t offset = hard_output->offset; + uint16_t data_len = rte_pktmbuf_data_len(m) - offset; - if (ref_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) - TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, - soft_data_orig), - "Soft output buffers (CB=%u) are not equal", - i); - if (ref_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) { - TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, - harq_data_orig, ops_td), - "HARQ output buffers (CB=%u) are not equal", - i); - } - if (ref_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) - TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, - harq_data_orig, ops_td), - "HARQ output buffers (CB=%u) are not equal", - i); + data = m->buf_addr; + memcpy(p_out, data+m->data_off, data_len); } @@ -2232,30 +1098,7 @@ TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, } -static int -validate_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, - struct rte_bbdev_enc_op *ref_op) -{ - unsigned int i; - int ret; - struct op_data_entries *hard_data_orig = - &test_vector.entries[DATA_HARD_OUTPUT]; - - for (i = 0; i < n; ++i) { - ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); - TEST_ASSERT_SUCCESS(ret, - "Checking status and ordering for encoder failed"); - TEST_ASSERT_SUCCESS(validate_op_chain( - &ops[i]->turbo_enc.output, - hard_data_orig), - "Output buffers (CB=%u) are not equal", - i); - } - - return TEST_SUCCESS; -} - -static int +/*static int validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, struct rte_bbdev_enc_op *ref_op) { @@ -2277,85 +1120,30 @@ validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, return TEST_SUCCESS; } +*/ static void -create_reference_dec_op(struct rte_bbdev_dec_op *op) +create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op, t_nrLDPCoffload_params *p_offloadParams) { - unsigned int i; - struct op_data_entries *entry; +// unsigned int i; +// struct op_data_entries *entry; - op->turbo_dec = test_vector.turbo_dec; - entry = &test_vector.entries[DATA_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->turbo_dec.input.length += - entry->segments[i].length; -} - -static void -create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op) -{ - unsigned int i; - struct op_data_entries *entry; - - op->ldpc_dec = test_vector.ldpc_dec; - entry = &test_vector.entries[DATA_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->ldpc_dec.input.length += - entry->segments[i].length; - if (test_vector.ldpc_dec.op_flags & +// op->ldpc_dec = test_vector.ldpc_dec; +// entry = &test_vector.entries[DATA_INPUT]; + //for (i = 0; i < entry->nb_segments; ++i) + op->ldpc_dec.input.length = p_offloadParams->E; +// entry->segments[i].length; + /*if (test_vector.ldpc_dec.op_flags & RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) { entry = &test_vector.entries[DATA_HARQ_INPUT]; for (i = 0; i < entry->nb_segments; ++i) op->ldpc_dec.harq_combined_input.length += entry->segments[i].length; - } + }*/ } -static void -create_reference_enc_op(struct rte_bbdev_enc_op *op) -{ - unsigned int i; - struct op_data_entries *entry; - op->turbo_enc = test_vector.turbo_enc; - entry = &test_vector.entries[DATA_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->turbo_enc.input.length += - entry->segments[i].length; -} - -static void -create_reference_ldpc_enc_op(struct rte_bbdev_enc_op *op) -{ - unsigned int i; - struct op_data_entries *entry; - - op->ldpc_enc = test_vector.ldpc_enc; - entry = &test_vector.entries[DATA_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->ldpc_enc.input.length += - entry->segments[i].length; -} - -static uint32_t -calc_dec_TB_size(struct rte_bbdev_dec_op *op) -{ - uint8_t i; - uint32_t c, r, tb_size = 0; - - if (op->turbo_dec.code_block_mode) { - tb_size = op->turbo_dec.tb_params.k_neg; - } else { - c = op->turbo_dec.tb_params.c; - r = op->turbo_dec.tb_params.r; - for (i = 0; i < c-r; i++) - tb_size += (r < op->turbo_dec.tb_params.c_neg) ? - op->turbo_dec.tb_params.k_neg : - op->turbo_dec.tb_params.k_pos; - } - return tb_size; -} static uint32_t calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) @@ -2377,44 +1165,6 @@ calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) return tb_size; } -static uint32_t -calc_enc_TB_size(struct rte_bbdev_enc_op *op) -{ - uint8_t i; - uint32_t c, r, tb_size = 0; - - if (op->turbo_enc.code_block_mode) { - tb_size = op->turbo_enc.tb_params.k_neg; - } else { - c = op->turbo_enc.tb_params.c; - r = op->turbo_enc.tb_params.r; - for (i = 0; i < c-r; i++) - tb_size += (r < op->turbo_enc.tb_params.c_neg) ? - op->turbo_enc.tb_params.k_neg : - op->turbo_enc.tb_params.k_pos; - } - return tb_size; -} - -static uint32_t -calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op *op) -{ - uint8_t i; - uint32_t c, r, tb_size = 0; - uint16_t sys_cols = (op->ldpc_enc.basegraph == 1) ? 22 : 10; - - if (op->turbo_enc.code_block_mode) { - tb_size = sys_cols * op->ldpc_enc.z_c - op->ldpc_enc.n_filler; - } else { - c = op->turbo_enc.tb_params.c; - r = op->turbo_enc.tb_params.r; - for (i = 0; i < c-r; i++) - tb_size += sys_cols * op->ldpc_enc.z_c - - op->ldpc_enc.n_filler; - } - return tb_size; -} - static int init_test_op_params(struct test_op_params *op_params, @@ -2448,25 +1198,22 @@ init_test_op_params(struct test_op_params *op_params, } static int -run_test_case_on_device(test_case_function *test_case_func, uint8_t dev_id, - struct test_op_params *op_params) +decod_on_device(uint8_t dev_id, + struct test_op_params *op_params, int8_t* p_llr, + t_nrLDPCoffload_params *p_offloadParams, int8_t* p_out) { -printf("run test case on device\n"); int t_ret, f_ret, socket_id = SOCKET_ID_ANY; unsigned int i; struct active_device *ad; unsigned int burst_sz = get_burst_sz(); - -test_vector.op_type= RTE_BBDEV_OP_LDPC_DEC; - -enum rte_bbdev_op_type op_type = test_vector.op_type; + enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; const struct rte_bbdev_op_cap *capabilities = NULL; ad = &active_devs[dev_id]; /* Check if device supports op_type */ - if (!is_avail_op(ad, test_vector.op_type)) + if (!is_avail_op(ad, op_type)) return TEST_SUCCESS; struct rte_bbdev_info info; @@ -2474,17 +1221,14 @@ enum rte_bbdev_op_type op_type = test_vector.op_type; socket_id = GET_SOCKET(info.socket_id); f_ret = create_mempools(ad, socket_id, op_type, - get_num_ops()); + get_num_ops(),p_offloadParams); if (f_ret != TEST_SUCCESS) { printf("Couldn't create mempools"); goto fail; } - if (op_type == RTE_BBDEV_OP_NONE) - op_type = RTE_BBDEV_OP_TURBO_ENC; - - f_ret = init_test_op_params(op_params, test_vector.op_type, - test_vector.expected_status, - test_vector.mask, + f_ret = init_test_op_params(op_params, op_type, + 0, + 0, ad->ops_mempool, burst_sz, get_num_ops(), @@ -2498,7 +1242,7 @@ enum rte_bbdev_op_type op_type = test_vector.op_type; /* Find capabilities */ const struct rte_bbdev_op_cap *cap = info.drv.capabilities; for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { - if (cap->type == test_vector.op_type) { + if (cap->type == op_type) { capabilities = cap; break; } @@ -2507,17 +1251,12 @@ enum rte_bbdev_op_type op_type = test_vector.op_type; TEST_ASSERT_NOT_NULL(capabilities, "Couldn't find capabilities"); - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { - create_reference_dec_op(op_params->ref_dec_op); - } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) - create_reference_enc_op(op_params->ref_enc_op); - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - create_reference_ldpc_enc_op(op_params->ref_enc_op); - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - create_reference_ldpc_dec_op(op_params->ref_dec_op); + create_reference_ldpc_dec_op(op_params->ref_dec_op, p_offloadParams); for (i = 0; i < ad->nb_queues; ++i) { f_ret = fill_queue_buffers(op_params, + p_llr, + p_offloadParams->E, ad->in_mbuf_pool, ad->hard_out_mbuf_pool, ad->soft_out_mbuf_pool, @@ -2533,8 +1272,7 @@ enum rte_bbdev_op_type op_type = test_vector.op_type; } } - /* Run test case function */ - t_ret = test_case_func(ad, op_params); + t_ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); /* Free active device resources and return */ free_buffers(ad, op_params); @@ -2545,13 +1283,12 @@ fail: return TEST_FAILED; } -/* Run given test function per active device per supported op type +/* Run ldpc per active device per supported op type * per burst size. */ static int -run_test_case(test_case_function *test_case_func) +ldpc_decod_ut(int8_t* p_llr, t_nrLDPCoffload_params *p_offloadParams, int8_t* p_out) { -printf("run test case\n"); int ret = 0; uint8_t dev; @@ -2561,10 +1298,9 @@ printf("run test case\n"); TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", RTE_ALIGN(sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE)); -printf("nb_active_devs %d\n",nb_active_devs); /* For each device run test case function */ for (dev = 0; dev < nb_active_devs; ++dev) - ret |= run_test_case_on_device(test_case_func, dev, op_params); + ret |= decod_on_device(dev, op_params, p_llr, p_offloadParams, p_out); rte_free(op_params); @@ -2670,256 +1406,9 @@ preload_harq_ddr(uint16_t dev_id, uint16_t queue_id, } } -static void -dequeue_event_callback(uint16_t dev_id, - enum rte_bbdev_event_type event, void *cb_arg, - void *ret_param) -{ - int ret; - uint16_t i; - uint64_t total_time; - uint16_t deq, burst_sz, num_ops; - uint16_t queue_id = *(uint16_t *) ret_param; - struct rte_bbdev_info info; - double tb_len_bits; - struct thread_params *tp = cb_arg; - - /* Find matching thread params using queue_id */ - for (i = 0; i < MAX_QUEUES; ++i, ++tp) - if (tp->queue_id == queue_id) - break; - - if (i == MAX_QUEUES) { - printf("%s: Queue_id from interrupt details was not found!\n", - __func__); - return; - } - - if (unlikely(event != RTE_BBDEV_EVENT_DEQUEUE)) { - rte_atomic16_set(&tp->processing_status, TEST_FAILED); - printf( - "Dequeue interrupt handler called for incorrect event!\n"); - return; - } - - burst_sz = rte_atomic16_read(&tp->burst_sz); - num_ops = tp->op_params->num_to_process; - - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) - deq = rte_bbdev_dequeue_dec_ops(dev_id, queue_id, - &tp->dec_ops[ - rte_atomic16_read(&tp->nb_dequeued)], - burst_sz); - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - deq = rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, - &tp->dec_ops[ - rte_atomic16_read(&tp->nb_dequeued)], - burst_sz); - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - deq = rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, - &tp->enc_ops[ - rte_atomic16_read(&tp->nb_dequeued)], - burst_sz); - else /*RTE_BBDEV_OP_TURBO_ENC*/ - deq = rte_bbdev_dequeue_enc_ops(dev_id, queue_id, - &tp->enc_ops[ - rte_atomic16_read(&tp->nb_dequeued)], - burst_sz); - - if (deq < burst_sz) { - printf( - "After receiving the interrupt all operations should be dequeued. Expected: %u, got: %u\n", - burst_sz, deq); - rte_atomic16_set(&tp->processing_status, TEST_FAILED); - return; - } - - if (rte_atomic16_read(&tp->nb_dequeued) + deq < num_ops) { - rte_atomic16_add(&tp->nb_dequeued, deq); - return; - } - - total_time = rte_rdtsc_precise() - tp->start_time; - - rte_bbdev_info_get(dev_id, &info); - - ret = TEST_SUCCESS; - - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - ret = validate_dec_op(tp->dec_ops, num_ops, ref_op, - tp->op_params->vector_mask); - /* get the max of iter_count for all dequeued ops */ - for (i = 0; i < num_ops; ++i) - tp->iter_count = RTE_MAX( - tp->dec_ops[i]->turbo_dec.iter_count, - tp->iter_count); - rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); - } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) { - struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; - ret = validate_enc_op(tp->enc_ops, num_ops, ref_op); - rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); - } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) { - struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; - ret = validate_ldpc_enc_op(tp->enc_ops, num_ops, ref_op); - rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); - } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - ret = validate_ldpc_dec_op(tp->dec_ops, num_ops, ref_op, - tp->op_params->vector_mask); - rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); - } - - if (ret) { - printf("Buffers validation failed\n"); - rte_atomic16_set(&tp->processing_status, TEST_FAILED); - } - - switch (test_vector.op_type) { - case RTE_BBDEV_OP_TURBO_DEC: - tb_len_bits = calc_dec_TB_size(tp->op_params->ref_dec_op); - break; - case RTE_BBDEV_OP_TURBO_ENC: - tb_len_bits = calc_enc_TB_size(tp->op_params->ref_enc_op); - break; - case RTE_BBDEV_OP_LDPC_DEC: - tb_len_bits = calc_ldpc_dec_TB_size(tp->op_params->ref_dec_op); - break; - case RTE_BBDEV_OP_LDPC_ENC: - tb_len_bits = calc_ldpc_enc_TB_size(tp->op_params->ref_enc_op); - break; - case RTE_BBDEV_OP_NONE: - tb_len_bits = 0.0; - break; - default: - printf("Unknown op type: %d\n", test_vector.op_type); - rte_atomic16_set(&tp->processing_status, TEST_FAILED); - return; - } - - tp->ops_per_sec += ((double)num_ops) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps += (((double)(num_ops * tb_len_bits)) / 1000000.0) / - ((double)total_time / (double)rte_get_tsc_hz()); - - rte_atomic16_add(&tp->nb_dequeued, deq); -} static int -throughput_intr_lcore_ldpc_dec(void *arg) -{ - struct thread_params *tp = arg; - unsigned int enqueued; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_to_process = tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops[num_to_process]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - int ret, i, j; - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - uint16_t num_to_enq, enq; - - bool loopback = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); - bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), - "Failed to enable interrupts for dev: %u, queue_id: %u", - tp->dev_id, queue_id); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - -char *addrb = &bufs->inputs[0].data->buf_addr; - -unsigned int lm; -for (lm=0; lm<16;lm++ ){ -printf("bufs len %d data %x addr orig %p addr %p\n",bufs->inputs[0].data->data_len,*(addrb+lm+256),(addrb+lm),(addrb+lm+256)); -} - - - rte_atomic16_clear(&tp->processing_status); - rte_atomic16_clear(&tp->nb_dequeued); - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, - num_to_process); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_to_process); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops, num_to_process, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_to_process; ++j) - ops[j]->opaque_data = (void *)(uintptr_t)j; - - for (j = 0; j < TEST_REPETITIONS; ++j) { - for (i = 0; i < num_to_process; ++i) { - if (!loopback) - rte_pktmbuf_reset( - ops[i]->ldpc_dec.hard_output.data); - if (hc_out || loopback) - mbuf_reset( - ops[i]->ldpc_dec.harq_combined_output.data); - } - - tp->start_time = rte_rdtsc_precise(); - for (enqueued = 0; enqueued < num_to_process;) { - num_to_enq = burst_sz; - - if (unlikely(num_to_process - enqueued < num_to_enq)) - num_to_enq = num_to_process - enqueued; - - enq = 0; - do { - enq += rte_bbdev_enqueue_ldpc_dec_ops( - tp->dev_id, - queue_id, &ops[enqueued], - num_to_enq); - } while (unlikely(num_to_enq != enq)); - enqueued += enq; - - /* Write to thread burst_sz current number of enqueued - * descriptors. It ensures that proper number of - * descriptors will be dequeued in callback - * function - needed for last batch in case where - * the number of operations is not a multiple of - * burst size. - */ - rte_atomic16_set(&tp->burst_sz, num_to_enq); - - /* Wait until processing of previous batch is - * completed - */ - while (rte_atomic16_read(&tp->nb_dequeued) != - (int16_t) enqueued) - rte_pause(); - } - if (j != TEST_REPETITIONS - 1) - rte_atomic16_clear(&tp->nb_dequeued); - } - - return TEST_SUCCESS; -} - - - -static int -throughput_pmd_lcore_ldpc_dec(void *arg) +pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p_out) { struct thread_params *tp = arg; uint16_t enq, deq; @@ -2972,10 +1461,10 @@ throughput_pmd_lcore_ldpc_dec(void *arg) ref_op->ldpc_dec.iter_max = get_iter_max(); ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; - if (test_vector.op_type != RTE_BBDEV_OP_NONE) + //if (test_vector.op_type != RTE_BBDEV_OP_NONE) copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op); + bufs->harq_inputs, bufs->harq_outputs, ref_op, p_offloadParams); /* Set counter to validate the ordering */ for (j = 0; j < num_ops; ++j) @@ -3039,9 +1528,8 @@ throughput_pmd_lcore_ldpc_dec(void *arg) } //if (test_vector.op_type != RTE_BBDEV_OP_NONE) { -//printf("op type != OP NONE\n"); -ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, - tp->op_params->vector_mask); + ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, + tp->op_params->vector_mask, p_out); TEST_ASSERT_SUCCESS(ret, "Validation failed!"); //} @@ -3058,96 +1546,6 @@ ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, return TEST_SUCCESS; } -static int -throughput_pmd_lcore_ldpc_enc(void *arg) -{ - struct thread_params *tp = arg; - uint16_t enq, deq; - uint64_t total_time = 0, start_time; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_ops = tp->op_params->num_to_process; - struct rte_bbdev_enc_op *ops_enq[num_ops]; - struct rte_bbdev_enc_op *ops_deq[num_ops]; - struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - struct rte_bbdev_info info; - uint16_t num_to_enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, - num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_ops); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_enc_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < TEST_REPETITIONS; ++i) { - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - for (j = 0; j < num_ops; ++j) - mbuf_reset(ops_enq[j]->turbo_enc.output.data); - - start_time = rte_rdtsc_precise(); - - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; - - if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; - - enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - /* dequeue the remaining */ - while (deq < enq) { - deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - total_time += rte_rdtsc_precise() - start_time; - } - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_ldpc_enc_op(ops_deq, num_ops, ref_op); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); - - double tb_len_bits = calc_ldpc_enc_TB_size(ref_op); - - tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) - / 1000000.0) / ((double)total_time / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} static void print_enc_throughput(struct thread_params *t_params, unsigned int used_cores) @@ -3193,47 +1591,21 @@ print_dec_throughput(struct thread_params *t_params, unsigned int used_cores) used_cores, total_mops, total_mbps, iter_count); } -/* Aggregate the performance results over the number of cores used */ -static void -print_dec_bler(struct thread_params *t_params, unsigned int used_cores) -{ - unsigned int core_idx = 0; - double total_mbps = 0, total_bler = 0, total_iter = 0; - double snr = get_snr(); - - for (core_idx = 0; core_idx < used_cores; core_idx++) { - printf("Core%u BLER %.1f %% - Iters %.1f - Tp %.1f Mbps %s\n", - t_params[core_idx].lcore_id, - t_params[core_idx].bler * 100, - t_params[core_idx].iter_average, - t_params[core_idx].mbps, - get_vector_filename()); - total_mbps += t_params[core_idx].mbps; - total_bler += t_params[core_idx].bler; - total_iter += t_params[core_idx].iter_average; - } - total_bler /= used_cores; - total_iter /= used_cores; - - printf("SNR %.2f BLER %.1f %% - Iterations %.1f %d - Tp %.1f Mbps %s\n", - snr, total_bler * 100, total_iter, get_iter_max(), - total_mbps, get_vector_filename()); -} - /* * Test function that determines how long an enqueue + dequeue of a burst * takes on available lcores. */ -static int -throughput_test(struct active_device *ad, - struct test_op_params *op_params) +int +start_pmd_dec(struct active_device *ad, + struct test_op_params *op_params, + t_nrLDPCoffload_params *p_offloadParams, + int8_t* p_out) { int ret; unsigned int lcore_id, used_cores = 0; struct thread_params *t_params, *tp; struct rte_bbdev_info info; - lcore_function_t *throughput_function; uint16_t num_lcores; const char *op_type_str; @@ -3244,7 +1616,7 @@ throughput_test(struct active_device *ad, test_vector.op_type); printf("+ ------------------------------------------------------- +\n"); - printf("== new test: throughput\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", + printf("== start pmd dec\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", info.dev_name, ad->nb_queues, op_params->burst_sz, op_params->num_to_process, op_params->num_lcores, op_type_str, @@ -3282,12 +1654,12 @@ throughput_test(struct active_device *ad, t_params[used_cores].queue_id = ad->queue_ids[used_cores]; t_params[used_cores].iter_count = 0; - rte_eal_remote_launch(throughput_pmd_lcore_ldpc_dec, + rte_eal_remote_launch(pmd_lcore_ldpc_dec, &t_params[used_cores++], lcore_id); } rte_atomic16_set(&op_params->sync, SYNC_START); - ret = throughput_pmd_lcore_ldpc_dec(&t_params[0]); + ret = pmd_lcore_ldpc_dec(&t_params[0], p_offloadParams, p_out); /* Master core is always used */ for (used_cores = 1; used_cores < num_lcores; used_cores++) @@ -3355,54 +1727,10 @@ throughput_test(struct active_device *ad, return ret; } -static int -throughput_tc(void) -{ - return run_test_case(throughput_test); -} - - - -static int -interrupt_tc(void) -{ - return run_test_case(throughput_test); -} - -static struct unit_test_suite bbdev_throughput_testsuite = { - .suite_name = "BBdev Throughput Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, throughput_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - - -REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); - - -#define MAX_QUEUES RTE_MAX_LCORE -#define TEST_REPETITIONS 1000 -/* Switch between PMD and Interrupt for throughput TC */ -static bool intr_enabled; -//static struct test_bbdev_vector test_vector; -/* LLR arithmetic representation for numerical conversion */ -static int ldpc_llr_decimals; -static int ldpc_llr_size; -/* Keep track of the LDPC decoder device capability flag */ -static uint32_t ldpc_cap_flags; - - -/* Defines how many testcases can be specified as cmdline args */ -#define MAX_CMDLINE_TESTCASES 8 - -static const char tc_sep = ','; /* Declare structure for command line test parameters and options */ static struct test_params { - struct test_command *test_to_run[MAX_CMDLINE_TESTCASES]; + struct test_command *test_to_run[8]; unsigned int num_tests; unsigned int num_ops; unsigned int burst_sz; @@ -3413,87 +1741,6 @@ static struct test_params { bool init_device; } test_params; -static struct test_commands_list commands_list = - TAILQ_HEAD_INITIALIZER(commands_list); - -void -add_test_command(struct test_command *t) -{ - TAILQ_INSERT_TAIL(&commands_list, t, next); -} -int -unit_test_suite_runner(struct unit_test_suite *suite) -{ - int test_result = TEST_SUCCESS; - unsigned int total = 0, skipped = 0, succeeded = 0, failed = 0; - uint64_t start, end; - - printf("\n===========================================================\n"); - printf("Starting Test Suite : %s\n", suite->suite_name); - - start = rte_rdtsc_precise(); - - if (suite->setup) { - test_result = suite->setup(); - if (test_result == TEST_FAILED) { - printf(" + Test suite setup %s failed!\n", - suite->suite_name); - printf(" + ------------------------------------------------------- +\n"); - return 1; - } - if (test_result == TEST_SKIPPED) { - printf(" + Test suite setup %s skipped!\n", - suite->suite_name); - printf(" + ------------------------------------------------------- +\n"); - return 0; - } - } - - while (suite->unit_test_cases[total].testcase) { - if (suite->unit_test_cases[total].setup) - test_result = suite->unit_test_cases[total].setup(); - - if (test_result == TEST_SUCCESS) - test_result = suite->unit_test_cases[total].testcase(); - - // if (suite->unit_test_cases[total].teardown) - // suite->unit_test_cases[total].teardown(); - - if (test_result == TEST_SUCCESS) { - succeeded++; - printf("TestCase [%2d] : %s passed\n", total, - suite->unit_test_cases[total].name); - } else if (test_result == TEST_SKIPPED) { - skipped++; - printf("TestCase [%2d] : %s skipped\n", total, - suite->unit_test_cases[total].name); - } else { - failed++; - printf("TestCase [%2d] : %s failed\n", total, - suite->unit_test_cases[total].name); - } - - total++; - } - - /* Run test suite teardown */ - if (suite->teardown) - suite->teardown(); - - end = rte_rdtsc_precise(); - - printf(" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\n"); - printf(" + Test Suite Summary : %s\n", suite->suite_name); - printf(" + Tests Total : %2d\n", total); - printf(" + Tests Skipped : %2d\n", skipped); - printf(" + Tests Passed : %2d\n", succeeded); - printf(" + Tests Failed : %2d\n", failed); - printf(" + Tests Lasted : %lg ms\n", - ((end - start) * 1000) / (double)rte_get_tsc_hz()); - printf(" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\n"); - - return (failed > 0) ? 1 : 0; -} const char * get_vector_filename(void) { @@ -3534,168 +1781,17 @@ get_init_device(void) { return test_params.init_device; } -static void -print_usage(const char *prog_name) -{ - struct test_command *t; - printf("***Usage: %s [EAL params] [-- [-n/--num-ops NUM_OPS]\n" - "\t[-b/--burst-size BURST_SIZE]\n" - "\t[-v/--test-vector VECTOR_FILE]\n" - "\t[-c/--test-cases TEST_CASE[,TEST_CASE,...]]]\n", - prog_name); - - printf("Available testcases: "); - TAILQ_FOREACH(t, &commands_list, next) - printf("%s ", t->command); - printf("\n"); -} - - -static int -init_input(uint32_t **data, uint32_t data_length) -{ - uint32_t n_values = 0; - uint32_t data_size = 32; - - uint32_t *values, *values_resized; - - values = (uint32_t *) - rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0); - if (values == NULL) - return -1; - - values_resized = NULL; - - - n_values = data_length>>2; -//printf("data len %d n %d\n",*data_length,n_values); - values_resized = (uint32_t *) rte_realloc(values, - sizeof(uint32_t) * (n_values+1), 0); - -//printf("resized values addr %p\n",values_resized); - if (values_resized == NULL) { - rte_free(values); - return -1; - } - - *data = values_resized; - - return 0; -} - -static int -init_output(uint32_t **data, uint32_t data_length) -{ - uint32_t n_values = 0; - uint32_t data_size = 32; - - uint32_t *values, *values_resized; - - values = (uint32_t *) - rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0); - if (values == NULL) - return -1; - - values_resized = NULL; - - -n_values = data_length>>2; -//printf("data len %d n %d\n",*data_length,n_values); - values_resized = (uint32_t *) rte_realloc(values, - sizeof(uint32_t) * (n_values+1), 0); - -//printf("resized values addr %p\n",values_resized); - if (values_resized == NULL) { - rte_free(values); - return -1; - } - - *data = values_resized; - - return 0; -} - -int -init_entry(struct test_bbdev_vector *vector, enum op_data_type type, uint32_t data_length) -{ - int ret; - uint32_t *data = NULL; - unsigned int id; - struct op_data_buf *op_data; - unsigned int *nb_ops; - - if (type >= DATA_NUM_TYPES) { - printf("Unknown op type: %d!\n", type); - return -1; - } - - op_data = vector->entries[type].segments; - nb_ops = &vector->entries[type].nb_segments; -printf("init entry nb segs %d\n",*nb_ops); - if (*nb_ops >= RTE_BBDEV_TURBO_MAX_CODE_BLOCKS) { - printf("Too many segments (code blocks defined): %u, max %d!\n", - *nb_ops, RTE_BBDEV_TURBO_MAX_CODE_BLOCKS); - return -1; - } - -//(*nb_ops)--; - /* Clear new op data struct */ - memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf)); -//for (int i=0; iqueue_id; - const uint16_t burst_sz = 2; //tp->op_params->burst_sz; - const uint16_t num_ops = 2; //tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops_enq[num_ops]; - struct rte_bbdev_dec_op *ops_deq[num_ops]; - struct thread_params *tp=&t_params_tp[0]; + t_nrLDPCoffload_params offloadParams; + t_nrLDPCoffload_params* p_offloadParams = &offloadParams; - // struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - struct rte_bbdev_info info; - uint16_t num_to_enq; - uint32_t offset=0; - uint32_t data_len=0; + uint32_t numIter = 0; + int ret; -// bufs->inputs->data->buf_addr = p_llr; -// ops_enq[i]->ldpc_dec.input.data->buf_addr = p_llr; - -//int count_init = 0; -//int ret; int argc_re=4; char *argv_re[15]; argv_re[0] = "/home/wang/dpdk2005/dpdk-20.05/build/app/testbbdev"; @@ -3706,7 +1802,7 @@ argv_re[2] = "-v"; argv_re[3] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"; if (count_init == 0) { -printf("argcre %d argvre %s %s %s %s\n", argc_re, argv_re[0], argv_re[1], argv_re[2], argv_re[3],argv_re[4]); +printf("argcre %d argvre %s %s %s %s\n", argc_re, argv_re[0], argv_re[1], argv_re[2], argv_re[3]); count_init++; ret = rte_eal_init(argc_re, argv_re); } @@ -3715,14 +1811,12 @@ argv_re[0] = "--"; argv_re[1] = "-v"; argv_re[2] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"; -//printf("after ......ret %d argc %d argv %s %s %s %s\n", ret,argc, argv[0], argv[1], argv[2], argv[3],argv[4]); memset(&test_vector_dec, 0, sizeof(struct test_bbdev_vector)); struct rte_bbdev_op_ldpc_dec *ldpc_dec = &test_vector_dec.ldpc_dec; test_vector.op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; test_vector.expected_status = 0; -//printf("test vector expected status %d\n",test_vector.expected_status); ldpc_dec->cb_params.e = E; ldpc_dec->iter_count = 3; @@ -3737,121 +1831,27 @@ ldpc_dec->iter_count = 3; ldpc_dec->code_block_mode = (C>1)?1:0; ldpc_dec->tb_params.ea = E; ldpc_dec->tb_params.eb = E; -ldpc_dec->tb_params.c = C; ldpc_dec->tb_params.r = 0; -printf("reference bg %d zc %d qm %d nfiller %d, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); -struct op_data_entries *ref_entries = - &test_vector_dec.entries[0]; -ref_entries->nb_segments = C; -for (i=0;isegments[i].addr = (int32_t *)(p_llr+offset); -offset += E; -} -//memcpy(ref_entries->segments[0].addr, p_llr, 8448); + device_setup(); + ut_setup(); -/*printf("ref seg addr %p +384 %p data %x\n", ref_entries->segments[0].addr,(ref_entries->segments[0].addr+384), *(ref_entries->segments[0].addr+384)); -int l=0; -for (l=0;l<8;l++) -printf("ref seg addr +384 %p data %x\n", (ref_entries->segments[0].addr+384+l), *(ref_entries->segments[0].addr+384+l)); -*/ + p_offloadParams->E = E; + p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); + p_offloadParams->BG = p_decParams->BG; + p_offloadParams->Z = p_decParams->Z; + p_offloadParams->rv = rv; + p_offloadParams->F = F; + p_offloadParams->Qm = Qm; + ldpc_decod_ut(p_llr, p_offloadParams, p_out); -snprintf(test_params.test_vector_filename,sizeof(test_params.test_vector_filename),"%s", argv_re[2]); - -test_params.num_ops=2; -test_params.burst_sz=2; -test_params.num_lcores=1; -test_params.num_tests = 1; -//run_all_tests(); - -testsuite_setup(); -ut_setup(); - -throughput_tc(); - - -char *data = ldpc_output; -data_len = (p_decParams->BG==1)?(22*p_decParams->Z):(10*p_decParams->Z); -memcpy(&p_out[0], data, C*data_len); -//p_out = ldpc_output; -ut_teardown(); - -//for (i=0;i<8;i++) -//printf("p_out[%d] = %x addr %p ldpcout addr %p\n",i,p_out[i],p_out+i,ldpc_output+i); - - bool extDdr = false; //check_bit(ldpc_cap_flags, - //RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); - bool loopback = true; //false; //check_bit(ref_op->ldpc_dec.op_flags, - // RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); - bool hc_out = false; //check_bit(ref_op->ldpc_dec.op_flags, - //RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); -/* t_params_tp = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), - RTE_CACHE_LINE_SIZE); - TEST_ASSERT_NOT_NULL(t_params_tp, "Failed to alloc %zuB for t_params", - RTE_ALIGN(sizeof(struct thread_params) * num_lcores, - RTE_CACHE_LINE_SIZE)); - while (rte_atomic16_read(&t_params_tp->op_params->sync) == 0) //SYNC_WAIT) - rte_pause(); - -ret = rte_bbdev_dec_op_alloc_bulk(t_params_tp->op_params->mp, ops_enq, num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); - -*/ - // throughput_pmd_lcore_ldpc_dec(&t_params_tp[0]); - /* ref_op->ldpc_dec.iter_max = get_iter_max(); - ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op); -*/ -// for (j = 0; j < num_ops; ++j) -// ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - -// for (i = 0; i < TEST_REPETITIONS; ++i) { - for (j = 0; j < num_ops; ++j) { - if (!loopback) - mbuf_reset( - ops_enq[j]->ldpc_dec.hard_output.data); - // if (hc_out || loopback) - // mbuf_reset( - // ops_enq[j]->ldpc_dec.harq_combined_output.data); - } - if (extDdr) { - bool preload = i == (TEST_REPETITIONS - 1); - preload_harq_ddr(tp->dev_id, queue_id, ops_enq, - num_ops, preload); - } - -//printf("ops enq buff addr %d\n",ops_enq[0]->ldpc_dec.input.data->buf_addr); - -// for (enq = 0, deq = 0; enq < num_ops;) { -// num_to_enq = burst_sz; - - //ops_enq[enq]->ldpc_dec.input.data->buf_addr = p_llr; - //memcpy(ops_enq[enq]->ldpc_dec.input.data->buf_addr, p_llr, 128); - - -/* if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; - - - enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - while (deq < enq) { - deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } -*/ -// } + //ut_teardown(); return numIter; } diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h index b7b15b5d33..d75c5e0709 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h @@ -74,6 +74,20 @@ typedef struct nrLDPC_dec_params { e_nrLDPC_outMode outMode; /**< Output format */ } t_nrLDPC_dec_params; +/** + Structure containing LDPC decoder parameters. + */ +typedef struct nrLDPCoffload_params { + uint8_t BG; /**< Base graph */ + uint16_t Z; + uint16_t Kr; + uint8_t rv; + uint32_t E; + uint16_t n_cb; + uint16_t F; /**< Filler bits */ + uint8_t Qm; /**< Modulation */ +} t_nrLDPCoffload_params; + /** Structure containing LDPC decoder processing time statistics. */ diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index cf11e434e3..a8be5d379c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -576,7 +576,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, offset = 0; if (enable_ldpc_offload) { - memset(harq_process->c[0],0,Kr_bytes); if (harq_process->C == 1) { if (A > 3824) @@ -594,7 +593,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, E = nr_get_E(G, harq_process->C, Qm, n_layers, 0); - memcpy((&z_ol[0]),ulsch_llr,G*sizeof(int16_t)); + for (r=0; rC; r++) { + memset(harq_process->c[r],0,Kr_bytes); + + memcpy((&z_ol[0]),ulsch_llr+r*E,E*sizeof(int16_t)); for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) { @@ -602,7 +604,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, } ret = nrLDPC_decoder_offload(p_decParams, - harq_process->C, + 1, //harq_process->C, pusch_pdu->pusch_data.rv_index, harq_process->F, E, @@ -610,8 +612,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, (int8_t*)&pl_ol128[0], llrProcBuf); - for (r=0; rC; r++) { - for (int m=0; m < Kr>>3; m ++) { harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; } @@ -627,12 +627,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, #endif no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; } - /*for (int k=0;k<8;k++) + for (int k=0;k<8;k++) { printf("output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); } - */ + memcpy(harq_process->b+offset, harq_process->c[r], @@ -649,7 +649,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, for (r=0; rC; r++) { E = nr_get_E(G, harq_process->C, Qm, n_layers, r); -printf("rm length %d seg %d\n", E,r); union ldpcReqUnion id = {.s={ulsch->rnti,frame,nr_tti_rx,0,0}}; notifiedFIFO_elt_t *req=newNotifiedFIFO_elt(sizeof(ldpcDecode_t), id.p, phy_vars_gNB->respDecode, nr_processULSegment_ptr); ldpcDecode_t * rdata=(ldpcDecode_t *) NotifiedFifoData(req); From 6532db123349401df3552034e5161485fd1c1665 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Sat, 7 Aug 2021 15:07:35 +0200 Subject: [PATCH 009/136] moving device init functions out from decoding --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 75 ++++--------------- openair1/PHY/CODING/nrLDPC_defs.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 6 +- openair1/SIMULATION/NR_PHY/ulsim.c | 17 +++++ 4 files changed, 36 insertions(+), 64 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index c0fe83ec19..880ca4780e 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -57,7 +57,6 @@ #include #include "nrLDPC_offload.h" -uint8_t count_initdev =0; #include #include @@ -580,13 +579,10 @@ populate_active_devices(void) static int device_setup(void) { -if (count_initdev ==0) { -count_initdev++; if (populate_active_devices() == 0) { printf("No suitable devices found!\n"); return TEST_SKIPPED; } -} return TEST_SUCCESS; } @@ -1445,8 +1441,6 @@ pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - //&op_params->q_bufs[socket_id][queue_id].inputs -//printf("bufs len %d\n",bufs->input.data->data_len); while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) rte_pause(); @@ -1492,19 +1486,12 @@ pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p if (unlikely(num_ops - enq < num_to_enq)) num_to_enq = num_ops - enq; - //printf("pmd lcore ldpc dec data %x\n", *ops_enq[enq]->ldpc_dec.input.addr); - enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, queue_id, &ops_enq[enq], num_to_enq); deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, queue_id, &ops_deq[deq], enq - deq); -/* ops_td = &ops_deq[enq]->ldpc_dec; - hard_output = &ops_td->hard_output; - struct rte_mbuf *m = hard_output->data; - printf("deq nb segs %d\n", m->nb_segs); -*/ } /* dequeue the remaining */ @@ -1782,9 +1769,8 @@ get_init_device(void) return test_params.init_device; } -int count_init = 0; - -int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint16_t F, uint32_t E, uint8_t Qm, int8_t* p_llr, int8_t* p_out) +int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint16_t F, + uint32_t E, uint8_t Qm, int8_t* p_llr, int8_t* p_out, uint8_t mode) { t_nrLDPCoffload_params offloadParams; t_nrLDPCoffload_params* p_offloadParams = &offloadParams; @@ -1792,55 +1778,24 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ uint32_t numIter = 0; int ret; -int argc_re=4; -char *argv_re[15]; -argv_re[0] = "/home/wang/dpdk2005/dpdk-20.05/build/app/testbbdev"; -argv_re[1] = "--"; //./build/app/testbbdev"; -//argv_re[2] = "-c"; -//argv_re[3] = "throughput"; -argv_re[2] = "-v"; -argv_re[3] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"; -if (count_init == 0) { - -printf("argcre %d argvre %s %s %s %s\n", argc_re, argv_re[0], argv_re[1], argv_re[2], argv_re[3]); -count_init++; - ret = rte_eal_init(argc_re, argv_re); -} -argc_re = 3; -argv_re[0] = "--"; -argv_re[1] = "-v"; -argv_re[2] = "../../../targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"; - - - memset(&test_vector_dec, 0, sizeof(struct test_bbdev_vector)); - -struct rte_bbdev_op_ldpc_dec *ldpc_dec = &test_vector_dec.ldpc_dec; -test_vector.op_type = RTE_BBDEV_OP_LDPC_DEC; //vector->op_type; -test_vector.expected_status = 0; - - ldpc_dec->cb_params.e = E; -ldpc_dec->iter_count = 3; - ldpc_dec->basegraph = p_decParams->BG; - ldpc_dec->z_c = p_decParams->Z; - ldpc_dec->q_m = Qm; - ldpc_dec->n_filler = F; - ldpc_dec->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); - ldpc_dec->iter_max = 8; - ldpc_dec->rv_index = rv; - ldpc_dec->op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - ldpc_dec->code_block_mode = (C>1)?1:0; -ldpc_dec->tb_params.ea = E; -ldpc_dec->tb_params.eb = E; -ldpc_dec->tb_params.r = 0; - + int argc_re=2; + char *argv_re[2]; + argv_re[0] = "/home/wang/dpdk2005/dpdk-20.05/build/app/testbbdev"; + argv_re[1] = "--"; test_params.num_ops=1; test_params.burst_sz=1; test_params.num_lcores=1; test_params.num_tests = 1; - device_setup(); - ut_setup(); + if (mode==0){ + printf("offload mode %d\n", mode); + ret = rte_eal_init(argc_re, argv_re); + + device_setup(); + ut_setup(); + } + else{ p_offloadParams->E = E; p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); @@ -1850,7 +1805,7 @@ ldpc_dec->tb_params.r = 0; p_offloadParams->F = F; p_offloadParams->Qm = Qm; ldpc_decod_ut(p_llr, p_offloadParams, p_out); - + } //ut_teardown(); return numIter; diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h index f793e92b62..4207779638 100644 --- a/openair1/PHY/CODING/nrLDPC_defs.h +++ b/openair1/PHY/CODING/nrLDPC_defs.h @@ -74,7 +74,7 @@ typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,sho typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); //typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); -typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint16_t, uint32_t, uint8_t, int8_t*, int8_t* ); +typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint16_t, uint32_t, uint8_t, int8_t*, int8_t* ,uint8_t ); typedef int32_t(*nrLDPC_dectopfunc_t)(void); #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index a8be5d379c..95e89b364f 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -610,7 +610,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, E, Qm, (int8_t*)&pl_ol128[0], - llrProcBuf); + llrProcBuf, 1); for (int m=0; m < Kr>>3; m ++) { harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; @@ -627,12 +627,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, #endif no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; } - for (int k=0;k<8;k++) + /*for (int k=0;k<8;k++) { printf("output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); } - + */ memcpy(harq_process->b+offset, harq_process->c[r], diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index cfefd4e612..79f39d10f9 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -260,6 +260,7 @@ channel_desc_t *UE2gNB[NUMBER_OF_UE_MAX][NUMBER_OF_gNB_MAX]; int main(int argc, char **argv) { + char c; int i; double SNR, snr0 = -2.0, snr1 = 2.0; @@ -642,6 +643,22 @@ int main(int argc, char **argv) load_nrLDPClib_offload(); + t_nrLDPC_dec_params decParams; + t_nrLDPC_dec_params* p_decParams = &decParams; + int8_t l_ol [68*384]; + __m128i *pl_ol128 = (__m128i*)&l_ol; + int8_t llrProcBuf[22*384]; + + nrLDPC_decoder_offload(p_decParams, + 1, + 0, + 0, + 0, + 2, + (int8_t*)&pl_ol128[0], + llrProcBuf, 0); + + if (snr1set == 0) snr1 = snr0 + 10; double sampling_frequency; From 7b88c36ba6641ad532d03d7abcf83f36ea838c77 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 18 Aug 2021 11:47:17 +0200 Subject: [PATCH 010/136] moving more init functions to device initialization --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 379 ++++++------------ openair1/PHY/CODING/nrLDPC_defs.h | 4 +- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 8 +- openair1/SIMULATION/NR_PHY/ulsim.c | 10 +- 4 files changed, 136 insertions(+), 265 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 880ca4780e..2ebb32ce99 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -28,7 +28,6 @@ * \warning */ - #include #include #include "nrLDPCdecoder_defs.h" @@ -73,7 +72,7 @@ #define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id)) #define MAX_QUEUES RTE_MAX_LCORE -#define TEST_REPETITIONS 1 +#define TEST_REPETITIONS 1 #ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC #include @@ -114,19 +113,11 @@ /* Headroom for filler LLRs insertion in HARQ buffer */ #define FILLER_HEADROOM 1024 -struct test_bbdev_vector test_vector; -struct test_bbdev_vector test_vector_dec; /* Switch between PMD and Interrupt for throughput TC */ static bool intr_enabled; -/* LLR arithmetic representation for numerical conversion */ -static int ldpc_llr_decimals; -static int ldpc_llr_size; -/* Keep track of the LDPC decoder device capability flag */ -static uint32_t ldpc_cap_flags; - /* Represents tested active devices */ -static struct active_device { +struct active_device { const char *driver_name; uint8_t dev_id; uint16_t supported_ops; @@ -286,7 +277,6 @@ create_mbuf_pool(uint32_t length, uint8_t dev_id, int socket_id, unsigned int mbuf_pool_size, const char *op_type_str) { - unsigned int i; uint32_t max_seg_sz = 0; char pool_name[RTE_MEMPOOL_NAMESIZE]; @@ -358,7 +348,6 @@ create_mempools(struct active_device *ad, int socket_id, socket_id); ad->in_mbuf_pool = mp; } - /* Hard outputs */ if (nb_segments > 0) { mbuf_pool_size = optimal_mempool_size(ops_pool_size * @@ -765,45 +754,6 @@ allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len, } -/* - * We may have to insert filler bits - * when they are required by the HARQ assumption - */ -static void -ldpc_add_filler(struct rte_bbdev_op_data *input_ops, - const uint16_t n, struct test_op_params *op_params) -{ - struct rte_bbdev_op_ldpc_dec dec = op_params->ref_dec_op->ldpc_dec; - - if (input_ops == NULL) - return; - /* No need to add filler if not required by device */ - if (!(ldpc_cap_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS)) - return; - /* No need to add filler for loopback operation */ - if (dec.op_flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) - return; - - uint16_t i, j, parity_offset; - for (i = 0; i < n; ++i) { - struct rte_mbuf *m = input_ops[i].data; - int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, - input_ops[i].offset); - parity_offset = (dec.basegraph == 1 ? 20 : 8) - * dec.z_c - dec.n_filler; - uint16_t new_hin_size = input_ops[i].length + dec.n_filler; - m->data_len = new_hin_size; - input_ops[i].length = new_hin_size; - for (j = new_hin_size - 1; j >= parity_offset + dec.n_filler; - j--) - llr[j] = llr[j - dec.n_filler]; - uint16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; - for (j = 0; j < dec.n_filler; j++) - llr[parity_offset + j] = llr_max_pre_scaling; - } -} - static void ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops, const uint16_t n, const int8_t llr_size, @@ -856,6 +806,9 @@ fill_queue_buffers(struct test_op_params *op_params,int8_t* p_llr, uint32_t data int ret; enum op_data_type type; const uint16_t n = op_params->num_to_process; + int ldpc_llr_decimals; + int ldpc_llr_size; + uint32_t ldpc_cap_flags; struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { in_mp, @@ -885,29 +838,19 @@ fill_queue_buffers(struct test_op_params *op_params,int8_t* p_llr, uint32_t data mbuf_pools[type], n, type, min_alignment); TEST_ASSERT_SUCCESS(ret, "Couldn't init rte_bbdev_op_data structs"); + } -// if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { bool loopback = op_params->ref_dec_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; bool llr_comp = op_params->ref_dec_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_LLR_COMPRESSION; - bool harq_comp = op_params->ref_dec_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; ldpc_llr_decimals = capabilities->cap.ldpc_dec.llr_decimals; ldpc_llr_size = capabilities->cap.ldpc_dec.llr_size; ldpc_cap_flags = capabilities->cap.ldpc_dec.capability_flags; if (!loopback && !llr_comp) ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n, ldpc_llr_size, ldpc_llr_decimals); - if (!loopback && !harq_comp) - ldpc_input_llr_scaling(*queue_ops[DATA_HARQ_INPUT], n, - ldpc_llr_size, ldpc_llr_decimals); - if (!loopback) - ldpc_add_filler(*queue_ops[DATA_HARQ_INPUT], n, - op_params); -// } - return 0; } @@ -946,7 +889,7 @@ maxstar(double A, double B) } static void -copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, +set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, unsigned int start_idx, struct rte_bbdev_op_data *inputs, struct rte_bbdev_op_data *hard_outputs, @@ -957,7 +900,7 @@ copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, t_nrLDPCoffload_params *p_offloadParams) { unsigned int i; - struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; + //struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; for (i = 0; i < n; ++i) { /* if (ldpc_dec->code_block_mode == 0) { ops[i]->ldpc_dec.tb_params.ea = @@ -1007,12 +950,11 @@ copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, -static int +/*static int check_dec_status_and_ordering(struct rte_bbdev_dec_op *op, unsigned int order_idx, const int expected_status) { int status = op->status; - /* ignore parity mismatch false alarms for long iterations */ if (get_iter_max() >= 10) { if (!(expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) && (status & (1 << RTE_BBDEV_SYNDROME_ERROR))) { @@ -1037,7 +979,7 @@ check_dec_status_and_ordering(struct rte_bbdev_dec_op *op, return TEST_SUCCESS; } -/*static int +static int check_enc_status_and_ordering(struct rte_bbdev_enc_op *op, unsigned int order_idx, const int expected_status) { @@ -1060,13 +1002,10 @@ validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, int8_t* p_out) { unsigned int i; - int ret; - struct op_data_entries *hard_data_orig ; + //int ret; struct rte_bbdev_op_ldpc_dec *ops_td; struct rte_bbdev_op_data *hard_output; - struct rte_bbdev_op_data *harq_output; - struct rte_bbdev_op_data *soft_output; - struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec; + //struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec; struct rte_mbuf *m; char *data; @@ -1081,7 +1020,7 @@ validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, "Returned iter_count (%d) > expected iter_count (%d)", ops_td->iter_count, ref_td->iter_count); -*/ + */ uint16_t offset = hard_output->offset; uint16_t data_len = rte_pktmbuf_data_len(m) - offset; @@ -1122,20 +1061,13 @@ static void create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op, t_nrLDPCoffload_params *p_offloadParams) { // unsigned int i; -// struct op_data_entries *entry; -// op->ldpc_dec = test_vector.ldpc_dec; -// entry = &test_vector.entries[DATA_INPUT]; //for (i = 0; i < entry->nb_segments; ++i) op->ldpc_dec.input.length = p_offloadParams->E; -// entry->segments[i].length; - /*if (test_vector.ldpc_dec.op_flags & - RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) { - entry = &test_vector.entries[DATA_HARQ_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->ldpc_dec.harq_combined_input.length += - entry->segments[i].length; - }*/ + op->ldpc_dec.basegraph = p_offloadParams->BG; + op->ldpc_dec.z_c = p_offloadParams->Z; + op->ldpc_dec.n_filler = p_offloadParams->F; + op->ldpc_dec.code_block_mode = 1; } @@ -1150,6 +1082,8 @@ calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) if (op->ldpc_dec.code_block_mode) { tb_size = sys_cols * op->ldpc_dec.z_c - op->ldpc_dec.n_filler; + //printf("calc tb sys cols %d tb_size %d\n",sys_cols,tb_size); + } else { c = op->ldpc_dec.tb_params.c; r = op->ldpc_dec.tb_params.r; @@ -1248,7 +1182,7 @@ decod_on_device(uint8_t dev_id, "Couldn't find capabilities"); create_reference_ldpc_dec_op(op_params->ref_dec_op, p_offloadParams); - +printf("info alig %d queue id %d nb queue %d socket id %d\n", info.drv.min_alignment, ad->queue_ids[i], ad->nb_queues, socket_id); for (i = 0; i < ad->nb_queues; ++i) { f_ret = fill_queue_buffers(op_params, p_llr, @@ -1268,10 +1202,10 @@ decod_on_device(uint8_t dev_id, } } - t_ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); +// t_ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); /* Free active device resources and return */ - free_buffers(ad, op_params); + //free_buffers(ad, op_params); return t_ret; fail: @@ -1283,126 +1217,28 @@ fail: * per burst size. */ static int -ldpc_decod_ut(int8_t* p_llr, t_nrLDPCoffload_params *p_offloadParams, int8_t* p_out) +ldpc_decod_ut(struct test_op_params *op_params, int8_t* p_llr, t_nrLDPCoffload_params *p_offloadParams, int8_t* p_out) { int ret = 0; uint8_t dev; /* Alloc op_params */ - struct test_op_params *op_params = rte_zmalloc(NULL, + /*struct test_op_params *op_params = rte_zmalloc(NULL, sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", RTE_ALIGN(sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE)); + */ /* For each device run test case function */ for (dev = 0; dev < nb_active_devs; ++dev) ret |= decod_on_device(dev, op_params, p_llr, p_offloadParams, p_out); - rte_free(op_params); +// rte_free(op_params); return ret; } -/* Push back the HARQ output from DDR to host */ -static void -retrieve_harq_ddr(uint16_t dev_id, uint16_t queue_id, - struct rte_bbdev_dec_op **ops, - const uint16_t n) -{ - uint16_t j; - int save_status, ret; - uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * 1024; - struct rte_bbdev_dec_op *ops_deq[MAX_BURST]; - uint32_t flags = ops[0]->ldpc_dec.op_flags; - bool loopback = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; - bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; - bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - for (j = 0; j < n; ++j) { - if ((loopback && mem_out) || hc_out) { - save_status = ops[j]->status; - ops[j]->ldpc_dec.op_flags = - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; - if (h_comp) - ops[j]->ldpc_dec.op_flags += - RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - ops[j]->ldpc_dec.harq_combined_input.offset = - harq_offset; - ops[j]->ldpc_dec.harq_combined_output.offset = 0; - harq_offset += HARQ_INCR; - if (!loopback) - ops[j]->ldpc_dec.harq_combined_input.length = - ops[j]->ldpc_dec.harq_combined_output.length; - rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, - &ops[j], 1); - ret = 0; - while (ret == 0) - ret = rte_bbdev_dequeue_ldpc_dec_ops( - dev_id, queue_id, - &ops_deq[j], 1); - ops[j]->ldpc_dec.op_flags = flags; - ops[j]->status = save_status; - } - } -} - -/* - * Push back the HARQ output from HW DDR to Host - * Preload HARQ memory input and adjust HARQ offset - */ -static void -preload_harq_ddr(uint16_t dev_id, uint16_t queue_id, - struct rte_bbdev_dec_op **ops, const uint16_t n, - bool preload) -{ - uint16_t j; - int ret; - uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * 1024; - struct rte_bbdev_op_data save_hc_in, save_hc_out; - struct rte_bbdev_dec_op *ops_deq[MAX_BURST]; - uint32_t flags = ops[0]->ldpc_dec.op_flags; - bool mem_in = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; - bool hc_in = flags & RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE; - bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; - bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - for (j = 0; j < n; ++j) { - if ((mem_in || hc_in) && preload) { - save_hc_in = ops[j]->ldpc_dec.harq_combined_input; - save_hc_out = ops[j]->ldpc_dec.harq_combined_output; - ops[j]->ldpc_dec.op_flags = - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - if (h_comp) - ops[j]->ldpc_dec.op_flags += - RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - ops[j]->ldpc_dec.harq_combined_output.offset = - harq_offset; - ops[j]->ldpc_dec.harq_combined_input.offset = 0; - rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, - &ops[j], 1); - ret = 0; - while (ret == 0) - ret = rte_bbdev_dequeue_ldpc_dec_ops( - dev_id, queue_id, &ops_deq[j], 1); - ops[j]->ldpc_dec.op_flags = flags; - ops[j]->ldpc_dec.harq_combined_input = save_hc_in; - ops[j]->ldpc_dec.harq_combined_output = save_hc_out; - } - /* Adjust HARQ offset when we reach external DDR */ - if (mem_in || hc_in) - ops[j]->ldpc_dec.harq_combined_input.offset - = harq_offset; - if (mem_out || hc_out) - ops[j]->ldpc_dec.harq_combined_output.offset - = harq_offset; - harq_offset += HARQ_INCR; - } -} - - static int pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p_out) { @@ -1420,11 +1256,10 @@ pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p struct rte_bbdev_info info; uint16_t num_to_enq; - struct rte_bbdev_op_data *hard_output; - struct rte_bbdev_op_ldpc_dec *ops_td; + //struct rte_bbdev_op_data *hard_output; - bool extDdr = check_bit(ldpc_cap_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + //bool extDdr = check_bit(ldpc_cap_flags, + // RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); bool loopback = check_bit(ref_op->ldpc_dec.op_flags, RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, @@ -1455,8 +1290,7 @@ pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p ref_op->ldpc_dec.iter_max = get_iter_max(); ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; - //if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, + set_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs, bufs->harq_outputs, ref_op, p_offloadParams); @@ -1473,11 +1307,6 @@ pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p mbuf_reset( ops_enq[j]->ldpc_dec.harq_combined_output.data); } - if (extDdr) { - bool preload = i == (TEST_REPETITIONS - 1); - preload_harq_ddr(tp->dev_id, queue_id, ops_enq, - num_ops, preload); - } start_time = rte_rdtsc_precise(); for (enq = 0, deq = 0; enq < num_ops;) { @@ -1509,16 +1338,10 @@ pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, tp->iter_count); } - if (extDdr) { - /* Read loopback is not thread safe */ - retrieve_harq_ddr(tp->dev_id, queue_id, ops_enq, num_ops); - } - //if (test_vector.op_type != RTE_BBDEV_OP_NONE) { ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, tp->op_params->vector_mask, p_out); TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - //} rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); @@ -1534,25 +1357,6 @@ pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p } -static void -print_enc_throughput(struct thread_params *t_params, unsigned int used_cores) -{ - unsigned int iter = 0; - double total_mops = 0, total_mbps = 0; - - for (iter = 0; iter < used_cores; iter++) { - printf( - "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps\n", - t_params[iter].lcore_id, t_params[iter].ops_per_sec, - t_params[iter].mbps); - total_mops += t_params[iter].ops_per_sec; - total_mbps += t_params[iter].mbps; - } - printf( - "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps\n", - used_cores, total_mops, total_mbps); -} - /* Aggregate the performance results over the number of cores used */ static void print_dec_throughput(struct thread_params *t_params, unsigned int used_cores) @@ -1594,22 +1398,16 @@ start_pmd_dec(struct active_device *ad, struct thread_params *t_params, *tp; struct rte_bbdev_info info; uint16_t num_lcores; - const char *op_type_str; rte_bbdev_info_get(ad->dev_id, &info); - op_type_str = rte_bbdev_op_type_str(test_vector.op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", - test_vector.op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== start pmd dec\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", + /*printf("+ ------------------------------------------------------- +\n"); + printf("== start pmd dec\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, itr mode: %s, GHz: %lg\n", info.dev_name, ad->nb_queues, op_params->burst_sz, op_params->num_to_process, op_params->num_lcores, - op_type_str, intr_enabled ? "Interrupt mode" : "PMD mode", (double)rte_get_tsc_hz() / 1000000000.0); - + */ /* Set number of lcores */ num_lcores = (ad->nb_queues < (op_params->num_lcores)) ? ad->nb_queues @@ -1640,7 +1438,6 @@ start_pmd_dec(struct active_device *ad, t_params[used_cores].op_params = op_params; t_params[used_cores].queue_id = ad->queue_ids[used_cores]; t_params[used_cores].iter_count = 0; - rte_eal_remote_launch(pmd_lcore_ldpc_dec, &t_params[used_cores++], lcore_id); } @@ -1660,11 +1457,7 @@ start_pmd_dec(struct active_device *ad, /* Print throughput if interrupts are disabled and test passed */ if (!intr_enabled) { - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || - test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - print_dec_throughput(t_params, num_lcores); - else - print_enc_throughput(t_params, num_lcores); + //print_dec_throughput(t_params, num_lcores); rte_free(t_params); return ret; } @@ -1702,12 +1495,7 @@ start_pmd_dec(struct active_device *ad, /* Print throughput if test passed */ if (!ret) { - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || - test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) print_dec_throughput(t_params, num_lcores); - else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC || - test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - print_enc_throughput(t_params, num_lcores); } rte_free(t_params); @@ -1728,11 +1516,6 @@ static struct test_params { bool init_device; } test_params; -const char * -get_vector_filename(void) -{ - return test_params.test_vector_filename; -} unsigned int get_num_ops(void) { @@ -1769,8 +1552,11 @@ get_init_device(void) return test_params.init_device; } +struct test_op_params op_params_e; +struct test_op_params *op_params = &op_params_e; + int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint16_t F, - uint32_t E, uint8_t Qm, int8_t* p_llr, int8_t* p_out, uint8_t mode) + uint32_t E, uint8_t Qm, int8_t* p_llr, int8_t* p_out, uint8_t mode) { t_nrLDPCoffload_params offloadParams; t_nrLDPCoffload_params* p_offloadParams = &offloadParams; @@ -1787,15 +1573,55 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ test_params.burst_sz=1; test_params.num_lcores=1; test_params.num_tests = 1; + struct active_device *ad; + ad = &active_devs[0]; if (mode==0){ - printf("offload mode %d\n", mode); + ret = rte_eal_init(argc_re, argv_re); - device_setup(); ut_setup(); + + p_offloadParams->E = E; + p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); + p_offloadParams->BG = p_decParams->BG; + p_offloadParams->Z = p_decParams->Z; + p_offloadParams->rv = rv; + p_offloadParams->F = F; + p_offloadParams->Qm = Qm; + + //struct test_op_params *op_params = rte_zmalloc(NULL, + op_params = rte_zmalloc(NULL, + sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", + RTE_ALIGN(sizeof(struct test_op_params), + RTE_CACHE_LINE_SIZE)); + + int socket_id; + int f_ret; + struct rte_bbdev_info info; + rte_bbdev_info_get(ad->dev_id, &info); + socket_id = GET_SOCKET(info.socket_id); + enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; + f_ret = create_mempools(ad, socket_id, op_type, + get_num_ops(),p_offloadParams); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't create mempools"); + } + f_ret = init_test_op_params(op_params, op_type, + 0, + 0, + ad->ops_mempool, + 1, + 1, + 1); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't init test op params"); + } + } else{ + //printf("offload param E %d BG %d F %d Z %d Qm %d\n", E,p_decParams->BG, F,p_decParams->Z, Qm); p_offloadParams->E = E; p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); @@ -1804,7 +1630,50 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ p_offloadParams->rv = rv; p_offloadParams->F = F; p_offloadParams->Qm = Qm; - ldpc_decod_ut(p_llr, p_offloadParams, p_out); + int socket_id; + int f_ret, i; + const struct rte_bbdev_op_cap *capabilities = NULL; + struct rte_bbdev_info info; + rte_bbdev_info_get(ad->dev_id, &info); + socket_id = GET_SOCKET(info.socket_id); + enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; + const struct rte_bbdev_op_cap *cap = info.drv.capabilities; + + for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { + if (cap->type == op_type) { + capabilities = cap; + break; + } + cap++; + } + + create_reference_ldpc_dec_op(op_params->ref_dec_op, p_offloadParams); + + ad->nb_queues =1; + for (i = 0; i < ad->nb_queues; ++i) { + f_ret = fill_queue_buffers(op_params, + p_llr, + p_offloadParams->E, + ad->in_mbuf_pool, + ad->hard_out_mbuf_pool, + ad->soft_out_mbuf_pool, + ad->harq_in_mbuf_pool, + ad->harq_out_mbuf_pool, + ad->queue_ids[i], + capabilities, + info.drv.min_alignment, + socket_id); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't init queue buffers"); + } + } + + + start_pmd_dec(ad, op_params, p_offloadParams, p_out); + + // free_buffers(ad, op_params); + +// rte_free(op_params); } //ut_teardown(); diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h index 4207779638..d3d0d5c652 100644 --- a/openair1/PHY/CODING/nrLDPC_defs.h +++ b/openair1/PHY/CODING/nrLDPC_defs.h @@ -24,6 +24,7 @@ #define __NRLDPC_DEFS__H__ #include #include "openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_types.h" + /** \brief LDPC encoder \param 1 input @@ -73,8 +74,7 @@ typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,sho */ typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); -//typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); -typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint16_t, uint32_t, uint8_t, int8_t*, int8_t* ,uint8_t ); +typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint16_t, uint32_t, uint8_t, int8_t*, int8_t* ,uint8_t); typedef int32_t(*nrLDPC_dectopfunc_t)(void); #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 95e89b364f..a67ff19390 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -602,17 +602,17 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, { pl_ol128[j] = _mm_packs_epi16(pv_ol128[i],pv_ol128[i+1]); } - + ret = nrLDPC_decoder_offload(p_decParams, - 1, //harq_process->C, + 1, pusch_pdu->pusch_data.rv_index, harq_process->F, E, Qm, (int8_t*)&pl_ol128[0], llrProcBuf, 1); - - for (int m=0; m < Kr>>3; m ++) { + + for (int m=0; m < Kr>>3; m ++) { harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; } diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 79f39d10f9..c84578e199 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -648,17 +648,19 @@ int main(int argc, char **argv) int8_t l_ol [68*384]; __m128i *pl_ol128 = (__m128i*)&l_ol; int8_t llrProcBuf[22*384]; - + + p_decParams->Z = 384; + p_decParams->BG = 1; + nrLDPC_decoder_offload(p_decParams, 1, 0, 0, - 0, - 2, + 25344, + 8, (int8_t*)&pl_ol128[0], llrProcBuf, 0); - if (snr1set == 0) snr1 = snr0 + 10; double sampling_frequency; From 1247a02f6d2f1aa9d871560c73b46dc1eebe781f Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 23 Aug 2021 11:12:38 +0200 Subject: [PATCH 011/136] Initializing the device in lib load function --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 4 +-- openair1/PHY/CODING/nrLDPC_load.c | 30 ++++++++++++------- openair1/SIMULATION/NR_PHY/ulsim.c | 18 ----------- 3 files changed, 21 insertions(+), 31 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 2ebb32ce99..6c22468221 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -1613,8 +1613,8 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ 0, ad->ops_mempool, 1, - 1, - 1); + get_num_ops(), + get_num_lcores()); if (f_ret != TEST_SUCCESS) { printf("Couldn't init test op params"); } diff --git a/openair1/PHY/CODING/nrLDPC_load.c b/openair1/PHY/CODING/nrLDPC_load.c index 44502193a9..93941c8f24 100644 --- a/openair1/PHY/CODING/nrLDPC_load.c +++ b/openair1/PHY/CODING/nrLDPC_load.c @@ -78,20 +78,28 @@ int load_nrLDPClib_offload(void) { int ret=load_module_shlib("ldpc_offload",&shlib_decoffload_fdesc,1,NULL); AssertFatal( (ret >= 0),"Error loading ldpc decoder offload"); nrLDPC_decoder_offload = (nrLDPC_decoffloadfunc_t)shlib_decoffload_fdesc.fptr; + + t_nrLDPC_dec_params decParams; + t_nrLDPC_dec_params* p_decParams = &decParams; + int8_t l[68*384]; + int8_t llrProcBuf[22*384]; + + p_decParams->Z = 384; + p_decParams->BG = 1; + + nrLDPC_decoder_offload(p_decParams, + 1, + 0, + 0, + 25344, + 8, + l, + llrProcBuf, 0); + + return 0; } -/*int load_nrLDPClib_offload(void) { - loader_shlibfunc_t shlib_decoffload_fdesc; - - shlib_decoffload_fdesc.fname = "top_testsuite"; - int ret=load_module_shlib("ldpc_offload",&shlib_decoffload_fdesc,1,NULL); - AssertFatal( (ret >= 0),"Error loading ldpc decoder offload"); - top_testsuite = (nrLDPC_dectopfunc_t)shlib_decoffload_fdesc.fptr; -return 0; -} -*/ - int load_nrLDPClib_ref(char *libversion, nrLDPC_encoderfunc_t * nrLDPC_encoder_ptr) { loader_shlibfunc_t shlib_encoder_fdesc; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index c84578e199..fcca53fcaf 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -643,24 +643,6 @@ int main(int argc, char **argv) load_nrLDPClib_offload(); - t_nrLDPC_dec_params decParams; - t_nrLDPC_dec_params* p_decParams = &decParams; - int8_t l_ol [68*384]; - __m128i *pl_ol128 = (__m128i*)&l_ol; - int8_t llrProcBuf[22*384]; - - p_decParams->Z = 384; - p_decParams->BG = 1; - - nrLDPC_decoder_offload(p_decParams, - 1, - 0, - 0, - 25344, - 8, - (int8_t*)&pl_ol128[0], - llrProcBuf, 0); - if (snr1set == 0) snr1 = snr0 + 10; double sampling_frequency; From a96aeff27929c5feb4e7117af693280085a29fbc Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 30 Aug 2021 11:17:17 +0200 Subject: [PATCH 012/136] adding post decoding for offload --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 29 ++++++----- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 49 ++++++++++++++----- 2 files changed, 56 insertions(+), 22 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 6c22468221..8439151889 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -166,6 +166,8 @@ struct thread_params { uint8_t iter_count; double iter_average; double bler; + struct t_nrLDPCoffload_params *p_offloadParams; + int8_t* p_out; rte_atomic16_t nb_dequeued; rte_atomic16_t processing_status; rte_atomic16_t burst_sz; @@ -928,7 +930,6 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; - if (hard_outputs != NULL) ops[i]->ldpc_dec.hard_output = hard_outputs[start_idx + i]; @@ -1240,7 +1241,7 @@ ldpc_decod_ut(struct test_op_params *op_params, int8_t* p_llr, t_nrLDPCoffload_p static int -pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p_out) +pmd_lcore_ldpc_dec(void *arg) { struct thread_params *tp = arg; uint16_t enq, deq; @@ -1255,8 +1256,10 @@ pmd_lcore_ldpc_dec(void *arg, t_nrLDPCoffload_params *p_offloadParams, int8_t* p int i, j, ret; struct rte_bbdev_info info; uint16_t num_to_enq; - - //struct rte_bbdev_op_data *hard_output; + int8_t *p_out = tp->p_out; + t_nrLDPCoffload_params *p_offloadParams = tp->p_offloadParams; + + //struct rte_bbdev_op_data *hard_output; //bool extDdr = check_bit(ldpc_cap_flags, // RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); @@ -1407,7 +1410,7 @@ start_pmd_dec(struct active_device *ad, op_params->num_to_process, op_params->num_lcores, intr_enabled ? "Interrupt mode" : "PMD mode", (double)rte_get_tsc_hz() / 1000000000.0); - */ + */ /* Set number of lcores */ num_lcores = (ad->nb_queues < (op_params->num_lcores)) ? ad->nb_queues @@ -1428,6 +1431,8 @@ start_pmd_dec(struct active_device *ad, t_params[0].op_params = op_params; t_params[0].queue_id = ad->queue_ids[used_cores++]; t_params[0].iter_count = 0; + t_params[0].p_out = p_out; + t_params[0].p_offloadParams = p_offloadParams; RTE_LCORE_FOREACH_SLAVE(lcore_id) { if (used_cores >= num_lcores) @@ -1438,12 +1443,15 @@ start_pmd_dec(struct active_device *ad, t_params[used_cores].op_params = op_params; t_params[used_cores].queue_id = ad->queue_ids[used_cores]; t_params[used_cores].iter_count = 0; + t_params[used_cores].p_out = p_out; + t_params[used_cores].p_offloadParams = p_offloadParams; + rte_eal_remote_launch(pmd_lcore_ldpc_dec, &t_params[used_cores++], lcore_id); } rte_atomic16_set(&op_params->sync, SYNC_START); - ret = pmd_lcore_ldpc_dec(&t_params[0], p_offloadParams, p_out); + ret = pmd_lcore_ldpc_dec(&t_params[0]); /* Master core is always used */ for (used_cores = 1; used_cores < num_lcores; used_cores++) @@ -1560,8 +1568,8 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ { t_nrLDPCoffload_params offloadParams; t_nrLDPCoffload_params* p_offloadParams = &offloadParams; - - uint32_t numIter = 0; + + uint32_t numIter = 0; int ret; int argc_re=2; @@ -1571,7 +1579,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ test_params.num_ops=1; test_params.burst_sz=1; - test_params.num_lcores=1; + test_params.num_lcores=3; test_params.num_tests = 1; struct active_device *ad; ad = &active_devs[0]; @@ -1648,8 +1656,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ } create_reference_ldpc_dec_op(op_params->ref_dec_op, p_offloadParams); - - ad->nb_queues =1; + ad->nb_queues = 1; for (i = 0; i < ad->nb_queues; ++i) { f_ret = fill_queue_buffers(op_params, p_llr, diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index a67ff19390..e8813392cf 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -590,13 +590,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, length_dec = (harq_process->B+24*harq_process->C)/harq_process->C; } - - E = nr_get_E(G, harq_process->C, Qm, n_layers, 0); - for (r=0; rC; r++) { + E = nr_get_E(G, harq_process->C, Qm, n_layers, r); memset(harq_process->c[r],0,Kr_bytes); - memcpy((&z_ol[0]),ulsch_llr+r*E,E*sizeof(int16_t)); + memcpy((&z_ol[0]),ulsch_llr+r_offset,E*sizeof(short)); for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) { @@ -627,21 +625,50 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, #endif no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; } + + r_offset += E; /*for (int k=0;k<8;k++) { printf("output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); } */ + bool decodeSuccess = (no_iteration_ldpc <= ulsch->max_ldpc_iterations); + if (decodeSuccess) { + memcpy(harq_process->b+offset, + harq_process->c[r], + Kr_bytes - (harq_process->F>>3) -((harq_process->C>1)?3:0)); + offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0)); + } + + if (r==harq_process->C-1){ + if (decodeSuccess) { + LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n", + phy_vars_gNB->Mod_id,harq_process->slot,harq_process->TBS); + harq_process->status = SCH_IDLE; + harq_process->round = 0; + ulsch->harq_mask &= ~(1 << harq_pid); - memcpy(harq_process->b+offset, - harq_process->c[r], - Kr_bytes - (harq_process->F>>3) -((harq_process->C>1)?3:0)); - offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0)); + LOG_D(PHY, "ULSCH received ok \n"); + nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, UE_id, harq_pid, 0); + + } else { + LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n", + phy_vars_gNB->Mod_id, harq_process->frame, harq_process->slot, + harq_pid,harq_process->status, harq_process->round,harq_process->TBS,r); + if (harq_process->round >= ulsch->Mlimit) { + harq_process->status = SCH_IDLE; + harq_process->round = 0; + harq_process->handled = 0; + ulsch->harq_mask &= ~(1 << harq_pid); + } + harq_process->handled = 1; - } - - + LOG_D(PHY, "ULSCH %d in error\n",UE_id); + nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, UE_id, harq_pid, 1); + } + } + } } else { void (*nr_processULSegment_ptr)(void*) = &nr_processULSegment; From 00ba6b6bb15f1756301de4712535af398b9a4aed Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 8 Sep 2021 09:41:56 +0200 Subject: [PATCH 013/136] add offload on cmdline and bugfix --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 31 ++++++------------- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 22 ++++++++----- openair1/PHY/defs_gNB.h | 2 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- openair1/SIMULATION/NR_PHY/ulsim.c | 11 +++++-- 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 8439151889..3b0619af9c 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -843,16 +843,6 @@ fill_queue_buffers(struct test_op_params *op_params,int8_t* p_llr, uint32_t data } - bool loopback = op_params->ref_dec_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; - bool llr_comp = op_params->ref_dec_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_LLR_COMPRESSION; - ldpc_llr_decimals = capabilities->cap.ldpc_dec.llr_decimals; - ldpc_llr_size = capabilities->cap.ldpc_dec.llr_size; - ldpc_cap_flags = capabilities->cap.ldpc_dec.capability_flags; - if (!loopback && !llr_comp) - ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n, - ldpc_llr_size, ldpc_llr_decimals); return 0; } @@ -925,7 +915,7 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ops[i]->ldpc_dec.q_m = p_offloadParams->Qm; ops[i]->ldpc_dec.n_filler = p_offloadParams->F; ops[i]->ldpc_dec.n_cb = p_offloadParams->n_cb; - ops[i]->ldpc_dec.iter_max = 8; + ops[i]->ldpc_dec.iter_max = 20; ops[i]->ldpc_dec.rv_index = p_offloadParams->rv; ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; @@ -998,7 +988,7 @@ check_enc_status_and_ordering(struct rte_bbdev_enc_op *op, */ static int -validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, +retrieve_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, struct rte_bbdev_dec_op *ref_op, const int vector_mask, int8_t* p_out) { @@ -1310,7 +1300,7 @@ pmd_lcore_ldpc_dec(void *arg) mbuf_reset( ops_enq[j]->ldpc_dec.harq_combined_output.data); } - start_time = rte_rdtsc_precise(); + //start_time = rte_rdtsc_precise(); for (enq = 0, deq = 0; enq < num_ops;) { num_to_enq = burst_sz; @@ -1332,7 +1322,7 @@ pmd_lcore_ldpc_dec(void *arg) queue_id, &ops_deq[deq], enq - deq); } - total_time += rte_rdtsc_precise() - start_time; +// total_time += rte_rdtsc_precise() - start_time; } tp->iter_count = 0; @@ -1342,20 +1332,20 @@ pmd_lcore_ldpc_dec(void *arg) tp->iter_count); } - ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, + ret = retrieve_ldpc_dec_op(ops_deq, num_ops, ref_op, tp->op_params->vector_mask, p_out); TEST_ASSERT_SUCCESS(ret, "Validation failed!"); rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); - double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); + /*double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / ((double)total_time / (double)rte_get_tsc_hz()); tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / 1000000.0) / ((double)total_time / (double)rte_get_tsc_hz()); - + */ return TEST_SUCCESS; } @@ -1402,7 +1392,7 @@ start_pmd_dec(struct active_device *ad, struct rte_bbdev_info info; uint16_t num_lcores; - rte_bbdev_info_get(ad->dev_id, &info); + //rte_bbdev_info_get(ad->dev_id, &info); /*printf("+ ------------------------------------------------------- +\n"); printf("== start pmd dec\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, itr mode: %s, GHz: %lg\n", @@ -1437,7 +1427,6 @@ start_pmd_dec(struct active_device *ad, RTE_LCORE_FOREACH_SLAVE(lcore_id) { if (used_cores >= num_lcores) break; - t_params[used_cores].dev_id = ad->dev_id; t_params[used_cores].lcore_id = lcore_id; t_params[used_cores].op_params = op_params; @@ -1486,7 +1475,6 @@ start_pmd_dec(struct active_device *ad, tp->mbps /= TEST_REPETITIONS; ret |= (int)rte_atomic16_read(&tp->processing_status); - /* Wait for slave lcores operations */ for (used_cores = 1; used_cores < num_lcores; used_cores++) { tp = &t_params[used_cores]; @@ -1579,7 +1567,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ test_params.num_ops=1; test_params.burst_sz=1; - test_params.num_lcores=3; + test_params.num_lcores=1; test_params.num_tests = 1; struct active_device *ad; ad = &active_devs[0]; @@ -1654,7 +1642,6 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ } cap++; } - create_reference_ldpc_dec_op(op_params->ref_dec_op, p_offloadParams); ad->nb_queues = 1; for (i = 0; i < ad->nb_queues; ++i) { diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index e8813392cf..b5d089ad2d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -403,7 +403,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, int8_t llrProcBuf[22*384]; int ret = 0; int i,j; - int8_t enable_ldpc_offload = 1; + int8_t enable_ldpc_offload = phy_vars_gNB->ldpc_offload_flag; int16_t z_ol [68*384]; int8_t l_ol [68*384]; __m128i *pv_ol128 = (__m128i*)&z_ol; @@ -598,7 +598,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) { - pl_ol128[j] = _mm_packs_epi16(pv_ol128[i],pv_ol128[i+1]); + pl_ol128[j] = _mm_packs_epi16(_mm_slli_epi16(pv_ol128[i],1),_mm_slli_epi16(pv_ol128[i+1],1)); } ret = nrLDPC_decoder_offload(p_decParams, @@ -639,9 +639,16 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, harq_process->c[r], Kr_bytes - (harq_process->F>>3) -((harq_process->C>1)?3:0)); offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0)); + harq_process->processedSegments=r+1; } - - if (r==harq_process->C-1){ + else { + if ( harq_process->C != harq_process->processedSegments ) { + LOG_I(PHY,"uplink segment error %d/%d\n",r,harq_process->C); + LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); + harq_process->processedSegments=harq_process->C; + } + } + if (harq_process->processedSegments==harq_process->C){ if (decodeSuccess) { LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n", phy_vars_gNB->Mod_id,harq_process->slot,harq_process->TBS); @@ -650,7 +657,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ulsch->harq_mask &= ~(1 << harq_pid); LOG_D(PHY, "ULSCH received ok \n"); - nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, UE_id, harq_pid, 0); + nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 0); } else { LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n", @@ -664,9 +671,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, } harq_process->handled = 1; - LOG_D(PHY, "ULSCH %d in error\n",UE_id); - nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, UE_id, harq_pid, 1); + LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); + nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 1); } + ulsch->last_iteration_cnt = no_iteration_ldpc; } } } diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index c24bd81549..16eec8cc00 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -829,7 +829,7 @@ typedef struct PHY_VARS_gNB_s { double N0; unsigned char first_run_I0_measurements; - + int ldpc_offload_flag; unsigned char is_secondary_gNB; // primary by default unsigned char is_init_sync; /// Flag to tell if initial synchronization is performed. This affects how often the secondary eNB will listen to the PSS from the primary system. diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 78d509848c..b38b79afb6 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -308,7 +308,7 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH uint8_t l, number_dmrs_symbols = 0; uint32_t G; uint16_t start_symbol, number_symbols, nb_re_dmrs; - uint8_t enable_ldpc_offload = 1; + uint8_t enable_ldpc_offload = gNB->ldpc_offload_flag; start_symbol = pusch_pdu->start_symbol_index; number_symbols = pusch_pdu->nr_of_symbols; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index fcca53fcaf..b8a2c9026c 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -311,6 +311,7 @@ int main(int argc, char **argv) //float eff_tp_check = 0.7; uint8_t snrRun; int prb_inter = 0; + int ldpc_offload_flag = 0; int enable_ptrs = 0; int modify_dmrs = 0; @@ -344,7 +345,7 @@ int main(int argc, char **argv) /* initialize the sin-cos table */ InitSinLUT(); - while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) { + while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:o:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) { printf("handling optarg %c\n",c); switch (c) { @@ -456,6 +457,10 @@ int main(int argc, char **argv) case 'n': n_trials = atoi(optarg); break; + + case 'o': + ldpc_offload_flag = atoi(optarg); + break; case 'p': extended_prefix_flag = 1; @@ -604,6 +609,7 @@ int main(int argc, char **argv) printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n"); printf("-m MCS value\n"); printf("-n Number of trials to simulate\n"); + printf("-o ldpc offload flag\n"); printf("-p Use extended prefix mode\n"); printf("-t Delay spread for multipath channel\n"); printf("-u Set the numerology\n"); @@ -805,7 +811,8 @@ int main(int argc, char **argv) unsigned char harq_pid = 0; - + + gNB->ldpc_offload_flag = ldpc_offload_flag; NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0]; //nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &ulsch_gNB->harq_processes[harq_pid]->ulsch_pdu; nfapi_nr_ul_tti_request_t *UL_tti_req = malloc(sizeof(*UL_tti_req)); From 2423996bba33c1e336d7cd4e06d02eeec2e05f05 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 13 Sep 2021 16:53:41 +0200 Subject: [PATCH 014/136] adding some error checks --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 105 +++++++++++------- openair1/PHY/CODING/nrLDPC_load.c | 19 ++-- openair1/SIMULATION/NR_PHY/ulsim.c | 2 +- 3 files changed, 73 insertions(+), 53 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 3b0619af9c..26748d3724 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -166,7 +166,7 @@ struct thread_params { uint8_t iter_count; double iter_average; double bler; - struct t_nrLDPCoffload_params *p_offloadParams; + struct nrLDPCoffload_params *p_offloadParams; int8_t* p_out; rte_atomic16_t nb_dequeued; rte_atomic16_t processing_status; @@ -1574,46 +1574,60 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ if (mode==0){ - ret = rte_eal_init(argc_re, argv_re); - device_setup(); - ut_setup(); - - p_offloadParams->E = E; - p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); - p_offloadParams->BG = p_decParams->BG; - p_offloadParams->Z = p_decParams->Z; - p_offloadParams->rv = rv; - p_offloadParams->F = F; - p_offloadParams->Qm = Qm; - - //struct test_op_params *op_params = rte_zmalloc(NULL, - op_params = rte_zmalloc(NULL, + ret = rte_eal_init(argc_re, argv_re); + if (ret<0) { + printf("Could not init EAL, ret %d\n",ret); + return(-1); + } + ret = device_setup(); + if (ret != TEST_SUCCESS) { + printf("Couldn't create mempools"); + return(-1); + } + ret=ut_setup(); + if (ret != TEST_SUCCESS) { + printf("Couldn't create mempools"); + return(-1); + } + + p_offloadParams->E = E; + p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); + p_offloadParams->BG = p_decParams->BG; + p_offloadParams->Z = p_decParams->Z; + p_offloadParams->rv = rv; + p_offloadParams->F = F; + p_offloadParams->Qm = Qm; + + //struct test_op_params *op_params = rte_zmalloc(NULL, + op_params = rte_zmalloc(NULL, sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); - TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", - RTE_ALIGN(sizeof(struct test_op_params), - RTE_CACHE_LINE_SIZE)); - - int socket_id; - int f_ret; - struct rte_bbdev_info info; - rte_bbdev_info_get(ad->dev_id, &info); - socket_id = GET_SOCKET(info.socket_id); - enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; - f_ret = create_mempools(ad, socket_id, op_type, - get_num_ops(),p_offloadParams); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't create mempools"); - } - f_ret = init_test_op_params(op_params, op_type, - 0, - 0, - ad->ops_mempool, - 1, - get_num_ops(), - get_num_lcores()); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't init test op params"); - } + TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", + RTE_ALIGN(sizeof(struct test_op_params), + RTE_CACHE_LINE_SIZE)); + + int socket_id; + int f_ret; + struct rte_bbdev_info info; + rte_bbdev_info_get(ad->dev_id, &info); + socket_id = GET_SOCKET(info.socket_id); + enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; + f_ret = create_mempools(ad, socket_id, op_type, + get_num_ops(),p_offloadParams); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't create mempools"); + return(-1); + } + f_ret = init_test_op_params(op_params, op_type, + 0, + 0, + ad->ops_mempool, + 1, + get_num_ops(), + get_num_lcores()); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't init test op params"); + return(-1); + } } else{ @@ -1659,15 +1673,20 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ socket_id); if (f_ret != TEST_SUCCESS) { printf("Couldn't init queue buffers"); + return(-1); } } - start_pmd_dec(ad, op_params, p_offloadParams, p_out); + ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); + if (ret<0) { + printf("Couldn't start pmd dec"); + return(-1); + } - // free_buffers(ad, op_params); + // free_buffers(ad, op_params); -// rte_free(op_params); + // rte_free(op_params); } //ut_teardown(); diff --git a/openair1/PHY/CODING/nrLDPC_load.c b/openair1/PHY/CODING/nrLDPC_load.c index 93941c8f24..760c9011b4 100644 --- a/openair1/PHY/CODING/nrLDPC_load.c +++ b/openair1/PHY/CODING/nrLDPC_load.c @@ -87,17 +87,18 @@ int load_nrLDPClib_offload(void) { p_decParams->Z = 384; p_decParams->BG = 1; - nrLDPC_decoder_offload(p_decParams, - 1, - 0, - 0, - 25344, - 8, - l, - llrProcBuf, 0); + AssertFatal(nrLDPC_decoder_offload(p_decParams, + 1, + 0, + 0, + 25344, + 8, + l, + llrProcBuf, 0)>0, + "error loading LDPC decoder offload library\n"); -return 0; + return 0; } int load_nrLDPClib_ref(char *libversion, nrLDPC_encoderfunc_t * nrLDPC_encoder_ptr) { diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index b8a2c9026c..810dc8f835 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -647,7 +647,7 @@ int main(int argc, char **argv) get_softmodem_params()->do_ra = 0; get_softmodem_params()->usim_test = 1; - load_nrLDPClib_offload(); + //load_nrLDPClib_offload(); if (snr1set == 0) snr1 = snr0 + 10; From 8af206c644503ec84454139d2b8b3d3841f79cc3 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 15 Sep 2021 16:42:54 +0200 Subject: [PATCH 015/136] adding allocation free function for offload --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 342 +++++------------- openair1/PHY/CODING/nrLDPC_extern.h | 1 + openair1/PHY/CODING/nrLDPC_load.c | 20 + openair1/SIMULATION/NR_PHY/ulsim.c | 3 +- 4 files changed, 116 insertions(+), 250 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 26748d3724..822bf01f86 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -582,17 +582,16 @@ static void testsuite_teardown(void) { uint8_t dev_id; -printf("testsuite teardown \n"); /* Unconfigure devices */ -// RTE_BBDEV_FOREACH(dev_id) -// rte_bbdev_close(dev_id); + RTE_BBDEV_FOREACH(dev_id) + rte_bbdev_close(dev_id); /* Clear active devices structs. */ -// memset(active_devs, 0, sizeof(active_devs)); -// nb_active_devs = 0; + memset(active_devs, 0, sizeof(active_devs)); + nb_active_devs = 0; /* Disable interrupts */ -// intr_enabled = false; + intr_enabled = false; } static int @@ -624,7 +623,7 @@ ut_teardown(void) /* read stats and print */ rte_bbdev_stats_get(dev_id, &stats); /* Stop the device */ - //rte_bbdev_stop(dev_id); + rte_bbdev_stop(dev_id); } } @@ -756,46 +755,6 @@ allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len, } -static void -ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops, - const uint16_t n, const int8_t llr_size, - const int8_t llr_decimals) -{ - if (input_ops == NULL) - return; - - uint16_t i, byte_idx; - - int16_t llr_max, llr_min, llr_tmp; - llr_max = (1 << (llr_size - 1)) - 1; - llr_min = -llr_max; - for (i = 0; i < n; ++i) { - struct rte_mbuf *m = input_ops[i].data; - while (m != NULL) { - int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, - input_ops[i].offset); - for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); - ++byte_idx) { - - llr_tmp = llr[byte_idx]; - if (llr_decimals == 4) - llr_tmp *= 8; - else if (llr_decimals == 2) - llr_tmp *= 2; - else if (llr_decimals == 0) - llr_tmp /= 2; - llr_tmp = RTE_MIN(llr_max, - RTE_MAX(llr_min, llr_tmp)); - llr[byte_idx] = (int8_t) llr_tmp; - } - - m = m->next; - } - } -} - - - static int fill_queue_buffers(struct test_op_params *op_params,int8_t* p_llr, uint32_t data_len, struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp, @@ -808,9 +767,9 @@ fill_queue_buffers(struct test_op_params *op_params,int8_t* p_llr, uint32_t data int ret; enum op_data_type type; const uint16_t n = op_params->num_to_process; - int ldpc_llr_decimals; - int ldpc_llr_size; - uint32_t ldpc_cap_flags; + //int ldpc_llr_decimals; + //int ldpc_llr_size; + //uint32_t ldpc_cap_flags; struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { in_mp, @@ -1064,7 +1023,7 @@ create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op, t_nrLDPCoffload_params -static uint32_t +/*static uint32_t calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) { uint8_t i; @@ -1085,7 +1044,7 @@ calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) } return tb_size; } - +*/ static int init_test_op_params(struct test_op_params *op_params, @@ -1118,124 +1077,12 @@ init_test_op_params(struct test_op_params *op_params, return 0; } -static int -decod_on_device(uint8_t dev_id, - struct test_op_params *op_params, int8_t* p_llr, - t_nrLDPCoffload_params *p_offloadParams, int8_t* p_out) -{ - - int t_ret, f_ret, socket_id = SOCKET_ID_ANY; - unsigned int i; - struct active_device *ad; - unsigned int burst_sz = get_burst_sz(); - enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; - const struct rte_bbdev_op_cap *capabilities = NULL; - - ad = &active_devs[dev_id]; - - /* Check if device supports op_type */ - if (!is_avail_op(ad, op_type)) - return TEST_SUCCESS; - - struct rte_bbdev_info info; - rte_bbdev_info_get(ad->dev_id, &info); - socket_id = GET_SOCKET(info.socket_id); - - f_ret = create_mempools(ad, socket_id, op_type, - get_num_ops(),p_offloadParams); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't create mempools"); - goto fail; - } - f_ret = init_test_op_params(op_params, op_type, - 0, - 0, - ad->ops_mempool, - burst_sz, - get_num_ops(), - get_num_lcores()); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't init test op params"); - goto fail; - } - - - /* Find capabilities */ - const struct rte_bbdev_op_cap *cap = info.drv.capabilities; - for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { - if (cap->type == op_type) { - capabilities = cap; - break; - } - cap++; - } - TEST_ASSERT_NOT_NULL(capabilities, - "Couldn't find capabilities"); - - create_reference_ldpc_dec_op(op_params->ref_dec_op, p_offloadParams); -printf("info alig %d queue id %d nb queue %d socket id %d\n", info.drv.min_alignment, ad->queue_ids[i], ad->nb_queues, socket_id); - for (i = 0; i < ad->nb_queues; ++i) { - f_ret = fill_queue_buffers(op_params, - p_llr, - p_offloadParams->E, - ad->in_mbuf_pool, - ad->hard_out_mbuf_pool, - ad->soft_out_mbuf_pool, - ad->harq_in_mbuf_pool, - ad->harq_out_mbuf_pool, - ad->queue_ids[i], - capabilities, - info.drv.min_alignment, - socket_id); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't init queue buffers"); - goto fail; - } - } - -// t_ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); - - /* Free active device resources and return */ - //free_buffers(ad, op_params); - return t_ret; - -fail: - free_buffers(ad, op_params); - return TEST_FAILED; -} - -/* Run ldpc per active device per supported op type - * per burst size. - */ -static int -ldpc_decod_ut(struct test_op_params *op_params, int8_t* p_llr, t_nrLDPCoffload_params *p_offloadParams, int8_t* p_out) -{ - int ret = 0; - uint8_t dev; - - /* Alloc op_params */ - /*struct test_op_params *op_params = rte_zmalloc(NULL, - sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); - TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", - RTE_ALIGN(sizeof(struct test_op_params), - RTE_CACHE_LINE_SIZE)); - */ - /* For each device run test case function */ - for (dev = 0; dev < nb_active_devs; ++dev) - ret |= decod_on_device(dev, op_params, p_llr, p_offloadParams, p_out); - -// rte_free(op_params); - - return ret; -} - - static int pmd_lcore_ldpc_dec(void *arg) { struct thread_params *tp = arg; uint16_t enq, deq; - uint64_t total_time = 0, start_time; + //uint64_t total_time = 0, start_time; const uint16_t queue_id = tp->queue_id; const uint16_t burst_sz = tp->op_params->burst_sz; const uint16_t num_ops = tp->op_params->num_to_process; @@ -1389,7 +1236,7 @@ start_pmd_dec(struct active_device *ad, int ret; unsigned int lcore_id, used_cores = 0; struct thread_params *t_params, *tp; - struct rte_bbdev_info info; + //struct rte_bbdev_info info; uint16_t num_lcores; //rte_bbdev_info_get(ad->dev_id, &info); @@ -1572,81 +1419,75 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ struct active_device *ad; ad = &active_devs[0]; - if (mode==0){ - - ret = rte_eal_init(argc_re, argv_re); - if (ret<0) { - printf("Could not init EAL, ret %d\n",ret); - return(-1); - } - ret = device_setup(); - if (ret != TEST_SUCCESS) { - printf("Couldn't create mempools"); - return(-1); - } - ret=ut_setup(); - if (ret != TEST_SUCCESS) { - printf("Couldn't create mempools"); - return(-1); - } - + int socket_id; + int i,f_ret; + struct rte_bbdev_info info; + enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; + + switch (mode) { + case 0: + ret = rte_eal_init(argc_re, argv_re); + if (ret<0) { + printf("Could not init EAL, ret %d\n",ret); + return(-1); + } + ret = device_setup(); + if (ret != TEST_SUCCESS) { + printf("Couldn't setup device"); + return(-1); + } + ret=ut_setup(); + if (ret != TEST_SUCCESS) { + printf("Couldn't setup ut"); + return(-1); + } + p_offloadParams->E = E; - p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); - p_offloadParams->BG = p_decParams->BG; - p_offloadParams->Z = p_decParams->Z; - p_offloadParams->rv = rv; - p_offloadParams->F = F; - p_offloadParams->Qm = Qm; - - //struct test_op_params *op_params = rte_zmalloc(NULL, - op_params = rte_zmalloc(NULL, + p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); + p_offloadParams->BG = p_decParams->BG; + p_offloadParams->Z = p_decParams->Z; + p_offloadParams->rv = rv; + p_offloadParams->F = F; + p_offloadParams->Qm = Qm; + + op_params = rte_zmalloc(NULL, sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); - TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", - RTE_ALIGN(sizeof(struct test_op_params), - RTE_CACHE_LINE_SIZE)); - - int socket_id; - int f_ret; - struct rte_bbdev_info info; - rte_bbdev_info_get(ad->dev_id, &info); - socket_id = GET_SOCKET(info.socket_id); - enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; - f_ret = create_mempools(ad, socket_id, op_type, - get_num_ops(),p_offloadParams); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't create mempools"); - return(-1); - } - f_ret = init_test_op_params(op_params, op_type, - 0, - 0, - ad->ops_mempool, - 1, - get_num_ops(), - get_num_lcores()); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't init test op params"); - return(-1); - } - - } - else{ - //printf("offload param E %d BG %d F %d Z %d Qm %d\n", E,p_decParams->BG, F,p_decParams->Z, Qm); - - p_offloadParams->E = E; - p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); - p_offloadParams->BG = p_decParams->BG; - p_offloadParams->Z = p_decParams->Z; - p_offloadParams->rv = rv; - p_offloadParams->F = F; - p_offloadParams->Qm = Qm; - int socket_id; - int f_ret, i; - const struct rte_bbdev_op_cap *capabilities = NULL; - struct rte_bbdev_info info; + TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", + RTE_ALIGN(sizeof(struct test_op_params), + RTE_CACHE_LINE_SIZE)); + rte_bbdev_info_get(ad->dev_id, &info); socket_id = GET_SOCKET(info.socket_id); - enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; + f_ret = create_mempools(ad, socket_id, op_type, + get_num_ops(),p_offloadParams); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't create mempools"); + } + f_ret = init_test_op_params(op_params, op_type, + 0, + 0, + ad->ops_mempool, + 1, + get_num_ops(), + get_num_lcores()); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't init test op params"); + } + break; + case 1: + //printf("offload param E %d BG %d F %d Z %d Qm %d\n", E,p_decParams->BG, F,p_decParams->Z, Qm); + p_offloadParams->E = E; + p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); + p_offloadParams->BG = p_decParams->BG; + p_offloadParams->Z = p_decParams->Z; + p_offloadParams->rv = rv; + p_offloadParams->F = F; + p_offloadParams->Qm = Qm; + + const struct rte_bbdev_op_cap *capabilities = NULL; + rte_bbdev_info_get(ad->dev_id, &info); + socket_id = GET_SOCKET(info.socket_id); + //enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; const struct rte_bbdev_op_cap *cap = info.drv.capabilities; for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { @@ -1677,18 +1518,23 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ } } + ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); + if (ret<0) { + printf("Couldn't start pmd dec"); + return(-1); + } + break; + case 2: - ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); - if (ret<0) { - printf("Couldn't start pmd dec"); - return(-1); - } - - // free_buffers(ad, op_params); - - // rte_free(op_params); - } - //ut_teardown(); + free_buffers(ad, op_params); + rte_free(op_params); + ut_teardown(); + testsuite_teardown(); + break; + default: + printf("Unknown mode: %d\n", mode); + return; + } return numIter; } diff --git a/openair1/PHY/CODING/nrLDPC_extern.h b/openair1/PHY/CODING/nrLDPC_extern.h index 5cf9f80aec..b415876d0b 100644 --- a/openair1/PHY/CODING/nrLDPC_extern.h +++ b/openair1/PHY/CODING/nrLDPC_extern.h @@ -30,6 +30,7 @@ nrLDPC_dectopfunc_t top_testsuite; /* functions to load the LDPC shared lib, implemented in openair1/PHY/CODING/nrLDPC_load.c */ extern int load_nrLDPClib(char *version) ; extern int load_nrLDPClib_offload(void) ; +extern int free_nrLDPClib_offload(void) ; extern int load_nrLDPClib_ref(char *libversion, nrLDPC_encoderfunc_t * nrLDPC_encoder_ptr); // for ldpctest /* ldpc coder/decoder functions, as loaded by load_nrLDPClib(). */ extern nrLDPC_initcallfunc_t nrLDPC_initcall; diff --git a/openair1/PHY/CODING/nrLDPC_load.c b/openair1/PHY/CODING/nrLDPC_load.c index 760c9011b4..71187b6a6b 100644 --- a/openair1/PHY/CODING/nrLDPC_load.c +++ b/openair1/PHY/CODING/nrLDPC_load.c @@ -101,6 +101,26 @@ int load_nrLDPClib_offload(void) { return 0; } +int free_nrLDPClib_offload(void) { +t_nrLDPC_dec_params decParams; + t_nrLDPC_dec_params* p_decParams = &decParams; + int8_t l[68*384]; + int8_t llrProcBuf[22*384]; + + p_decParams->Z = 384; + p_decParams->BG = 1; + + nrLDPC_decoder_offload(p_decParams, + 1, + 0, + 0, + 25344, + 8, + l, + llrProcBuf, 2); +return 0; +} + int load_nrLDPClib_ref(char *libversion, nrLDPC_encoderfunc_t * nrLDPC_encoder_ptr) { loader_shlibfunc_t shlib_encoder_fdesc; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 810dc8f835..89b2107e6b 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -647,8 +647,6 @@ int main(int argc, char **argv) get_softmodem_params()->do_ra = 0; get_softmodem_params()->usim_test = 1; - //load_nrLDPClib_offload(); - if (snr1set == 0) snr1 = snr0 + 10; double sampling_frequency; @@ -1544,6 +1542,7 @@ int main(int argc, char **argv) LOG_MM("ulsimStats.m","EffTP",effTP,snrRun,1,7); free(test_input_bit); free(estimated_output_bit); + free_nrLDPClib_offload(); if (output_fd) fclose(output_fd); From d91226f07fb913591b2d963f6d9e8d4c0a38577e Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 2 Sep 2021 16:03:39 +0200 Subject: [PATCH 016/136] Load ldpc_offload lib in softmodem --- cmake_targets/CMakeLists.txt | 2 +- executables/nr-uesoftmodem.c | 2 +- openair1/PHY/INIT/nr_init.c | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index b099611139..e06123decc 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -2773,7 +2773,7 @@ target_link_libraries (nr-softmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRA target_link_libraries (nr-softmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (nr-softmodem ${T_LIB}) -add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc ) +add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc ldpc_offload) # nr-uesoftmodem is UE implementation ####################################### diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 76c21bb422..c51f791588 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -434,7 +434,7 @@ int main( int argc, char **argv ) { init_opt() ; load_nrLDPClib(NULL); - + if (ouput_vcd) { vcd_signal_dumper_init("/tmp/openair_dump_nrUE.vcd"); } diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index bf360d347a..8275037082 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -107,7 +107,10 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, crcTableInit(); init_scrambling_luts(); init_pucch2_luts(); + load_nrLDPClib(NULL); + load_nrLDPClib_offload(); + // PBCH DMRS gold sequences generation nr_init_pbch_dmrs(gNB); //PDCCH DMRS init From bd2a27f6cca612d449bb6d8cde79f618fc7c44a4 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 24 Sep 2021 08:36:59 +0200 Subject: [PATCH 017/136] some more error checks + data collection --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 20 ++++++++++-- openair1/PHY/INIT/nr_init.c | 4 ++- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 26 ++++++++++------ openair1/SIMULATION/NR_PHY/ulsim.c | 31 +++++++++++++------ 4 files changed, 59 insertions(+), 22 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 822bf01f86..aee8090ca6 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -1161,17 +1161,27 @@ pmd_lcore_ldpc_dec(void *arg) deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, queue_id, &ops_deq[deq], enq - deq); + //printf("enq %d, deq %d\n",enq,deq); + } /* dequeue the remaining */ + int trials=0; while (deq < enq) { deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, queue_id, &ops_deq[deq], enq - deq); + usleep(10); + trials++; + if (trials>=100) { + printf("aborting decoding after 100 dequeue tries\n"); + break; + } } // total_time += rte_rdtsc_precise() - start_time; } + if (deq==enq) { tp->iter_count = 0; /* get the max of iter_count for all dequeued ops */ for (i = 0; i < num_ops; ++i) { @@ -1182,6 +1192,10 @@ pmd_lcore_ldpc_dec(void *arg) ret = retrieve_ldpc_dec_op(ops_deq, num_ops, ref_op, tp->op_params->vector_mask, p_out); TEST_ASSERT_SUCCESS(ret, "Validation failed!"); + } + else { + ret = TEST_FAILED; + } rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); @@ -1193,7 +1207,7 @@ pmd_lcore_ldpc_dec(void *arg) 1000000.0) / ((double)total_time / (double)rte_get_tsc_hz()); */ - return TEST_SUCCESS; + return ret; } @@ -1513,14 +1527,14 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ info.drv.min_alignment, socket_id); if (f_ret != TEST_SUCCESS) { - printf("Couldn't init queue buffers"); + printf("Couldn't init queue buffers\n"); return(-1); } } ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); if (ret<0) { - printf("Couldn't start pmd dec"); + printf("Couldn't start pmd dec\n"); return(-1); } break; diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 8275037082..e875b7ca79 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -109,7 +109,9 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, init_pucch2_luts(); load_nrLDPClib(NULL); - load_nrLDPClib_offload(); + + if (gNB->ldpc_offload_flag) + load_nrLDPClib_offload(); // PBCH DMRS gold sequences generation nr_init_pbch_dmrs(gNB); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index b5d089ad2d..9384039b55 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -609,24 +609,31 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, Qm, (int8_t*)&pl_ol128[0], llrProcBuf, 1); - - for (int m=0; m < Kr>>3; m ++) { - harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; - } - - if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) { + + if (ret<0) { + no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; + } + else { + + for (int m=0; m < Kr>>3; m ++) { + harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; + } + + if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) { #ifdef PRINT_CRC_CHECK LOG_I(PHY, "Segment %d CRC OK\n",r); #endif - no_iteration_ldpc = 2; - } else { + no_iteration_ldpc = 2; + } else { #ifdef PRINT_CRC_CHECK LOG_I(PHY, "CRC NOK\n"); #endif - no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; + no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; + } } r_offset += E; + /*for (int k=0;k<8;k++) { printf("output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); @@ -646,6 +653,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, LOG_I(PHY,"uplink segment error %d/%d\n",r,harq_process->C); LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); harq_process->processedSegments=harq_process->C; + r=harq_process->C; } } if (harq_process->processedSegments==harq_process->C){ diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 89b2107e6b..af76fd7086 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -312,6 +312,7 @@ int main(int argc, char **argv) uint8_t snrRun; int prb_inter = 0; int ldpc_offload_flag = 0; + uint8_t max_rounds = 4; int enable_ptrs = 0; int modify_dmrs = 0; @@ -345,7 +346,7 @@ int main(int argc, char **argv) /* initialize the sin-cos table */ InitSinLUT(); - while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:o:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) { + while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:o:p:q:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) { printf("handling optarg %c\n",c); switch (c) { @@ -465,6 +466,10 @@ int main(int argc, char **argv) case 'p': extended_prefix_flag = 1; break; + + case 'q': + max_rounds = atoi(optarg); + break; case 'r': nb_rb = atoi(optarg); @@ -756,7 +761,11 @@ int main(int argc, char **argv) nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; cfg->carrier_config.num_tx_ant.value = n_tx; cfg->carrier_config.num_rx_ant.value = n_rx; + // nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,0,0x01); + + gNB->ldpc_offload_flag = ldpc_offload_flag; + phy_init_nr_gNB(gNB,0,1); N_RB_DL = gNB->frame_parms.N_RB_DL; @@ -810,7 +819,6 @@ int main(int argc, char **argv) unsigned char harq_pid = 0; - gNB->ldpc_offload_flag = ldpc_offload_flag; NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0]; //nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &ulsch_gNB->harq_processes[harq_pid]->ulsch_pdu; nfapi_nr_ul_tti_request_t *UL_tti_req = malloc(sizeof(*UL_tti_req)); @@ -845,7 +853,6 @@ int main(int argc, char **argv) uint16_t n_rb1 = 75; uint16_t pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA; // | PUSCH_PDU_BITMAP_PUSCH_PTRS; - uint8_t max_rounds = 4; uint8_t crc_status = 0; unsigned char mod_order = nr_get_Qm_ul(Imcs, mcs_table); @@ -1014,12 +1021,14 @@ int main(int argc, char **argv) double blerStats[4][100]; double berStats[4][100]; double snrStats[100]; + double ldpcDecStats[100]; memset(errors_scrambling, 0, sizeof(uint32_t)*4*100); memset(n_errors, 0, sizeof(int)*4*100); memset(round_trials, 0, sizeof(int)*4*100); memset(blerStats, 0, sizeof(double)*4*100); memset(berStats, 0, sizeof(double)*4*100); memset(snrStats, 0, sizeof(double)*100); + memset(ldpcDecStats, 0, sizeof(double)*100); for (SNR = snr0; SNR < snr1; SNR += snr_step) { varArray_t *table_rx=initVarArray(1000,sizeof(double)); int error_flag = 0; @@ -1421,16 +1430,16 @@ int main(int argc, char **argv) errors_decoding++; } } - if (n_trials == 1) { + /*if (n_trials == 1) { for (int r=0;rharq_processes[harq_pid]->C;r++) for (int i=0;iharq_processes[harq_pid]->K>>3;i++) { - if ((ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]) != 0) printf("************"); - /*printf("r %d: in[%d] %x, out[%d] %x (%x)\n",r, + if ((ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]) != 0) + printf("r %d: in[%d] %x, out[%d] %x (%x)\n",r, i,ulsch_ue[0]->harq_processes[harq_pid]->c[r][i], i,ulsch_gNB->harq_processes[harq_pid]->c[r][i], - ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]);*/ + ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]); } - } + }*/ if (errors_decoding > 0 && error_flag == 0) { n_false_positive++; if (n_trials==1) @@ -1496,6 +1505,8 @@ int main(int argc, char **argv) printf("\n"); } + ldpcDecStats[snrRun] = gNB->ulsch_decoding_stats.trials?inMicroS(gNB->ulsch_decoding_stats.diff/gNB->ulsch_decoding_stats.trials):0; + if(n_trials==1) break; @@ -1540,9 +1551,11 @@ int main(int argc, char **argv) LOG_MM("ulsimStats.m","BER_round3",berStats[3],snrRun,1,7); LOG_MM("ulsimStats.m","EffRate",effRate,snrRun,1,7); LOG_MM("ulsimStats.m","EffTP",effTP,snrRun,1,7); + LOG_MM("ulsimStats.m","LDPC_dec_time",ldpcDecStats,snrRun,1,7); free(test_input_bit); free(estimated_output_bit); - free_nrLDPClib_offload(); + if (gNB->ldpc_offload_flag) + free_nrLDPClib_offload(); if (output_fd) fclose(output_fd); From 8c09af6291f9daa918dc076ef7e6c156a9bee473 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 24 Sep 2021 15:25:10 +0200 Subject: [PATCH 018/136] Split fill queue function and move mbuf allocation to init step --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 258 ++++++++++-------- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 2 +- 2 files changed, 139 insertions(+), 121 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index aee8090ca6..2ffe4846a9 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -630,6 +630,7 @@ ut_teardown(void) static int init_op_data_objs(struct rte_bbdev_op_data *bufs, int8_t* p_llr, uint32_t data_len, + struct rte_mbuf *m_head, struct rte_mempool *mbuf_pool, const uint16_t n, enum op_data_type op_type, uint16_t min_alignment) { @@ -640,12 +641,7 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, for (i = 0; i < n; ++i) { char *data; - struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); - TEST_ASSERT_NOT_NULL(m_head, - "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", - op_type, n * nb_segments, - mbuf_pool->size); - + if (data_len > RTE_BBDEV_LDPC_E_MAX_MBUF) { /* * Special case when DPDK mbuf cannot handle @@ -669,7 +665,9 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, m_head->data_off = 0; m_head->data_len = data_len; } else { + rte_pktmbuf_reset(m_head); data = rte_pktmbuf_append(m_head, data_len); + TEST_ASSERT_NOT_NULL(data, "Couldn't append %u bytes to mbuf from %d data type mbuf pool", data_len, op_type); @@ -755,55 +753,6 @@ allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len, } -static int -fill_queue_buffers(struct test_op_params *op_params,int8_t* p_llr, uint32_t data_len, - struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp, - struct rte_mempool *soft_out_mp, - struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp, - uint16_t queue_id, - const struct rte_bbdev_op_cap *capabilities, - uint16_t min_alignment, const int socket_id) -{ - int ret; - enum op_data_type type; - const uint16_t n = op_params->num_to_process; - //int ldpc_llr_decimals; - //int ldpc_llr_size; - //uint32_t ldpc_cap_flags; - - struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { - in_mp, - soft_out_mp, - hard_out_mp, - harq_in_mp, - harq_out_mp, - }; - - struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = { - &op_params->q_bufs[socket_id][queue_id].inputs, - &op_params->q_bufs[socket_id][queue_id].soft_outputs, - &op_params->q_bufs[socket_id][queue_id].hard_outputs, - &op_params->q_bufs[socket_id][queue_id].harq_inputs, - &op_params->q_bufs[socket_id][queue_id].harq_outputs, - }; - - for (type = DATA_INPUT; type < 3; type+=2) { - - ret = allocate_buffers_on_socket(queue_ops[type], - n * sizeof(struct rte_bbdev_op_data), - socket_id); - TEST_ASSERT_SUCCESS(ret, - "Couldn't allocate memory for rte_bbdev_op_data structs"); - - ret = init_op_data_objs(*queue_ops[type], p_llr, data_len, - mbuf_pools[type], n, type, min_alignment); - TEST_ASSERT_SUCCESS(ret, - "Couldn't init rte_bbdev_op_data structs"); - - } - - return 0; -} static void free_buffers(struct active_device *ad, struct test_op_params *op_params) @@ -1166,16 +1115,16 @@ pmd_lcore_ldpc_dec(void *arg) } /* dequeue the remaining */ - int trials=0; + //int trials=0; while (deq < enq) { deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, queue_id, &ops_deq[deq], enq - deq); - usleep(10); + /*usleep(10); trials++; if (trials>=100) { printf("aborting decoding after 100 dequeue tries\n"); break; - } + }*/ } // total_time += rte_rdtsc_precise() - start_time; @@ -1412,6 +1361,9 @@ get_init_device(void) struct test_op_params op_params_e; struct test_op_params *op_params = &op_params_e; +struct rte_mbuf *m_head[DATA_NUM_TYPES]; + + int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint16_t F, uint32_t E, uint8_t Qm, int8_t* p_llr, int8_t* p_out, uint8_t mode) { @@ -1430,10 +1382,10 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ test_params.burst_sz=1; test_params.num_lcores=1; test_params.num_tests = 1; - struct active_device *ad; + struct active_device *ad; ad = &active_devs[0]; - int socket_id; + int socket_id=0; int i,f_ret; struct rte_bbdev_info info; enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; @@ -1469,24 +1421,86 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", RTE_ALIGN(sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE)); + + rte_bbdev_info_get(ad->dev_id, &info); + socket_id = GET_SOCKET(info.socket_id); + f_ret = create_mempools(ad, socket_id, op_type, + get_num_ops(),p_offloadParams); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't create mempools"); + } + f_ret = init_test_op_params(op_params, op_type, + 0, + 0, + ad->ops_mempool, + 1, + get_num_ops(), + get_num_lcores()); + if (f_ret != TEST_SUCCESS) { + printf("Couldn't init test op params"); + } - rte_bbdev_info_get(ad->dev_id, &info); - socket_id = GET_SOCKET(info.socket_id); - f_ret = create_mempools(ad, socket_id, op_type, - get_num_ops(),p_offloadParams); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't create mempools"); - } - f_ret = init_test_op_params(op_params, op_type, - 0, - 0, - ad->ops_mempool, - 1, - get_num_ops(), - get_num_lcores()); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't init test op params"); - } + const struct rte_bbdev_op_cap *capabilities = NULL; + rte_bbdev_info_get(ad->dev_id, &info); + socket_id = GET_SOCKET(info.socket_id); + //enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; + const struct rte_bbdev_op_cap *cap = info.drv.capabilities; + + for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { + if (cap->type == op_type) { + capabilities = cap; + break; + } + cap++; + } + ad->nb_queues = 1; + enum op_data_type type; + + for (i = 0; i < ad->nb_queues; ++i) { + + const uint16_t n = op_params->num_to_process; + + struct rte_mempool *in_mp = ad->in_mbuf_pool; + struct rte_mempool *hard_out_mp = ad->hard_out_mbuf_pool; + struct rte_mempool *soft_out_mp = ad->soft_out_mbuf_pool; + struct rte_mempool *harq_in_mp = ad->harq_in_mbuf_pool; + struct rte_mempool *harq_out_mp = ad->harq_out_mbuf_pool; + + struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { + in_mp, + soft_out_mp, + hard_out_mp, + harq_in_mp, + harq_out_mp, + }; + + uint8_t queue_id =ad->queue_ids[i]; + struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = { + &op_params->q_bufs[socket_id][queue_id].inputs, + &op_params->q_bufs[socket_id][queue_id].soft_outputs, + &op_params->q_bufs[socket_id][queue_id].hard_outputs, + &op_params->q_bufs[socket_id][queue_id].harq_inputs, + &op_params->q_bufs[socket_id][queue_id].harq_outputs, + }; + + for (type = DATA_INPUT; type < 3; type+=2) { + + ret = allocate_buffers_on_socket(queue_ops[type], + n * sizeof(struct rte_bbdev_op_data), + socket_id); + TEST_ASSERT_SUCCESS(ret, + "Couldn't allocate memory for rte_bbdev_op_data structs"); + + m_head[type] = rte_pktmbuf_alloc(mbuf_pools[type]); + + TEST_ASSERT_NOT_NULL(m_head[type], + "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", + op_type, 1, + mbuf_pools[type]->size); + + } + } + break; case 1: //printf("offload param E %d BG %d F %d Z %d Qm %d\n", E,p_decParams->BG, F,p_decParams->Z, Qm); @@ -1498,56 +1512,60 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ p_offloadParams->F = F; p_offloadParams->Qm = Qm; - const struct rte_bbdev_op_cap *capabilities = NULL; - rte_bbdev_info_get(ad->dev_id, &info); - socket_id = GET_SOCKET(info.socket_id); - //enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; - const struct rte_bbdev_op_cap *cap = info.drv.capabilities; + rte_bbdev_info_get(ad->dev_id, &info); + socket_id = GET_SOCKET(info.socket_id); - for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { - if (cap->type == op_type) { - capabilities = cap; - break; - } - cap++; - } - create_reference_ldpc_dec_op(op_params->ref_dec_op, p_offloadParams); - ad->nb_queues = 1; - for (i = 0; i < ad->nb_queues; ++i) { - f_ret = fill_queue_buffers(op_params, - p_llr, - p_offloadParams->E, - ad->in_mbuf_pool, - ad->hard_out_mbuf_pool, - ad->soft_out_mbuf_pool, - ad->harq_in_mbuf_pool, - ad->harq_out_mbuf_pool, - ad->queue_ids[i], - capabilities, - info.drv.min_alignment, - socket_id); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't init queue buffers\n"); - return(-1); - } - } + create_reference_ldpc_dec_op(op_params->ref_dec_op, p_offloadParams); - ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); - if (ret<0) { - printf("Couldn't start pmd dec\n"); - return(-1); - } + struct rte_mempool *in_mp = ad->in_mbuf_pool; + struct rte_mempool *hard_out_mp = ad->hard_out_mbuf_pool; + struct rte_mempool *soft_out_mp = ad->soft_out_mbuf_pool; + struct rte_mempool *harq_in_mp = ad->harq_in_mbuf_pool; + struct rte_mempool *harq_out_mp = ad->harq_out_mbuf_pool; + + struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { + in_mp, + soft_out_mp, + hard_out_mp, + harq_in_mp, + harq_out_mp, + }; + + uint8_t queue_id =ad->queue_ids[0]; + struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = { + &op_params->q_bufs[socket_id][queue_id].inputs, + &op_params->q_bufs[socket_id][queue_id].soft_outputs, + &op_params->q_bufs[socket_id][queue_id].hard_outputs, + &op_params->q_bufs[socket_id][queue_id].harq_inputs, + &op_params->q_bufs[socket_id][queue_id].harq_outputs, + }; + + for (type = DATA_INPUT; type < 3; type+=2) { + + ret = init_op_data_objs(*queue_ops[type], p_llr, p_offloadParams->E, + m_head[type], mbuf_pools[type], 1, type, info.drv.min_alignment); + TEST_ASSERT_SUCCESS(ret, + "Couldn't init rte_bbdev_op_data structs"); + + } + + ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); + if (ret<0) { + printf("Couldn't start pmd dec"); + return(-1); + } + break; case 2: - free_buffers(ad, op_params); - rte_free(op_params); - ut_teardown(); - testsuite_teardown(); + free_buffers(ad, op_params); + rte_free(op_params); + ut_teardown(); + testsuite_teardown(); break; default: - printf("Unknown mode: %d\n", mode); - return; + printf("Unknown mode: %d\n", mode); + return; } return numIter; diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 9384039b55..d9ba11bce9 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -682,7 +682,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 1); } - ulsch->last_iteration_cnt = no_iteration_ldpc; + //ulsch->last_iteration_cnt = no_iteration_ldpc; } } } From 1216eb2e4dfbbb3f48871fc7685fbb0ece84383a Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Sun, 3 Oct 2021 19:24:14 +0200 Subject: [PATCH 019/136] adding segment buffer offset and updates --- cmake_targets/CMakeLists.txt | 2 +- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 29 +++++++++++++------ openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 25 +++++++--------- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index e06123decc..88a37dbfe9 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -833,7 +833,7 @@ add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include") -SET(T1_DPDK_LIBS "-L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_fpga_5gnr_fec -lrte_pmd_hpac_sdfec_pmd -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") +SET(T1_DPDK_LIBS "-Wl,-rpath /usr/local/lib64 -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_fpga_5gnr_fec -lrte_pmd_hpac_sdfec_pmd -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") TARGET_LINK_LIBRARIES(ldpc_offload ${T1_DPDK_LIBS}) TARGET_LINK_LIBRARIES(ldpc_offload pthread dl rt m numa) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 2ffe4846a9..bfc65dc41a 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -167,7 +167,8 @@ struct thread_params { double iter_average; double bler; struct nrLDPCoffload_params *p_offloadParams; - int8_t* p_out; + int8_t* p_out; + uint8_t r; rte_atomic16_t nb_dequeued; rte_atomic16_t processing_status; rte_atomic16_t burst_sz; @@ -796,7 +797,8 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, struct rte_bbdev_op_data *soft_outputs, struct rte_bbdev_op_data *harq_inputs, struct rte_bbdev_op_data *harq_outputs, - struct rte_bbdev_dec_op *ref_op, + struct rte_bbdev_dec_op *ref_op, + uint8_t r, t_nrLDPCoffload_params *p_offloadParams) { unsigned int i; @@ -825,9 +827,13 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ops[i]->ldpc_dec.n_cb = p_offloadParams->n_cb; ops[i]->ldpc_dec.iter_max = 20; ops[i]->ldpc_dec.rv_index = p_offloadParams->rv; - ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; + ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE|RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP; ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; + ops[i]->ldpc_dec.harq_combined_input.offset =r*1024*32; + ops[i]->ldpc_dec.harq_combined_output.offset =r*1024*32; + + if (hard_outputs != NULL) ops[i]->ldpc_dec.hard_output = hard_outputs[start_idx + i]; @@ -967,6 +973,7 @@ create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op, t_nrLDPCoffload_params op->ldpc_dec.z_c = p_offloadParams->Z; op->ldpc_dec.n_filler = p_offloadParams->F; op->ldpc_dec.code_block_mode = 1; + op->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE|RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP; } @@ -1038,6 +1045,7 @@ pmd_lcore_ldpc_dec(void *arg) struct rte_bbdev_dec_op *ops_enq[num_ops]; struct rte_bbdev_dec_op *ops_deq[num_ops]; struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; + uint8_t r= tp->r; struct test_buffers *bufs = NULL; int i, j, ret; struct rte_bbdev_info info; @@ -1081,7 +1089,7 @@ pmd_lcore_ldpc_dec(void *arg) set_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op, p_offloadParams); + bufs->harq_inputs, bufs->harq_outputs, ref_op, r, p_offloadParams); /* Set counter to validate the ordering */ for (j = 0; j < num_ops; ++j) @@ -1192,9 +1200,10 @@ print_dec_throughput(struct thread_params *t_params, unsigned int used_cores) */ int start_pmd_dec(struct active_device *ad, - struct test_op_params *op_params, - t_nrLDPCoffload_params *p_offloadParams, - int8_t* p_out) + struct test_op_params *op_params, + t_nrLDPCoffload_params *p_offloadParams, + uint8_t r, + int8_t* p_out) { int ret; unsigned int lcore_id, used_cores = 0; @@ -1233,6 +1242,7 @@ start_pmd_dec(struct active_device *ad, t_params[0].iter_count = 0; t_params[0].p_out = p_out; t_params[0].p_offloadParams = p_offloadParams; + t_params[0].r = r; RTE_LCORE_FOREACH_SLAVE(lcore_id) { if (used_cores >= num_lcores) @@ -1244,6 +1254,7 @@ start_pmd_dec(struct active_device *ad, t_params[used_cores].iter_count = 0; t_params[used_cores].p_out = p_out; t_params[used_cores].p_offloadParams = p_offloadParams; + t_params[used_cores].r = r; rte_eal_remote_launch(pmd_lcore_ldpc_dec, &t_params[used_cores++], lcore_id); @@ -1264,7 +1275,7 @@ start_pmd_dec(struct active_device *ad, /* Print throughput if interrupts are disabled and test passed */ if (!intr_enabled) { - //print_dec_throughput(t_params, num_lcores); + //print_dec_throughput(t_params, num_lcores); rte_free(t_params); return ret; } @@ -1549,7 +1560,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ } - ret = start_pmd_dec(ad, op_params, p_offloadParams, p_out); + ret = start_pmd_dec(ad, op_params, p_offloadParams, C, p_out); if (ret<0) { printf("Couldn't start pmd dec"); return(-1); diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index d9ba11bce9..6457461c65 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -371,7 +371,7 @@ void nr_processULSegment(void* arg) { if (rdata->decodeIterations > p_decoderParms->numMaxIter) rdata->decodeIterations--; } else { #ifdef PRINT_CRC_CHECK - LOG_I(PHY, "CRC NOK\n"); + LOG_I(PHY, "segment %d CRC NOK\n",r); #endif rdata->decodeIterations = max_ldpc_iterations + 1; } @@ -602,7 +602,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, } ret = nrLDPC_decoder_offload(p_decParams, - 1, + r, pusch_pdu->pusch_data.rv_index, harq_process->F, E, @@ -626,7 +626,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, no_iteration_ldpc = 2; } else { #ifdef PRINT_CRC_CHECK - LOG_I(PHY, "CRC NOK\n"); + LOG_I(PHY, "segment %d CRC NOK\n",r); #endif no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; } @@ -640,24 +640,21 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); } */ + bool decodeSuccess = (no_iteration_ldpc <= ulsch->max_ldpc_iterations); if (decodeSuccess) { memcpy(harq_process->b+offset, harq_process->c[r], Kr_bytes - (harq_process->F>>3) -((harq_process->C>1)?3:0)); offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0)); - harq_process->processedSegments=r+1; + harq_process->processedSegments++; } else { - if ( harq_process->C != harq_process->processedSegments ) { - LOG_I(PHY,"uplink segment error %d/%d\n",r,harq_process->C); - LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); - harq_process->processedSegments=harq_process->C; - r=harq_process->C; - } - } - if (harq_process->processedSegments==harq_process->C){ - if (decodeSuccess) { + LOG_D(PHY,"uplink segment error %d/%d\n",r,harq_process->C); + LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); + } + if (r==(harq_process->C-1)){ + if ((decodeSuccess)&&(harq_process->processedSegments==(harq_process->C))) { LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n", phy_vars_gNB->Mod_id,harq_process->slot,harq_process->TBS); harq_process->status = SCH_IDLE; @@ -678,7 +675,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ulsch->harq_mask &= ~(1 << harq_pid); } harq_process->handled = 1; - + no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 1); } From 637ca97566b761bdb390ca53190b689371cd838d Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 7 Oct 2021 10:38:17 +0200 Subject: [PATCH 020/136] add ldpc offload cmdline option for softmodem and remove crc drop flag --- executables/nr-gnb.c | 1 + executables/nr-softmodem-common.h | 2 +- executables/nr-softmodem.h | 2 ++ executables/softmodem-common.c | 2 +- executables/softmodem-common.h | 1 + openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c | 2 +- 6 files changed, 7 insertions(+), 3 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index fa0c3a1f63..2cd7ab9413 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -507,6 +507,7 @@ void init_eNB_afterRU(void) { for (inst=0; instldpc_offload_flag = ldpc_offload_flag; phy_init_nr_gNB(gNB,0,0); // map antennas and PRACH signals to gNB RX diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h index 47fd816db5..ac6f81ad15 100644 --- a/executables/nr-softmodem-common.h +++ b/executables/nr-softmodem-common.h @@ -97,7 +97,7 @@ #define CONFIG_HLP_WORKER_CMD "two option for worker 'WORKER_DISABLE' or 'WORKER_ENABLE'\n" #define CONFIG_HLP_USRP_THREAD "having extra thead for usrp tx\n" #define CONFIG_HLP_DISABLNBIOT "disable nb-iot, even if defined in config\n" - +#define CONFIG_HLP_LDPC_OFFLOAD "enable LDPC offload\n" #define CONFIG_HLP_USRP_ARGS "set the arguments to identify USRP (same syntax as in UHD)\n" #define CONFIG_HLP_FLOG "Enable online log \n" diff --git a/executables/nr-softmodem.h b/executables/nr-softmodem.h index 834e89b403..25351dd442 100644 --- a/executables/nr-softmodem.h +++ b/executables/nr-softmodem.h @@ -29,6 +29,7 @@ {"U" , CONFIG_HLP_ULBM_PHYTEST,0, u64ptr:&ulsch_slot_bitmap, defintval:0, TYPE_UINT64, 0}, \ {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0, iptr:&usrp_tx_thread, defstrval:0, TYPE_INT, 0}, \ {"uecap_file", CONFIG_HLP_UECAP_FILE, 0, strptr:(char **)&uecap_file, defstrval:"./uecap.xml", TYPE_STRING, 0}, \ + {"ldpc-offload-enable", CONFIG_HLP_LDPC_OFFLOAD, 0, iptr:&ldpc_offload_flag, defstrval:0, TYPE_INT, 0}, \ {"s" , CONFIG_HLP_SNR, 0, dblptr:&snr_dB, defdblval:25, TYPE_DOUBLE, 0}, \ } @@ -42,6 +43,7 @@ extern uint32_t target_ul_bw; extern uint64_t dlsch_slot_bitmap; extern uint64_t ulsch_slot_bitmap; extern char *uecap_file; +extern uint32_t ldpc_offload_flag; // In nr-gnb.c extern void init_gNB(int single_thread_flag,int wait_for_sync); diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c index 12c60e98fd..0cc726f3f2 100644 --- a/executables/softmodem-common.c +++ b/executables/softmodem-common.c @@ -46,7 +46,7 @@ static softmodem_params_t softmodem_params; char *parallel_config=NULL; char *worker_config=NULL; int usrp_tx_thread = 0; - +uint32_t ldpc_offload_flag=0; uint8_t nfapi_mode=0; static mapping softmodem_funcs[] = MAPPING_SOFTMODEM_FUNCTIONS; diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 1f73720e70..2891949ffe 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -269,6 +269,7 @@ extern int usrp_tx_thread; extern uint16_t sl_ahead; extern uint16_t sf_ahead; extern volatile int oai_exit; +extern uint32_t ldpc_offload_flag; void tx_func(void *param); void rx_func(void *param); diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index bfc65dc41a..c6d572ec7d 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -827,7 +827,7 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ops[i]->ldpc_dec.n_cb = p_offloadParams->n_cb; ops[i]->ldpc_dec.iter_max = 20; ops[i]->ldpc_dec.rv_index = p_offloadParams->rv; - ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE|RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP; + ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; //|RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP; ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; ops[i]->ldpc_dec.harq_combined_input.offset =r*1024*32; From aeb987bb0a95ea1806ee11f6a7ae8b1763158088 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 25 Oct 2021 10:06:29 +0200 Subject: [PATCH 021/136] using temporarily one l1tx thread and soft ldpc for small mcs --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 72 +++- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 4 +- .../GENERIC-NR-5GC/CONF/gNB_SA_40_2x2.conf | 323 ++++++++++++++++++ 3 files changed, 390 insertions(+), 9 deletions(-) create mode 100755 targets/PROJECTS/GENERIC-NR-5GC/CONF/gNB_SA_40_2x2.conf diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 6457461c65..90c466ae84 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -411,6 +411,13 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, int no_iteration_ldpc; int length_dec; uint8_t crc_type; + int K_bits_F; + int16_t z [68*384 + 16] __attribute__ ((aligned(16))); + int8_t l [68*384 + 16] __attribute__ ((aligned(16))); + + __m128i *pv = (__m128i*)&z; + __m128i *pl = (__m128i*)&l; + #ifdef PRINT_CRC_CHECK prnt_crc_cnt++; #endif @@ -435,7 +442,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, harq_process->processedSegments = 0; double Coderate = 0.0; - + uint8_t Ilbrm = 0; // ------------------------------------------------------------------ uint16_t nb_rb = pusch_pdu->rb_size; uint8_t Qm = pusch_pdu->qam_mod_order; @@ -576,7 +583,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, offset = 0; if (enable_ldpc_offload) { - + if (harq_process->C == 1) { if (A > 3824) crc_type = CRC24_A; @@ -594,11 +601,12 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, E = nr_get_E(G, harq_process->C, Qm, n_layers, r); memset(harq_process->c[r],0,Kr_bytes); + if (mcs >9){ memcpy((&z_ol[0]),ulsch_llr+r_offset,E*sizeof(short)); for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) { - pl_ol128[j] = _mm_packs_epi16(_mm_slli_epi16(pv_ol128[i],1),_mm_slli_epi16(pv_ol128[i+1],1)); + pl_ol128[j] = _mm_packs_epi16(pv_ol128[i],pv_ol128[i+1]); } ret = nrLDPC_decoder_offload(p_decParams, @@ -609,11 +617,61 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, Qm, (int8_t*)&pl_ol128[0], llrProcBuf, 1); - - if (ret<0) { + } + else{ + K_bits_F = Kr-harq_process->F; + + t_nrLDPC_time_stats procTime = {0}; + t_nrLDPC_time_stats* p_procTime = &procTime ; + + nr_deinterleaving_ldpc(E, + Qm, + harq_process->e[r], + ulsch_llr+r_offset); + + if (nr_rate_matching_ldpc_rx(Ilbrm, + Tbslbrm, + p_decParams->BG, + p_decParams->Z, + harq_process->d[r], + harq_process->e[r], + harq_process->C, + pusch_pdu->pusch_data.rv_index, + harq_process->new_rx, + E, + harq_process->F, + Kr-harq_process->F-2*(p_decParams->Z))==-1) { + + LOG_E(PHY,"ulsch_decoding.c: Problem in rate_matching\n"); + no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; + return; + } + + //set first 2*Z_c bits to zeros + memset(&z[0],0,2*harq_process->Z*sizeof(int16_t)); + //set Filler bits + memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t)); + //Move coded bits before filler bits + memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); + //skip filler bits + memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t)); + //Saturate coded bits before decoding into 8 bits values + for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) + { + pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); + } + + no_iteration_ldpc = nrLDPC_decoder(p_decParams, + (int8_t*)&pl[0], + llrProcBuf, + harq_process->p_nrLDPC_procBuf[r], + p_procTime); + + } + /*if (ret<0) { no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; } - else { + else {*/ for (int m=0; m < Kr>>3; m ++) { harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; @@ -630,7 +688,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, #endif no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; } - } + //} r_offset += E; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index bd2836c3e7..f93d41028d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1239,7 +1239,7 @@ void pf_ul(module_id_t module_id, sched_ctrl->update_pusch_ps = false; } NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; - sched_pusch->mcs = 9; + sched_pusch->mcs = 12; update_ul_ue_R_Qm(sched_pusch, ps); sched_pusch->rbStart = rbStart; sched_pusch->rbSize = min_rb; @@ -1265,7 +1265,7 @@ void pf_ul(module_id_t module_id, add_tail_nr_list(&UE_sched, UE_id); /* Calculate coefficient*/ - sched_pusch->mcs = 9; + sched_pusch->mcs = 12; const uint32_t tbs = ul_pf_tbs[ps->mcs_table][sched_pusch->mcs]; coeff_ue[UE_id] = (float) tbs / ul_thr_ue[UE_id]; LOG_D(NR_MAC,"b %d, ul_thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n", diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gNB_SA_40_2x2.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gNB_SA_40_2x2.conf new file mode 100755 index 0000000000..a050ed6035 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gNB_SA_40_2x2.conf @@ -0,0 +1,323 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_CU_ID = 0xe00; + +# cell_type = "CELL_MACRO_GNB"; + + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x010203; // 0 false, else true + }, + { + sst = 1; + sd = 0x112233; // 0 false, else true + } + ); + }); + + nr_cellid = 12345678L + +# tr_s_preference = "local_mac" + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 2; + min_rxtxtime_pdsch = 2; + ul_prbblacklist = "51,52,53,54" + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 11; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6 + #absoluteFrequencySSB = 620640; + # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68 + absoluteFrequencySSB = 621312; + # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2 + #absoluteFrequencySSB = 634080; + # this is 3600.48 MHz + #absoluteFrequencySSB = 640032; + #dl_frequencyBand = 78; + # this is 3301.68 MHz + #dl_absoluteFrequencyPointA = 620112; + # this is 3300.60 MHz + dl_absoluteFrequencyPointA = 620040; + # this is 3502.56 MHz + #dl_absoluteFrequencyPointA = 633552; + # this is 3600.48 MHz + #dl_absoluteFrequencyPointA = 640032; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 106; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=106 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPsearchSpaceZero = 0; + #pdsch-ConfigCommon + #pdschTimeDomainAllocationList (up to 16 entries) + initialDLBWPk0_0 = 0; + #initialULBWPmappingType + #0=typeA,1=typeB + initialDLBWPmappingType_0 = 0; + #this is SS=1,L=13 + initialDLBWPstartSymbolAndLength_0 = 40; + + initialDLBWPk0_1 = 0; + initialDLBWPmappingType_1 = 0; + #this is SS=1,L=5 + initialDLBWPstartSymbolAndLength_1 = 57; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 106; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -104; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + # pusch-ConfigCommon (up to 16 elements) + initialULBWPk2_0 = 6; + initialULBWPmappingType_0 = 1 + # this is SS=2 L=13 + initialULBWPstartSymbolAndLength_0 = 41; + + initialULBWPk2_1 = 6; + initialULBWPmappingType_1 = 1; + # this is SS=0 L=4 + initialULBWPstartSymbolAndLength_1 = 52; + + initialULBWPk2_2 = 7; + initialULBWPmappingType_2 = 1; + # this is SS=10 L=4 + initialULBWPstartSymbolAndLength_2 = 52; + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.69.131"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + GNB_INTERFACE_NAME_FOR_NG_AMF = "em1"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.18.196/24"; + GNB_INTERFACE_NAME_FOR_NGU = "em1"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.18.196/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 200; + pucch_TargetSNRx10 = 200; + ulsch_max_slots_inactivity=10; + } +); + +L1s = ( + { + num_cc = 1; + tr_n_preference = "local_mac"; + pusch_proc_threads = 3; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 50; + } +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 2 + nb_rx = 2 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + ##beamforming 1x4 matrix: 1 layer x 4 antennas + #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000]; + ## beamforming 2x2 matrix: + # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff]; + ## beamforming 4x4 matrix: + #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; + + sdr_addrs = "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=internal,time_source=internal" + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + f1ap_log_level ="debug"; + f1ap_log_verbosity ="medium"; + }; From 1749595217f654ff339f73f491ddb2508ead25f5 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 15 Nov 2021 12:53:28 +0100 Subject: [PATCH 022/136] bug fixes and removing warnings --- cmake_targets/CMakeLists.txt | 2 +- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 11 +- .../CODING/nrLDPC_decoder/nrLDPC_offload.h | 9 +- targets/ARCH/test-bbdev/Makefile | 30 - targets/ARCH/test-bbdev/ldpc_dec_default.data | 1 - targets/ARCH/test-bbdev/ldpc_enc_default.data | 1 - targets/ARCH/test-bbdev/main.c | 362 -- targets/ARCH/test-bbdev/main.h | 128 - targets/ARCH/test-bbdev/meson.build | 14 - targets/ARCH/test-bbdev/test-bbdev.py | 118 - targets/ARCH/test-bbdev/test_bbdev.c | 1371 ----- targets/ARCH/test-bbdev/test_bbdev_perf.c | 5058 ----------------- targets/ARCH/test-bbdev/test_bbdev_vector.c | 1438 ----- targets/ARCH/test-bbdev/test_bbdev_vector.h | 79 - .../test-bbdev/test_vectors/bbdev_null.data | 5 - .../test_vectors/demo_dec_scn_1_rv0_drv0.data | 44 - .../test_vectors/demo_dec_scn_2_rv0_drv0.data | 43 - .../test_vectors/demo_dec_scn_3_rv0_drv0.data | 44 - .../test_vectors/demo_dec_scn_4_rv0_drv0.data | 44 - .../test_vectors/demo_dec_scn_5_rv0_drv0.data | 44 - .../test_vectors/demo_dec_scn_6_rv0_drv0.data | 44 - .../test_vectors/demo_dec_scn_7_rv0_drv0.data | 45 - .../test_vectors/demo_dec_scn_8_rv0_drv0.data | 45 - .../test_vectors/demo_enc_scn_1_rv0.data | 38 - .../test_vectors/demo_enc_scn_2_rv0.data | 38 - .../test_vectors/demo_enc_scn_3_rv0.data | 38 - .../test_vectors/demo_enc_scn_4_rv0.data | 40 - .../test_vectors/demo_enc_scn_5_rv0.data | 39 - .../test_vectors/demo_enc_scn_6_rv0.data | 39 - .../test_vectors/demo_enc_scn_7_rv0.data | 38 - .../test_vectors/demo_enc_scn_8_rv0.data | 39 - .../test_vectors/ldpc_dec_HARQ_1_0.data | 353 -- .../test_vectors/ldpc_dec_HARQ_1_1.data | 684 --- .../test_vectors/ldpc_dec_HARQ_1_2.data | 902 --- .../test_vectors/ldpc_dec_v11835.data | 49 - .../test_vectors/ldpc_dec_v2342_drop.data | 745 --- .../test_vectors/ldpc_dec_v7813.data | 48 - .../test_vectors/ldpc_dec_v8480.data | 135 - .../test_vectors/ldpc_dec_v8568.data | 255 - .../test_vectors/ldpc_dec_v9503.data | 1215 ---- .../test_vectors/ldpc_enc_v11835.data | 41 - .../test_vectors/ldpc_enc_v2342.data | 151 - .../test_vectors/ldpc_enc_v7813.data | 43 - .../test_vectors/ldpc_enc_v8568.data | 70 - .../test_vectors/ldpc_enc_v9503.data | 197 - ...turbo_dec_c1_k40_r0_e17280_sbd_negllr.data | 57 - ..._r0_e10376_crc24b_sbd_negllr_high_snr.data | 643 --- ...4_r0_e10376_crc24b_sbd_negllr_low_snr.data | 643 --- .../turbo_dec_c1_k6144_r0_e34560_posllr.data | 645 --- ...rbo_dec_c1_k6144_r0_e34560_sbd_negllr.data | 1224 ---- ...rbo_dec_c1_k6144_r0_e34560_sbd_posllr.data | 1225 ---- ...c_c2_k3136_r0_e4920_sbd_negllr_crc24b.data | 680 --- .../turbo_enc_c1_k40_r0_e1190_rm.data | 36 - .../turbo_enc_c1_k40_r0_e1194_rm.data | 36 - .../turbo_enc_c1_k40_r0_e1196_rm.data | 36 - .../turbo_enc_c1_k40_r0_e272_rm.data | 33 - .../turbo_enc_c1_k6144_r0_e120_rm_rvidx.data | 63 - .../turbo_enc_c1_k6144_r0_e18444.data | 156 - .../turbo_enc_c1_k6144_r0_e18448_crc24a.data | 159 - ...urbo_enc_c1_k6144_r0_e32256_crc24b_rm.data | 180 - .../turbo_enc_c3_k4800_r2_e14412_crc24b.data | 153 - .../ARCH/test-bbdev/turbo_dec_default.data | 1 - .../ARCH/test-bbdev/turbo_enc_default.data | 1 - 63 files changed, 13 insertions(+), 20135 deletions(-) delete mode 100644 targets/ARCH/test-bbdev/Makefile delete mode 120000 targets/ARCH/test-bbdev/ldpc_dec_default.data delete mode 120000 targets/ARCH/test-bbdev/ldpc_enc_default.data delete mode 100644 targets/ARCH/test-bbdev/main.c delete mode 100644 targets/ARCH/test-bbdev/main.h delete mode 100644 targets/ARCH/test-bbdev/meson.build delete mode 100755 targets/ARCH/test-bbdev/test-bbdev.py delete mode 100644 targets/ARCH/test-bbdev/test_bbdev.c delete mode 100644 targets/ARCH/test-bbdev/test_bbdev_perf.c delete mode 100644 targets/ARCH/test-bbdev/test_bbdev_vector.c delete mode 100644 targets/ARCH/test-bbdev/test_bbdev_vector.h delete mode 100644 targets/ARCH/test-bbdev/test_vectors/bbdev_null.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_1_rv0_drv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_2_rv0_drv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_3_rv0_drv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_4_rv0_drv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_5_rv0_drv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_6_rv0_drv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_7_rv0_drv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_8_rv0_drv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_1_rv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_2_rv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_3_rv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_4_rv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_5_rv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_6_rv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_7_rv0.data delete mode 100755 targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_8_rv0.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_0.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_1.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_2.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v11835.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v2342_drop.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v7813.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8568.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v9503.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v11835.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v2342.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v7813.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v8568.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v9503.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k40_r0_e17280_sbd_negllr.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_low_snr.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_posllr.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_negllr.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_posllr.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_dec_c2_k3136_r0_e4920_sbd_negllr_crc24b.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1190_rm.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1194_rm.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1196_rm.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e272_rm.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e120_rm_rvidx.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18444.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18448_crc24a.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e32256_crc24b_rm.data delete mode 100644 targets/ARCH/test-bbdev/test_vectors/turbo_enc_c3_k4800_r2_e14412_crc24b.data delete mode 120000 targets/ARCH/test-bbdev/turbo_dec_default.data delete mode 120000 targets/ARCH/test-bbdev/turbo_enc_default.data diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 88a37dbfe9..54e38fd682 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -831,7 +831,7 @@ set(HWLIB_LDPC_OFFLOAD_SOURCE ) add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) -set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include") +set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include -DALLOW_EXPERIMENTAL_API") SET(T1_DPDK_LIBS "-Wl,-rpath /usr/local/lib64 -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_fpga_5gnr_fec -lrte_pmd_hpac_sdfec_pmd -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") TARGET_LINK_LIBRARIES(ldpc_offload ${T1_DPDK_LIBS}) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index c6d572ec7d..10eed12776 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -65,9 +65,6 @@ #include #include #include -//#include "../../../targets/ARCH/test-bbdev/main.h" -#include "../../../targets/ARCH/test-bbdev/test_bbdev_vector.h" - #define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id)) @@ -1451,11 +1448,11 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ printf("Couldn't init test op params"); } - const struct rte_bbdev_op_cap *capabilities = NULL; + //const struct rte_bbdev_op_cap *capabilities = NULL; rte_bbdev_info_get(ad->dev_id, &info); socket_id = GET_SOCKET(info.socket_id); //enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_LDPC_DEC; - const struct rte_bbdev_op_cap *cap = info.drv.capabilities; + /*const struct rte_bbdev_op_cap *cap = info.drv.capabilities; for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { if (cap->type == op_type) { @@ -1463,7 +1460,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ break; } cap++; - } + }*/ ad->nb_queues = 1; enum op_data_type type; @@ -1576,7 +1573,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ break; default: printf("Unknown mode: %d\n", mode); - return; + return(-1); } return numIter; diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h index fb3dec8326..80a9395d0b 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h @@ -21,7 +21,14 @@ #define DEFAULT_OPS 64U #define DEFAULT_ITER 6U - +enum op_data_type { + DATA_INPUT = 0, + DATA_SOFT_OUTPUT, + DATA_HARD_OUTPUT, + DATA_HARQ_INPUT, + DATA_HARQ_OUTPUT, + DATA_NUM_TYPES, +}; #define TEST_ASSERT(cond, msg, ...) do { \ if (!(cond)) { \ diff --git a/targets/ARCH/test-bbdev/Makefile b/targets/ARCH/test-bbdev/Makefile deleted file mode 100644 index dc29557f37..0000000000 --- a/targets/ARCH/test-bbdev/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -include $(RTE_SDK)/mk/rte.vars.mk - -# -# library name -# -APP = testbbdev - -CFLAGS += -O3 -CFLAGS += $(WERROR_FLAGS) - -# -# all sources are stored in SRCS-y -# -SRCS-$(CONFIG_RTE_TEST_BBDEV) += main.c -SRCS-$(CONFIG_RTE_TEST_BBDEV) += test_bbdev.c -SRCS-$(CONFIG_RTE_TEST_BBDEV) += test_bbdev_perf.c -SRCS-$(CONFIG_RTE_TEST_BBDEV) += test_bbdev_vector.c - -LDLIBS += -lm -ifeq ($(CONFIG_RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC),y) -LDLIBS += -lrte_pmd_bbdev_fpga_lte_fec -endif -ifeq ($(CONFIG_RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC),y) -LDLIBS += -lrte_pmd_bbdev_fpga_5gnr_fec -endif - -include $(RTE_SDK)/mk/rte.app.mk diff --git a/targets/ARCH/test-bbdev/ldpc_dec_default.data b/targets/ARCH/test-bbdev/ldpc_dec_default.data deleted file mode 120000 index e53aa1b902..0000000000 --- a/targets/ARCH/test-bbdev/ldpc_dec_default.data +++ /dev/null @@ -1 +0,0 @@ -test_vectors/ldpc_dec_v2342_drop.data \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/ldpc_enc_default.data b/targets/ARCH/test-bbdev/ldpc_enc_default.data deleted file mode 120000 index 371cbc692d..0000000000 --- a/targets/ARCH/test-bbdev/ldpc_enc_default.data +++ /dev/null @@ -1 +0,0 @@ -test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/main.c b/targets/ARCH/test-bbdev/main.c deleted file mode 100644 index ff65173fdb..0000000000 --- a/targets/ARCH/test-bbdev/main.c +++ /dev/null @@ -1,362 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2017 Intel Corporation - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "main.h" - - -/* Defines how many testcases can be specified as cmdline args */ -#define MAX_CMDLINE_TESTCASES 8 - -static const char tc_sep = ','; - -/* Declare structure for command line test parameters and options */ -static struct test_params { - struct test_command *test_to_run[MAX_CMDLINE_TESTCASES]; - unsigned int num_tests; - unsigned int num_ops; - unsigned int burst_sz; - unsigned int num_lcores; - double snr; - unsigned int iter_max; - char test_vector_filename[PATH_MAX]; - bool init_device; -} test_params; - -static struct test_commands_list commands_list = - TAILQ_HEAD_INITIALIZER(commands_list); - -void -add_test_command(struct test_command *t) -{ - TAILQ_INSERT_TAIL(&commands_list, t, next); -} - -int -unit_test_suite_runner(struct unit_test_suite *suite) -{ - int test_result = TEST_SUCCESS; - unsigned int total = 0, skipped = 0, succeeded = 0, failed = 0; - uint64_t start, end; - - printf("\n===========================================================\n"); - printf("Starting Test Suite : %s\n", suite->suite_name); - - start = rte_rdtsc_precise(); - - if (suite->setup) { - test_result = suite->setup(); - if (test_result == TEST_FAILED) { - printf(" + Test suite setup %s failed!\n", - suite->suite_name); - printf(" + ------------------------------------------------------- +\n"); - return 1; - } - if (test_result == TEST_SKIPPED) { - printf(" + Test suite setup %s skipped!\n", - suite->suite_name); - printf(" + ------------------------------------------------------- +\n"); - return 0; - } - } - - while (suite->unit_test_cases[total].testcase) { - if (suite->unit_test_cases[total].setup) - test_result = suite->unit_test_cases[total].setup(); - - if (test_result == TEST_SUCCESS) - test_result = suite->unit_test_cases[total].testcase(); - - if (suite->unit_test_cases[total].teardown) - suite->unit_test_cases[total].teardown(); - - if (test_result == TEST_SUCCESS) { - succeeded++; - printf("TestCase [%2d] : %s passed\n", total, - suite->unit_test_cases[total].name); - } else if (test_result == TEST_SKIPPED) { - skipped++; - printf("TestCase [%2d] : %s skipped\n", total, - suite->unit_test_cases[total].name); - } else { - failed++; - printf("TestCase [%2d] : %s failed\n", total, - suite->unit_test_cases[total].name); - } - - total++; - } - - /* Run test suite teardown */ - if (suite->teardown) - suite->teardown(); - - end = rte_rdtsc_precise(); - - printf(" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\n"); - printf(" + Test Suite Summary : %s\n", suite->suite_name); - printf(" + Tests Total : %2d\n", total); - printf(" + Tests Skipped : %2d\n", skipped); - printf(" + Tests Passed : %2d\n", succeeded); - printf(" + Tests Failed : %2d\n", failed); - printf(" + Tests Lasted : %lg ms\n", - ((end - start) * 1000) / (double)rte_get_tsc_hz()); - printf(" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\n"); - - return (failed > 0) ? 1 : 0; -} - -const char * -get_vector_filename(void) -{ - return test_params.test_vector_filename; -} - -unsigned int -get_num_ops(void) -{ - return test_params.num_ops; -} - -unsigned int -get_burst_sz(void) -{ - return test_params.burst_sz; -} - -unsigned int -get_num_lcores(void) -{ - return test_params.num_lcores; -} - -double -get_snr(void) -{ - return test_params.snr; -} - -unsigned int -get_iter_max(void) -{ - return test_params.iter_max; -} - -bool -get_init_device(void) -{ - return test_params.init_device; -} - -static void -print_usage(const char *prog_name) -{ - struct test_command *t; - - printf("***Usage: %s [EAL params] [-- [-n/--num-ops NUM_OPS]\n" - "\t[-b/--burst-size BURST_SIZE]\n" - "\t[-v/--test-vector VECTOR_FILE]\n" - "\t[-c/--test-cases TEST_CASE[,TEST_CASE,...]]]\n", - prog_name); - - printf("Available testcases: "); - TAILQ_FOREACH(t, &commands_list, next) - printf("%s ", t->command); - printf("\n"); -} - -static int -parse_args(int argc, char **argv, struct test_params *tp) -{ - int opt, option_index; - unsigned int num_tests = 0; - bool test_cases_present = false; - bool test_vector_present = false; - struct test_command *t; - char *tokens[MAX_CMDLINE_TESTCASES]; - int tc, ret; - - static struct option lgopts[] = { - { "num-ops", 1, 0, 'n' }, - { "burst-size", 1, 0, 'b' }, - { "test-cases", 1, 0, 'c' }, - { "test-vector", 1, 0, 'v' }, - { "lcores", 1, 0, 'l' }, - { "snr", 1, 0, 's' }, - { "iter_max", 6, 0, 't' }, - { "init-device", 0, 0, 'i'}, - { "help", 0, 0, 'h' }, - { NULL, 0, 0, 0 } - }; - tp->iter_max = DEFAULT_ITER; - - while ((opt = getopt_long(argc, argv, "hin:b:c:v:l:s:t:", lgopts, - &option_index)) != EOF) - switch (opt) { - case 'n': - TEST_ASSERT(strlen(optarg) > 0, - "Num of operations is not provided"); - tp->num_ops = strtol(optarg, NULL, 10); - break; - case 'b': - TEST_ASSERT(strlen(optarg) > 0, - "Burst size is not provided"); - tp->burst_sz = strtol(optarg, NULL, 10); - TEST_ASSERT(tp->burst_sz <= MAX_BURST, - "Burst size mustn't be greater than %u", - MAX_BURST); - break; - case 'c': - TEST_ASSERT(test_cases_present == false, - "Test cases provided more than once"); - test_cases_present = true; - - ret = rte_strsplit(optarg, strlen(optarg), - tokens, MAX_CMDLINE_TESTCASES, tc_sep); - - TEST_ASSERT(ret <= MAX_CMDLINE_TESTCASES, - "Too many test cases (max=%d)", - MAX_CMDLINE_TESTCASES); - - for (tc = 0; tc < ret; ++tc) { - /* Find matching test case */ - TAILQ_FOREACH(t, &commands_list, next) - if (!strcmp(tokens[tc], t->command)) - tp->test_to_run[num_tests] = t; - - TEST_ASSERT(tp->test_to_run[num_tests] != NULL, - "Unknown test case: %s", - tokens[tc]); - ++num_tests; - } - break; - case 'v': - TEST_ASSERT(test_vector_present == false, - "Test vector provided more than once"); - test_vector_present = true; - - TEST_ASSERT(strlen(optarg) > 0, - "Config file name is null"); - - snprintf(tp->test_vector_filename, - sizeof(tp->test_vector_filename), - "%s", optarg); - break; - case 's': - TEST_ASSERT(strlen(optarg) > 0, - "SNR is not provided"); - tp->snr = strtod(optarg, NULL); - break; - case 't': - TEST_ASSERT(strlen(optarg) > 0, - "Iter_max is not provided"); - tp->iter_max = strtol(optarg, NULL, 10); - break; - case 'l': - TEST_ASSERT(strlen(optarg) > 0, - "Num of lcores is not provided"); - tp->num_lcores = strtol(optarg, NULL, 10); - TEST_ASSERT(tp->num_lcores <= RTE_MAX_LCORE, - "Num of lcores mustn't be greater than %u", - RTE_MAX_LCORE); - break; - case 'i': - /* indicate fpga fec config required */ - tp->init_device = true; - break; - case 'h': - print_usage(argv[0]); - return 0; - default: - printf("ERROR: Unknown option: -%c\n", opt); - return -1; - } - - if (tp->num_ops == 0) { - printf( - "WARNING: Num of operations was not provided or was set 0. Set to default (%u)\n", - DEFAULT_OPS); - tp->num_ops = DEFAULT_OPS; - } - if (tp->burst_sz == 0) { - printf( - "WARNING: Burst size was not provided or was set 0. Set to default (%u)\n", - DEFAULT_BURST); - tp->burst_sz = DEFAULT_BURST; - } - if (tp->num_lcores == 0) { - printf( - "WARNING: Num of lcores was not provided or was set 0. Set to value from RTE config (%u)\n", - rte_lcore_count()); - tp->num_lcores = rte_lcore_count(); - } - - TEST_ASSERT(tp->burst_sz <= tp->num_ops, - "Burst size (%u) mustn't be greater than num ops (%u)", - tp->burst_sz, tp->num_ops); - - tp->num_tests = num_tests; - return 0; -} - -static int -run_all_tests(void) -{ - int ret = TEST_SUCCESS; - struct test_command *t; - - TAILQ_FOREACH(t, &commands_list, next) - ret |= (int) t->callback(); - - return ret; -} - -static int -run_parsed_tests(struct test_params *tp) -{ - int ret = TEST_SUCCESS; - unsigned int i; - - for (i = 0; i < tp->num_tests; ++i) - ret |= (int) tp->test_to_run[i]->callback(); - - return ret; -} - -int -main(int argc, char **argv) -{ - int ret; - - /* Init EAL */ - ret = rte_eal_init(argc, argv); - if (ret < 0) - return 1; - argc -= ret; - argv += ret; - - /* Parse application arguments (after the EAL ones) */ - ret = parse_args(argc, argv, &test_params); - if (ret < 0) { - print_usage(argv[0]); - return 1; - } - - /* If no argument provided - run all tests */ - if (test_params.num_tests == 0) - return run_all_tests(); - else - return run_parsed_tests(&test_params); -} diff --git a/targets/ARCH/test-bbdev/main.h b/targets/ARCH/test-bbdev/main.h deleted file mode 100644 index fb3dec8326..0000000000 --- a/targets/ARCH/test-bbdev/main.h +++ /dev/null @@ -1,128 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2017 Intel Corporation - */ - -#ifndef _MAIN_H_ -#define _MAIN_H_ - -#include -#include - -#include -#include -#include - -#define TEST_SUCCESS 0 -#define TEST_FAILED -1 -#define TEST_SKIPPED 1 - -#define MAX_BURST 512U -#define DEFAULT_BURST 32U -#define DEFAULT_OPS 64U -#define DEFAULT_ITER 6U - - - -#define TEST_ASSERT(cond, msg, ...) do { \ - if (!(cond)) { \ - printf("TestCase %s() line %d failed: " \ - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ - return TEST_FAILED; \ - } \ -} while (0) - -/* Compare two buffers (length in bytes) */ -#define TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, len, msg, ...) do { \ - if (memcmp((a), (b), len)) { \ - printf("TestCase %s() line %d failed: " \ - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ - rte_memdump(stdout, "Buffer A", (a), len); \ - rte_memdump(stdout, "Buffer B", (b), len); \ - return TEST_FAILED; \ - } \ -} while (0) - -#define TEST_ASSERT_SUCCESS(val, msg, ...) do { \ - typeof(val) _val = (val); \ - if (!(_val == 0)) { \ - printf("TestCase %s() line %d failed (err %d): " \ - msg "\n", __func__, __LINE__, _val, \ - ##__VA_ARGS__); \ - return TEST_FAILED; \ - } \ -} while (0) - -#define TEST_ASSERT_FAIL(val, msg, ...) \ - TEST_ASSERT_SUCCESS(!(val), msg, ##__VA_ARGS__) - -#define TEST_ASSERT_NOT_NULL(val, msg, ...) do { \ - if ((val) == NULL) { \ - printf("TestCase %s() line %d failed (null): " \ - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ - return TEST_FAILED; \ - } \ -} while (0) - -struct unit_test_case { - int (*setup)(void); - void (*teardown)(void); - int (*testcase)(void); - const char *name; -}; - -#define TEST_CASE(testcase) {NULL, NULL, testcase, #testcase} - -#define TEST_CASE_ST(setup, teardown, testcase) \ - {setup, teardown, testcase, #testcase} - -#define TEST_CASES_END() {NULL, NULL, NULL, NULL} - -struct unit_test_suite { - const char *suite_name; - int (*setup)(void); - void (*teardown)(void); - struct unit_test_case unit_test_cases[]; -}; - -int unit_test_suite_runner(struct unit_test_suite *suite); - -typedef int (test_callback)(void); -TAILQ_HEAD(test_commands_list, test_command); -struct test_command { - TAILQ_ENTRY(test_command) next; - const char *command; - test_callback *callback; -}; - -void add_test_command(struct test_command *t); - -/* Register a test function */ -#define REGISTER_TEST_COMMAND(name, testsuite) \ - static int test_func_##name(void) \ - { \ - return unit_test_suite_runner(&testsuite); \ - } \ - static struct test_command test_struct_##name = { \ - .command = RTE_STR(name), \ - .callback = test_func_##name, \ - }; \ - RTE_INIT(test_register_##name) \ - { \ - add_test_command(&test_struct_##name); \ - } - -const char *get_vector_filename(void); - -unsigned int get_num_ops(void); - -unsigned int get_burst_sz(void); - -unsigned int get_num_lcores(void); - -double get_snr(void); - -unsigned int get_iter_max(void); - -bool get_init_device(void); - -#endif diff --git a/targets/ARCH/test-bbdev/meson.build b/targets/ARCH/test-bbdev/meson.build deleted file mode 100644 index 18ab6a8c6c..0000000000 --- a/targets/ARCH/test-bbdev/meson.build +++ /dev/null @@ -1,14 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2018 Intel Corporation - -sources = files('main.c', - 'test_bbdev.c', - 'test_bbdev_perf.c', - 'test_bbdev_vector.c') -deps += ['bbdev', 'bus_vdev'] -if dpdk_conf.has('RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC') - deps += ['pmd_bbdev_fpga_lte_fec'] -endif -if dpdk_conf.has('RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC') - deps += ['pmd_bbdev_fpga_5gnr_fec'] -endif diff --git a/targets/ARCH/test-bbdev/test-bbdev.py b/targets/ARCH/test-bbdev/test-bbdev.py deleted file mode 100755 index 0194be0464..0000000000 --- a/targets/ARCH/test-bbdev/test-bbdev.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python - -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -import sys -import os -import argparse -import subprocess -import shlex - -from threading import Timer - -def kill(process): - print "ERROR: Test app timed out" - process.kill() - -if "RTE_SDK" in os.environ: - dpdk_path = os.environ["RTE_SDK"] -else: - dpdk_path = "../.." - -if "RTE_TARGET" in os.environ: - dpdk_target = os.environ["RTE_TARGET"] -else: - dpdk_target = "x86_64-native-linux-gcc" - -parser = argparse.ArgumentParser( - description='BBdev Unit Test Application', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) -parser.add_argument("-p", "--testapp-path", - help="specifies path to the bbdev test app", - default=dpdk_path + "/" + dpdk_target + "/app/testbbdev") -parser.add_argument("-e", "--eal-params", - help="EAL arguments which are passed to the test app", - default="--vdev=baseband_null0") -parser.add_argument("-t", "--timeout", - type=int, - help="Timeout in seconds", - default=300) -parser.add_argument("-c", "--test-cases", - nargs="+", - help="Defines test cases to run. Run all if not specified") -parser.add_argument("-v", "--test-vector", - nargs="+", - help="Specifies paths to the test vector files.", - default=[dpdk_path + - "/app/test-bbdev/test_vectors/bbdev_null.data"]) -parser.add_argument("-n", "--num-ops", - type=int, - help="Number of operations to process on device.", - default=32) -parser.add_argument("-b", "--burst-size", - nargs="+", - type=int, - help="Operations enqueue/dequeue burst size.", - default=[32]) -parser.add_argument("-l", "--num-lcores", - type=int, - help="Number of lcores to run.", - default=16) -parser.add_argument("-i", "--init-device", - action='store_true', - help="Initialise PF device with default values.") - -args = parser.parse_args() - -if not os.path.exists(args.testapp_path): - print "No such file: " + args.testapp_path - sys.exit(1) - -params = [args.testapp_path] -if args.eal_params: - params.extend(shlex.split(args.eal_params)) - -params.extend(["--"]) - -if args.num_ops: - params.extend(["-n", str(args.num_ops)]) - -if args.num_lcores: - params.extend(["-l", str(args.num_lcores)]) - -if args.test_cases: - params.extend(["-c"]) - params.extend([",".join(args.test_cases)]) - -if args.init_device: - params.extend(["-i"]) - - -exit_status = 0 -for vector in args.test_vector: - for burst_size in args.burst_size: - call_params = params[:] - call_params.extend(["-v", vector]) - call_params.extend(["-b", str(burst_size)]) - params_string = " ".join(call_params) - - print("Executing: {}".format(params_string)) - app_proc = subprocess.Popen(call_params) - if args.timeout > 0: - timer = Timer(args.timeout, kill, [app_proc]) - timer.start() - - try: - app_proc.communicate() - except: - print("Error: failed to execute: {}".format(params_string)) - finally: - timer.cancel() - - if app_proc.returncode != 0: - exit_status = 1 - print("ERROR TestCase failed. Failed test for vector {}. Return code: {}".format( - vector, app_proc.returncode)) - -sys.exit(exit_status) diff --git a/targets/ARCH/test-bbdev/test_bbdev.c b/targets/ARCH/test-bbdev/test_bbdev.c deleted file mode 100644 index ac06d7320a..0000000000 --- a/targets/ARCH/test-bbdev/test_bbdev.c +++ /dev/null @@ -1,1371 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2017 Intel Corporation - */ - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include "main.h" - - -#define BBDEV_NAME_NULL ("bbdev_null") - -struct bbdev_testsuite_params { - struct rte_bbdev_queue_conf qconf; -}; - -static struct bbdev_testsuite_params testsuite_params; - -static uint8_t null_dev_id; - -static int -testsuite_setup(void) -{ - uint8_t nb_devs; - int ret; - char buf[RTE_BBDEV_NAME_MAX_LEN]; - - /* Create test device */ - snprintf(buf, sizeof(buf), "%s_unittest", BBDEV_NAME_NULL); - ret = rte_vdev_init(buf, NULL); - TEST_ASSERT(ret == 0, "Failed to create instance of pmd: %s", buf); - - nb_devs = rte_bbdev_count(); - TEST_ASSERT(nb_devs != 0, "No devices found"); - - /* Most recently created device is our device */ - null_dev_id = nb_devs - 1; - - return TEST_SUCCESS; -} - -static void -testsuite_teardown(void) -{ - char buf[RTE_BBDEV_NAME_MAX_LEN]; - - snprintf(buf, sizeof(buf), "%s_unittest", BBDEV_NAME_NULL); - rte_vdev_uninit(buf); -} - -static int -ut_setup(void) -{ - struct bbdev_testsuite_params *ts_params = &testsuite_params; - uint8_t num_queues; - - /* Valid queue configuration */ - ts_params->qconf.priority = 0; - ts_params->qconf.socket = SOCKET_ID_ANY; - ts_params->qconf.deferred_start = 1; - - num_queues = 1; - TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(null_dev_id, num_queues, - SOCKET_ID_ANY), "Failed to setup queues for bbdev %u", - 0); - - /* Start the device */ - TEST_ASSERT_SUCCESS(rte_bbdev_start(null_dev_id), - "Failed to start bbdev %u", 0); - - return TEST_SUCCESS; -} - -static void -ut_teardown(void) -{ - rte_bbdev_close(null_dev_id); -} - -static int -test_bbdev_configure_invalid_dev_id(void) -{ - uint8_t dev_id; - uint8_t num_queues; - - num_queues = 1; - for (dev_id = 0; dev_id < RTE_BBDEV_MAX_DEVS; dev_id++) { - if (!rte_bbdev_is_valid(dev_id)) { - TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, - num_queues, SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "invalid dev_num %u", dev_id); - TEST_ASSERT(rte_bbdev_intr_enable(dev_id) == -ENODEV, - "Failed test for rte_bbdev_intr_enable: " - "invalid dev_num %u", dev_id); - break; - } - } - - return TEST_SUCCESS; -} - -static int -test_bbdev_configure_invalid_num_queues(void) -{ - struct rte_bbdev_info info; - uint8_t dev_id, num_devs; - uint8_t num_queues; - int return_value; - - TEST_ASSERT((num_devs = rte_bbdev_count()) >= 1, - "Need at least %d devices for test", 1); - - /* valid num_queues values */ - num_queues = 8; - - /* valid dev_id values */ - dev_id = null_dev_id; - - /* Stop the device in case it's started so it can be configured */ - rte_bbdev_stop(dev_id); - - TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 0, SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "invalid num_queues %d", 0); - - TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, num_queues, - SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "invalid dev_num %u", dev_id); - - TEST_ASSERT_FAIL(return_value = rte_bbdev_info_get(dev_id, NULL), - "Failed test for rte_bbdev_info_get: " - "returned value:%i", return_value); - - TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), - "Failed test for rte_bbdev_info_get: " - "invalid return value:%i", return_value); - - TEST_ASSERT(info.num_queues == num_queues, - "Failed test for rte_bbdev_info_get: " - "invalid num_queues:%u", info.num_queues); - - num_queues = info.drv.max_num_queues; - TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, num_queues, - SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "invalid num_queues: %u", num_queues); - - num_queues++; - TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, num_queues, - SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "invalid num_queues: %u", num_queues); - - return TEST_SUCCESS; -} - -static int -test_bbdev_configure_stop_device(void) -{ - struct rte_bbdev_info info; - uint8_t dev_id; - int return_value; - - /* valid dev_id values */ - dev_id = null_dev_id; - - /* Stop the device so it can be configured */ - rte_bbdev_stop(dev_id); - - TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), - "Failed test for rte_bbdev_info_get: " - "invalid return value from " - "rte_bbdev_info_get function: %i", return_value); - - TEST_ASSERT_SUCCESS(info.started, "Failed test for rte_bbdev_info_get: " - "started value: %u", info.started); - - TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, - info.drv.max_num_queues, SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "device should be stopped, dev_id: %u", dev_id); - - return_value = rte_bbdev_intr_enable(dev_id); - TEST_ASSERT(return_value != -EBUSY, - "Failed test for rte_bbdev_intr_enable: device should be stopped, dev_id: %u", - dev_id); - - /* Start the device so it cannot be configured */ - TEST_ASSERT_FAIL(rte_bbdev_start(RTE_BBDEV_MAX_DEVS), - "Failed to start bbdev %u", dev_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), - "Failed to start bbdev %u", dev_id); - - TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), - "Failed test for rte_bbdev_info_get: " - "invalid return value from " - "rte_bbdev_info_get function: %i", return_value); - - TEST_ASSERT_FAIL(info.started, "Failed test for rte_bbdev_info_get: " - "started value: %u", info.started); - - TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, - info.drv.max_num_queues, SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "device should be started, dev_id: %u", dev_id); - - return_value = rte_bbdev_intr_enable(dev_id); - TEST_ASSERT(return_value == -EBUSY, - "Failed test for rte_bbdev_intr_enable: device should be started, dev_id: %u", - dev_id); - - /* Stop again the device so it can be once again configured */ - TEST_ASSERT_FAIL(rte_bbdev_stop(RTE_BBDEV_MAX_DEVS), - "Failed to start bbdev %u", dev_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), "Failed to stop bbdev %u", - dev_id); - - TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), - "Failed test for rte_bbdev_info_get: " - "invalid return value from " - "rte_bbdev_info_get function: %i", return_value); - - TEST_ASSERT_SUCCESS(info.started, "Failed test for rte_bbdev_info_get: " - "started value: %u", info.started); - - TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, - info.drv.max_num_queues, SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "device should be stopped, dev_id: %u", dev_id); - - return_value = rte_bbdev_intr_enable(dev_id); - TEST_ASSERT(return_value != -EBUSY, - "Failed test for rte_bbdev_intr_enable: device should be stopped, dev_id: %u", - dev_id); - - return TEST_SUCCESS; -} - -static int -test_bbdev_configure_stop_queue(void) -{ - struct bbdev_testsuite_params *ts_params = &testsuite_params; - struct rte_bbdev_info info; - struct rte_bbdev_queue_info qinfo; - uint8_t dev_id; - uint16_t queue_id; - int return_value; - - /* Valid dev_id values */ - dev_id = null_dev_id; - - /* Valid queue_id values */ - queue_id = 0; - - rte_bbdev_stop(dev_id); - TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), - "Failed test for rte_bbdev_info_get: " - "invalid return value:%i", return_value); - - /* Valid queue configuration */ - ts_params->qconf.queue_size = info.drv.queue_size_lim; - ts_params->qconf.priority = info.drv.max_ul_queue_priority; - - /* Device - started; queue - started */ - rte_bbdev_start(dev_id); - - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed test for rte_bbdev_queue_configure: " - "queue:%u on device:%u should be stopped", - queue_id, dev_id); - - /* Device - stopped; queue - started */ - rte_bbdev_stop(dev_id); - - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed test for rte_bbdev_queue_configure: " - "queue:%u on device:%u should be stopped", - queue_id, dev_id); - - TEST_ASSERT_FAIL(rte_bbdev_queue_stop(RTE_BBDEV_MAX_DEVS, queue_id), - "Failed test for rte_bbdev_queue_stop " - "invalid dev_id "); - - TEST_ASSERT_FAIL(rte_bbdev_queue_stop(dev_id, RTE_MAX_QUEUES_PER_PORT), - "Failed test for rte_bbdev_queue_stop " - "invalid queue_id "); - - /* Device - stopped; queue - stopped */ - rte_bbdev_queue_stop(dev_id, queue_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed test for rte_bbdev_queue_configure: " - "queue:%u on device:%u should be stopped", queue_id, - dev_id); - - TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id, - queue_id, &qinfo), - "Failed test for rte_bbdev_info_get: " - "invalid return value from " - "rte_bbdev_queue_info_get function: %i", return_value); - - TEST_ASSERT(qinfo.conf.socket == ts_params->qconf.socket, - "Failed test for rte_bbdev_queue_info_get: " - "invalid queue_size:%u", qinfo.conf.socket); - - TEST_ASSERT(qinfo.conf.queue_size == ts_params->qconf.queue_size, - "Failed test for rte_bbdev_queue_info_get: " - "invalid queue_size:%u", qinfo.conf.queue_size); - - TEST_ASSERT(qinfo.conf.priority == ts_params->qconf.priority, - "Failed test for rte_bbdev_queue_info_get: " - "invalid queue_size:%u", qinfo.conf.priority); - - TEST_ASSERT(qinfo.conf.deferred_start == - ts_params->qconf.deferred_start, - "Failed test for rte_bbdev_queue_info_get: " - "invalid queue_size:%u", qinfo.conf.deferred_start); - - /* Device - started; queue - stopped */ - rte_bbdev_start(dev_id); - rte_bbdev_queue_stop(dev_id, queue_id); - - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed test for rte_bbdev_queue_configure: " - "queue:%u on device:%u should be stopped", queue_id, - dev_id); - - rte_bbdev_stop(dev_id); - - /* After rte_bbdev_start(dev_id): - * - queue should be still stopped if deferred_start == - */ - rte_bbdev_start(dev_id); - - TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id, - queue_id, &qinfo), - "Failed test for rte_bbdev_info_get: " - "invalid return value from " - "rte_bbdev_queue_info_get function: %i", return_value); - - TEST_ASSERT(qinfo.started == 0, - "Failed test for rte_bbdev_queue_info_get: " - "invalid value for qinfo.started:%u", qinfo.started); - - rte_bbdev_stop(dev_id); - - /* After rte_bbdev_start(dev_id): - * - queue should be started if deferred_start == - */ - ts_params->qconf.deferred_start = 0; - rte_bbdev_queue_configure(dev_id, queue_id, &ts_params->qconf); - rte_bbdev_start(dev_id); - - TEST_ASSERT_SUCCESS(return_value = rte_bbdev_queue_info_get(dev_id, - queue_id, &qinfo), - "Failed test for rte_bbdev_info_get: " - "invalid return value from " - "rte_bbdev_queue_info_get function: %i", return_value); - - TEST_ASSERT(qinfo.started == 1, - "Failed test for rte_bbdev_queue_info_get: " - "invalid value for qinfo.started:%u", qinfo.started); - - return TEST_SUCCESS; -} - -static int -test_bbdev_configure_invalid_queue_configure(void) -{ - struct bbdev_testsuite_params *ts_params = &testsuite_params; - int return_value; - struct rte_bbdev_info info; - uint8_t dev_id; - uint16_t queue_id; - - /* Valid dev_id values */ - dev_id = null_dev_id; - - /* Valid queue_id values */ - queue_id = 0; - - rte_bbdev_stop(dev_id); - - TEST_ASSERT_SUCCESS(return_value = rte_bbdev_info_get(dev_id, &info), - "Failed test for rte_bbdev_info_get: " - "invalid return value:%i", return_value); - - rte_bbdev_queue_stop(dev_id, queue_id); - - ts_params->qconf.queue_size = info.drv.queue_size_lim + 1; - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed test for rte_bbdev_queue_configure: " - "invalid value qconf.queue_size: %u", - ts_params->qconf.queue_size); - - ts_params->qconf.queue_size = info.drv.queue_size_lim; - ts_params->qconf.priority = info.drv.max_ul_queue_priority; - queue_id = info.num_queues; - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed test for rte_bbdev_queue_configure: " - "invalid value queue_id: %u", queue_id); - - queue_id = 0; - TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, NULL), - "Failed test for rte_bbdev_queue_configure: " - "NULL qconf structure "); - - ts_params->qconf.socket = RTE_MAX_NUMA_NODES; - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed test for rte_bbdev_queue_configure: " - "invalid socket number "); - - ts_params->qconf.socket = SOCKET_ID_ANY; - TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed test for rte_bbdev_queue_configure: " - "invalid value qconf.queue_size: %u", - ts_params->qconf.queue_size); - - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(RTE_BBDEV_MAX_DEVS, queue_id, - &ts_params->qconf), - "Failed test for rte_bbdev_queue_configure: " - "invalid dev_id"); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, NULL), - "Failed test for rte_bbdev_queue_configure: " - "invalid value qconf.queue_size: %u", - ts_params->qconf.queue_size); - - return TEST_SUCCESS; -} - -static int -test_bbdev_op_pool(void) -{ - struct rte_mempool *mp; - - unsigned int dec_size = sizeof(struct rte_bbdev_dec_op); - unsigned int enc_size = sizeof(struct rte_bbdev_enc_op); - - const char *pool_dec = "Test_DEC"; - const char *pool_enc = "Test_ENC"; - - /* Valid pool configuration */ - uint32_t size = 256; - uint32_t cache_size = 128; - - TEST_ASSERT(rte_bbdev_op_pool_create(NULL, - RTE_BBDEV_OP_TURBO_DEC, size, cache_size, 0) == NULL, - "Failed test for rte_bbdev_op_pool_create: " - "NULL name parameter"); - - TEST_ASSERT((mp = rte_bbdev_op_pool_create(pool_dec, - RTE_BBDEV_OP_TURBO_DEC, size, cache_size, 0)) != NULL, - "Failed test for rte_bbdev_op_pool_create: " - "returned value is empty"); - - TEST_ASSERT(mp->size == size, - "Failed test for rte_bbdev_op_pool_create: " - "invalid size of the mempool, mp->size: %u", mp->size); - - TEST_ASSERT(mp->cache_size == cache_size, - "Failed test for rte_bbdev_op_pool_create: " - "invalid size of the mempool, mp->size: %u", - mp->cache_size); - - TEST_ASSERT_SUCCESS(strcmp(mp->name, pool_dec), - "Failed test for rte_bbdev_op_pool_create: " - "invalid name of mempool, mp->name: %s", mp->name); - - TEST_ASSERT(mp->elt_size == dec_size, - "Failed test for rte_bbdev_op_pool_create: " - "invalid element size for RTE_BBDEV_OP_TURBO_DEC, " - "mp->elt_size: %u", mp->elt_size); - - rte_mempool_free(mp); - - TEST_ASSERT((mp = rte_bbdev_op_pool_create(pool_enc, - RTE_BBDEV_OP_TURBO_ENC, size, cache_size, 0)) != NULL, - "Failed test for rte_bbdev_op_pool_create: " - "returned value is empty"); - - TEST_ASSERT(mp->elt_size == enc_size, - "Failed test for rte_bbdev_op_pool_create: " - "invalid element size for RTE_BBDEV_OP_TURBO_ENC, " - "mp->elt_size: %u", mp->elt_size); - - rte_mempool_free(mp); - - TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_NONE", - RTE_BBDEV_OP_NONE, size, cache_size, 0)) != NULL, - "Failed test for rte_bbdev_op_pool_create: " - "returned value is empty for RTE_BBDEV_OP_NONE"); - - TEST_ASSERT(mp->elt_size == (enc_size > dec_size ? enc_size : dec_size), - "Failed test for rte_bbdev_op_pool_create: " - "invalid size for RTE_BBDEV_OP_NONE, mp->elt_size: %u", - mp->elt_size); - - rte_mempool_free(mp); - - TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_INV", - RTE_BBDEV_OP_TYPE_COUNT, size, cache_size, 0)) == NULL, - "Failed test for rte_bbdev_op_pool_create: " - "returned value is not NULL for invalid type"); - - /* Invalid pool configuration */ - size = 128; - cache_size = 256; - - TEST_ASSERT((mp = rte_bbdev_op_pool_create("Test_InvSize", - RTE_BBDEV_OP_NONE, size, cache_size, 0)) == NULL, - "Failed test for rte_bbdev_op_pool_create: " - "returned value should be empty " - "because size of per-lcore local cache " - "is greater than size of the mempool."); - - return TEST_SUCCESS; -} - -/** - * Create pool of OP types RTE_BBDEV_OP_NONE, RTE_BBDEV_OP_TURBO_DEC and - * RTE_BBDEV_OP_TURBO_ENC and check that only ops of that type can be - * allocated - */ -static int -test_bbdev_op_type(void) -{ - struct rte_mempool *mp_dec; - - const unsigned int OPS_COUNT = 32; - struct rte_bbdev_dec_op *dec_ops_arr[OPS_COUNT]; - struct rte_bbdev_enc_op *enc_ops_arr[OPS_COUNT]; - - const char *pool_dec = "Test_op_dec"; - - /* Valid pool configuration */ - uint32_t num_elements = 256; - uint32_t cache_size = 128; - - /* mempool type : RTE_BBDEV_OP_TURBO_DEC */ - mp_dec = rte_bbdev_op_pool_create(pool_dec, - RTE_BBDEV_OP_TURBO_DEC, num_elements, cache_size, 0); - TEST_ASSERT(mp_dec != NULL, "Failed to create %s mempool", pool_dec); - - TEST_ASSERT(rte_bbdev_dec_op_alloc_bulk(mp_dec, dec_ops_arr, 1) == 0, - "Failed test for rte_bbdev_op_alloc_bulk TURBO_DEC: " - "OPs type: RTE_BBDEV_OP_TURBO_DEC"); - - TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_dec, enc_ops_arr, 1) != 0, - "Failed test for rte_bbdev_op_alloc_bulk TURBO_DEC: " - "OPs type: RTE_BBDEV_OP_TURBO_ENC"); - - rte_mempool_free(mp_dec); - - return TEST_SUCCESS; -} - -static int -test_bbdev_op_pool_size(void) -{ - struct rte_mempool *mp_none; - - const unsigned int OPS_COUNT = 128; - struct rte_bbdev_enc_op *ops_enc_arr[OPS_COUNT]; - struct rte_bbdev_enc_op *ops_ext_arr[OPS_COUNT]; - struct rte_bbdev_enc_op *ops_ext2_arr[OPS_COUNT]; - - const char *pool_none = "Test_pool_size"; - - /* Valid pool configuration */ - uint32_t num_elements = 256; - uint32_t cache_size = 0; - - /* Create mempool type : RTE_BBDEV_OP_TURBO_ENC, size : 256 */ - mp_none = rte_bbdev_op_pool_create(pool_none, RTE_BBDEV_OP_TURBO_ENC, - num_elements, cache_size, 0); - TEST_ASSERT(mp_none != NULL, "Failed to create %s mempool", pool_none); - - /* Add 128 RTE_BBDEV_OP_TURBO_ENC ops */ - rte_bbdev_enc_op_alloc_bulk(mp_none, ops_enc_arr, OPS_COUNT); - - /* Add 128 RTE_BBDEV_OP_TURBO_ENC ops */ - TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext_arr, - OPS_COUNT) == 0, - "Failed test for allocating bbdev ops: " - "Mempool size: 256, Free : 128, Attempted to add: 128"); - - /* Try adding 128 more RTE_BBDEV_OP_TURBO_ENC ops, this should fail */ - TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext2_arr, - OPS_COUNT) != 0, - "Failed test for allocating bbdev ops: " - "Mempool size: 256, Free : 0, Attempted to add: 128"); - - /* Free-up 128 RTE_BBDEV_OP_TURBO_ENC ops */ - rte_bbdev_enc_op_free_bulk(ops_enc_arr, OPS_COUNT); - - /* Try adding 128 RTE_BBDEV_OP_TURBO_DEC ops, this should succeed */ - /* Cache size > 0 causes reallocation of ops size > 127 fail */ - TEST_ASSERT(rte_bbdev_enc_op_alloc_bulk(mp_none, ops_ext2_arr, - OPS_COUNT) == 0, - "Failed test for allocating ops after mempool freed: " - "Mempool size: 256, Free : 128, Attempted to add: 128"); - - rte_mempool_free(mp_none); - - return TEST_SUCCESS; -} - -static int -test_bbdev_count(void) -{ - uint8_t num_devs, num_valid_devs = 0; - - for (num_devs = 0; num_devs < RTE_BBDEV_MAX_DEVS; num_devs++) { - if (rte_bbdev_is_valid(num_devs)) - num_valid_devs++; - } - - num_devs = rte_bbdev_count(); - TEST_ASSERT(num_valid_devs == num_devs, - "Failed test for rte_bbdev_is_valid: " - "invalid num_devs %u ", num_devs); - - return TEST_SUCCESS; -} - -static int -test_bbdev_stats(void) -{ - uint8_t dev_id = null_dev_id; - uint16_t queue_id = 0; - struct rte_bbdev_dec_op *dec_ops[4096] = { 0 }; - struct rte_bbdev_dec_op *dec_proc_ops[4096] = { 0 }; - struct rte_bbdev_enc_op *enc_ops[4096] = { 0 }; - struct rte_bbdev_enc_op *enc_proc_ops[4096] = { 0 }; - uint16_t num_ops = 236; - struct rte_bbdev_stats stats; - struct bbdev_testsuite_params *ts_params = &testsuite_params; - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_stop(dev_id, queue_id), - "Failed to stop queue %u on device %u ", queue_id, - dev_id); - TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), - "Failed to stop bbdev %u ", dev_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed to configure queue %u on device %u ", - queue_id, dev_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), - "Failed to start bbdev %u ", dev_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id), - "Failed to start queue %u on device %u ", queue_id, - dev_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id), - "Failed to start queue %u on device %u ", queue_id, - dev_id); - - /* Tests after enqueue operation */ - rte_bbdev_enqueue_enc_ops(dev_id, queue_id, enc_ops, num_ops); - rte_bbdev_enqueue_dec_ops(dev_id, queue_id, dec_ops, num_ops); - - TEST_ASSERT_FAIL(rte_bbdev_stats_get(RTE_BBDEV_MAX_DEVS, &stats), - "Failed test for rte_bbdev_stats_get on device %u ", - dev_id); - - TEST_ASSERT_FAIL(rte_bbdev_stats_get(dev_id, NULL), - "Failed test for rte_bbdev_stats_get on device %u ", - dev_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), - "Failed test for rte_bbdev_stats_get on device %u ", - dev_id); - - TEST_ASSERT(stats.enqueued_count == 2 * num_ops, - "Failed test for rte_bbdev_enqueue_ops: " - "invalid enqueued_count %" PRIu64 " ", - stats.enqueued_count); - - TEST_ASSERT(stats.dequeued_count == 0, - "Failed test for rte_bbdev_stats_reset: " - "invalid dequeued_count %" PRIu64 " ", - stats.dequeued_count); - - /* Tests after dequeue operation */ - rte_bbdev_dequeue_enc_ops(dev_id, queue_id, enc_proc_ops, num_ops); - rte_bbdev_dequeue_dec_ops(dev_id, queue_id, dec_proc_ops, num_ops); - - TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), - "Failed test for rte_bbdev_stats_get on device %u ", - dev_id); - - TEST_ASSERT(stats.dequeued_count == 2 * num_ops, - "Failed test for rte_bbdev_dequeue_ops: " - "invalid enqueued_count %" PRIu64 " ", - stats.dequeued_count); - - TEST_ASSERT(stats.enqueue_err_count == 0, - "Failed test for rte_bbdev_stats_reset: " - "invalid enqueue_err_count %" PRIu64 " ", - stats.enqueue_err_count); - - TEST_ASSERT(stats.dequeue_err_count == 0, - "Failed test for rte_bbdev_stats_reset: " - "invalid dequeue_err_count %" PRIu64 " ", - stats.dequeue_err_count); - - /* Tests after reset operation */ - TEST_ASSERT_FAIL(rte_bbdev_stats_reset(RTE_BBDEV_MAX_DEVS), - "Failed to reset statistic for device %u ", dev_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), - "Failed to reset statistic for device %u ", dev_id); - TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), - "Failed test for rte_bbdev_stats_get on device %u ", - dev_id); - - TEST_ASSERT(stats.enqueued_count == 0, - "Failed test for rte_bbdev_stats_reset: " - "invalid enqueued_count %" PRIu64 " ", - stats.enqueued_count); - - TEST_ASSERT(stats.dequeued_count == 0, - "Failed test for rte_bbdev_stats_reset: " - "invalid dequeued_count %" PRIu64 " ", - stats.dequeued_count); - - TEST_ASSERT(stats.enqueue_err_count == 0, - "Failed test for rte_bbdev_stats_reset: " - "invalid enqueue_err_count %" PRIu64 " ", - stats.enqueue_err_count); - - TEST_ASSERT(stats.dequeue_err_count == 0, - "Failed test for rte_bbdev_stats_reset: " - "invalid dequeue_err_count %" PRIu64 " ", - stats.dequeue_err_count); - - return TEST_SUCCESS; -} - -static int -test_bbdev_driver_init(void) -{ - struct rte_bbdev *dev1, *dev2; - const char *name = "dev_name"; - char name_tmp[32]; - int num_devs, num_devs_tmp; - - dev1 = rte_bbdev_allocate(NULL); - TEST_ASSERT(dev1 == NULL, - "Failed initialize bbdev driver with NULL name"); - - dev1 = rte_bbdev_allocate(name); - TEST_ASSERT(dev1 != NULL, "Failed to initialize bbdev driver"); - - dev2 = rte_bbdev_allocate(name); - TEST_ASSERT(dev2 == NULL, - "Failed to initialize bbdev driver: " - "driver with the same name has been initialized before"); - - num_devs = rte_bbdev_count() - 1; - num_devs_tmp = num_devs; - - /* Initialize the maximum amount of devices */ - do { - sprintf(name_tmp, "%s%i", "name_", num_devs); - dev2 = rte_bbdev_allocate(name_tmp); - TEST_ASSERT(dev2 != NULL, - "Failed to initialize bbdev driver"); - ++num_devs; - } while (num_devs < (RTE_BBDEV_MAX_DEVS - 1)); - - sprintf(name_tmp, "%s%i", "name_", num_devs); - dev2 = rte_bbdev_allocate(name_tmp); - TEST_ASSERT(dev2 == NULL, "Failed to initialize bbdev driver number %d " - "more drivers than RTE_BBDEV_MAX_DEVS: %d ", num_devs, - RTE_BBDEV_MAX_DEVS); - - num_devs--; - - while (num_devs >= num_devs_tmp) { - sprintf(name_tmp, "%s%i", "name_", num_devs); - dev2 = rte_bbdev_get_named_dev(name_tmp); - TEST_ASSERT_SUCCESS(rte_bbdev_release(dev2), - "Failed to uninitialize bbdev driver %s ", - name_tmp); - num_devs--; - } - - TEST_ASSERT(dev1->data->dev_id < RTE_BBDEV_MAX_DEVS, - "Failed test rte_bbdev_allocate: " - "invalid dev_id %" PRIu8 ", max number of devices %d ", - dev1->data->dev_id, RTE_BBDEV_MAX_DEVS); - - TEST_ASSERT(dev1->state == RTE_BBDEV_INITIALIZED, - "Failed test rte_bbdev_allocate: " - "invalid state %d (0 - RTE_BBDEV_UNUSED, 1 - RTE_BBDEV_INITIALIZED", - dev1->state); - - TEST_ASSERT_FAIL(rte_bbdev_release(NULL), - "Failed to uninitialize bbdev driver with NULL bbdev"); - - sprintf(name_tmp, "%s", "invalid_name"); - dev2 = rte_bbdev_get_named_dev(name_tmp); - TEST_ASSERT_FAIL(rte_bbdev_release(dev2), - "Failed to uninitialize bbdev driver with invalid name"); - - dev2 = rte_bbdev_get_named_dev(name); - TEST_ASSERT_SUCCESS(rte_bbdev_release(dev2), - "Failed to uninitialize bbdev driver: %s ", name); - - return TEST_SUCCESS; -} - -static void -event_callback(uint16_t dev_id, enum rte_bbdev_event_type type, void *param, - void *ret_param) -{ - RTE_SET_USED(dev_id); - RTE_SET_USED(ret_param); - - if (param == NULL) - return; - - if (type == RTE_BBDEV_EVENT_UNKNOWN || - type == RTE_BBDEV_EVENT_ERROR || - type == RTE_BBDEV_EVENT_MAX) - *(int *)param = type; -} - -static int -test_bbdev_callback(void) -{ - struct rte_bbdev *dev1, *dev2; - const char *name = "dev_name1"; - const char *name2 = "dev_name2"; - int event_status; - uint8_t invalid_dev_id = RTE_BBDEV_MAX_DEVS; - enum rte_bbdev_event_type invalid_event_type = RTE_BBDEV_EVENT_MAX; - uint8_t dev_id; - - dev1 = rte_bbdev_allocate(name); - TEST_ASSERT(dev1 != NULL, "Failed to initialize bbdev driver"); - - /* - * RTE_BBDEV_EVENT_UNKNOWN - unregistered - * RTE_BBDEV_EVENT_ERROR - unregistered - */ - event_status = -1; - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); - TEST_ASSERT(event_status == -1, - "Failed test for rte_bbdev_pmd_callback_process: " - "events were not registered "); - - TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id, - RTE_BBDEV_EVENT_MAX, event_callback, NULL), - "Failed to callback register for RTE_BBDEV_EVENT_MAX "); - - TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id, - RTE_BBDEV_EVENT_MAX, event_callback, NULL), - "Failed to unregister RTE_BBDEV_EVENT_MAX "); - - /* - * RTE_BBDEV_EVENT_UNKNOWN - registered - * RTE_BBDEV_EVENT_ERROR - unregistered - */ - TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id, - RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), - "Failed to callback rgstr for RTE_BBDEV_EVENT_UNKNOWN"); - - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); - TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, - "Failed test for rte_bbdev_pmd_callback_process " - "for RTE_BBDEV_EVENT_UNKNOWN "); - - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); - TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, - "Failed test for rte_bbdev_pmd_callback_process: " - "event RTE_BBDEV_EVENT_ERROR was not registered "); - - /* - * RTE_BBDEV_EVENT_UNKNOWN - registered - * RTE_BBDEV_EVENT_ERROR - registered - */ - TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id, - RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), - "Failed to callback rgstr for RTE_BBDEV_EVENT_ERROR "); - - TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev1->data->dev_id, - RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), - "Failed to callback register for RTE_BBDEV_EVENT_ERROR" - "(re-registration) "); - - event_status = -1; - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); - TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, - "Failed test for rte_bbdev_pmd_callback_process " - "for RTE_BBDEV_EVENT_UNKNOWN "); - - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); - TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_ERROR, - "Failed test for rte_bbdev_pmd_callback_process " - "for RTE_BBDEV_EVENT_ERROR "); - - /* - * RTE_BBDEV_EVENT_UNKNOWN - registered - * RTE_BBDEV_EVENT_ERROR - unregistered - */ - TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev1->data->dev_id, - RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), - "Failed to unregister RTE_BBDEV_EVENT_ERROR "); - - event_status = -1; - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); - TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, - "Failed test for rte_bbdev_pmd_callback_process " - "for RTE_BBDEV_EVENT_UNKNOWN "); - - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); - TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, - "Failed test for rte_bbdev_pmd_callback_process: " - "event RTE_BBDEV_EVENT_ERROR was unregistered "); - - /* rte_bbdev_callback_register with invalid inputs */ - TEST_ASSERT_FAIL(rte_bbdev_callback_register(invalid_dev_id, - RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), - "Failed test for rte_bbdev_callback_register " - "for invalid_dev_id "); - - TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id, - invalid_event_type, event_callback, &event_status), - "Failed to callback register for invalid event type "); - - TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev1->data->dev_id, - RTE_BBDEV_EVENT_ERROR, NULL, &event_status), - "Failed to callback register - no callback function "); - - /* The impact of devices on each other */ - dev2 = rte_bbdev_allocate(name2); - TEST_ASSERT(dev2 != NULL, - "Failed to initialize bbdev driver"); - - /* - * dev2: - * RTE_BBDEV_EVENT_UNKNOWN - unregistered - * RTE_BBDEV_EVENT_ERROR - unregistered - */ - event_status = -1; - rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); - rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL); - TEST_ASSERT(event_status == -1, - "Failed test for rte_bbdev_pmd_callback_process: " - "events were not registered "); - - /* - * dev1: RTE_BBDEV_EVENT_ERROR - unregistered - * dev2: RTE_BBDEV_EVENT_ERROR - registered - */ - TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev2->data->dev_id, - RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), - "Failed to callback rgstr for RTE_BBDEV_EVENT_ERROR"); - - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); - TEST_ASSERT(event_status == -1, - "Failed test for rte_bbdev_pmd_callback_process in dev1 " - "for RTE_BBDEV_EVENT_ERROR "); - - rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL); - TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_ERROR, - "Failed test for rte_bbdev_pmd_callback_process in dev2 " - "for RTE_BBDEV_EVENT_ERROR "); - - /* - * dev1: RTE_BBDEV_EVENT_UNKNOWN - registered - * dev2: RTE_BBDEV_EVENT_UNKNOWN - unregistered - */ - TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev2->data->dev_id, - RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), - "Failed to callback register for RTE_BBDEV_EVENT_UNKNOWN " - "in dev 2 "); - - rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); - TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, - "Failed test for rte_bbdev_pmd_callback_process in dev2" - " for RTE_BBDEV_EVENT_UNKNOWN "); - - TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev2->data->dev_id, - RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), - "Failed to unregister RTE_BBDEV_EVENT_UNKNOWN "); - - TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev2->data->dev_id, - RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), - "Failed to unregister RTE_BBDEV_EVENT_UNKNOWN : " - "unregister function called once again "); - - event_status = -1; - rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); - TEST_ASSERT(event_status == -1, - "Failed test for rte_bbdev_pmd_callback_process in dev2" - " for RTE_BBDEV_EVENT_UNKNOWN "); - - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); - TEST_ASSERT(event_status == (int) RTE_BBDEV_EVENT_UNKNOWN, - "Failed test for rte_bbdev_pmd_callback_process in dev2 " - "for RTE_BBDEV_EVENT_UNKNOWN "); - - /* rte_bbdev_pmd_callback_process with invalid inputs */ - rte_bbdev_pmd_callback_process(NULL, RTE_BBDEV_EVENT_UNKNOWN, NULL); - - event_status = -1; - rte_bbdev_pmd_callback_process(dev1, invalid_event_type, NULL); - TEST_ASSERT(event_status == -1, - "Failed test for rte_bbdev_pmd_callback_process: " - "for invalid event type "); - - /* rte_dev_callback_unregister with invalid inputs */ - TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(invalid_dev_id, - RTE_BBDEV_EVENT_UNKNOWN, event_callback, &event_status), - "Failed test for rte_dev_callback_unregister " - "for invalid_dev_id "); - - TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id, - invalid_event_type, event_callback, &event_status), - "Failed rte_dev_callback_unregister " - "for invalid event type "); - - TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev1->data->dev_id, - invalid_event_type, NULL, &event_status), - "Failed rte_dev_callback_unregister " - "when no callback function "); - - dev_id = dev1->data->dev_id; - - rte_bbdev_release(dev1); - rte_bbdev_release(dev2); - - TEST_ASSERT_FAIL(rte_bbdev_callback_register(dev_id, - RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), - "Failed test for rte_bbdev_callback_register: " - "function called after rte_bbdev_driver_uninit ."); - - TEST_ASSERT_FAIL(rte_bbdev_callback_unregister(dev_id, - RTE_BBDEV_EVENT_ERROR, event_callback, &event_status), - "Failed test for rte_dev_callback_unregister: " - "function called after rte_bbdev_driver_uninit. "); - - event_status = -1; - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_UNKNOWN, NULL); - rte_bbdev_pmd_callback_process(dev1, RTE_BBDEV_EVENT_ERROR, NULL); - rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); - rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_ERROR, NULL); - TEST_ASSERT(event_status == -1, - "Failed test for rte_bbdev_pmd_callback_process: " - "callback function was called after rte_bbdev_driver_uninit"); - - return TEST_SUCCESS; -} - -static int -test_bbdev_invalid_driver(void) -{ - struct rte_bbdev dev1, *dev2; - uint8_t dev_id = null_dev_id; - uint16_t queue_id = 0; - struct rte_bbdev_stats stats; - struct bbdev_testsuite_params *ts_params = &testsuite_params; - struct rte_bbdev_queue_info qinfo; - struct rte_bbdev_ops dev_ops_tmp; - - TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), "Failed to stop bbdev %u ", - dev_id); - - dev1 = rte_bbdev_devices[dev_id]; - dev2 = &rte_bbdev_devices[dev_id]; - - /* Tests for rte_bbdev_setup_queues */ - dev2->dev_ops = NULL; - TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "NULL dev_ops structure "); - dev2->dev_ops = dev1.dev_ops; - - dev_ops_tmp = *dev2->dev_ops; - dev_ops_tmp.info_get = NULL; - dev2->dev_ops = &dev_ops_tmp; - TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "NULL info_get "); - dev2->dev_ops = dev1.dev_ops; - - dev_ops_tmp = *dev2->dev_ops; - dev_ops_tmp.queue_release = NULL; - dev2->dev_ops = &dev_ops_tmp; - TEST_ASSERT_FAIL(rte_bbdev_setup_queues(dev_id, 1, SOCKET_ID_ANY), - "Failed test for rte_bbdev_setup_queues: " - "NULL queue_release "); - dev2->dev_ops = dev1.dev_ops; - - dev2->data->socket_id = SOCKET_ID_ANY; - TEST_ASSERT_SUCCESS(rte_bbdev_setup_queues(dev_id, 1, - SOCKET_ID_ANY), "Failed to configure bbdev %u", dev_id); - - /* Test for rte_bbdev_queue_configure */ - dev2->dev_ops = NULL; - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed to configure queue %u on device %u " - "with NULL dev_ops structure ", queue_id, dev_id); - dev2->dev_ops = dev1.dev_ops; - - dev_ops_tmp = *dev2->dev_ops; - dev_ops_tmp.queue_setup = NULL; - dev2->dev_ops = &dev_ops_tmp; - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed to configure queue %u on device %u " - "with NULL queue_setup ", queue_id, dev_id); - dev2->dev_ops = dev1.dev_ops; - - dev_ops_tmp = *dev2->dev_ops; - dev_ops_tmp.info_get = NULL; - dev2->dev_ops = &dev_ops_tmp; - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed to configure queue %u on device %u " - "with NULL info_get ", queue_id, dev_id); - dev2->dev_ops = dev1.dev_ops; - - TEST_ASSERT_FAIL(rte_bbdev_queue_configure(RTE_BBDEV_MAX_DEVS, - queue_id, &ts_params->qconf), - "Failed to configure queue %u on device %u ", - queue_id, dev_id); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_configure(dev_id, queue_id, - &ts_params->qconf), - "Failed to configure queue %u on device %u ", - queue_id, dev_id); - - /* Test for rte_bbdev_queue_info_get */ - dev2->dev_ops = NULL; - TEST_ASSERT_SUCCESS(rte_bbdev_queue_info_get(dev_id, queue_id, &qinfo), - "Failed test for rte_bbdev_info_get: " - "NULL dev_ops structure "); - dev2->dev_ops = dev1.dev_ops; - - TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(RTE_BBDEV_MAX_DEVS, - queue_id, &qinfo), - "Failed test for rte_bbdev_info_get: " - "invalid dev_id "); - - TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(dev_id, - RTE_MAX_QUEUES_PER_PORT, &qinfo), - "Failed test for rte_bbdev_info_get: " - "invalid queue_id "); - - TEST_ASSERT_FAIL(rte_bbdev_queue_info_get(dev_id, queue_id, NULL), - "Failed test for rte_bbdev_info_get: " - "invalid dev_info "); - - /* Test for rte_bbdev_start */ - dev2->dev_ops = NULL; - TEST_ASSERT_FAIL(rte_bbdev_start(dev_id), - "Failed to start bbdev %u " - "with NULL dev_ops structure ", dev_id); - dev2->dev_ops = dev1.dev_ops; - - TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), - "Failed to start bbdev %u ", dev_id); - - /* Test for rte_bbdev_queue_start */ - dev2->dev_ops = NULL; - TEST_ASSERT_FAIL(rte_bbdev_queue_start(dev_id, queue_id), - "Failed to start queue %u on device %u: " - "NULL dev_ops structure", queue_id, dev_id); - dev2->dev_ops = dev1.dev_ops; - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_start(dev_id, queue_id), - "Failed to start queue %u on device %u ", queue_id, - dev_id); - - /* Tests for rte_bbdev_stats_get */ - dev2->dev_ops = NULL; - TEST_ASSERT_FAIL(rte_bbdev_stats_get(dev_id, &stats), - "Failed test for rte_bbdev_stats_get on device %u ", - dev_id); - dev2->dev_ops = dev1.dev_ops; - - dev_ops_tmp = *dev2->dev_ops; - dev_ops_tmp.stats_reset = NULL; - dev2->dev_ops = &dev_ops_tmp; - TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), - "Failed test for rte_bbdev_stats_get: " - "NULL stats_get "); - dev2->dev_ops = dev1.dev_ops; - - TEST_ASSERT_SUCCESS(rte_bbdev_stats_get(dev_id, &stats), - "Failed test for rte_bbdev_stats_get on device %u ", - dev_id); - - /* - * Tests for: - * rte_bbdev_callback_register, - * rte_bbdev_pmd_callback_process, - * rte_dev_callback_unregister - */ - dev2->dev_ops = NULL; - TEST_ASSERT_SUCCESS(rte_bbdev_callback_register(dev_id, - RTE_BBDEV_EVENT_UNKNOWN, event_callback, NULL), - "Failed to callback rgstr for RTE_BBDEV_EVENT_UNKNOWN"); - rte_bbdev_pmd_callback_process(dev2, RTE_BBDEV_EVENT_UNKNOWN, NULL); - - TEST_ASSERT_SUCCESS(rte_bbdev_callback_unregister(dev_id, - RTE_BBDEV_EVENT_UNKNOWN, event_callback, NULL), - "Failed to unregister RTE_BBDEV_EVENT_ERROR "); - dev2->dev_ops = dev1.dev_ops; - - /* Tests for rte_bbdev_stats_reset */ - dev2->dev_ops = NULL; - TEST_ASSERT_FAIL(rte_bbdev_stats_reset(dev_id), - "Failed to reset statistic for device %u ", dev_id); - dev2->dev_ops = dev1.dev_ops; - - dev_ops_tmp = *dev2->dev_ops; - dev_ops_tmp.stats_reset = NULL; - dev2->dev_ops = &dev_ops_tmp; - TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), - "Failed test for rte_bbdev_stats_reset: " - "NULL stats_reset "); - dev2->dev_ops = dev1.dev_ops; - - TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), - "Failed to reset statistic for device %u ", dev_id); - - /* Tests for rte_bbdev_queue_stop */ - dev2->dev_ops = NULL; - TEST_ASSERT_FAIL(rte_bbdev_queue_stop(dev_id, queue_id), - "Failed to stop queue %u on device %u: " - "NULL dev_ops structure", queue_id, dev_id); - dev2->dev_ops = dev1.dev_ops; - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_stop(dev_id, queue_id), - "Failed to stop queue %u on device %u ", queue_id, - dev_id); - - /* Tests for rte_bbdev_stop */ - dev2->dev_ops = NULL; - TEST_ASSERT_FAIL(rte_bbdev_stop(dev_id), - "Failed to stop bbdev %u with NULL dev_ops structure ", - dev_id); - dev2->dev_ops = dev1.dev_ops; - - TEST_ASSERT_SUCCESS(rte_bbdev_stop(dev_id), - "Failed to stop bbdev %u ", dev_id); - - /* Tests for rte_bbdev_close */ - TEST_ASSERT_FAIL(rte_bbdev_close(RTE_BBDEV_MAX_DEVS), - "Failed to close bbdev with invalid dev_id"); - - dev2->dev_ops = NULL; - TEST_ASSERT_FAIL(rte_bbdev_close(dev_id), - "Failed to close bbdev %u with NULL dev_ops structure ", - dev_id); - dev2->dev_ops = dev1.dev_ops; - - TEST_ASSERT_SUCCESS(rte_bbdev_close(dev_id), - "Failed to close bbdev %u ", dev_id); - - return TEST_SUCCESS; -} - -static int -test_bbdev_get_named_dev(void) -{ - struct rte_bbdev *dev, *dev_tmp; - const char *name = "name"; - - dev = rte_bbdev_allocate(name); - TEST_ASSERT(dev != NULL, "Failed to initialize bbdev driver"); - - dev_tmp = rte_bbdev_get_named_dev(NULL); - TEST_ASSERT(dev_tmp == NULL, "Failed test for rte_bbdev_get_named_dev: " - "function called with NULL parameter"); - - dev_tmp = rte_bbdev_get_named_dev(name); - - TEST_ASSERT(dev == dev_tmp, "Failed test for rte_bbdev_get_named_dev: " - "wrong device was returned "); - - TEST_ASSERT_SUCCESS(rte_bbdev_release(dev), - "Failed to uninitialize bbdev driver %s ", name); - - return TEST_SUCCESS; -} - -static struct unit_test_suite bbdev_null_testsuite = { - .suite_name = "BBDEV NULL Unit Test Suite", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - - TEST_CASE(test_bbdev_configure_invalid_dev_id), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_configure_invalid_num_queues), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_configure_stop_device), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_configure_stop_queue), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_configure_invalid_queue_configure), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_op_pool), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_op_type), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_op_pool_size), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_stats), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_driver_init), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_callback), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_invalid_driver), - - TEST_CASE_ST(ut_setup, ut_teardown, - test_bbdev_get_named_dev), - - TEST_CASE(test_bbdev_count), - - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -REGISTER_TEST_COMMAND(unittest, bbdev_null_testsuite); diff --git a/targets/ARCH/test-bbdev/test_bbdev_perf.c b/targets/ARCH/test-bbdev/test_bbdev_perf.c deleted file mode 100644 index c29c1d5a14..0000000000 --- a/targets/ARCH/test-bbdev/test_bbdev_perf.c +++ /dev/null @@ -1,5058 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2017 Intel Corporation - */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "main.h" -#include "test_bbdev_vector.h" - -#define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id)) - -#define MAX_QUEUES RTE_MAX_LCORE -#define TEST_REPETITIONS 1000 - -#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC -#include -#define FPGA_LTE_PF_DRIVER_NAME ("intel_fpga_lte_fec_pf") -#define FPGA_LTE_VF_DRIVER_NAME ("intel_fpga_lte_fec_vf") -#define VF_UL_4G_QUEUE_VALUE 4 -#define VF_DL_4G_QUEUE_VALUE 4 -#define UL_4G_BANDWIDTH 3 -#define DL_4G_BANDWIDTH 3 -#define UL_4G_LOAD_BALANCE 128 -#define DL_4G_LOAD_BALANCE 128 -#define FLR_4G_TIMEOUT 610 -#endif - -#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC -#include -#define FPGA_5GNR_PF_DRIVER_NAME ("intel_fpga_5gnr_fec_pf") -#define FPGA_5GNR_VF_DRIVER_NAME ("intel_fpga_5gnr_fec_vf") -#define VF_UL_5G_QUEUE_VALUE 4 -#define VF_DL_5G_QUEUE_VALUE 4 -#define UL_5G_BANDWIDTH 3 -#define DL_5G_BANDWIDTH 3 -#define UL_5G_LOAD_BALANCE 128 -#define DL_5G_LOAD_BALANCE 128 -#define FLR_5G_TIMEOUT 610 -#endif - -#define OPS_CACHE_SIZE 256U -#define OPS_POOL_SIZE_MIN 511U /* 0.5K per queue */ - -#define SYNC_WAIT 0 -#define SYNC_START 1 -#define INVALID_OPAQUE -1 - -#define INVALID_QUEUE_ID -1 -/* Increment for next code block in external HARQ memory */ -#define HARQ_INCR 32768 -/* Headroom for filler LLRs insertion in HARQ buffer */ -#define FILLER_HEADROOM 1024 -/* Constants from K0 computation from 3GPP 38.212 Table 5.4.2.1-2 */ -#define N_ZC_1 66 /* N = 66 Zc for BG 1 */ -#define N_ZC_2 50 /* N = 50 Zc for BG 2 */ -#define K0_1_1 17 /* K0 fraction numerator for rv 1 and BG 1 */ -#define K0_1_2 13 /* K0 fraction numerator for rv 1 and BG 2 */ -#define K0_2_1 33 /* K0 fraction numerator for rv 2 and BG 1 */ -#define K0_2_2 25 /* K0 fraction numerator for rv 2 and BG 2 */ -#define K0_3_1 56 /* K0 fraction numerator for rv 3 and BG 1 */ -#define K0_3_2 43 /* K0 fraction numerator for rv 3 and BG 2 */ - -static struct test_bbdev_vector test_vector; - -/* Switch between PMD and Interrupt for throughput TC */ -static bool intr_enabled; - -/* LLR arithmetic representation for numerical conversion */ -static int ldpc_llr_decimals; -static int ldpc_llr_size; -/* Keep track of the LDPC decoder device capability flag */ -static uint32_t ldpc_cap_flags; - -/* Represents tested active devices */ -static struct active_device { - const char *driver_name; - uint8_t dev_id; - uint16_t supported_ops; - uint16_t queue_ids[MAX_QUEUES]; - uint16_t nb_queues; - struct rte_mempool *ops_mempool; - struct rte_mempool *in_mbuf_pool; - struct rte_mempool *hard_out_mbuf_pool; - struct rte_mempool *soft_out_mbuf_pool; - struct rte_mempool *harq_in_mbuf_pool; - struct rte_mempool *harq_out_mbuf_pool; -} active_devs[RTE_BBDEV_MAX_DEVS]; - -static uint8_t nb_active_devs; - -/* Data buffers used by BBDEV ops */ -struct test_buffers { - struct rte_bbdev_op_data *inputs; - struct rte_bbdev_op_data *hard_outputs; - struct rte_bbdev_op_data *soft_outputs; - struct rte_bbdev_op_data *harq_inputs; - struct rte_bbdev_op_data *harq_outputs; -}; - -/* Operation parameters specific for given test case */ -struct test_op_params { - struct rte_mempool *mp; - struct rte_bbdev_dec_op *ref_dec_op; - struct rte_bbdev_enc_op *ref_enc_op; - uint16_t burst_sz; - uint16_t num_to_process; - uint16_t num_lcores; - int vector_mask; - rte_atomic16_t sync; - struct test_buffers q_bufs[RTE_MAX_NUMA_NODES][MAX_QUEUES]; -}; - -/* Contains per lcore params */ -struct thread_params { - uint8_t dev_id; - uint16_t queue_id; - uint32_t lcore_id; - uint64_t start_time; - double ops_per_sec; - double mbps; - uint8_t iter_count; - double iter_average; - double bler; - rte_atomic16_t nb_dequeued; - rte_atomic16_t processing_status; - rte_atomic16_t burst_sz; - struct test_op_params *op_params; - struct rte_bbdev_dec_op *dec_ops[MAX_BURST]; - struct rte_bbdev_enc_op *enc_ops[MAX_BURST]; -}; - -#ifdef RTE_BBDEV_OFFLOAD_COST -/* Stores time statistics */ -struct test_time_stats { - /* Stores software enqueue total working time */ - uint64_t enq_sw_total_time; - /* Stores minimum value of software enqueue working time */ - uint64_t enq_sw_min_time; - /* Stores maximum value of software enqueue working time */ - uint64_t enq_sw_max_time; - /* Stores turbo enqueue total working time */ - uint64_t enq_acc_total_time; - /* Stores minimum value of accelerator enqueue working time */ - uint64_t enq_acc_min_time; - /* Stores maximum value of accelerator enqueue working time */ - uint64_t enq_acc_max_time; - /* Stores dequeue total working time */ - uint64_t deq_total_time; - /* Stores minimum value of dequeue working time */ - uint64_t deq_min_time; - /* Stores maximum value of dequeue working time */ - uint64_t deq_max_time; -}; -#endif - -typedef int (test_case_function)(struct active_device *ad, - struct test_op_params *op_params); - -static inline void -mbuf_reset(struct rte_mbuf *m) -{ - m->pkt_len = 0; - - do { - m->data_len = 0; - m = m->next; - } while (m != NULL); -} - -/* Read flag value 0/1 from bitmap */ -static inline bool -check_bit(uint32_t bitmap, uint32_t bitmask) -{ - return bitmap & bitmask; -} - -static inline void -set_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) -{ - ad->supported_ops |= (1 << op_type); -} - -static inline bool -is_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) -{ - return ad->supported_ops & (1 << op_type); -} - -static inline bool -flags_match(uint32_t flags_req, uint32_t flags_present) -{ - return (flags_req & flags_present) == flags_req; -} - -static void -clear_soft_out_cap(uint32_t *op_flags) -{ - *op_flags &= ~RTE_BBDEV_TURBO_SOFT_OUTPUT; - *op_flags &= ~RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT; - *op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; -} - -static int -check_dev_cap(const struct rte_bbdev_info *dev_info) -{ - unsigned int i; - unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs, - nb_harq_inputs, nb_harq_outputs; - const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities; - - nb_inputs = test_vector.entries[DATA_INPUT].nb_segments; - nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments; - nb_hard_outputs = test_vector.entries[DATA_HARD_OUTPUT].nb_segments; - nb_harq_inputs = test_vector.entries[DATA_HARQ_INPUT].nb_segments; - nb_harq_outputs = test_vector.entries[DATA_HARQ_OUTPUT].nb_segments; - - for (i = 0; op_cap->type != RTE_BBDEV_OP_NONE; ++i, ++op_cap) { - if (op_cap->type != test_vector.op_type) - continue; - - if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) { - const struct rte_bbdev_op_cap_turbo_dec *cap = - &op_cap->cap.turbo_dec; - /* Ignore lack of soft output capability, just skip - * checking if soft output is valid. - */ - if ((test_vector.turbo_dec.op_flags & - RTE_BBDEV_TURBO_SOFT_OUTPUT) && - !(cap->capability_flags & - RTE_BBDEV_TURBO_SOFT_OUTPUT)) { - printf( - "INFO: Device \"%s\" does not support soft output - soft output flags will be ignored.\n", - dev_info->dev_name); - clear_soft_out_cap( - &test_vector.turbo_dec.op_flags); - } - - if (!flags_match(test_vector.turbo_dec.op_flags, - cap->capability_flags)) - return TEST_FAILED; - if (nb_inputs > cap->num_buffers_src) { - printf("Too many inputs defined: %u, max: %u\n", - nb_inputs, cap->num_buffers_src); - return TEST_FAILED; - } - if (nb_soft_outputs > cap->num_buffers_soft_out && - (test_vector.turbo_dec.op_flags & - RTE_BBDEV_TURBO_SOFT_OUTPUT)) { - printf( - "Too many soft outputs defined: %u, max: %u\n", - nb_soft_outputs, - cap->num_buffers_soft_out); - return TEST_FAILED; - } - if (nb_hard_outputs > cap->num_buffers_hard_out) { - printf( - "Too many hard outputs defined: %u, max: %u\n", - nb_hard_outputs, - cap->num_buffers_hard_out); - return TEST_FAILED; - } - if (intr_enabled && !(cap->capability_flags & - RTE_BBDEV_TURBO_DEC_INTERRUPTS)) { - printf( - "Dequeue interrupts are not supported!\n"); - return TEST_FAILED; - } - - return TEST_SUCCESS; - } else if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) { - const struct rte_bbdev_op_cap_turbo_enc *cap = - &op_cap->cap.turbo_enc; - - if (!flags_match(test_vector.turbo_enc.op_flags, - cap->capability_flags)) - return TEST_FAILED; - if (nb_inputs > cap->num_buffers_src) { - printf("Too many inputs defined: %u, max: %u\n", - nb_inputs, cap->num_buffers_src); - return TEST_FAILED; - } - if (nb_hard_outputs > cap->num_buffers_dst) { - printf( - "Too many hard outputs defined: %u, max: %u\n", - nb_hard_outputs, cap->num_buffers_dst); - return TEST_FAILED; - } - if (intr_enabled && !(cap->capability_flags & - RTE_BBDEV_TURBO_ENC_INTERRUPTS)) { - printf( - "Dequeue interrupts are not supported!\n"); - return TEST_FAILED; - } - - return TEST_SUCCESS; - } else if (op_cap->type == RTE_BBDEV_OP_LDPC_ENC) { - const struct rte_bbdev_op_cap_ldpc_enc *cap = - &op_cap->cap.ldpc_enc; - - if (!flags_match(test_vector.ldpc_enc.op_flags, - cap->capability_flags)){ - printf("Flag Mismatch\n"); - return TEST_FAILED; - } - if (nb_inputs > cap->num_buffers_src) { - printf("Too many inputs defined: %u, max: %u\n", - nb_inputs, cap->num_buffers_src); - return TEST_FAILED; - } - if (nb_hard_outputs > cap->num_buffers_dst) { - printf( - "Too many hard outputs defined: %u, max: %u\n", - nb_hard_outputs, cap->num_buffers_dst); - return TEST_FAILED; - } - if (intr_enabled && !(cap->capability_flags & - RTE_BBDEV_LDPC_ENC_INTERRUPTS)) { - printf( - "Dequeue interrupts are not supported!\n"); - return TEST_FAILED; - } - - return TEST_SUCCESS; - } else if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) { - const struct rte_bbdev_op_cap_ldpc_dec *cap = - &op_cap->cap.ldpc_dec; - - if (!flags_match(test_vector.ldpc_dec.op_flags, - cap->capability_flags)){ - printf("Flag Mismatch\n"); - return TEST_FAILED; - } - if (nb_inputs > cap->num_buffers_src) { - printf("Too many inputs defined: %u, max: %u\n", - nb_inputs, cap->num_buffers_src); - return TEST_FAILED; - } - if (nb_hard_outputs > cap->num_buffers_hard_out) { - printf( - "Too many hard outputs defined: %u, max: %u\n", - nb_hard_outputs, - cap->num_buffers_hard_out); - return TEST_FAILED; - } - if (nb_harq_inputs > cap->num_buffers_hard_out) { - printf( - "Too many HARQ inputs defined: %u, max: %u\n", - nb_hard_outputs, - cap->num_buffers_hard_out); - return TEST_FAILED; - } - if (nb_harq_outputs > cap->num_buffers_hard_out) { - printf( - "Too many HARQ outputs defined: %u, max: %u\n", - nb_hard_outputs, - cap->num_buffers_hard_out); - return TEST_FAILED; - } - if (intr_enabled && !(cap->capability_flags & - RTE_BBDEV_LDPC_DEC_INTERRUPTS)) { - printf( - "Dequeue interrupts are not supported!\n"); - return TEST_FAILED; - } - if (intr_enabled && (test_vector.ldpc_dec.op_flags & - (RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE | - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE | - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK - ))) { - printf("Skip loop-back with interrupt\n"); - return TEST_FAILED; - } - return TEST_SUCCESS; - } - } - - if ((i == 0) && (test_vector.op_type == RTE_BBDEV_OP_NONE)) - return TEST_SUCCESS; /* Special case for NULL device */ - - return TEST_FAILED; -} - -/* calculates optimal mempool size not smaller than the val */ -static unsigned int -optimal_mempool_size(unsigned int val) -{ - return rte_align32pow2(val + 1) - 1; -} - -/* allocates mbuf mempool for inputs and outputs */ -static struct rte_mempool * -create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id, - int socket_id, unsigned int mbuf_pool_size, - const char *op_type_str) -{ - unsigned int i; - uint32_t max_seg_sz = 0; - char pool_name[RTE_MEMPOOL_NAMESIZE]; - - /* find max input segment size */ - for (i = 0; i < entries->nb_segments; ++i) - if (entries->segments[i].length > max_seg_sz) - max_seg_sz = entries->segments[i].length; - - snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, - dev_id); - return rte_pktmbuf_pool_create(pool_name, mbuf_pool_size, 0, 0, - RTE_MAX(max_seg_sz + RTE_PKTMBUF_HEADROOM - + FILLER_HEADROOM, - (unsigned int)RTE_MBUF_DEFAULT_BUF_SIZE), socket_id); -} - -static int -create_mempools(struct active_device *ad, int socket_id, - enum rte_bbdev_op_type org_op_type, uint16_t num_ops) -{ - struct rte_mempool *mp; - unsigned int ops_pool_size, mbuf_pool_size = 0; - char pool_name[RTE_MEMPOOL_NAMESIZE]; - const char *op_type_str; - enum rte_bbdev_op_type op_type = org_op_type; - - struct op_data_entries *in = &test_vector.entries[DATA_INPUT]; - struct op_data_entries *hard_out = - &test_vector.entries[DATA_HARD_OUTPUT]; - struct op_data_entries *soft_out = - &test_vector.entries[DATA_SOFT_OUTPUT]; - struct op_data_entries *harq_in = - &test_vector.entries[DATA_HARQ_INPUT]; - struct op_data_entries *harq_out = - &test_vector.entries[DATA_HARQ_OUTPUT]; - - /* allocate ops mempool */ - ops_pool_size = optimal_mempool_size(RTE_MAX( - /* Ops used plus 1 reference op */ - RTE_MAX((unsigned int)(ad->nb_queues * num_ops + 1), - /* Minimal cache size plus 1 reference op */ - (unsigned int)(1.5 * rte_lcore_count() * - OPS_CACHE_SIZE + 1)), - OPS_POOL_SIZE_MIN)); - - if (org_op_type == RTE_BBDEV_OP_NONE) - op_type = RTE_BBDEV_OP_TURBO_ENC; - - op_type_str = rte_bbdev_op_type_str(op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); - - snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, - ad->dev_id); - mp = rte_bbdev_op_pool_create(pool_name, op_type, - ops_pool_size, OPS_CACHE_SIZE, socket_id); - TEST_ASSERT_NOT_NULL(mp, - "ERROR Failed to create %u items ops pool for dev %u on socket %u.", - ops_pool_size, - ad->dev_id, - socket_id); - ad->ops_mempool = mp; - - /* Do not create inputs and outputs mbufs for BaseBand Null Device */ - if (org_op_type == RTE_BBDEV_OP_NONE) - return TEST_SUCCESS; - - /* Inputs */ - if (in->nb_segments > 0) { - mbuf_pool_size = optimal_mempool_size(ops_pool_size * - in->nb_segments); - mp = create_mbuf_pool(in, ad->dev_id, socket_id, - mbuf_pool_size, "in"); - TEST_ASSERT_NOT_NULL(mp, - "ERROR Failed to create %u items input pktmbuf pool for dev %u on socket %u.", - mbuf_pool_size, - ad->dev_id, - socket_id); - ad->in_mbuf_pool = mp; - } - - /* Hard outputs */ - if (hard_out->nb_segments > 0) { - mbuf_pool_size = optimal_mempool_size(ops_pool_size * - hard_out->nb_segments); - mp = create_mbuf_pool(hard_out, ad->dev_id, socket_id, - mbuf_pool_size, - "hard_out"); - TEST_ASSERT_NOT_NULL(mp, - "ERROR Failed to create %u items hard output pktmbuf pool for dev %u on socket %u.", - mbuf_pool_size, - ad->dev_id, - socket_id); - ad->hard_out_mbuf_pool = mp; - } - - /* Soft outputs */ - if (soft_out->nb_segments > 0) { - mbuf_pool_size = optimal_mempool_size(ops_pool_size * - soft_out->nb_segments); - mp = create_mbuf_pool(soft_out, ad->dev_id, socket_id, - mbuf_pool_size, - "soft_out"); - TEST_ASSERT_NOT_NULL(mp, - "ERROR Failed to create %uB soft output pktmbuf pool for dev %u on socket %u.", - mbuf_pool_size, - ad->dev_id, - socket_id); - ad->soft_out_mbuf_pool = mp; - } - - /* HARQ inputs */ - if (harq_in->nb_segments > 0) { - mbuf_pool_size = optimal_mempool_size(ops_pool_size * - harq_in->nb_segments); - mp = create_mbuf_pool(harq_in, ad->dev_id, socket_id, - mbuf_pool_size, - "harq_in"); - TEST_ASSERT_NOT_NULL(mp, - "ERROR Failed to create %uB harq input pktmbuf pool for dev %u on socket %u.", - mbuf_pool_size, - ad->dev_id, - socket_id); - ad->harq_in_mbuf_pool = mp; - } - - /* HARQ outputs */ - if (harq_out->nb_segments > 0) { - mbuf_pool_size = optimal_mempool_size(ops_pool_size * - harq_out->nb_segments); - mp = create_mbuf_pool(harq_out, ad->dev_id, socket_id, - mbuf_pool_size, - "harq_out"); - TEST_ASSERT_NOT_NULL(mp, - "ERROR Failed to create %uB harq output pktmbuf pool for dev %u on socket %u.", - mbuf_pool_size, - ad->dev_id, - socket_id); - ad->harq_out_mbuf_pool = mp; - } - - return TEST_SUCCESS; -} - -static int -add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info, - struct test_bbdev_vector *vector) -{ - int ret; - unsigned int queue_id; - struct rte_bbdev_queue_conf qconf; - struct active_device *ad = &active_devs[nb_active_devs]; - unsigned int nb_queues; - enum rte_bbdev_op_type op_type = vector->op_type; - -/* Configure fpga lte fec with PF & VF values - * if '-i' flag is set and using fpga device - */ -#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC - if ((get_init_device() == true) && - (!strcmp(info->drv.driver_name, FPGA_LTE_PF_DRIVER_NAME))) { - struct fpga_lte_fec_conf conf; - unsigned int i; - - printf("Configure FPGA LTE FEC Driver %s with default values\n", - info->drv.driver_name); - - /* clear default configuration before initialization */ - memset(&conf, 0, sizeof(struct fpga_lte_fec_conf)); - - /* Set PF mode : - * true if PF is used for data plane - * false for VFs - */ - conf.pf_mode_en = true; - - for (i = 0; i < FPGA_LTE_FEC_NUM_VFS; ++i) { - /* Number of UL queues per VF (fpga supports 8 VFs) */ - conf.vf_ul_queues_number[i] = VF_UL_4G_QUEUE_VALUE; - /* Number of DL queues per VF (fpga supports 8 VFs) */ - conf.vf_dl_queues_number[i] = VF_DL_4G_QUEUE_VALUE; - } - - /* UL bandwidth. Needed for schedule algorithm */ - conf.ul_bandwidth = UL_4G_BANDWIDTH; - /* DL bandwidth */ - conf.dl_bandwidth = DL_4G_BANDWIDTH; - - /* UL & DL load Balance Factor to 64 */ - conf.ul_load_balance = UL_4G_LOAD_BALANCE; - conf.dl_load_balance = DL_4G_LOAD_BALANCE; - - /**< FLR timeout value */ - conf.flr_time_out = FLR_4G_TIMEOUT; - - /* setup FPGA PF with configuration information */ - ret = fpga_lte_fec_configure(info->dev_name, &conf); - TEST_ASSERT_SUCCESS(ret, - "Failed to configure 4G FPGA PF for bbdev %s", - info->dev_name); - } -#endif -#ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_5GNR_FEC - if ((get_init_device() == true) && - (!strcmp(info->drv.driver_name, FPGA_5GNR_PF_DRIVER_NAME))) { - struct fpga_5gnr_fec_conf conf; - unsigned int i; - - printf("Configure FPGA 5GNR FEC Driver %s with default values\n", - info->drv.driver_name); - - /* clear default configuration before initialization */ - memset(&conf, 0, sizeof(struct fpga_5gnr_fec_conf)); - - /* Set PF mode : - * true if PF is used for data plane - * false for VFs - */ - conf.pf_mode_en = true; - - for (i = 0; i < FPGA_5GNR_FEC_NUM_VFS; ++i) { - /* Number of UL queues per VF (fpga supports 8 VFs) */ - conf.vf_ul_queues_number[i] = VF_UL_5G_QUEUE_VALUE; - /* Number of DL queues per VF (fpga supports 8 VFs) */ - conf.vf_dl_queues_number[i] = VF_DL_5G_QUEUE_VALUE; - } - - /* UL bandwidth. Needed for schedule algorithm */ - conf.ul_bandwidth = UL_5G_BANDWIDTH; - /* DL bandwidth */ - conf.dl_bandwidth = DL_5G_BANDWIDTH; - - /* UL & DL load Balance Factor to 64 */ - conf.ul_load_balance = UL_5G_LOAD_BALANCE; - conf.dl_load_balance = DL_5G_LOAD_BALANCE; - - /**< FLR timeout value */ - conf.flr_time_out = FLR_5G_TIMEOUT; - - /* setup FPGA PF with configuration information */ - ret = fpga_5gnr_fec_configure(info->dev_name, &conf); - TEST_ASSERT_SUCCESS(ret, - "Failed to configure 5G FPGA PF for bbdev %s", - info->dev_name); - } -#endif - nb_queues = RTE_MIN(rte_lcore_count(), info->drv.max_num_queues); - nb_queues = RTE_MIN(nb_queues, (unsigned int) MAX_QUEUES); - - /* setup device */ - ret = rte_bbdev_setup_queues(dev_id, nb_queues, info->socket_id); - if (ret < 0) { - printf("rte_bbdev_setup_queues(%u, %u, %d) ret %i\n", - dev_id, nb_queues, info->socket_id, ret); - return TEST_FAILED; - } - - /* configure interrupts if needed */ - if (intr_enabled) { - ret = rte_bbdev_intr_enable(dev_id); - if (ret < 0) { - printf("rte_bbdev_intr_enable(%u) ret %i\n", dev_id, - ret); - return TEST_FAILED; - } - } - - /* setup device queues */ - qconf.socket = info->socket_id; - qconf.queue_size = info->drv.default_queue_conf.queue_size; - qconf.priority = 0; - qconf.deferred_start = 0; - qconf.op_type = op_type; - - for (queue_id = 0; queue_id < nb_queues; ++queue_id) { - ret = rte_bbdev_queue_configure(dev_id, queue_id, &qconf); - if (ret != 0) { - printf( - "Allocated all queues (id=%u) at prio%u on dev%u\n", - queue_id, qconf.priority, dev_id); - qconf.priority++; - ret = rte_bbdev_queue_configure(ad->dev_id, queue_id, - &qconf); - } - if (ret != 0) { - printf("All queues on dev %u allocated: %u\n", - dev_id, queue_id); - break; - } - ad->queue_ids[queue_id] = queue_id; - } - TEST_ASSERT(queue_id != 0, - "ERROR Failed to configure any queues on dev %u", - dev_id); - ad->nb_queues = queue_id; - - set_avail_op(ad, op_type); - - return TEST_SUCCESS; -} - -static int -add_active_device(uint8_t dev_id, struct rte_bbdev_info *info, - struct test_bbdev_vector *vector) -{ - int ret; - - active_devs[nb_active_devs].driver_name = info->drv.driver_name; - active_devs[nb_active_devs].dev_id = dev_id; - - ret = add_bbdev_dev(dev_id, info, vector); - if (ret == TEST_SUCCESS) - ++nb_active_devs; - return ret; -} - -static uint8_t -populate_active_devices(void) -{ - int ret; - uint8_t dev_id; - uint8_t nb_devs_added = 0; - struct rte_bbdev_info info; - - RTE_BBDEV_FOREACH(dev_id) { - rte_bbdev_info_get(dev_id, &info); - - if (check_dev_cap(&info)) { - printf( - "Device %d (%s) does not support specified capabilities\n", - dev_id, info.dev_name); - continue; - } - - ret = add_active_device(dev_id, &info, &test_vector); - if (ret != 0) { - printf("Adding active bbdev %s skipped\n", - info.dev_name); - continue; - } - nb_devs_added++; - } - - return nb_devs_added; -} - -static int -read_test_vector(void) -{ - int ret; - - memset(&test_vector, 0, sizeof(test_vector)); - printf("Test vector file = %s\n", get_vector_filename()); - ret = test_bbdev_vector_read(get_vector_filename(), &test_vector); - TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n", - get_vector_filename()); - - return TEST_SUCCESS; -} - -static int -testsuite_setup(void) -{ - TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); - - if (populate_active_devices() == 0) { - printf("No suitable devices found!\n"); - return TEST_SKIPPED; - } - - return TEST_SUCCESS; -} - -static int -interrupt_testsuite_setup(void) -{ - TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); - - /* Enable interrupts */ - intr_enabled = true; - - /* Special case for NULL device (RTE_BBDEV_OP_NONE) */ - if (populate_active_devices() == 0 || - test_vector.op_type == RTE_BBDEV_OP_NONE) { - intr_enabled = false; - printf("No suitable devices found!\n"); - return TEST_SKIPPED; - } - - return TEST_SUCCESS; -} - -static void -testsuite_teardown(void) -{ - uint8_t dev_id; - - /* Unconfigure devices */ - RTE_BBDEV_FOREACH(dev_id) - rte_bbdev_close(dev_id); - - /* Clear active devices structs. */ - memset(active_devs, 0, sizeof(active_devs)); - nb_active_devs = 0; - - /* Disable interrupts */ - intr_enabled = false; -} - -static int -ut_setup(void) -{ - uint8_t i, dev_id; - - for (i = 0; i < nb_active_devs; i++) { - dev_id = active_devs[i].dev_id; - /* reset bbdev stats */ - TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), - "Failed to reset stats of bbdev %u", dev_id); - /* start the device */ - TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), - "Failed to start bbdev %u", dev_id); - } - - return TEST_SUCCESS; -} - -static void -ut_teardown(void) -{ - uint8_t i, dev_id; - struct rte_bbdev_stats stats; - - for (i = 0; i < nb_active_devs; i++) { - dev_id = active_devs[i].dev_id; - /* read stats and print */ - rte_bbdev_stats_get(dev_id, &stats); - /* Stop the device */ - rte_bbdev_stop(dev_id); - } -} - -static int -init_op_data_objs(struct rte_bbdev_op_data *bufs, - struct op_data_entries *ref_entries, - struct rte_mempool *mbuf_pool, const uint16_t n, - enum op_data_type op_type, uint16_t min_alignment) -{ - int ret; - unsigned int i, j, lc; - bool large_input = false; -printf("init op data\n"); - for (i = 0; i < n; ++i) { - char *data; - struct op_data_buf *seg = &ref_entries->segments[0]; - struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); - TEST_ASSERT_NOT_NULL(m_head, - "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", - op_type, n * ref_entries->nb_segments, - mbuf_pool->size); - - if (seg->length > RTE_BBDEV_LDPC_E_MAX_MBUF) { - /* - * Special case when DPDK mbuf cannot handle - * the required input size - */ - printf("Warning: Larger input size than DPDK mbuf %d\n", - seg->length); - large_input = true; - } - bufs[i].data = m_head; - bufs[i].offset = 0; - bufs[i].length = 0; - -//printf("init op data len %d data %x seg len %d\n",m_head->data_len, *data,seg->length); -if (i==0) -printf("init op data seg len %d data %x\n",seg->length,*seg->addr); - if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) { - if ((op_type == DATA_INPUT) && large_input) { - /* Allocate a fake overused mbuf */ - data = rte_malloc(NULL, seg->length, 0); - memcpy(data, seg->addr, seg->length); - m_head->buf_addr = data; - m_head->buf_iova = rte_malloc_virt2iova(data); - m_head->data_off = 0; - m_head->data_len = seg->length; - -printf("init op data len %d data %x\n",m_head->data_len, *data); - - } else { -if (i==0) -printf("else ...\n"); - data = rte_pktmbuf_append(m_head, seg->length); - TEST_ASSERT_NOT_NULL(data, - "Couldn't append %u bytes to mbuf from %d data type mbuf pool", - seg->length, op_type); - - TEST_ASSERT(data == RTE_PTR_ALIGN( - data, min_alignment), - "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", - data, min_alignment); - rte_memcpy(data, seg->addr, seg->length); - } -if (i==0) -{ -printf("type input len %d nb seg %d\n",seg->length,ref_entries->nb_segments); - -//printf("mhead len %d data %x\n",m_head->data_len, *data); -//printf("mhead len %d \n",m_head->data_len ); -for (lc =0; lc<8; lc++) -{ -printf("**********mhead len %d data %x addr %d\n",m_head->data_len, *(data+lc),(data+lc)); -} -} - - - bufs[i].length += seg->length; - - for (j = 1; j < ref_entries->nb_segments; ++j) { - struct rte_mbuf *m_tail = - rte_pktmbuf_alloc(mbuf_pool); - TEST_ASSERT_NOT_NULL(m_tail, - "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", - op_type, - n * ref_entries->nb_segments, - mbuf_pool->size); - seg += 1; - - data = rte_pktmbuf_append(m_tail, seg->length); - TEST_ASSERT_NOT_NULL(data, - "Couldn't append %u bytes to mbuf from %d data type mbuf pool", - seg->length, op_type); - - TEST_ASSERT(data == RTE_PTR_ALIGN(data, - min_alignment), - "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", - data, min_alignment); - rte_memcpy(data, seg->addr, seg->length); - bufs[i].length += seg->length; - -printf("loop rte memcpy data length %d\n",seg->length); -/*if (i==0) -{ -for (lc =0; lc<8; lc++) -{ -printf("mhead len %d data %x addr %d\n",m_head->data_len, *(data+lc),(data+lc)); -} -} -*/ - ret = rte_pktmbuf_chain(m_head, m_tail); - TEST_ASSERT_SUCCESS(ret, - "Couldn't chain mbufs from %d data type mbuf pool", - op_type); - } - -if (i==0) -{ -printf("rte memcpy data length %d\n",seg->length); -if (i==0) -for (lc =0; lc<8; lc++) -{ -printf("mhead len %d data %x addr %d\n",m_head->data_len, *(data+lc),(data+lc)); -} -} - - - - } else { - - /* allocate chained-mbuf for output buffer */ - for (j = 1; j < ref_entries->nb_segments; ++j) { - struct rte_mbuf *m_tail = - rte_pktmbuf_alloc(mbuf_pool); - TEST_ASSERT_NOT_NULL(m_tail, - "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", - op_type, - n * ref_entries->nb_segments, - mbuf_pool->size); - - ret = rte_pktmbuf_chain(m_head, m_tail); - TEST_ASSERT_SUCCESS(ret, - "Couldn't chain mbufs from %d data type mbuf pool", - op_type); - } - } - } - - return 0; -} - -static int -allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len, - const int socket) -{ - int i; - - *buffers = rte_zmalloc_socket(NULL, len, 0, socket); - if (*buffers == NULL) { - printf("WARNING: Failed to allocate op_data on socket %d\n", - socket); - /* try to allocate memory on other detected sockets */ - for (i = 0; i < socket; i++) { - *buffers = rte_zmalloc_socket(NULL, len, 0, i); - if (*buffers != NULL) - break; - } - } - - return (*buffers == NULL) ? TEST_FAILED : TEST_SUCCESS; -} - -static void -limit_input_llr_val_range(struct rte_bbdev_op_data *input_ops, - const uint16_t n, const int8_t max_llr_modulus) -{ - uint16_t i, byte_idx; - - for (i = 0; i < n; ++i) { - struct rte_mbuf *m = input_ops[i].data; - while (m != NULL) { - int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, - input_ops[i].offset); - for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); - ++byte_idx) - llr[byte_idx] = round((double)max_llr_modulus * - llr[byte_idx] / INT8_MAX); - - m = m->next; - } - } -} - -/* - * We may have to insert filler bits - * when they are required by the HARQ assumption - */ -static void -ldpc_add_filler(struct rte_bbdev_op_data *input_ops, - const uint16_t n, struct test_op_params *op_params) -{ - struct rte_bbdev_op_ldpc_dec dec = op_params->ref_dec_op->ldpc_dec; - - if (input_ops == NULL) - return; - /* No need to add filler if not required by device */ - if (!(ldpc_cap_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS)) - return; - /* No need to add filler for loopback operation */ - if (dec.op_flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) - return; - - uint16_t i, j, parity_offset; - for (i = 0; i < n; ++i) { - struct rte_mbuf *m = input_ops[i].data; - int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, - input_ops[i].offset); - parity_offset = (dec.basegraph == 1 ? 20 : 8) - * dec.z_c - dec.n_filler; - uint16_t new_hin_size = input_ops[i].length + dec.n_filler; - m->data_len = new_hin_size; - input_ops[i].length = new_hin_size; - for (j = new_hin_size - 1; j >= parity_offset + dec.n_filler; - j--) - llr[j] = llr[j - dec.n_filler]; - uint16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; - for (j = 0; j < dec.n_filler; j++) - llr[parity_offset + j] = llr_max_pre_scaling; - } -} - -static void -ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops, - const uint16_t n, const int8_t llr_size, - const int8_t llr_decimals) -{ -printf("start llr scaling \n"); - - if (input_ops == NULL) - return; - - uint16_t i, byte_idx; - - int16_t llr_max, llr_min, llr_tmp; - llr_max = (1 << (llr_size - 1)) - 1; - llr_min = -llr_max; - for (i = 0; i < n; ++i) { - struct rte_mbuf *m = input_ops[i].data; -char * addrl = &(m->buf_addr); -unsigned int off=256; //m->data_off; -unsigned int ll; -if (i==0){ -for (ll=0; ll<8;ll++) -printf("llr data len %d data %x addr %d offset %d data off %d\n",m->data_len,*(addrl+ll+off),(addrl+ll+off),input_ops[i].offset,m->data_off); -} - - - while (m != NULL) { - int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, - input_ops[i].offset); -char *addrllr = llr; - -if (i==0){ -printf("addrllr %d llr %x llr orig addr %d data %x\n",addrllr, *addrllr,llr,*llr);} - - for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); - ++byte_idx) { - -if (i==0){ -if (byte_idx<16) - -printf("llr %d\n",llr[byte_idx]); -} - llr_tmp = llr[byte_idx]; - if (llr_decimals == 4) - llr_tmp *= 8; - else if (llr_decimals == 2) - llr_tmp *= 2; - else if (llr_decimals == 0) - llr_tmp /= 2; - llr_tmp = RTE_MIN(llr_max, - RTE_MAX(llr_min, llr_tmp)); - llr[byte_idx] = (int8_t) llr_tmp; - - -//if (byte_idx<16) -//printf("llr %d\n",llr[byte_idx]); -} - - m = m->next; - } - } -} - - - -static int -fill_queue_buffers(struct test_op_params *op_params, - struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp, - struct rte_mempool *soft_out_mp, - struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp, - uint16_t queue_id, - const struct rte_bbdev_op_cap *capabilities, - uint16_t min_alignment, const int socket_id) -{ - int ret; - enum op_data_type type; - const uint16_t n = op_params->num_to_process; - - struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { - in_mp, - soft_out_mp, - hard_out_mp, - harq_in_mp, - harq_out_mp, - }; -printf("fill queue buffer\n"); - struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = { - &op_params->q_bufs[socket_id][queue_id].inputs, - &op_params->q_bufs[socket_id][queue_id].soft_outputs, - &op_params->q_bufs[socket_id][queue_id].hard_outputs, - &op_params->q_bufs[socket_id][queue_id].harq_inputs, - &op_params->q_bufs[socket_id][queue_id].harq_outputs, - }; - -//struct rte_bbdev_op_data *bufs = *queue_ops[type]; -struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pools[type]); -//m_head = queue_ops[type][0]->data; - - -//printf("queue ops len %d\n",m_head->data_len); - -for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { - struct op_data_entries *ref_entries = - &test_vector.entries[type]; -unsigned int nb_ops; -nb_ops = ref_entries->nb_segments; -//printf("ref seg data %x \n", *ref_entries->segments[0].addr); - -printf("ref seg nb seg %d\n", nb_ops); - if (ref_entries->nb_segments == 0) - continue; - - ret = allocate_buffers_on_socket(queue_ops[type], - n * sizeof(struct rte_bbdev_op_data), - socket_id); - TEST_ASSERT_SUCCESS(ret, - "Couldn't allocate memory for rte_bbdev_op_data structs"); - - ret = init_op_data_objs(*queue_ops[type], ref_entries, - mbuf_pools[type], n, type, min_alignment); - TEST_ASSERT_SUCCESS(ret, - "Couldn't init rte_bbdev_op_data structs"); - } - - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) - limit_input_llr_val_range(*queue_ops[DATA_INPUT], n, - capabilities->cap.turbo_dec.max_llr_modulus); - - if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { - bool loopback = op_params->ref_dec_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; - bool llr_comp = op_params->ref_dec_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_LLR_COMPRESSION; - bool harq_comp = op_params->ref_dec_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - ldpc_llr_decimals = capabilities->cap.ldpc_dec.llr_decimals; - ldpc_llr_size = capabilities->cap.ldpc_dec.llr_size; - ldpc_cap_flags = capabilities->cap.ldpc_dec.capability_flags; - if (!loopback && !llr_comp) - ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n, - ldpc_llr_size, ldpc_llr_decimals); - if (!loopback && !harq_comp) - ldpc_input_llr_scaling(*queue_ops[DATA_HARQ_INPUT], n, - ldpc_llr_size, ldpc_llr_decimals); - if (!loopback) - ldpc_add_filler(*queue_ops[DATA_HARQ_INPUT], n, - op_params); - } -//printf("queue ops len %d\n",bufs[0].data->data_len); - -//printf("queue ops len %d\n",queue_ops[type][0]->data->data_len); - return 0; -} - -static void -free_buffers(struct active_device *ad, struct test_op_params *op_params) -{ - unsigned int i, j; - - rte_mempool_free(ad->ops_mempool); - rte_mempool_free(ad->in_mbuf_pool); - rte_mempool_free(ad->hard_out_mbuf_pool); - rte_mempool_free(ad->soft_out_mbuf_pool); - rte_mempool_free(ad->harq_in_mbuf_pool); - rte_mempool_free(ad->harq_out_mbuf_pool); - - for (i = 0; i < rte_lcore_count(); ++i) { - for (j = 0; j < RTE_MAX_NUMA_NODES; ++j) { - rte_free(op_params->q_bufs[j][i].inputs); - rte_free(op_params->q_bufs[j][i].hard_outputs); - rte_free(op_params->q_bufs[j][i].soft_outputs); - rte_free(op_params->q_bufs[j][i].harq_inputs); - rte_free(op_params->q_bufs[j][i].harq_outputs); - } - } -} - -static void -copy_reference_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, - unsigned int start_idx, - struct rte_bbdev_op_data *inputs, - struct rte_bbdev_op_data *hard_outputs, - struct rte_bbdev_op_data *soft_outputs, - struct rte_bbdev_dec_op *ref_op) -{ - unsigned int i; - struct rte_bbdev_op_turbo_dec *turbo_dec = &ref_op->turbo_dec; - - for (i = 0; i < n; ++i) { - if (turbo_dec->code_block_mode == 0) { - ops[i]->turbo_dec.tb_params.ea = - turbo_dec->tb_params.ea; - ops[i]->turbo_dec.tb_params.eb = - turbo_dec->tb_params.eb; - ops[i]->turbo_dec.tb_params.k_pos = - turbo_dec->tb_params.k_pos; - ops[i]->turbo_dec.tb_params.k_neg = - turbo_dec->tb_params.k_neg; - ops[i]->turbo_dec.tb_params.c = - turbo_dec->tb_params.c; - ops[i]->turbo_dec.tb_params.c_neg = - turbo_dec->tb_params.c_neg; - ops[i]->turbo_dec.tb_params.cab = - turbo_dec->tb_params.cab; - ops[i]->turbo_dec.tb_params.r = - turbo_dec->tb_params.r; - } else { - ops[i]->turbo_dec.cb_params.e = turbo_dec->cb_params.e; - ops[i]->turbo_dec.cb_params.k = turbo_dec->cb_params.k; - } - - ops[i]->turbo_dec.ext_scale = turbo_dec->ext_scale; - ops[i]->turbo_dec.iter_max = turbo_dec->iter_max; - ops[i]->turbo_dec.iter_min = turbo_dec->iter_min; - ops[i]->turbo_dec.op_flags = turbo_dec->op_flags; - ops[i]->turbo_dec.rv_index = turbo_dec->rv_index; - ops[i]->turbo_dec.num_maps = turbo_dec->num_maps; - ops[i]->turbo_dec.code_block_mode = turbo_dec->code_block_mode; - - ops[i]->turbo_dec.hard_output = hard_outputs[start_idx + i]; - ops[i]->turbo_dec.input = inputs[start_idx + i]; - if (soft_outputs != NULL) - ops[i]->turbo_dec.soft_output = - soft_outputs[start_idx + i]; - } -} - -static void -copy_reference_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, - unsigned int start_idx, - struct rte_bbdev_op_data *inputs, - struct rte_bbdev_op_data *outputs, - struct rte_bbdev_enc_op *ref_op) -{ - unsigned int i; - struct rte_bbdev_op_turbo_enc *turbo_enc = &ref_op->turbo_enc; - for (i = 0; i < n; ++i) { - if (turbo_enc->code_block_mode == 0) { - ops[i]->turbo_enc.tb_params.ea = - turbo_enc->tb_params.ea; - ops[i]->turbo_enc.tb_params.eb = - turbo_enc->tb_params.eb; - ops[i]->turbo_enc.tb_params.k_pos = - turbo_enc->tb_params.k_pos; - ops[i]->turbo_enc.tb_params.k_neg = - turbo_enc->tb_params.k_neg; - ops[i]->turbo_enc.tb_params.c = - turbo_enc->tb_params.c; - ops[i]->turbo_enc.tb_params.c_neg = - turbo_enc->tb_params.c_neg; - ops[i]->turbo_enc.tb_params.cab = - turbo_enc->tb_params.cab; - ops[i]->turbo_enc.tb_params.ncb_pos = - turbo_enc->tb_params.ncb_pos; - ops[i]->turbo_enc.tb_params.ncb_neg = - turbo_enc->tb_params.ncb_neg; - ops[i]->turbo_enc.tb_params.r = turbo_enc->tb_params.r; - } else { - ops[i]->turbo_enc.cb_params.e = turbo_enc->cb_params.e; - ops[i]->turbo_enc.cb_params.k = turbo_enc->cb_params.k; - ops[i]->turbo_enc.cb_params.ncb = - turbo_enc->cb_params.ncb; - } - ops[i]->turbo_enc.rv_index = turbo_enc->rv_index; - ops[i]->turbo_enc.op_flags = turbo_enc->op_flags; - ops[i]->turbo_enc.code_block_mode = turbo_enc->code_block_mode; - - ops[i]->turbo_enc.output = outputs[start_idx + i]; - ops[i]->turbo_enc.input = inputs[start_idx + i]; - } -} - - -/* Returns a random number drawn from a normal distribution - * with mean of 0 and variance of 1 - * Marsaglia algorithm - */ -static double -randn(int n) -{ - double S, Z, U1, U2, u, v, fac; - - do { - U1 = (double)rand() / RAND_MAX; - U2 = (double)rand() / RAND_MAX; - u = 2. * U1 - 1.; - v = 2. * U2 - 1.; - S = u * u + v * v; - } while (S >= 1 || S == 0); - fac = sqrt(-2. * log(S) / S); - Z = (n % 2) ? u * fac : v * fac; - return Z; -} - -static inline double -maxstar(double A, double B) -{ - if (fabs(A - B) > 5) - return RTE_MAX(A, B); - else - return RTE_MAX(A, B) + log1p(exp(-fabs(A - B))); -} - -/* - * Generate Qm LLRS for Qm==8 - * Modulation, AWGN and LLR estimation from max log development - */ -static void -gen_qm8_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) -{ - int qm = 8; - int qam = 256; - int m, k; - double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; - /* 5.1.4 of TS38.211 */ - const double symbols_I[256] = { - 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 5, - 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 11, - 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, 15, 13, 13, - 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, - 15, 13, 13, 15, 15, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, - 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, - 1, 3, 3, 1, 1, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, - 15, 15, 13, 13, 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, - 13, 13, 15, 15, 13, 13, 15, 15, -5, -5, -7, -7, -5, - -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, - -7, -7, -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, - -1, -1, -11, -11, -9, -9, -11, -11, -9, -9, -13, - -13, -15, -15, -13, -13, -15, -15, -11, -11, -9, - -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, - -13, -15, -15, -5, -5, -7, -7, -5, -5, -7, -7, -3, - -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, -5, -5, - -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -11, -11, - -9, -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, - -13, -15, -15, -11, -11, -9, -9, -11, -11, -9, -9, - -13, -13, -15, -15, -13, -13, -15, -15}; - const double symbols_Q[256] = { - 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, - 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, 13, - 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, - 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, - 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, -5, - -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, - -15, -13, -15, -11, -9, -11, -9, -13, -15, -13, - -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, -5, - -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, - -13, -15, -11, -9, -11, -9, -13, -15, -13, -15, 5, - 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, - 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, - 13, 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, - 3, 1, 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, - 13, 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, - -5, -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, - -13, -15, -13, -15, -11, -9, -11, -9, -13, -15, - -13, -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, - -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, - -13, -15, -11, -9, -11, -9, -13, -15, -13, -15}; - /* Average constellation point energy */ - N0 *= 170.0; - for (k = 0; k < qm; k++) - b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; - /* 5.1.4 of TS38.211 */ - I = (1 - 2 * b[0]) * (8 - (1 - 2 * b[2]) * - (4 - (1 - 2 * b[4]) * (2 - (1 - 2 * b[6])))); - Q = (1 - 2 * b[1]) * (8 - (1 - 2 * b[3]) * - (4 - (1 - 2 * b[5]) * (2 - (1 - 2 * b[7])))); - /* AWGN channel */ - I += sqrt(N0 / 2) * randn(0); - Q += sqrt(N0 / 2) * randn(1); - /* - * Calculate the log of the probability that each of - * the constellation points was transmitted - */ - for (m = 0; m < qam; m++) - log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) - + pow(Q - symbols_Q[m], 2.0)) / N0; - /* Calculate an LLR for each of the k_64QAM bits in the set */ - for (k = 0; k < qm; k++) { - p0 = -999999; - p1 = -999999; - /* For each constellation point */ - for (m = 0; m < qam; m++) { - if ((m >> (qm - k - 1)) & 1) - p1 = maxstar(p1, log_syml_prob[m]); - else - p0 = maxstar(p0, log_syml_prob[m]); - } - /* Calculate the LLR */ - llr_ = p0 - p1; - llr_ *= (1 << ldpc_llr_decimals); - llr_ = round(llr_); - if (llr_ > llr_max) - llr_ = llr_max; - if (llr_ < -llr_max) - llr_ = -llr_max; - llrs[qm * i + k] = (int8_t) llr_; - } -} - - -/* - * Generate Qm LLRS for Qm==6 - * Modulation, AWGN and LLR estimation from max log development - */ -static void -gen_qm6_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) -{ - int qm = 6; - int qam = 64; - int m, k; - double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; - /* 5.1.4 of TS38.211 */ - const double symbols_I[64] = { - 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, - 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, - -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, - -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, - -5, -5, -7, -7, -5, -5, -7, -7}; - const double symbols_Q[64] = { - 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, - -3, -1, -3, -1, -5, -7, -5, -7, -3, -1, -3, -1, - -5, -7, -5, -7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, - 5, 7, 5, 7, -3, -1, -3, -1, -5, -7, -5, -7, - -3, -1, -3, -1, -5, -7, -5, -7}; - /* Average constellation point energy */ - N0 *= 42.0; - for (k = 0; k < qm; k++) - b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; - /* 5.1.4 of TS38.211 */ - I = (1 - 2 * b[0])*(4 - (1 - 2 * b[2]) * (2 - (1 - 2 * b[4]))); - Q = (1 - 2 * b[1])*(4 - (1 - 2 * b[3]) * (2 - (1 - 2 * b[5]))); - /* AWGN channel */ - I += sqrt(N0 / 2) * randn(0); - Q += sqrt(N0 / 2) * randn(1); - /* - * Calculate the log of the probability that each of - * the constellation points was transmitted - */ - for (m = 0; m < qam; m++) - log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) - + pow(Q - symbols_Q[m], 2.0)) / N0; - /* Calculate an LLR for each of the k_64QAM bits in the set */ - for (k = 0; k < qm; k++) { - p0 = -999999; - p1 = -999999; - /* For each constellation point */ - for (m = 0; m < qam; m++) { - if ((m >> (qm - k - 1)) & 1) - p1 = maxstar(p1, log_syml_prob[m]); - else - p0 = maxstar(p0, log_syml_prob[m]); - } - /* Calculate the LLR */ - llr_ = p0 - p1; - llr_ *= (1 << ldpc_llr_decimals); - llr_ = round(llr_); - if (llr_ > llr_max) - llr_ = llr_max; - if (llr_ < -llr_max) - llr_ = -llr_max; - llrs[qm * i + k] = (int8_t) llr_; - } -} - -/* - * Generate Qm LLRS for Qm==4 - * Modulation, AWGN and LLR estimation from max log development - */ -static void -gen_qm4_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) -{ - int qm = 4; - int qam = 16; - int m, k; - double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; - /* 5.1.4 of TS38.211 */ - const double symbols_I[16] = {1, 1, 3, 3, 1, 1, 3, 3, - -1, -1, -3, -3, -1, -1, -3, -3}; - const double symbols_Q[16] = {1, 3, 1, 3, -1, -3, -1, -3, - 1, 3, 1, 3, -1, -3, -1, -3}; - /* Average constellation point energy */ - N0 *= 10.0; - for (k = 0; k < qm; k++) - b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; - /* 5.1.4 of TS38.211 */ - I = (1 - 2 * b[0]) * (2 - (1 - 2 * b[2])); - Q = (1 - 2 * b[1]) * (2 - (1 - 2 * b[3])); - /* AWGN channel */ - I += sqrt(N0 / 2) * randn(0); - Q += sqrt(N0 / 2) * randn(1); - /* - * Calculate the log of the probability that each of - * the constellation points was transmitted - */ - for (m = 0; m < qam; m++) - log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) - + pow(Q - symbols_Q[m], 2.0)) / N0; - /* Calculate an LLR for each of the k_64QAM bits in the set */ - for (k = 0; k < qm; k++) { - p0 = -999999; - p1 = -999999; - /* For each constellation point */ - for (m = 0; m < qam; m++) { - if ((m >> (qm - k - 1)) & 1) - p1 = maxstar(p1, log_syml_prob[m]); - else - p0 = maxstar(p0, log_syml_prob[m]); - } - /* Calculate the LLR */ - llr_ = p0 - p1; - llr_ *= (1 << ldpc_llr_decimals); - llr_ = round(llr_); - if (llr_ > llr_max) - llr_ = llr_max; - if (llr_ < -llr_max) - llr_ = -llr_max; - llrs[qm * i + k] = (int8_t) llr_; - } -} - -static void -gen_qm2_llr(int8_t *llrs, uint32_t j, double N0, double llr_max) -{ - double b, b1, n; - double coeff = 2.0 * sqrt(N0); - - /* Ignore in vectors rare quasi null LLRs not to be saturated */ - if (llrs[j] < 8 && llrs[j] > -8) - return; - - /* Note don't change sign here */ - n = randn(j % 2); - b1 = ((llrs[j] > 0 ? 2.0 : -2.0) - + coeff * n) / N0; - b = b1 * (1 << ldpc_llr_decimals); - b = round(b); - if (b > llr_max) - b = llr_max; - if (b < -llr_max) - b = -llr_max; - llrs[j] = (int8_t) b; -} - -/* Generate LLR for a given SNR */ -static void -generate_llr_input(uint16_t n, struct rte_bbdev_op_data *inputs, - struct rte_bbdev_dec_op *ref_op) -{ - struct rte_mbuf *m; - uint16_t qm; - uint32_t i, j, e, range; - double N0, llr_max; - - e = ref_op->ldpc_dec.cb_params.e; - qm = ref_op->ldpc_dec.q_m; - llr_max = (1 << (ldpc_llr_size - 1)) - 1; - range = e / qm; - N0 = 1.0 / pow(10.0, get_snr() / 10.0); - - for (i = 0; i < n; ++i) { - m = inputs[i].data; - int8_t *llrs = rte_pktmbuf_mtod_offset(m, int8_t *, 0); - if (qm == 8) { - for (j = 0; j < range; ++j) - gen_qm8_llr(llrs, j, N0, llr_max); - } else if (qm == 6) { - for (j = 0; j < range; ++j) - gen_qm6_llr(llrs, j, N0, llr_max); - } else if (qm == 4) { - for (j = 0; j < range; ++j) - gen_qm4_llr(llrs, j, N0, llr_max); - } else { - for (j = 0; j < e; ++j) - gen_qm2_llr(llrs, j, N0, llr_max); - } - } -} - -static void -copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, - unsigned int start_idx, - struct rte_bbdev_op_data *inputs, - struct rte_bbdev_op_data *hard_outputs, - struct rte_bbdev_op_data *soft_outputs, - struct rte_bbdev_op_data *harq_inputs, - struct rte_bbdev_op_data *harq_outputs, - struct rte_bbdev_dec_op *ref_op) -{ - unsigned int i; - struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; -printf("num ops %d\n",n); - -struct rte_mbuf *m = inputs[0].data; -char *addr = m->buf_addr; -printf("input data ad %d data %x len %d\n",(m->buf_addr),*addr,m->data_len); - for (i = 0; i < n; ++i) { - if (ldpc_dec->code_block_mode == 0) { - ops[i]->ldpc_dec.tb_params.ea = - ldpc_dec->tb_params.ea; - ops[i]->ldpc_dec.tb_params.eb = - ldpc_dec->tb_params.eb; - ops[i]->ldpc_dec.tb_params.c = - ldpc_dec->tb_params.c; - ops[i]->ldpc_dec.tb_params.cab = - ldpc_dec->tb_params.cab; - ops[i]->ldpc_dec.tb_params.r = - ldpc_dec->tb_params.r; - -printf("code block ea %d eb %d c %d cab %d r %d\n",ldpc_dec->tb_params.ea,ldpc_dec->tb_params.eb,ldpc_dec->tb_params.c, ldpc_dec->tb_params.cab, ldpc_dec->tb_params.r); - - } else { - ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; -if (i==0) -printf("cb param e %d\n",ldpc_dec->cb_params.e); - } - - ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; - ops[i]->ldpc_dec.z_c = 72;//ldpc_dec->z_c; - ops[i]->ldpc_dec.q_m = 2; //ldpc_dec->q_m; - ops[i]->ldpc_dec.n_filler = 0; //ldpc_dec->n_filler; - ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; - ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; - ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; - ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags; - ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; -if (i==0) -printf("reference bg %d zc %d qm %d n_filler %d, n_cb %d iter max %d rv %d\n", ldpc_dec->basegraph, ldpc_dec->z_c, ldpc_dec->q_m,ldpc_dec->n_filler,ldpc_dec->n_cb,ldpc_dec->iter_max,ldpc_dec->rv_index); -//if (i<10) -//printf("input %x\n",inputs[start_idx+i]->data); - if (hard_outputs != NULL) - ops[i]->ldpc_dec.hard_output = - hard_outputs[start_idx + i]; - if (inputs != NULL) - ops[i]->ldpc_dec.input = - inputs[start_idx + i]; - if (soft_outputs != NULL) - ops[i]->ldpc_dec.soft_output = - soft_outputs[start_idx + i]; - if (harq_inputs != NULL) - ops[i]->ldpc_dec.harq_combined_input = - harq_inputs[start_idx + i]; - if (harq_outputs != NULL) - ops[i]->ldpc_dec.harq_combined_output = - harq_outputs[start_idx + i]; -//if (i<10) -//printf("ldpc_dec input %x\n",*ops[i]->ldpc_dec.input[0]->data->buf_addr); - - } -} - - -static void -copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, - unsigned int start_idx, - struct rte_bbdev_op_data *inputs, - struct rte_bbdev_op_data *outputs, - struct rte_bbdev_enc_op *ref_op) -{ - unsigned int i; - struct rte_bbdev_op_ldpc_enc *ldpc_enc = &ref_op->ldpc_enc; - for (i = 0; i < n; ++i) { - if (ldpc_enc->code_block_mode == 0) { - ops[i]->ldpc_enc.tb_params.ea = ldpc_enc->tb_params.ea; - ops[i]->ldpc_enc.tb_params.eb = ldpc_enc->tb_params.eb; - ops[i]->ldpc_enc.tb_params.cab = - ldpc_enc->tb_params.cab; - ops[i]->ldpc_enc.tb_params.c = ldpc_enc->tb_params.c; - ops[i]->ldpc_enc.tb_params.r = ldpc_enc->tb_params.r; - } else { - ops[i]->ldpc_enc.cb_params.e = ldpc_enc->cb_params.e; - } - ops[i]->ldpc_enc.basegraph = ldpc_enc->basegraph; - ops[i]->ldpc_enc.z_c = ldpc_enc->z_c; - ops[i]->ldpc_enc.q_m = ldpc_enc->q_m; - ops[i]->ldpc_enc.n_filler = ldpc_enc->n_filler; - ops[i]->ldpc_enc.n_cb = ldpc_enc->n_cb; - ops[i]->ldpc_enc.rv_index = ldpc_enc->rv_index; - ops[i]->ldpc_enc.op_flags = ldpc_enc->op_flags; - ops[i]->ldpc_enc.code_block_mode = ldpc_enc->code_block_mode; - ops[i]->ldpc_enc.output = outputs[start_idx + i]; - ops[i]->ldpc_enc.input = inputs[start_idx + i]; - } -} - -static int -check_dec_status_and_ordering(struct rte_bbdev_dec_op *op, - unsigned int order_idx, const int expected_status) -{ - int status = op->status; - /* ignore parity mismatch false alarms for long iterations */ - if (get_iter_max() >= 10) { - if (!(expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) && - (status & (1 << RTE_BBDEV_SYNDROME_ERROR))) { - printf("WARNING: Ignore Syndrome Check mismatch\n"); - status -= (1 << RTE_BBDEV_SYNDROME_ERROR); - } - if ((expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) && - !(status & (1 << RTE_BBDEV_SYNDROME_ERROR))) { - printf("WARNING: Ignore Syndrome Check mismatch\n"); - status += (1 << RTE_BBDEV_SYNDROME_ERROR); - } - } - - TEST_ASSERT(status == expected_status, - "op_status (%d) != expected_status (%d)", - op->status, expected_status); - - TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, - "Ordering error, expected %p, got %p", - (void *)(uintptr_t)order_idx, op->opaque_data); - - return TEST_SUCCESS; -} - -static int -check_enc_status_and_ordering(struct rte_bbdev_enc_op *op, - unsigned int order_idx, const int expected_status) -{ - TEST_ASSERT(op->status == expected_status, - "op_status (%d) != expected_status (%d)", - op->status, expected_status); - - if (op->opaque_data != (void *)(uintptr_t)INVALID_OPAQUE) - TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, - "Ordering error, expected %p, got %p", - (void *)(uintptr_t)order_idx, op->opaque_data); - - return TEST_SUCCESS; -} - -static inline int -validate_op_chain(struct rte_bbdev_op_data *op, - struct op_data_entries *orig_op) -{ - uint8_t i; - struct rte_mbuf *m = op->data; - uint8_t nb_dst_segments = orig_op->nb_segments; - uint32_t total_data_size = 0; - - TEST_ASSERT(nb_dst_segments == m->nb_segs, - "Number of segments differ in original (%u) and filled (%u) op", - nb_dst_segments, m->nb_segs); - - /* Validate each mbuf segment length */ - for (i = 0; i < nb_dst_segments; ++i) { - /* Apply offset to the first mbuf segment */ - uint16_t offset = (i == 0) ? op->offset : 0; - uint16_t data_len = rte_pktmbuf_data_len(m) - offset; - total_data_size += orig_op->segments[i].length; - - TEST_ASSERT(orig_op->segments[i].length == data_len, - "Length of segment differ in original (%u) and filled (%u) op", - orig_op->segments[i].length, data_len); - TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, - rte_pktmbuf_mtod_offset(m, uint32_t *, offset), - data_len, - "Output buffers (CB=%u) are not equal", i); - m = m->next; - } - - /* Validate total mbuf pkt length */ - uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; - TEST_ASSERT(total_data_size == pkt_len, - "Length of data differ in original (%u) and filled (%u) op", - total_data_size, pkt_len); - - return TEST_SUCCESS; -} - -/* - * Compute K0 for a given configuration for HARQ output length computation - * As per definition in 3GPP 38.212 Table 5.4.2.1-2 - */ -static inline uint16_t -get_k0(uint16_t n_cb, uint16_t z_c, uint8_t bg, uint8_t rv_index) -{ - if (rv_index == 0) - return 0; - uint16_t n = (bg == 1 ? N_ZC_1 : N_ZC_2) * z_c; - if (n_cb == n) { - if (rv_index == 1) - return (bg == 1 ? K0_1_1 : K0_1_2) * z_c; - else if (rv_index == 2) - return (bg == 1 ? K0_2_1 : K0_2_2) * z_c; - else - return (bg == 1 ? K0_3_1 : K0_3_2) * z_c; - } - /* LBRM case - includes a division by N */ - if (rv_index == 1) - return (((bg == 1 ? K0_1_1 : K0_1_2) * n_cb) - / n) * z_c; - else if (rv_index == 2) - return (((bg == 1 ? K0_2_1 : K0_2_2) * n_cb) - / n) * z_c; - else - return (((bg == 1 ? K0_3_1 : K0_3_2) * n_cb) - / n) * z_c; -} - -/* HARQ output length including the Filler bits */ -static inline uint16_t -compute_harq_len(struct rte_bbdev_op_ldpc_dec *ops_ld) -{ - uint16_t k0 = 0; - uint8_t max_rv = (ops_ld->rv_index == 1) ? 3 : ops_ld->rv_index; - k0 = get_k0(ops_ld->n_cb, ops_ld->z_c, ops_ld->basegraph, max_rv); - /* Compute RM out size and number of rows */ - uint16_t parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) - * ops_ld->z_c - ops_ld->n_filler; - uint16_t deRmOutSize = RTE_MIN( - k0 + ops_ld->cb_params.e + - ((k0 > parity_offset) ? - 0 : ops_ld->n_filler), - ops_ld->n_cb); - uint16_t numRows = ((deRmOutSize + ops_ld->z_c - 1) - / ops_ld->z_c); - uint16_t harq_output_len = numRows * ops_ld->z_c; - return harq_output_len; -} - -static inline int -validate_op_harq_chain(struct rte_bbdev_op_data *op, - struct op_data_entries *orig_op, - struct rte_bbdev_op_ldpc_dec *ops_ld) -{ - uint8_t i; - uint32_t j, jj, k; - struct rte_mbuf *m = op->data; - uint8_t nb_dst_segments = orig_op->nb_segments; - uint32_t total_data_size = 0; - int8_t *harq_orig, *harq_out, abs_harq_origin; - uint32_t byte_error = 0, cum_error = 0, error; - int16_t llr_max = (1 << (ldpc_llr_size - ldpc_llr_decimals)) - 1; - int16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; - uint16_t parity_offset; - - TEST_ASSERT(nb_dst_segments == m->nb_segs, - "Number of segments differ in original (%u) and filled (%u) op", - nb_dst_segments, m->nb_segs); - - /* Validate each mbuf segment length */ - for (i = 0; i < nb_dst_segments; ++i) { - /* Apply offset to the first mbuf segment */ - uint16_t offset = (i == 0) ? op->offset : 0; - uint16_t data_len = rte_pktmbuf_data_len(m) - offset; - total_data_size += orig_op->segments[i].length; - - TEST_ASSERT(orig_op->segments[i].length < - (uint32_t)(data_len + 64), - "Length of segment differ in original (%u) and filled (%u) op", - orig_op->segments[i].length, data_len); - harq_orig = (int8_t *) orig_op->segments[i].addr; - harq_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset); - - if (!(ldpc_cap_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS - ) || (ops_ld->op_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { - data_len -= ops_ld->z_c; - parity_offset = data_len; - } else { - /* Compute RM out size and number of rows */ - parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) - * ops_ld->z_c - ops_ld->n_filler; - uint16_t deRmOutSize = compute_harq_len(ops_ld) - - ops_ld->n_filler; - if (data_len > deRmOutSize) - data_len = deRmOutSize; - if (data_len > orig_op->segments[i].length) - data_len = orig_op->segments[i].length; - } - /* - * HARQ output can have minor differences - * due to integer representation and related scaling - */ - for (j = 0, jj = 0; j < data_len; j++, jj++) { - if (j == parity_offset) { - /* Special Handling of the filler bits */ - for (k = 0; k < ops_ld->n_filler; k++) { - if (harq_out[jj] != - llr_max_pre_scaling) { - printf("HARQ Filler issue %d: %d %d\n", - jj, harq_out[jj], - llr_max); - byte_error++; - } - jj++; - } - } - if (!(ops_ld->op_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { - if (ldpc_llr_decimals > 1) - harq_out[jj] = (harq_out[jj] + 1) - >> (ldpc_llr_decimals - 1); - /* Saturated to S7 */ - if (harq_orig[j] > llr_max) - harq_orig[j] = llr_max; - if (harq_orig[j] < -llr_max) - harq_orig[j] = -llr_max; - } - if (harq_orig[j] != harq_out[jj]) { - error = (harq_orig[j] > harq_out[jj]) ? - harq_orig[j] - harq_out[jj] : - harq_out[jj] - harq_orig[j]; - abs_harq_origin = harq_orig[j] > 0 ? - harq_orig[j] : - -harq_orig[j]; - /* Residual quantization error */ - if ((error > 8 && (abs_harq_origin < - (llr_max - 16))) || - (error > 16)) { - printf("HARQ mismatch %d: exp %d act %d => %d\n", - j, harq_orig[j], - harq_out[jj], error); - byte_error++; - cum_error += error; - } - } - } - m = m->next; - } - - if (byte_error) - TEST_ASSERT(byte_error <= 1, - "HARQ output mismatch (%d) %d", - byte_error, cum_error); - - /* Validate total mbuf pkt length */ - uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; - TEST_ASSERT(total_data_size < pkt_len + 64, - "Length of data differ in original (%u) and filled (%u) op", - total_data_size, pkt_len); - - return TEST_SUCCESS; -} - -static int -validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, - struct rte_bbdev_dec_op *ref_op, const int vector_mask) -{ - unsigned int i; - int ret; - struct op_data_entries *hard_data_orig = - &test_vector.entries[DATA_HARD_OUTPUT]; - struct op_data_entries *soft_data_orig = - &test_vector.entries[DATA_SOFT_OUTPUT]; - struct rte_bbdev_op_turbo_dec *ops_td; - struct rte_bbdev_op_data *hard_output; - struct rte_bbdev_op_data *soft_output; - struct rte_bbdev_op_turbo_dec *ref_td = &ref_op->turbo_dec; - - for (i = 0; i < n; ++i) { - ops_td = &ops[i]->turbo_dec; - hard_output = &ops_td->hard_output; - soft_output = &ops_td->soft_output; - - if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) - TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, - "Returned iter_count (%d) > expected iter_count (%d)", - ops_td->iter_count, ref_td->iter_count); - ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); - TEST_ASSERT_SUCCESS(ret, - "Checking status and ordering for decoder failed"); - - TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, - hard_data_orig), - "Hard output buffers (CB=%u) are not equal", - i); - - if (ref_op->turbo_dec.op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) - TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, - soft_data_orig), - "Soft output buffers (CB=%u) are not equal", - i); - } - - return TEST_SUCCESS; -} - -/* Check Number of code blocks errors */ -static int -validate_ldpc_bler(struct rte_bbdev_dec_op **ops, const uint16_t n) -{ - unsigned int i; - struct op_data_entries *hard_data_orig = - &test_vector.entries[DATA_HARD_OUTPUT]; - struct rte_bbdev_op_ldpc_dec *ops_td; - struct rte_bbdev_op_data *hard_output; - int errors = 0; - struct rte_mbuf *m; - - for (i = 0; i < n; ++i) { - ops_td = &ops[i]->ldpc_dec; - hard_output = &ops_td->hard_output; - m = hard_output->data; - if (memcmp(rte_pktmbuf_mtod_offset(m, uint32_t *, 0), - hard_data_orig->segments[0].addr, - hard_data_orig->segments[0].length)) - errors++; - } - return errors; -} - -static int -validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, - struct rte_bbdev_dec_op *ref_op, const int vector_mask) -{ - unsigned int i; - int ret; - struct op_data_entries *hard_data_orig = - &test_vector.entries[DATA_HARD_OUTPUT]; - struct op_data_entries *soft_data_orig = - &test_vector.entries[DATA_SOFT_OUTPUT]; - struct op_data_entries *harq_data_orig = - &test_vector.entries[DATA_HARQ_OUTPUT]; - struct rte_bbdev_op_ldpc_dec *ops_td; - struct rte_bbdev_op_data *hard_output; - struct rte_bbdev_op_data *harq_output; - struct rte_bbdev_op_data *soft_output; - struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec; - - for (i = 0; i < n; ++i) { - ops_td = &ops[i]->ldpc_dec; - hard_output = &ops_td->hard_output; - harq_output = &ops_td->harq_combined_output; - soft_output = &ops_td->soft_output; - - ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); - TEST_ASSERT_SUCCESS(ret, - "Checking status and ordering for decoder failed"); - if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) - TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, - "Returned iter_count (%d) > expected iter_count (%d)", - ops_td->iter_count, ref_td->iter_count); - /* - * We can ignore output data when the decoding failed to - * converge or for loop-back cases - */ - if (!check_bit(ops[i]->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK - ) && ( - ops[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR - )) == 0) - TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, - hard_data_orig), - "Hard output buffers (CB=%u) are not equal", - i); - - if (ref_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) - TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, - soft_data_orig), - "Soft output buffers (CB=%u) are not equal", - i); - if (ref_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) { - TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, - harq_data_orig, ops_td), - "HARQ output buffers (CB=%u) are not equal", - i); - } - if (ref_op->ldpc_dec.op_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) - TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, - harq_data_orig, ops_td), - "HARQ output buffers (CB=%u) are not equal", - i); - - } - - return TEST_SUCCESS; -} - - -static int -validate_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, - struct rte_bbdev_enc_op *ref_op) -{ - unsigned int i; - int ret; - struct op_data_entries *hard_data_orig = - &test_vector.entries[DATA_HARD_OUTPUT]; - - for (i = 0; i < n; ++i) { - ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); - TEST_ASSERT_SUCCESS(ret, - "Checking status and ordering for encoder failed"); - TEST_ASSERT_SUCCESS(validate_op_chain( - &ops[i]->turbo_enc.output, - hard_data_orig), - "Output buffers (CB=%u) are not equal", - i); - } - - return TEST_SUCCESS; -} - -static int -validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, - struct rte_bbdev_enc_op *ref_op) -{ - unsigned int i; - int ret; - struct op_data_entries *hard_data_orig = - &test_vector.entries[DATA_HARD_OUTPUT]; - - for (i = 0; i < n; ++i) { - ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); - TEST_ASSERT_SUCCESS(ret, - "Checking status and ordering for encoder failed"); - TEST_ASSERT_SUCCESS(validate_op_chain( - &ops[i]->ldpc_enc.output, - hard_data_orig), - "Output buffers (CB=%u) are not equal", - i); - } - - return TEST_SUCCESS; -} - -static void -create_reference_dec_op(struct rte_bbdev_dec_op *op) -{ - unsigned int i; - struct op_data_entries *entry; - - op->turbo_dec = test_vector.turbo_dec; - entry = &test_vector.entries[DATA_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->turbo_dec.input.length += - entry->segments[i].length; -} - -static void -create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op) -{ - unsigned int i; - struct op_data_entries *entry; - - op->ldpc_dec = test_vector.ldpc_dec; - entry = &test_vector.entries[DATA_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->ldpc_dec.input.length += - entry->segments[i].length; -printf("data %x length %d\n",*entry->segments[0].addr,entry->segments[0].length); - - - if (test_vector.ldpc_dec.op_flags & - RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) { - entry = &test_vector.entries[DATA_HARQ_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->ldpc_dec.harq_combined_input.length += - entry->segments[i].length; - } -} - - -static void -create_reference_enc_op(struct rte_bbdev_enc_op *op) -{ - unsigned int i; - struct op_data_entries *entry; - - op->turbo_enc = test_vector.turbo_enc; - entry = &test_vector.entries[DATA_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->turbo_enc.input.length += - entry->segments[i].length; -} - -static void -create_reference_ldpc_enc_op(struct rte_bbdev_enc_op *op) -{ - unsigned int i; - struct op_data_entries *entry; - - op->ldpc_enc = test_vector.ldpc_enc; - entry = &test_vector.entries[DATA_INPUT]; - for (i = 0; i < entry->nb_segments; ++i) - op->ldpc_enc.input.length += - entry->segments[i].length; -} - -static uint32_t -calc_dec_TB_size(struct rte_bbdev_dec_op *op) -{ - uint8_t i; - uint32_t c, r, tb_size = 0; - - if (op->turbo_dec.code_block_mode) { - tb_size = op->turbo_dec.tb_params.k_neg; - } else { - c = op->turbo_dec.tb_params.c; - r = op->turbo_dec.tb_params.r; - for (i = 0; i < c-r; i++) - tb_size += (r < op->turbo_dec.tb_params.c_neg) ? - op->turbo_dec.tb_params.k_neg : - op->turbo_dec.tb_params.k_pos; - } - return tb_size; -} - -static uint32_t -calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) -{ - uint8_t i; - uint32_t c, r, tb_size = 0; - uint16_t sys_cols = (op->ldpc_dec.basegraph == 1) ? 22 : 10; - - if (op->ldpc_dec.code_block_mode) { - tb_size = sys_cols * op->ldpc_dec.z_c - op->ldpc_dec.n_filler; -printf("calc tb c %d r %d sys cols %d tb_size %d\n",op->ldpc_dec.tb_params.c, op->ldpc_dec.tb_params.r,sys_cols,tb_size); - } else { - c = op->ldpc_dec.tb_params.c; - r = op->ldpc_dec.tb_params.r; - for (i = 0; i < c-r; i++) - tb_size += sys_cols * op->ldpc_dec.z_c - - op->ldpc_dec.n_filler; - -printf("calc tb c %d r %d sys cols %d tb_size %d\n",c,r,sys_cols,tb_size); - - } - return tb_size; -} - -static uint32_t -calc_enc_TB_size(struct rte_bbdev_enc_op *op) -{ - uint8_t i; - uint32_t c, r, tb_size = 0; - - if (op->turbo_enc.code_block_mode) { - tb_size = op->turbo_enc.tb_params.k_neg; - } else { - c = op->turbo_enc.tb_params.c; - r = op->turbo_enc.tb_params.r; - for (i = 0; i < c-r; i++) - tb_size += (r < op->turbo_enc.tb_params.c_neg) ? - op->turbo_enc.tb_params.k_neg : - op->turbo_enc.tb_params.k_pos; - } - return tb_size; -} - -static uint32_t -calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op *op) -{ - uint8_t i; - uint32_t c, r, tb_size = 0; - uint16_t sys_cols = (op->ldpc_enc.basegraph == 1) ? 22 : 10; - - if (op->turbo_enc.code_block_mode) { - tb_size = sys_cols * op->ldpc_enc.z_c - op->ldpc_enc.n_filler; - } else { - c = op->turbo_enc.tb_params.c; - r = op->turbo_enc.tb_params.r; - for (i = 0; i < c-r; i++) - tb_size += sys_cols * op->ldpc_enc.z_c - - op->ldpc_enc.n_filler; - } - return tb_size; -} - - -static int -init_test_op_params(struct test_op_params *op_params, - enum rte_bbdev_op_type op_type, const int expected_status, - const int vector_mask, struct rte_mempool *ops_mp, - uint16_t burst_sz, uint16_t num_to_process, uint16_t num_lcores) -{ - int ret = 0; - if (op_type == RTE_BBDEV_OP_TURBO_DEC || - op_type == RTE_BBDEV_OP_LDPC_DEC) - ret = rte_bbdev_dec_op_alloc_bulk(ops_mp, - &op_params->ref_dec_op, 1); - else - ret = rte_bbdev_enc_op_alloc_bulk(ops_mp, - &op_params->ref_enc_op, 1); - - TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed"); - - op_params->mp = ops_mp; - op_params->burst_sz = burst_sz; - op_params->num_to_process = num_to_process; - op_params->num_lcores = num_lcores; - op_params->vector_mask = vector_mask; - if (op_type == RTE_BBDEV_OP_TURBO_DEC || - op_type == RTE_BBDEV_OP_LDPC_DEC) - op_params->ref_dec_op->status = expected_status; - else if (op_type == RTE_BBDEV_OP_TURBO_ENC - || op_type == RTE_BBDEV_OP_LDPC_ENC) - op_params->ref_enc_op->status = expected_status; - return 0; -} - -static int -run_test_case_on_device(test_case_function *test_case_func, uint8_t dev_id, - struct test_op_params *op_params) -{ - int t_ret, f_ret, socket_id = SOCKET_ID_ANY; - unsigned int i; - struct active_device *ad; - unsigned int burst_sz = get_burst_sz(); - enum rte_bbdev_op_type op_type = test_vector.op_type; - const struct rte_bbdev_op_cap *capabilities = NULL; - - ad = &active_devs[dev_id]; - - /* Check if device supports op_type */ - if (!is_avail_op(ad, test_vector.op_type)) - return TEST_SUCCESS; - - struct rte_bbdev_info info; - rte_bbdev_info_get(ad->dev_id, &info); - socket_id = GET_SOCKET(info.socket_id); - - f_ret = create_mempools(ad, socket_id, op_type, - get_num_ops()); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't create mempools"); - goto fail; - } - if (op_type == RTE_BBDEV_OP_NONE) - op_type = RTE_BBDEV_OP_TURBO_ENC; - - f_ret = init_test_op_params(op_params, test_vector.op_type, - test_vector.expected_status, - test_vector.mask, - ad->ops_mempool, - burst_sz, - get_num_ops(), - get_num_lcores()); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't init test op params"); - goto fail; - } - - - /* Find capabilities */ - const struct rte_bbdev_op_cap *cap = info.drv.capabilities; - for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { - if (cap->type == test_vector.op_type) { - capabilities = cap; - break; - } - cap++; - } - TEST_ASSERT_NOT_NULL(capabilities, - "Couldn't find capabilities"); - - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { - create_reference_dec_op(op_params->ref_dec_op); - } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) - create_reference_enc_op(op_params->ref_enc_op); - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - create_reference_ldpc_enc_op(op_params->ref_enc_op); - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - create_reference_ldpc_dec_op(op_params->ref_dec_op); - - for (i = 0; i < ad->nb_queues; ++i) { - f_ret = fill_queue_buffers(op_params, - ad->in_mbuf_pool, - ad->hard_out_mbuf_pool, - ad->soft_out_mbuf_pool, - ad->harq_in_mbuf_pool, - ad->harq_out_mbuf_pool, - ad->queue_ids[i], - capabilities, - info.drv.min_alignment, - socket_id); - if (f_ret != TEST_SUCCESS) { - printf("Couldn't init queue buffers"); - goto fail; - } - } - - /* Run test case function */ - t_ret = test_case_func(ad, op_params); - - /* Free active device resources and return */ - free_buffers(ad, op_params); - return t_ret; - -fail: - free_buffers(ad, op_params); - return TEST_FAILED; -} - -/* Run given test function per active device per supported op type - * per burst size. - */ -static int -run_test_case(test_case_function *test_case_func) -{ - int ret = 0; - uint8_t dev; - - /* Alloc op_params */ - struct test_op_params *op_params = rte_zmalloc(NULL, - sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); - TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", - RTE_ALIGN(sizeof(struct test_op_params), - RTE_CACHE_LINE_SIZE)); - - /* For each device run test case function */ - for (dev = 0; dev < nb_active_devs; ++dev) - ret |= run_test_case_on_device(test_case_func, dev, op_params); - - rte_free(op_params); - - return ret; -} - - -/* Push back the HARQ output from DDR to host */ -static void -retrieve_harq_ddr(uint16_t dev_id, uint16_t queue_id, - struct rte_bbdev_dec_op **ops, - const uint16_t n) -{ - uint16_t j; - int save_status, ret; - uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * 1024; - struct rte_bbdev_dec_op *ops_deq[MAX_BURST]; - uint32_t flags = ops[0]->ldpc_dec.op_flags; - bool loopback = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; - bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; - bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - for (j = 0; j < n; ++j) { - if ((loopback && mem_out) || hc_out) { - save_status = ops[j]->status; - ops[j]->ldpc_dec.op_flags = - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; - if (h_comp) - ops[j]->ldpc_dec.op_flags += - RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - ops[j]->ldpc_dec.harq_combined_input.offset = - harq_offset; - ops[j]->ldpc_dec.harq_combined_output.offset = 0; - harq_offset += HARQ_INCR; - if (!loopback) - ops[j]->ldpc_dec.harq_combined_input.length = - ops[j]->ldpc_dec.harq_combined_output.length; - rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, - &ops[j], 1); - ret = 0; - while (ret == 0) - ret = rte_bbdev_dequeue_ldpc_dec_ops( - dev_id, queue_id, - &ops_deq[j], 1); - ops[j]->ldpc_dec.op_flags = flags; - ops[j]->status = save_status; - } - } -} - -/* - * Push back the HARQ output from HW DDR to Host - * Preload HARQ memory input and adjust HARQ offset - */ -static void -preload_harq_ddr(uint16_t dev_id, uint16_t queue_id, - struct rte_bbdev_dec_op **ops, const uint16_t n, - bool preload) -{ - uint16_t j; - int ret; - uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * 1024; - struct rte_bbdev_op_data save_hc_in, save_hc_out; - struct rte_bbdev_dec_op *ops_deq[MAX_BURST]; - uint32_t flags = ops[0]->ldpc_dec.op_flags; - bool mem_in = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; - bool hc_in = flags & RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE; - bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; - bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - for (j = 0; j < n; ++j) { - if ((mem_in || hc_in) && preload) { - save_hc_in = ops[j]->ldpc_dec.harq_combined_input; - save_hc_out = ops[j]->ldpc_dec.harq_combined_output; - ops[j]->ldpc_dec.op_flags = - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - if (h_comp) - ops[j]->ldpc_dec.op_flags += - RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - ops[j]->ldpc_dec.harq_combined_output.offset = - harq_offset; - ops[j]->ldpc_dec.harq_combined_input.offset = 0; - rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, - &ops[j], 1); - ret = 0; - while (ret == 0) - ret = rte_bbdev_dequeue_ldpc_dec_ops( - dev_id, queue_id, &ops_deq[j], 1); - ops[j]->ldpc_dec.op_flags = flags; - ops[j]->ldpc_dec.harq_combined_input = save_hc_in; - ops[j]->ldpc_dec.harq_combined_output = save_hc_out; - } - /* Adjust HARQ offset when we reach external DDR */ - if (mem_in || hc_in) - ops[j]->ldpc_dec.harq_combined_input.offset - = harq_offset; - if (mem_out || hc_out) - ops[j]->ldpc_dec.harq_combined_output.offset - = harq_offset; - harq_offset += HARQ_INCR; - } -} - -static void -dequeue_event_callback(uint16_t dev_id, - enum rte_bbdev_event_type event, void *cb_arg, - void *ret_param) -{ - int ret; - uint16_t i; - uint64_t total_time; - uint16_t deq, burst_sz, num_ops; - uint16_t queue_id = *(uint16_t *) ret_param; - struct rte_bbdev_info info; - double tb_len_bits; - struct thread_params *tp = cb_arg; - - /* Find matching thread params using queue_id */ - for (i = 0; i < MAX_QUEUES; ++i, ++tp) - if (tp->queue_id == queue_id) - break; - - if (i == MAX_QUEUES) { - printf("%s: Queue_id from interrupt details was not found!\n", - __func__); - return; - } - - if (unlikely(event != RTE_BBDEV_EVENT_DEQUEUE)) { - rte_atomic16_set(&tp->processing_status, TEST_FAILED); - printf( - "Dequeue interrupt handler called for incorrect event!\n"); - return; - } - - burst_sz = rte_atomic16_read(&tp->burst_sz); - num_ops = tp->op_params->num_to_process; - - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) - deq = rte_bbdev_dequeue_dec_ops(dev_id, queue_id, - &tp->dec_ops[ - rte_atomic16_read(&tp->nb_dequeued)], - burst_sz); - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - deq = rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, - &tp->dec_ops[ - rte_atomic16_read(&tp->nb_dequeued)], - burst_sz); - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - deq = rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, - &tp->enc_ops[ - rte_atomic16_read(&tp->nb_dequeued)], - burst_sz); - else /*RTE_BBDEV_OP_TURBO_ENC*/ - deq = rte_bbdev_dequeue_enc_ops(dev_id, queue_id, - &tp->enc_ops[ - rte_atomic16_read(&tp->nb_dequeued)], - burst_sz); - - if (deq < burst_sz) { - printf( - "After receiving the interrupt all operations should be dequeued. Expected: %u, got: %u\n", - burst_sz, deq); - rte_atomic16_set(&tp->processing_status, TEST_FAILED); - return; - } - - if (rte_atomic16_read(&tp->nb_dequeued) + deq < num_ops) { - rte_atomic16_add(&tp->nb_dequeued, deq); - return; - } - - total_time = rte_rdtsc_precise() - tp->start_time; - - rte_bbdev_info_get(dev_id, &info); - - ret = TEST_SUCCESS; - - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - ret = validate_dec_op(tp->dec_ops, num_ops, ref_op, - tp->op_params->vector_mask); - /* get the max of iter_count for all dequeued ops */ - for (i = 0; i < num_ops; ++i) - tp->iter_count = RTE_MAX( - tp->dec_ops[i]->turbo_dec.iter_count, - tp->iter_count); - rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); - } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) { - struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; - ret = validate_enc_op(tp->enc_ops, num_ops, ref_op); - rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); - } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) { - struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; - ret = validate_ldpc_enc_op(tp->enc_ops, num_ops, ref_op); - rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); - } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - ret = validate_ldpc_dec_op(tp->dec_ops, num_ops, ref_op, - tp->op_params->vector_mask); - rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); - } - - if (ret) { - printf("Buffers validation failed\n"); - rte_atomic16_set(&tp->processing_status, TEST_FAILED); - } - - switch (test_vector.op_type) { - case RTE_BBDEV_OP_TURBO_DEC: - tb_len_bits = calc_dec_TB_size(tp->op_params->ref_dec_op); - break; - case RTE_BBDEV_OP_TURBO_ENC: - tb_len_bits = calc_enc_TB_size(tp->op_params->ref_enc_op); - break; - case RTE_BBDEV_OP_LDPC_DEC: - tb_len_bits = calc_ldpc_dec_TB_size(tp->op_params->ref_dec_op); - break; - case RTE_BBDEV_OP_LDPC_ENC: - tb_len_bits = calc_ldpc_enc_TB_size(tp->op_params->ref_enc_op); - break; - case RTE_BBDEV_OP_NONE: - tb_len_bits = 0.0; - break; - default: - printf("Unknown op type: %d\n", test_vector.op_type); - rte_atomic16_set(&tp->processing_status, TEST_FAILED); - return; - } - - tp->ops_per_sec += ((double)num_ops) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps += (((double)(num_ops * tb_len_bits)) / 1000000.0) / - ((double)total_time / (double)rte_get_tsc_hz()); - - rte_atomic16_add(&tp->nb_dequeued, deq); -} - -static int -throughput_intr_lcore_ldpc_dec(void *arg) -{ - struct thread_params *tp = arg; - unsigned int enqueued; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_to_process = tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops[num_to_process]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - int ret, i, j; - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - uint16_t num_to_enq, enq; - - bool loopback = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); - bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), - "Failed to enable interrupts for dev: %u, queue_id: %u", - tp->dev_id, queue_id); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - -printf("start tp intr lcore ldpc dec\n"); - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - rte_atomic16_clear(&tp->processing_status); - rte_atomic16_clear(&tp->nb_dequeued); - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, - num_to_process); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_to_process); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops, num_to_process, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_to_process; ++j) - ops[j]->opaque_data = (void *)(uintptr_t)j; - - for (j = 0; j < TEST_REPETITIONS; ++j) { - for (i = 0; i < num_to_process; ++i) { - if (!loopback) - rte_pktmbuf_reset( - ops[i]->ldpc_dec.hard_output.data); - if (hc_out || loopback) - mbuf_reset( - ops[i]->ldpc_dec.harq_combined_output.data); - } - - tp->start_time = rte_rdtsc_precise(); - for (enqueued = 0; enqueued < num_to_process;) { - num_to_enq = burst_sz; - - if (unlikely(num_to_process - enqueued < num_to_enq)) - num_to_enq = num_to_process - enqueued; - - enq = 0; - do { - - printf("do enqueue ldpc dec ops\n"); - enq += rte_bbdev_enqueue_ldpc_dec_ops( - tp->dev_id, - queue_id, &ops[enqueued], - num_to_enq); - } while (unlikely(num_to_enq != enq)); - enqueued += enq; - - /* Write to thread burst_sz current number of enqueued - * descriptors. It ensures that proper number of - * descriptors will be dequeued in callback - * function - needed for last batch in case where - * the number of operations is not a multiple of - * burst size. - */ - rte_atomic16_set(&tp->burst_sz, num_to_enq); - - /* Wait until processing of previous batch is - * completed - */ - while (rte_atomic16_read(&tp->nb_dequeued) != - (int16_t) enqueued) - rte_pause(); - } - if (j != TEST_REPETITIONS - 1) - rte_atomic16_clear(&tp->nb_dequeued); - } - - return TEST_SUCCESS; -} - -static int -throughput_intr_lcore_dec(void *arg) -{ - struct thread_params *tp = arg; - unsigned int enqueued; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_to_process = tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops[num_to_process]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - int ret, i, j; - uint16_t num_to_enq, enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), - "Failed to enable interrupts for dev: %u, queue_id: %u", - tp->dev_id, queue_id); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - rte_atomic16_clear(&tp->processing_status); - rte_atomic16_clear(&tp->nb_dequeued); - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, - num_to_process); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_to_process); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_dec_op(ops, num_to_process, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, - tp->op_params->ref_dec_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_to_process; ++j) - ops[j]->opaque_data = (void *)(uintptr_t)j; - - for (j = 0; j < TEST_REPETITIONS; ++j) { - for (i = 0; i < num_to_process; ++i) - rte_pktmbuf_reset(ops[i]->turbo_dec.hard_output.data); - - tp->start_time = rte_rdtsc_precise(); - for (enqueued = 0; enqueued < num_to_process;) { - num_to_enq = burst_sz; - - if (unlikely(num_to_process - enqueued < num_to_enq)) - num_to_enq = num_to_process - enqueued; - - enq = 0; - do { - enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, - queue_id, &ops[enqueued], - num_to_enq); - } while (unlikely(num_to_enq != enq)); - enqueued += enq; - - /* Write to thread burst_sz current number of enqueued - * descriptors. It ensures that proper number of - * descriptors will be dequeued in callback - * function - needed for last batch in case where - * the number of operations is not a multiple of - * burst size. - */ - rte_atomic16_set(&tp->burst_sz, num_to_enq); - - /* Wait until processing of previous batch is - * completed - */ - while (rte_atomic16_read(&tp->nb_dequeued) != - (int16_t) enqueued) - rte_pause(); - } - if (j != TEST_REPETITIONS - 1) - rte_atomic16_clear(&tp->nb_dequeued); - } - - return TEST_SUCCESS; -} - -static int -throughput_intr_lcore_enc(void *arg) -{ - struct thread_params *tp = arg; - unsigned int enqueued; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_to_process = tp->op_params->num_to_process; - struct rte_bbdev_enc_op *ops[num_to_process]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - int ret, i, j; - uint16_t num_to_enq, enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), - "Failed to enable interrupts for dev: %u, queue_id: %u", - tp->dev_id, queue_id); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - rte_atomic16_clear(&tp->processing_status); - rte_atomic16_clear(&tp->nb_dequeued); - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, - num_to_process); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_to_process); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_enc_op(ops, num_to_process, 0, bufs->inputs, - bufs->hard_outputs, tp->op_params->ref_enc_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_to_process; ++j) - ops[j]->opaque_data = (void *)(uintptr_t)j; - - for (j = 0; j < TEST_REPETITIONS; ++j) { - for (i = 0; i < num_to_process; ++i) - rte_pktmbuf_reset(ops[i]->turbo_enc.output.data); - - tp->start_time = rte_rdtsc_precise(); - for (enqueued = 0; enqueued < num_to_process;) { - num_to_enq = burst_sz; - - if (unlikely(num_to_process - enqueued < num_to_enq)) - num_to_enq = num_to_process - enqueued; - - enq = 0; - do { - enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, - queue_id, &ops[enqueued], - num_to_enq); - } while (unlikely(enq != num_to_enq)); - enqueued += enq; - - /* Write to thread burst_sz current number of enqueued - * descriptors. It ensures that proper number of - * descriptors will be dequeued in callback - * function - needed for last batch in case where - * the number of operations is not a multiple of - * burst size. - */ - rte_atomic16_set(&tp->burst_sz, num_to_enq); - - /* Wait until processing of previous batch is - * completed - */ - while (rte_atomic16_read(&tp->nb_dequeued) != - (int16_t) enqueued) - rte_pause(); - } - if (j != TEST_REPETITIONS - 1) - rte_atomic16_clear(&tp->nb_dequeued); - } - - return TEST_SUCCESS; -} - - -static int -throughput_intr_lcore_ldpc_enc(void *arg) -{ - struct thread_params *tp = arg; - unsigned int enqueued; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_to_process = tp->op_params->num_to_process; - struct rte_bbdev_enc_op *ops[num_to_process]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - int ret, i, j; - uint16_t num_to_enq, enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), - "Failed to enable interrupts for dev: %u, queue_id: %u", - tp->dev_id, queue_id); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - rte_atomic16_clear(&tp->processing_status); - rte_atomic16_clear(&tp->nb_dequeued); - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, - num_to_process); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_to_process); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_enc_op(ops, num_to_process, 0, - bufs->inputs, bufs->hard_outputs, - tp->op_params->ref_enc_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_to_process; ++j) - ops[j]->opaque_data = (void *)(uintptr_t)j; - - for (j = 0; j < TEST_REPETITIONS; ++j) { - for (i = 0; i < num_to_process; ++i) - rte_pktmbuf_reset(ops[i]->turbo_enc.output.data); - - tp->start_time = rte_rdtsc_precise(); - for (enqueued = 0; enqueued < num_to_process;) { - num_to_enq = burst_sz; - - if (unlikely(num_to_process - enqueued < num_to_enq)) - num_to_enq = num_to_process - enqueued; - - enq = 0; - do { - enq += rte_bbdev_enqueue_ldpc_enc_ops( - tp->dev_id, - queue_id, &ops[enqueued], - num_to_enq); - } while (unlikely(enq != num_to_enq)); - enqueued += enq; - - /* Write to thread burst_sz current number of enqueued - * descriptors. It ensures that proper number of - * descriptors will be dequeued in callback - * function - needed for last batch in case where - * the number of operations is not a multiple of - * burst size. - */ - rte_atomic16_set(&tp->burst_sz, num_to_enq); - - /* Wait until processing of previous batch is - * completed - */ - while (rte_atomic16_read(&tp->nb_dequeued) != - (int16_t) enqueued) - rte_pause(); - } - if (j != TEST_REPETITIONS - 1) - rte_atomic16_clear(&tp->nb_dequeued); - } - - return TEST_SUCCESS; -} - -static int -throughput_pmd_lcore_dec(void *arg) -{ - struct thread_params *tp = arg; - uint16_t enq, deq; - uint64_t total_time = 0, start_time; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_ops = tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops_enq[num_ops]; - struct rte_bbdev_dec_op *ops_deq[num_ops]; - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - struct rte_bbdev_info info; - uint16_t num_to_enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(tp->dev_id, &info); -printf("lcore pmd dec\n"); - TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < TEST_REPETITIONS; ++i) { - - for (j = 0; j < num_ops; ++j) - mbuf_reset(ops_enq[j]->turbo_dec.hard_output.data); - - start_time = rte_rdtsc_precise(); - - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; - - if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; - - enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - /* dequeue the remaining */ - while (deq < enq) { - deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - total_time += rte_rdtsc_precise() - start_time; - } - - tp->iter_count = 0; - /* get the max of iter_count for all dequeued ops */ - for (i = 0; i < num_ops; ++i) { - tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count, - tp->iter_count); - } - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_dec_op(ops_deq, num_ops, ref_op, - tp->op_params->vector_mask); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); - - double tb_len_bits = calc_dec_TB_size(ref_op); -printf("tb len bits %d\n",tb_len_bits); - - tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / - 1000000.0) / ((double)total_time / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} - -static int -bler_pmd_lcore_ldpc_dec(void *arg) -{ - struct thread_params *tp = arg; - uint16_t enq, deq; - uint64_t total_time = 0, start_time; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_ops = tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops_enq[num_ops]; - struct rte_bbdev_dec_op *ops_deq[num_ops]; - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - float parity_bler = 0; - struct rte_bbdev_info info; - uint16_t num_to_enq; - bool extDdr = check_bit(ldpc_cap_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); - bool loopback = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); - bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(tp->dev_id, &info); -printf("++++++++++++++++++pmd ldpc dec\n"); - TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); - - /* For BLER tests we need to enable early termination */ - if (!check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) - ref_op->ldpc_dec.op_flags += - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - ref_op->ldpc_dec.iter_max = get_iter_max(); - ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op); - generate_llr_input(num_ops, bufs->inputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < 1; ++i) { /* Could add more iterations */ - for (j = 0; j < num_ops; ++j) { - if (!loopback) - mbuf_reset( - ops_enq[j]->ldpc_dec.hard_output.data); - if (hc_out || loopback) - mbuf_reset( - ops_enq[j]->ldpc_dec.harq_combined_output.data); - } - if (extDdr) { - bool preload = i == (TEST_REPETITIONS - 1); - preload_harq_ddr(tp->dev_id, queue_id, ops_enq, - num_ops, preload); - } - start_time = rte_rdtsc_precise(); - - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; - - if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; - - enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - /* dequeue the remaining */ - while (deq < enq) { - deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - total_time += rte_rdtsc_precise() - start_time; - } - - tp->iter_count = 0; - tp->iter_average = 0; - /* get the max of iter_count for all dequeued ops */ - for (i = 0; i < num_ops; ++i) { - tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, - tp->iter_count); - tp->iter_average += (double) ops_enq[i]->ldpc_dec.iter_count; - if (ops_enq[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR)) - parity_bler += 1.0; - } - - parity_bler /= num_ops; /* This one is based on SYND */ - tp->iter_average /= num_ops; - tp->bler = (double) validate_ldpc_bler(ops_deq, num_ops) / num_ops; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE - && tp->bler == 0 - && parity_bler == 0 - && !hc_out) { - ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, - tp->op_params->vector_mask); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); - - double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); -printf("tb len bits %d\n",tb_len_bits); - -tp->ops_per_sec = ((double)num_ops * 1) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps = (((double)(num_ops * 1 * tb_len_bits)) / - 1000000.0) / ((double)total_time / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} - -static int -throughput_pmd_lcore_ldpc_dec(void *arg) -{ - struct thread_params *tp = arg; - uint16_t enq, deq; - uint64_t total_time = 0, start_time; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_ops = tp->op_params->num_to_process; - struct rte_bbdev_dec_op *ops_enq[num_ops]; - struct rte_bbdev_dec_op *ops_deq[num_ops]; - struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - struct rte_bbdev_info info; - uint16_t num_to_enq; - bool extDdr = check_bit(ldpc_cap_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); - bool loopback = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); - bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); -printf("pmd ldpc dec\n"); - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - -char *addrb = &bufs->inputs[0].data->buf_addr; - -unsigned int lm; -for (lm=0; lm<16;lm++ ){ -printf("bufs len %d data %x addr %d\n",bufs->inputs[0].data->data_len,*(addrb+lm),(addrb+lm)); -} - -//printf("bufs len %d data %x\n",bufs->inputs[0].data->data_len,*bufs->inputs[0].data->buf_addr); - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); - - /* For throughput tests we need to disable early termination */ - if (check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) - ref_op->ldpc_dec.op_flags -= - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - ref_op->ldpc_dec.iter_max = get_iter_max(); - ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < TEST_REPETITIONS; ++i) { - for (j = 0; j < num_ops; ++j) { - if (!loopback) - mbuf_reset( - ops_enq[j]->ldpc_dec.hard_output.data); - if (hc_out || loopback) - mbuf_reset( - ops_enq[j]->ldpc_dec.harq_combined_output.data); - } - if (extDdr) { - bool preload = i == (TEST_REPETITIONS - 1); - preload_harq_ddr(tp->dev_id, queue_id, ops_enq, - num_ops, preload); - } - start_time = rte_rdtsc_precise(); -//printf("num ops %d burst sz %d enq %d\n",num_ops,burst_sz,enq); - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; - - if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; -//if (enq==0) -//printf("pmd lcore ldpc dec length %d data %x\n", ops_enq[enq]->ldpc_dec.input.length,ops_enq[enq]->ldpc_dec.input); - - enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - /* dequeue the remaining */ - while (deq < enq) { - deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - total_time += rte_rdtsc_precise() - start_time; - } - - tp->iter_count = 0; - /* get the max of iter_count for all dequeued ops */ - for (i = 0; i < num_ops; ++i) { - tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, - tp->iter_count); - } - if (extDdr) { - /* Read loopback is not thread safe */ - retrieve_harq_ddr(tp->dev_id, queue_id, ops_enq, num_ops); - } - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, - tp->op_params->vector_mask); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); - - double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); -printf("tb len bits %f \n",tb_len_bits); - tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / - 1000000.0) / ((double)total_time / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} - -static int -throughput_pmd_lcore_enc(void *arg) -{ - struct thread_params *tp = arg; - uint16_t enq, deq; - uint64_t total_time = 0, start_time; - const uint16_t queue_id = tp->queue_id; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_ops = tp->op_params->num_to_process; - struct rte_bbdev_enc_op *ops_enq[num_ops]; - struct rte_bbdev_enc_op *ops_deq[num_ops]; - struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - struct rte_bbdev_info info; - uint16_t num_to_enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, - num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_ops); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_enc_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < TEST_REPETITIONS; ++i) { - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - for (j = 0; j < num_ops; ++j) - mbuf_reset(ops_enq[j]->turbo_enc.output.data); - - start_time = rte_rdtsc_precise(); - - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; - - if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; - - enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - /* dequeue the remaining */ - while (deq < enq) { - deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - total_time += rte_rdtsc_precise() - start_time; - } - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_enc_op(ops_deq, num_ops, ref_op); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); - - double tb_len_bits = calc_enc_TB_size(ref_op); - - tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) - / 1000000.0) / ((double)total_time / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} - -static int -throughput_pmd_lcore_ldpc_enc(void *arg) -{ -printf("start tp lcore ldpc enc\n"); - struct thread_params *tp = arg; - uint16_t enq, deq; - uint64_t total_time = 0, start_time; - const uint16_t queue_id = tp->queue_id+3; - const uint16_t burst_sz = tp->op_params->burst_sz; - const uint16_t num_ops = tp->op_params->num_to_process; - struct rte_bbdev_enc_op *ops_enq[num_ops]; - struct rte_bbdev_enc_op *ops_deq[num_ops]; - struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; - struct test_buffers *bufs = NULL; - int i, j, ret; - struct rte_bbdev_info info; - uint16_t num_to_enq; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(tp->dev_id, &info); - - TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), - "NUM_OPS cannot exceed %u for this device", - info.drv.queue_size_lim); - - bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) - rte_pause(); - - ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, - num_ops); - TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", - num_ops); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_enc_op(ops_enq, num_ops, 0, bufs->inputs, - bufs->hard_outputs, ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < num_ops; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - for (i = 0; i < TEST_REPETITIONS; ++i) { - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - for (j = 0; j < num_ops; ++j) - mbuf_reset(ops_enq[j]->turbo_enc.output.data); - - start_time = rte_rdtsc_precise(); - - for (enq = 0, deq = 0; enq < num_ops;) { - num_to_enq = burst_sz; - - if (unlikely(num_ops - enq < num_to_enq)) - num_to_enq = num_ops - enq; - - enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id, - queue_id, &ops_enq[enq], num_to_enq); - - deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - /* dequeue the remaining */ - while (deq < enq) { - deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, - queue_id, &ops_deq[deq], enq - deq); - } - - total_time += rte_rdtsc_precise() - start_time; - } - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_ldpc_enc_op(ops_deq, num_ops, ref_op); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); - - double tb_len_bits = calc_ldpc_enc_TB_size(ref_op); - - tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / - ((double)total_time / (double)rte_get_tsc_hz()); - tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) - / 1000000.0) / ((double)total_time / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} - -static void -print_enc_throughput(struct thread_params *t_params, unsigned int used_cores) -{ - unsigned int iter = 0; - double total_mops = 0, total_mbps = 0; - - for (iter = 0; iter < used_cores; iter++) { - printf( - "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps\n", - t_params[iter].lcore_id, t_params[iter].ops_per_sec, - t_params[iter].mbps); - total_mops += t_params[iter].ops_per_sec; - total_mbps += t_params[iter].mbps; - } - printf( - "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps\n", - used_cores, total_mops, total_mbps); -} - -/* Aggregate the performance results over the number of cores used */ -static void -print_dec_throughput(struct thread_params *t_params, unsigned int used_cores) -{ - unsigned int core_idx = 0; - double total_mops = 0, total_mbps = 0; - uint8_t iter_count = 0; - - for (core_idx = 0; core_idx < used_cores; core_idx++) { - printf( - "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps @ max %u iterations\n", - t_params[core_idx].lcore_id, - t_params[core_idx].ops_per_sec, - t_params[core_idx].mbps, - t_params[core_idx].iter_count); - total_mops += t_params[core_idx].ops_per_sec; - total_mbps += t_params[core_idx].mbps; - iter_count = RTE_MAX(iter_count, - t_params[core_idx].iter_count); - } - printf( - "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps @ max %u iterations\n", - used_cores, total_mops, total_mbps, iter_count); -} - -/* Aggregate the performance results over the number of cores used */ -static void -print_dec_bler(struct thread_params *t_params, unsigned int used_cores) -{ - unsigned int core_idx = 0; - double total_mbps = 0, total_bler = 0, total_iter = 0; - double snr = get_snr(); - - for (core_idx = 0; core_idx < used_cores; core_idx++) { - printf("Core%u BLER %.1f %% - Iters %.1f - Tp %.1f Mbps %s\n", - t_params[core_idx].lcore_id, - t_params[core_idx].bler * 100, - t_params[core_idx].iter_average, - t_params[core_idx].mbps, - get_vector_filename()); - total_mbps += t_params[core_idx].mbps; - total_bler += t_params[core_idx].bler; - total_iter += t_params[core_idx].iter_average; - } - total_bler /= used_cores; - total_iter /= used_cores; - - printf("SNR %.2f BLER %.1f %% - Iterations %.1f %d - Tp %.1f Mbps %s\n", - snr, total_bler * 100, total_iter, get_iter_max(), - total_mbps, get_vector_filename()); -} - -/* - * Test function that determines BLER wireless performance - */ -static int -bler_test(struct active_device *ad, - struct test_op_params *op_params) -{ - int ret; - unsigned int lcore_id, used_cores = 0; - struct thread_params *t_params; - struct rte_bbdev_info info; - lcore_function_t *bler_function; - uint16_t num_lcores; - const char *op_type_str; - - rte_bbdev_info_get(ad->dev_id, &info); - - op_type_str = rte_bbdev_op_type_str(test_vector.op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", - test_vector.op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== test: bler\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", - info.dev_name, ad->nb_queues, op_params->burst_sz, - op_params->num_to_process, op_params->num_lcores, - op_type_str, - intr_enabled ? "Interrupt mode" : "PMD mode", - (double)rte_get_tsc_hz() / 1000000000.0); - - /* Set number of lcores */ - num_lcores = (ad->nb_queues < (op_params->num_lcores)) - ? ad->nb_queues - : op_params->num_lcores; - - /* Allocate memory for thread parameters structure */ - t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), - RTE_CACHE_LINE_SIZE); - TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", - RTE_ALIGN(sizeof(struct thread_params) * num_lcores, - RTE_CACHE_LINE_SIZE)); - - if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - bler_function = bler_pmd_lcore_ldpc_dec; - else - return TEST_SKIPPED; - - rte_atomic16_set(&op_params->sync, SYNC_WAIT); - - /* Master core is set at first entry */ - t_params[0].dev_id = ad->dev_id; - t_params[0].lcore_id = rte_lcore_id(); - t_params[0].op_params = op_params; - t_params[0].queue_id = ad->queue_ids[used_cores++]; - t_params[0].iter_count = 0; - - RTE_LCORE_FOREACH_SLAVE(lcore_id) { - if (used_cores >= num_lcores) - break; - - t_params[used_cores].dev_id = ad->dev_id; - t_params[used_cores].lcore_id = lcore_id; - t_params[used_cores].op_params = op_params; - t_params[used_cores].queue_id = ad->queue_ids[used_cores]; - t_params[used_cores].iter_count = 0; - - rte_eal_remote_launch(bler_function, - &t_params[used_cores++], lcore_id); - } - - rte_atomic16_set(&op_params->sync, SYNC_START); - ret = bler_function(&t_params[0]); - - /* Master core is always used */ - for (used_cores = 1; used_cores < num_lcores; used_cores++) - ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); - - print_dec_bler(t_params, num_lcores); - - /* Return if test failed */ - if (ret) { - rte_free(t_params); - return ret; - } - - /* Function to print something here*/ - rte_free(t_params); - return ret; -} - -/* - * Test function that determines how long an enqueue + dequeue of a burst - * takes on available lcores. - */ -static int -throughput_test(struct active_device *ad, - struct test_op_params *op_params) -{ - int ret; - unsigned int lcore_id, used_cores = 0; - struct thread_params *t_params, *tp; - struct rte_bbdev_info info; - lcore_function_t *throughput_function; - uint16_t num_lcores; - const char *op_type_str; - - rte_bbdev_info_get(ad->dev_id, &info); - - op_type_str = rte_bbdev_op_type_str(test_vector.op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", - test_vector.op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== new test with library: throughput\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", - info.dev_name, ad->nb_queues, op_params->burst_sz, - op_params->num_to_process, op_params->num_lcores, - op_type_str, - intr_enabled ? "Interrupt mode" : "PMD mode", - (double)rte_get_tsc_hz() / 1000000000.0); - - /* Set number of lcores */ - num_lcores = (ad->nb_queues < (op_params->num_lcores)) - ? ad->nb_queues - : op_params->num_lcores; - - /* Allocate memory for thread parameters structure */ - t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), - RTE_CACHE_LINE_SIZE); - TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", - RTE_ALIGN(sizeof(struct thread_params) * num_lcores, - RTE_CACHE_LINE_SIZE)); - - if (intr_enabled) { - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) - throughput_function = throughput_intr_lcore_dec; - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - throughput_function = throughput_intr_lcore_ldpc_dec; - else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) - throughput_function = throughput_intr_lcore_enc; - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - throughput_function = throughput_intr_lcore_ldpc_enc; - else - throughput_function = throughput_intr_lcore_enc; - - /* Dequeue interrupt callback registration */ - ret = rte_bbdev_callback_register(ad->dev_id, - RTE_BBDEV_EVENT_DEQUEUE, dequeue_event_callback, - t_params); - if (ret < 0) { - rte_free(t_params); - return ret; - } - } else { -printf("pmd enabled \n"); - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) - throughput_function = throughput_pmd_lcore_dec; - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - { - throughput_function = throughput_pmd_lcore_ldpc_dec; - printf("ldpc dec\n"); -} - else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) - throughput_function = throughput_pmd_lcore_enc; - else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - throughput_function = throughput_pmd_lcore_ldpc_enc; - else - throughput_function = throughput_pmd_lcore_enc; - } - - rte_atomic16_set(&op_params->sync, SYNC_WAIT); - - /* Master core is set at first entry */ - t_params[0].dev_id = ad->dev_id; - t_params[0].lcore_id = rte_lcore_id(); - t_params[0].op_params = op_params; - t_params[0].queue_id = ad->queue_ids[used_cores++]; - t_params[0].iter_count = 0; - - RTE_LCORE_FOREACH_SLAVE(lcore_id) { - if (used_cores >= num_lcores) - break; - - t_params[used_cores].dev_id = ad->dev_id; - t_params[used_cores].lcore_id = lcore_id; - t_params[used_cores].op_params = op_params; - t_params[used_cores].queue_id = ad->queue_ids[used_cores]; - t_params[used_cores].iter_count = 0; - - rte_eal_remote_launch(throughput_function, - &t_params[used_cores++], lcore_id); - } - - rte_atomic16_set(&op_params->sync, SYNC_START); - ret = throughput_function(&t_params[0]); - - /* Master core is always used */ - for (used_cores = 1; used_cores < num_lcores; used_cores++) - ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); - - /* Return if test failed */ - if (ret) { - rte_free(t_params); - return ret; - } - - /* Print throughput if interrupts are disabled and test passed */ - if (!intr_enabled) { - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || - test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - print_dec_throughput(t_params, num_lcores); - else - print_enc_throughput(t_params, num_lcores); - rte_free(t_params); - return ret; - } - - /* In interrupt TC we need to wait for the interrupt callback to deqeue - * all pending operations. Skip waiting for queues which reported an - * error using processing_status variable. - * Wait for master lcore operations. - */ - tp = &t_params[0]; - while ((rte_atomic16_read(&tp->nb_dequeued) < - op_params->num_to_process) && - (rte_atomic16_read(&tp->processing_status) != - TEST_FAILED)) - rte_pause(); - - tp->ops_per_sec /= TEST_REPETITIONS; - tp->mbps /= TEST_REPETITIONS; - ret |= (int)rte_atomic16_read(&tp->processing_status); - - /* Wait for slave lcores operations */ - for (used_cores = 1; used_cores < num_lcores; used_cores++) { - tp = &t_params[used_cores]; - - while ((rte_atomic16_read(&tp->nb_dequeued) < - op_params->num_to_process) && - (rte_atomic16_read(&tp->processing_status) != - TEST_FAILED)) - rte_pause(); - - tp->ops_per_sec /= TEST_REPETITIONS; - tp->mbps /= TEST_REPETITIONS; - ret |= (int)rte_atomic16_read(&tp->processing_status); - } - - /* Print throughput if test passed */ - if (!ret) { - if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || - test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) - print_dec_throughput(t_params, num_lcores); - else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC || - test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) - print_enc_throughput(t_params, num_lcores); - } - - rte_free(t_params); - return ret; -} - -static int -latency_test_dec(struct rte_mempool *mempool, - struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, - int vector_mask, uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) -{ - int ret = TEST_SUCCESS; - uint16_t i, j, dequeued; - struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t start_time = 0, last_time = 0; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - bool first_time = true; - last_time = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_dec_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_dec_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - bufs->soft_outputs, - ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < burst_sz; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - start_time = rte_rdtsc_precise(); - - enq = rte_bbdev_enqueue_dec_ops(dev_id, queue_id, &ops_enq[enq], - burst_sz); - TEST_ASSERT(enq == burst_sz, - "Error enqueueing burst, expected %u, got %u", - burst_sz, enq); - - /* Dequeue */ - do { - deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - if (likely(first_time && (deq > 0))) { - last_time = rte_rdtsc_precise() - start_time; - first_time = false; - } - } while (unlikely(burst_sz != deq)); - - *max_time = RTE_MAX(*max_time, last_time); - *min_time = RTE_MIN(*min_time, last_time); - *total_time += last_time; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_dec_op(ops_deq, burst_sz, ref_op, - vector_mask); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -latency_test_ldpc_dec(struct rte_mempool *mempool, - struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, - int vector_mask, uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) -{ - int ret = TEST_SUCCESS; - uint16_t i, j, dequeued; - struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t start_time = 0, last_time = 0; - bool extDdr = ldpc_cap_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - bool first_time = true; - last_time = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_dec_op_alloc_bulk() failed"); - - /* For latency tests we need to disable early termination */ - if (check_bit(ref_op->ldpc_dec.op_flags, - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) - ref_op->ldpc_dec.op_flags -= - RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - ref_op->ldpc_dec.iter_max = get_iter_max(); - ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - bufs->soft_outputs, - bufs->harq_inputs, - bufs->harq_outputs, - ref_op); - - if (extDdr) - preload_harq_ddr(dev_id, queue_id, ops_enq, - burst_sz, true); - - /* Set counter to validate the ordering */ - for (j = 0; j < burst_sz; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - start_time = rte_rdtsc_precise(); - - enq = rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz); - TEST_ASSERT(enq == burst_sz, - "Error enqueueing burst, expected %u, got %u", - burst_sz, enq); - - /* Dequeue */ - do { - deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - if (likely(first_time && (deq > 0))) { - last_time = rte_rdtsc_precise() - start_time; - first_time = false; - } - } while (unlikely(burst_sz != deq)); - - *max_time = RTE_MAX(*max_time, last_time); - *min_time = RTE_MIN(*min_time, last_time); - *total_time += last_time; - - if (extDdr) - retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_ldpc_dec_op(ops_deq, burst_sz, ref_op, - vector_mask); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - return i; -} - -static int -latency_test_enc(struct rte_mempool *mempool, - struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, - uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) -{ - int ret = TEST_SUCCESS; - uint16_t i, j, dequeued; - struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t start_time = 0, last_time = 0; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - bool first_time = true; - last_time = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_enc_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_enc_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < burst_sz; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - start_time = rte_rdtsc_precise(); - - enq = rte_bbdev_enqueue_enc_ops(dev_id, queue_id, &ops_enq[enq], - burst_sz); - TEST_ASSERT(enq == burst_sz, - "Error enqueueing burst, expected %u, got %u", - burst_sz, enq); - - /* Dequeue */ - do { - deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - if (likely(first_time && (deq > 0))) { - last_time += rte_rdtsc_precise() - start_time; - first_time = false; - } - } while (unlikely(burst_sz != deq)); - - *max_time = RTE_MAX(*max_time, last_time); - *min_time = RTE_MIN(*min_time, last_time); - *total_time += last_time; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_enc_op(ops_deq, burst_sz, ref_op); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_enc_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -latency_test_ldpc_enc(struct rte_mempool *mempool, - struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, - uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) -{ - int ret = TEST_SUCCESS; - uint16_t i, j, dequeued; - struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t start_time = 0, last_time = 0; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - bool first_time = true; - last_time = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_enc_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - ref_op); - - /* Set counter to validate the ordering */ - for (j = 0; j < burst_sz; ++j) - ops_enq[j]->opaque_data = (void *)(uintptr_t)j; - - start_time = rte_rdtsc_precise(); - - enq = rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz); - TEST_ASSERT(enq == burst_sz, - "Error enqueueing burst, expected %u, got %u", - burst_sz, enq); - - /* Dequeue */ - do { - deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - if (likely(first_time && (deq > 0))) { - last_time += rte_rdtsc_precise() - start_time; - first_time = false; - } - } while (unlikely(burst_sz != deq)); - - *max_time = RTE_MAX(*max_time, last_time); - *min_time = RTE_MIN(*min_time, last_time); - *total_time += last_time; - - if (test_vector.op_type != RTE_BBDEV_OP_NONE) { - ret = validate_enc_op(ops_deq, burst_sz, ref_op); - TEST_ASSERT_SUCCESS(ret, "Validation failed!"); - } - - rte_bbdev_enc_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -latency_test(struct active_device *ad, - struct test_op_params *op_params) -{ - int iter; - uint16_t burst_sz = op_params->burst_sz; - const uint16_t num_to_process = op_params->num_to_process; - const enum rte_bbdev_op_type op_type = test_vector.op_type; - const uint16_t queue_id = ad->queue_ids[0]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - uint64_t total_time, min_time, max_time; - const char *op_type_str; - - total_time = max_time = 0; - min_time = UINT64_MAX; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(ad->dev_id, &info); - bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - op_type_str = rte_bbdev_op_type_str(op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== test: validation/latency\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", - info.dev_name, burst_sz, num_to_process, op_type_str); - - if (op_type == RTE_BBDEV_OP_TURBO_DEC) - iter = latency_test_dec(op_params->mp, bufs, - op_params->ref_dec_op, op_params->vector_mask, - ad->dev_id, queue_id, num_to_process, - burst_sz, &total_time, &min_time, &max_time); - else if (op_type == RTE_BBDEV_OP_TURBO_ENC) - iter = latency_test_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &total_time, - &min_time, &max_time); - else if (op_type == RTE_BBDEV_OP_LDPC_ENC) - iter = latency_test_ldpc_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &total_time, - &min_time, &max_time); - else if (op_type == RTE_BBDEV_OP_LDPC_DEC) - iter = latency_test_ldpc_dec(op_params->mp, bufs, - op_params->ref_dec_op, op_params->vector_mask, - ad->dev_id, queue_id, num_to_process, - burst_sz, &total_time, &min_time, &max_time); - else - iter = latency_test_enc(op_params->mp, bufs, - op_params->ref_enc_op, - ad->dev_id, queue_id, - num_to_process, burst_sz, &total_time, - &min_time, &max_time); - - if (iter <= 0) - return TEST_FAILED; - - printf("Operation latency:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n", - (double)total_time / (double)iter, - (double)(total_time * 1000000) / (double)iter / - (double)rte_get_tsc_hz(), (double)min_time, - (double)(min_time * 1000000) / (double)rte_get_tsc_hz(), - (double)max_time, (double)(max_time * 1000000) / - (double)rte_get_tsc_hz()); - - return TEST_SUCCESS; -} - -#ifdef RTE_BBDEV_OFFLOAD_COST -static int -get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id, - struct rte_bbdev_stats *stats) -{ - struct rte_bbdev *dev = &rte_bbdev_devices[dev_id]; - struct rte_bbdev_stats *q_stats; - - if (queue_id >= dev->data->num_queues) - return -1; - - q_stats = &dev->data->queues[queue_id].queue_stats; - - stats->enqueued_count = q_stats->enqueued_count; - stats->dequeued_count = q_stats->dequeued_count; - stats->enqueue_err_count = q_stats->enqueue_err_count; - stats->dequeue_err_count = q_stats->dequeue_err_count; - stats->acc_offload_cycles = q_stats->acc_offload_cycles; - - return 0; -} - -static int -offload_latency_test_dec(struct rte_mempool *mempool, struct test_buffers *bufs, - struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, - uint16_t queue_id, const uint16_t num_to_process, - uint16_t burst_sz, struct test_time_stats *time_st) -{ - int i, dequeued, ret; - struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t enq_start_time, deq_start_time; - uint64_t enq_sw_last_time, deq_last_time; - struct rte_bbdev_stats stats; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_dec_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - bufs->soft_outputs, - ref_op); - - /* Start time meas for enqueue function offload latency */ - enq_start_time = rte_rdtsc_precise(); - do { - enq += rte_bbdev_enqueue_dec_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz - enq); - } while (unlikely(burst_sz != enq)); - - ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); - TEST_ASSERT_SUCCESS(ret, - "Failed to get stats for queue (%u) of device (%u)", - queue_id, dev_id); - - enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - - stats.acc_offload_cycles; - time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, - enq_sw_last_time); - time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, - enq_sw_last_time); - time_st->enq_sw_total_time += enq_sw_last_time; - - time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, - stats.acc_offload_cycles); - time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, - stats.acc_offload_cycles); - time_st->enq_acc_total_time += stats.acc_offload_cycles; - - /* give time for device to process ops */ - rte_delay_us(200); - - /* Start time meas for dequeue function offload latency */ - deq_start_time = rte_rdtsc_precise(); - /* Dequeue one operation */ - do { - deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, - &ops_deq[deq], 1); - } while (unlikely(deq != 1)); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, - deq_last_time); - time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, - deq_last_time); - time_st->deq_total_time += deq_last_time; - - /* Dequeue remaining operations if needed*/ - while (burst_sz != deq) - deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - - rte_bbdev_dec_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -offload_latency_test_ldpc_dec(struct rte_mempool *mempool, - struct test_buffers *bufs, - struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, - uint16_t queue_id, const uint16_t num_to_process, - uint16_t burst_sz, struct test_time_stats *time_st) -{ - int i, dequeued, ret; - struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t enq_start_time, deq_start_time; - uint64_t enq_sw_last_time, deq_last_time; - struct rte_bbdev_stats stats; - bool extDdr = ldpc_cap_flags & - RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - bufs->soft_outputs, - bufs->harq_inputs, - bufs->harq_outputs, - ref_op); - - if (extDdr) - preload_harq_ddr(dev_id, queue_id, ops_enq, - burst_sz, true); - - /* Start time meas for enqueue function offload latency */ - enq_start_time = rte_rdtsc_precise(); - do { - enq += rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz - enq); - } while (unlikely(burst_sz != enq)); - - enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; - ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); - TEST_ASSERT_SUCCESS(ret, - "Failed to get stats for queue (%u) of device (%u)", - queue_id, dev_id); - - enq_sw_last_time -= stats.acc_offload_cycles; - time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, - enq_sw_last_time); - time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, - enq_sw_last_time); - time_st->enq_sw_total_time += enq_sw_last_time; - - time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, - stats.acc_offload_cycles); - time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, - stats.acc_offload_cycles); - time_st->enq_acc_total_time += stats.acc_offload_cycles; - - /* give time for device to process ops */ - rte_delay_us(200); - - /* Start time meas for dequeue function offload latency */ - deq_start_time = rte_rdtsc_precise(); - /* Dequeue one operation */ - do { - deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, - &ops_deq[deq], 1); - } while (unlikely(deq != 1)); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, - deq_last_time); - time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, - deq_last_time); - time_st->deq_total_time += deq_last_time; - - /* Dequeue remaining operations if needed*/ - while (burst_sz != deq) - deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - - if (extDdr) { - /* Read loopback is not thread safe */ - retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); - } - - rte_bbdev_dec_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -offload_latency_test_enc(struct rte_mempool *mempool, struct test_buffers *bufs, - struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, - uint16_t queue_id, const uint16_t num_to_process, - uint16_t burst_sz, struct test_time_stats *time_st) -{ - int i, dequeued, ret; - struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t enq_start_time, deq_start_time; - uint64_t enq_sw_last_time, deq_last_time; - struct rte_bbdev_stats stats; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_enc_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_enc_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - ref_op); - - /* Start time meas for enqueue function offload latency */ - enq_start_time = rte_rdtsc_precise(); - do { - enq += rte_bbdev_enqueue_enc_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz - enq); - } while (unlikely(burst_sz != enq)); - - enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; - - ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); - TEST_ASSERT_SUCCESS(ret, - "Failed to get stats for queue (%u) of device (%u)", - queue_id, dev_id); - enq_sw_last_time -= stats.acc_offload_cycles; - time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, - enq_sw_last_time); - time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, - enq_sw_last_time); - time_st->enq_sw_total_time += enq_sw_last_time; - - time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, - stats.acc_offload_cycles); - time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, - stats.acc_offload_cycles); - time_st->enq_acc_total_time += stats.acc_offload_cycles; - - /* give time for device to process ops */ - rte_delay_us(200); - - /* Start time meas for dequeue function offload latency */ - deq_start_time = rte_rdtsc_precise(); - /* Dequeue one operation */ - do { - deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, - &ops_deq[deq], 1); - } while (unlikely(deq != 1)); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, - deq_last_time); - time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, - deq_last_time); - time_st->deq_total_time += deq_last_time; - - while (burst_sz != deq) - deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - - rte_bbdev_enc_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} - -static int -offload_latency_test_ldpc_enc(struct rte_mempool *mempool, - struct test_buffers *bufs, - struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, - uint16_t queue_id, const uint16_t num_to_process, - uint16_t burst_sz, struct test_time_stats *time_st) -{ - int i, dequeued, ret; - struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; - uint64_t enq_start_time, deq_start_time; - uint64_t enq_sw_last_time, deq_last_time; - struct rte_bbdev_stats stats; - - for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { - uint16_t enq = 0, deq = 0; - - if (unlikely(num_to_process - dequeued < burst_sz)) - burst_sz = num_to_process - dequeued; - - ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); - TEST_ASSERT_SUCCESS(ret, - "rte_bbdev_enc_op_alloc_bulk() failed"); - if (test_vector.op_type != RTE_BBDEV_OP_NONE) - copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, - bufs->inputs, - bufs->hard_outputs, - ref_op); - - /* Start time meas for enqueue function offload latency */ - enq_start_time = rte_rdtsc_precise(); - do { - enq += rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, - &ops_enq[enq], burst_sz - enq); - } while (unlikely(burst_sz != enq)); - - enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; - ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); - TEST_ASSERT_SUCCESS(ret, - "Failed to get stats for queue (%u) of device (%u)", - queue_id, dev_id); - - enq_sw_last_time -= stats.acc_offload_cycles; - time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, - enq_sw_last_time); - time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, - enq_sw_last_time); - time_st->enq_sw_total_time += enq_sw_last_time; - - time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, - stats.acc_offload_cycles); - time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, - stats.acc_offload_cycles); - time_st->enq_acc_total_time += stats.acc_offload_cycles; - - /* give time for device to process ops */ - rte_delay_us(200); - - /* Start time meas for dequeue function offload latency */ - deq_start_time = rte_rdtsc_precise(); - /* Dequeue one operation */ - do { - deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, - &ops_deq[deq], 1); - } while (unlikely(deq != 1)); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, - deq_last_time); - time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, - deq_last_time); - time_st->deq_total_time += deq_last_time; - - while (burst_sz != deq) - deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, - &ops_deq[deq], burst_sz - deq); - - rte_bbdev_enc_op_free_bulk(ops_enq, deq); - dequeued += deq; - } - - return i; -} -#endif - -static int -offload_cost_test(struct active_device *ad, - struct test_op_params *op_params) -{ -#ifndef RTE_BBDEV_OFFLOAD_COST - RTE_SET_USED(ad); - RTE_SET_USED(op_params); - printf("Offload latency test is disabled.\n"); - printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); - return TEST_SKIPPED; -#else - int iter; - uint16_t burst_sz = op_params->burst_sz; - const uint16_t num_to_process = op_params->num_to_process; - const enum rte_bbdev_op_type op_type = test_vector.op_type; - const uint16_t queue_id = ad->queue_ids[0]; - struct test_buffers *bufs = NULL; - struct rte_bbdev_info info; - const char *op_type_str; - struct test_time_stats time_st; - - memset(&time_st, 0, sizeof(struct test_time_stats)); - time_st.enq_sw_min_time = UINT64_MAX; - time_st.enq_acc_min_time = UINT64_MAX; - time_st.deq_min_time = UINT64_MAX; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(ad->dev_id, &info); - bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; - - op_type_str = rte_bbdev_op_type_str(op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== test: offload latency test\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", - info.dev_name, burst_sz, num_to_process, op_type_str); - - if (op_type == RTE_BBDEV_OP_TURBO_DEC) - iter = offload_latency_test_dec(op_params->mp, bufs, - op_params->ref_dec_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - else if (op_type == RTE_BBDEV_OP_TURBO_ENC) - iter = offload_latency_test_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - else if (op_type == RTE_BBDEV_OP_LDPC_ENC) - iter = offload_latency_test_ldpc_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - else if (op_type == RTE_BBDEV_OP_LDPC_DEC) - iter = offload_latency_test_ldpc_dec(op_params->mp, bufs, - op_params->ref_dec_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - else - iter = offload_latency_test_enc(op_params->mp, bufs, - op_params->ref_enc_op, ad->dev_id, queue_id, - num_to_process, burst_sz, &time_st); - - if (iter <= 0) - return TEST_FAILED; - - printf("Enqueue driver offload cost latency:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n" - "Enqueue accelerator offload cost latency:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n", - (double)time_st.enq_sw_total_time / (double)iter, - (double)(time_st.enq_sw_total_time * 1000000) / - (double)iter / (double)rte_get_tsc_hz(), - (double)time_st.enq_sw_min_time, - (double)(time_st.enq_sw_min_time * 1000000) / - rte_get_tsc_hz(), (double)time_st.enq_sw_max_time, - (double)(time_st.enq_sw_max_time * 1000000) / - rte_get_tsc_hz(), (double)time_st.enq_acc_total_time / - (double)iter, - (double)(time_st.enq_acc_total_time * 1000000) / - (double)iter / (double)rte_get_tsc_hz(), - (double)time_st.enq_acc_min_time, - (double)(time_st.enq_acc_min_time * 1000000) / - rte_get_tsc_hz(), (double)time_st.enq_acc_max_time, - (double)(time_st.enq_acc_max_time * 1000000) / - rte_get_tsc_hz()); - - printf("Dequeue offload cost latency - one op:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n", - (double)time_st.deq_total_time / (double)iter, - (double)(time_st.deq_total_time * 1000000) / - (double)iter / (double)rte_get_tsc_hz(), - (double)time_st.deq_min_time, - (double)(time_st.deq_min_time * 1000000) / - rte_get_tsc_hz(), (double)time_st.deq_max_time, - (double)(time_st.deq_max_time * 1000000) / - rte_get_tsc_hz()); - - return TEST_SUCCESS; -#endif -} - -#ifdef RTE_BBDEV_OFFLOAD_COST -static int -offload_latency_empty_q_test_dec(uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *deq_total_time, uint64_t *deq_min_time, - uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) -{ - int i, deq_total; - struct rte_bbdev_dec_op *ops[MAX_BURST]; - uint64_t deq_start_time, deq_last_time; - - /* Test deq offload latency from an empty queue */ - - for (i = 0, deq_total = 0; deq_total < num_to_process; - ++i, deq_total += burst_sz) { - deq_start_time = rte_rdtsc_precise(); - - if (unlikely(num_to_process - deq_total < burst_sz)) - burst_sz = num_to_process - deq_total; - if (op_type == RTE_BBDEV_OP_LDPC_DEC) - rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, ops, - burst_sz); - else - rte_bbdev_dequeue_dec_ops(dev_id, queue_id, ops, - burst_sz); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); - *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); - *deq_total_time += deq_last_time; - } - - return i; -} - -static int -offload_latency_empty_q_test_enc(uint16_t dev_id, uint16_t queue_id, - const uint16_t num_to_process, uint16_t burst_sz, - uint64_t *deq_total_time, uint64_t *deq_min_time, - uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) -{ - int i, deq_total; - struct rte_bbdev_enc_op *ops[MAX_BURST]; - uint64_t deq_start_time, deq_last_time; - - /* Test deq offload latency from an empty queue */ - for (i = 0, deq_total = 0; deq_total < num_to_process; - ++i, deq_total += burst_sz) { - deq_start_time = rte_rdtsc_precise(); - - if (unlikely(num_to_process - deq_total < burst_sz)) - burst_sz = num_to_process - deq_total; - if (op_type == RTE_BBDEV_OP_LDPC_ENC) - rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, ops, - burst_sz); - else - rte_bbdev_dequeue_enc_ops(dev_id, queue_id, ops, - burst_sz); - - deq_last_time = rte_rdtsc_precise() - deq_start_time; - *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); - *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); - *deq_total_time += deq_last_time; - } - - return i; -} - -#endif - -static int -offload_latency_empty_q_test(struct active_device *ad, - struct test_op_params *op_params) -{ -#ifndef RTE_BBDEV_OFFLOAD_COST - RTE_SET_USED(ad); - RTE_SET_USED(op_params); - printf("Offload latency empty dequeue test is disabled.\n"); - printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); - return TEST_SKIPPED; -#else - int iter; - uint64_t deq_total_time, deq_min_time, deq_max_time; - uint16_t burst_sz = op_params->burst_sz; - const uint16_t num_to_process = op_params->num_to_process; - const enum rte_bbdev_op_type op_type = test_vector.op_type; - const uint16_t queue_id = ad->queue_ids[0]; - struct rte_bbdev_info info; - const char *op_type_str; - - deq_total_time = deq_max_time = 0; - deq_min_time = UINT64_MAX; - - TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), - "BURST_SIZE should be <= %u", MAX_BURST); - - rte_bbdev_info_get(ad->dev_id, &info); - - op_type_str = rte_bbdev_op_type_str(op_type); - TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); - - printf("+ ------------------------------------------------------- +\n"); - printf("== test: offload latency empty dequeue\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", - info.dev_name, burst_sz, num_to_process, op_type_str); - - if (op_type == RTE_BBDEV_OP_TURBO_DEC || - op_type == RTE_BBDEV_OP_LDPC_DEC) - iter = offload_latency_empty_q_test_dec(ad->dev_id, queue_id, - num_to_process, burst_sz, &deq_total_time, - &deq_min_time, &deq_max_time, op_type); - else - iter = offload_latency_empty_q_test_enc(ad->dev_id, queue_id, - num_to_process, burst_sz, &deq_total_time, - &deq_min_time, &deq_max_time, op_type); - - if (iter <= 0) - return TEST_FAILED; - - printf("Empty dequeue offload:\n" - "\tavg: %lg cycles, %lg us\n" - "\tmin: %lg cycles, %lg us\n" - "\tmax: %lg cycles, %lg us\n", - (double)deq_total_time / (double)iter, - (double)(deq_total_time * 1000000) / (double)iter / - (double)rte_get_tsc_hz(), (double)deq_min_time, - (double)(deq_min_time * 1000000) / rte_get_tsc_hz(), - (double)deq_max_time, (double)(deq_max_time * 1000000) / - rte_get_tsc_hz()); - - return TEST_SUCCESS; -#endif -} - -static int -bler_tc(void) -{ - return run_test_case(bler_test); -} - -static int -throughput_tc(void) -{ - return run_test_case(throughput_test); -} - -static int -offload_cost_tc(void) -{ - return run_test_case(offload_cost_test); -} - -static int -offload_latency_empty_q_tc(void) -{ - return run_test_case(offload_latency_empty_q_test); -} - -static int -latency_tc(void) -{ - return run_test_case(latency_test); -} - -static int -interrupt_tc(void) -{ - return run_test_case(throughput_test); -} - -static struct unit_test_suite bbdev_bler_testsuite = { - .suite_name = "BBdev BLER Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, bler_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -static struct unit_test_suite bbdev_throughput_testsuite = { - .suite_name = "BBdev Throughput Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, throughput_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -static struct unit_test_suite bbdev_validation_testsuite = { - .suite_name = "BBdev Validation Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -static struct unit_test_suite bbdev_latency_testsuite = { - .suite_name = "BBdev Latency Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -static struct unit_test_suite bbdev_offload_cost_testsuite = { - .suite_name = "BBdev Offload Cost Tests", - .setup = testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, offload_cost_tc), - TEST_CASE_ST(ut_setup, ut_teardown, offload_latency_empty_q_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -static struct unit_test_suite bbdev_interrupt_testsuite = { - .suite_name = "BBdev Interrupt Tests", - .setup = interrupt_testsuite_setup, - .teardown = testsuite_teardown, - .unit_test_cases = { - TEST_CASE_ST(ut_setup, ut_teardown, interrupt_tc), - TEST_CASES_END() /**< NULL terminate unit test array */ - } -}; - -//REGISTER_TEST_COMMAND(bler, bbdev_bler_testsuite); -//REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); -REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite); -//REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite); -//REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite); -//REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite); diff --git a/targets/ARCH/test-bbdev/test_bbdev_vector.c b/targets/ARCH/test-bbdev/test_bbdev_vector.c deleted file mode 100644 index cc9a47a48a..0000000000 --- a/targets/ARCH/test-bbdev/test_bbdev_vector.c +++ /dev/null @@ -1,1438 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2017 Intel Corporation - */ - -#ifdef RTE_EXEC_ENV_FREEBSD - #define _WITH_GETLINE -#endif -#include -#include -#include - -#include "test_bbdev_vector.h" - -#define VALUE_DELIMITER "," -#define ENTRY_DELIMITER "=" - -const char *op_data_prefixes[] = { - "input", - "soft_output", - "hard_output", - "harq_input", - "harq_output", -}; - -/* trim leading and trailing spaces */ -static void -trim_space(char *str) -{ - char *start, *end; - - for (start = str; *start; start++) { - if (!isspace((unsigned char) start[0])) - break; - } - - for (end = start + strlen(start); end > start + 1; end--) { - if (!isspace((unsigned char) end[-1])) - break; - } - - *end = 0; - - /* Shift from "start" to the beginning of the string */ - if (start > str) - memmove(str, start, (end - start) + 1); -} - -static bool -starts_with(const char *str, const char *pre) -{ - return strncmp(pre, str, strlen(pre)) == 0; -} - -/* tokenization test values separated by a comma */ -static int -parse_values(char *tokens, uint32_t **data, uint32_t *data_length) -{ - uint32_t n_tokens = 0; - uint32_t data_size = 32; - - uint32_t *values, *values_resized; - char *tok, *error = NULL; - - tok = strtok(tokens, VALUE_DELIMITER); - if (tok == NULL) - return -1; - - values = (uint32_t *) - rte_zmalloc(NULL, sizeof(uint32_t) * data_size, 0); - if (values == NULL) - return -1; - - while (tok != NULL) { - values_resized = NULL; - - if (n_tokens >= data_size) { - data_size *= 2; - - values_resized = (uint32_t *) rte_realloc(values, - sizeof(uint32_t) * data_size, 0); - if (values_resized == NULL) { - rte_free(values); - return -1; - } - values = values_resized; - } - - values[n_tokens] = (uint32_t) strtoul(tok, &error, 0); - - if ((error == NULL) || (*error != '\0')) { - printf("Failed with convert '%s'\n", tok); - rte_free(values); - return -1; - } - - *data_length = *data_length + (strlen(tok) - strlen("0x"))/2; - - tok = strtok(NULL, VALUE_DELIMITER); - if (tok == NULL) - break; - - n_tokens++; - } - - values_resized = (uint32_t *) rte_realloc(values, - sizeof(uint32_t) * (n_tokens + 1), 0); - - if (values_resized == NULL) { - rte_free(values); - return -1; - } - - *data = values_resized; - - return 0; -} - -/* convert turbo decoder flag from string to unsigned long int*/ -static int -op_decoder_flag_strtoul(char *token, uint32_t *op_flag_value) -{ - if (!strcmp(token, "RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE")) - *op_flag_value = RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE; - else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_TYPE_24B")) - *op_flag_value = RTE_BBDEV_TURBO_CRC_TYPE_24B; - else if (!strcmp(token, "RTE_BBDEV_TURBO_EQUALIZER")) - *op_flag_value = RTE_BBDEV_TURBO_EQUALIZER; - else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUT_SATURATE")) - *op_flag_value = RTE_BBDEV_TURBO_SOFT_OUT_SATURATE; - else if (!strcmp(token, "RTE_BBDEV_TURBO_HALF_ITERATION_EVEN")) - *op_flag_value = RTE_BBDEV_TURBO_HALF_ITERATION_EVEN; - else if (!strcmp(token, "RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH")) - *op_flag_value = RTE_BBDEV_TURBO_CONTINUE_CRC_MATCH; - else if (!strcmp(token, "RTE_BBDEV_TURBO_SOFT_OUTPUT")) - *op_flag_value = RTE_BBDEV_TURBO_SOFT_OUTPUT; - else if (!strcmp(token, "RTE_BBDEV_TURBO_EARLY_TERMINATION")) - *op_flag_value = RTE_BBDEV_TURBO_EARLY_TERMINATION; - else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN")) - *op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN; - else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN")) - *op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN; - else if (!strcmp(token, "RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT")) - *op_flag_value = RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT; - else if (!strcmp(token, "RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT")) - *op_flag_value = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; - else if (!strcmp(token, "RTE_BBDEV_TURBO_MAP_DEC")) - *op_flag_value = RTE_BBDEV_TURBO_MAP_DEC; - else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_SCATTER_GATHER")) - *op_flag_value = RTE_BBDEV_TURBO_DEC_SCATTER_GATHER; - else if (!strcmp(token, "RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP")) - *op_flag_value = RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP; - else { - printf("The given value is not a turbo decoder flag\n"); - return -1; - } - - return 0; -} - -/* convert LDPC flag from string to unsigned long int*/ -static int -op_ldpc_decoder_flag_strtoul(char *token, uint32_t *op_flag_value) -{ - if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK")) - *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24A_CHECK; - else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK")) - *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK; - else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP")) - *op_flag_value = RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP; - else if (!strcmp(token, "RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS")) - *op_flag_value = RTE_BBDEV_LDPC_DEINTERLEAVER_BYPASS; - else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE")) - *op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE; - else if (!strcmp(token, "RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE")) - *op_flag_value = RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; - else if (!strcmp(token, "RTE_BBDEV_LDPC_DECODE_BYPASS")) - *op_flag_value = RTE_BBDEV_LDPC_DECODE_BYPASS; - else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_ENABLE")) - *op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_ENABLE; - else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS")) - *op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_RM_BYPASS; - else if (!strcmp(token, "RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS")) - *op_flag_value = RTE_BBDEV_LDPC_SOFT_OUT_DEINTERLEAVER_BYPASS; - else if (!strcmp(token, "RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE")) - *op_flag_value = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; - else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_INTERRUPTS")) - *op_flag_value = RTE_BBDEV_LDPC_DEC_INTERRUPTS; - else if (!strcmp(token, "RTE_BBDEV_LDPC_DEC_SCATTER_GATHER")) - *op_flag_value = RTE_BBDEV_LDPC_DEC_SCATTER_GATHER; - else if (!strcmp(token, "RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION")) - *op_flag_value = RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; - else if (!strcmp(token, "RTE_BBDEV_LDPC_LLR_COMPRESSION")) - *op_flag_value = RTE_BBDEV_LDPC_LLR_COMPRESSION; - else if (!strcmp(token, - "RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE")) - *op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; - else if (!strcmp(token, - "RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE")) - *op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; - else if (!strcmp(token, - "RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK")) - *op_flag_value = RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; - else { - printf("The given value is not a LDPC decoder flag\n"); - return -1; - } - - return 0; -} - -/* convert turbo encoder flag from string to unsigned long int*/ -static int -op_encoder_flag_strtoul(char *token, uint32_t *op_flag_value) -{ - if (!strcmp(token, "RTE_BBDEV_TURBO_RV_INDEX_BYPASS")) - *op_flag_value = RTE_BBDEV_TURBO_RV_INDEX_BYPASS; - else if (!strcmp(token, "RTE_BBDEV_TURBO_RATE_MATCH")) - *op_flag_value = RTE_BBDEV_TURBO_RATE_MATCH; - else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24B_ATTACH")) - *op_flag_value = RTE_BBDEV_TURBO_CRC_24B_ATTACH; - else if (!strcmp(token, "RTE_BBDEV_TURBO_CRC_24A_ATTACH")) - *op_flag_value = RTE_BBDEV_TURBO_CRC_24A_ATTACH; - else if (!strcmp(token, "RTE_BBDEV_TURBO_ENC_SCATTER_GATHER")) - *op_flag_value = RTE_BBDEV_TURBO_ENC_SCATTER_GATHER; - else { - printf("The given value is not a turbo encoder flag\n"); - return -1; - } - - return 0; -} - -/* convert LDPC encoder flag from string to unsigned long int*/ -static int -op_ldpc_encoder_flag_strtoul(char *token, uint32_t *op_flag_value) -{ - if (!strcmp(token, "RTE_BBDEV_LDPC_INTERLEAVER_BYPASS")) - *op_flag_value = RTE_BBDEV_LDPC_INTERLEAVER_BYPASS; - else if (!strcmp(token, "RTE_BBDEV_LDPC_RATE_MATCH")) - *op_flag_value = RTE_BBDEV_LDPC_RATE_MATCH; - else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24A_ATTACH")) - *op_flag_value = RTE_BBDEV_LDPC_CRC_24A_ATTACH; - else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_24B_ATTACH")) - *op_flag_value = RTE_BBDEV_LDPC_CRC_24B_ATTACH; - else if (!strcmp(token, "RTE_BBDEV_LDPC_CRC_16_ATTACH")) - *op_flag_value = RTE_BBDEV_LDPC_CRC_16_ATTACH; - else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_INTERRUPTS")) - *op_flag_value = RTE_BBDEV_LDPC_ENC_INTERRUPTS; - else if (!strcmp(token, "RTE_BBDEV_LDPC_ENC_SCATTER_GATHER")) - *op_flag_value = RTE_BBDEV_LDPC_ENC_SCATTER_GATHER; - else { - printf("The given value is not a turbo encoder flag\n"); - return -1; - } - - return 0; -} - -/* tokenization turbo decoder/encoder flags values separated by a comma */ -static int -parse_turbo_flags(char *tokens, uint32_t *op_flags, - enum rte_bbdev_op_type op_type) -{ - char *tok = NULL; - uint32_t op_flag_value = 0; - - tok = strtok(tokens, VALUE_DELIMITER); - if (tok == NULL) - return -1; - - while (tok != NULL) { - trim_space(tok); - if (op_type == RTE_BBDEV_OP_TURBO_DEC) { - if (op_decoder_flag_strtoul(tok, &op_flag_value) == -1) - return -1; - } else if (op_type == RTE_BBDEV_OP_TURBO_ENC) { - if (op_encoder_flag_strtoul(tok, &op_flag_value) == -1) - return -1; - } else if (op_type == RTE_BBDEV_OP_LDPC_ENC) { - if (op_ldpc_encoder_flag_strtoul(tok, &op_flag_value) - == -1) - return -1; - } else if (op_type == RTE_BBDEV_OP_LDPC_DEC) { - if (op_ldpc_decoder_flag_strtoul(tok, &op_flag_value) - == -1) - return -1; - } else { - return -1; - } - - *op_flags = *op_flags | op_flag_value; - - tok = strtok(NULL, VALUE_DELIMITER); - if (tok == NULL) - break; - } - - return 0; -} - -/* convert turbo encoder/decoder op_type from string to enum*/ -static int -op_turbo_type_strtol(char *token, enum rte_bbdev_op_type *op_type) -{ - trim_space(token); - if (!strcmp(token, "RTE_BBDEV_OP_TURBO_DEC")) - *op_type = RTE_BBDEV_OP_TURBO_DEC; - else if (!strcmp(token, "RTE_BBDEV_OP_TURBO_ENC")) - *op_type = RTE_BBDEV_OP_TURBO_ENC; - else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_ENC")) - *op_type = RTE_BBDEV_OP_LDPC_ENC; - else if (!strcmp(token, "RTE_BBDEV_OP_LDPC_DEC")) - *op_type = RTE_BBDEV_OP_LDPC_DEC; - else if (!strcmp(token, "RTE_BBDEV_OP_NONE")) - *op_type = RTE_BBDEV_OP_NONE; - else { - printf("Not valid turbo op_type: '%s'\n", token); - return -1; - } - - return 0; -} - -/* tokenization expected status values separated by a comma */ -static int -parse_expected_status(char *tokens, int *status, enum rte_bbdev_op_type op_type) -{ - char *tok = NULL; - bool status_ok = false; - - tok = strtok(tokens, VALUE_DELIMITER); - if (tok == NULL) - return -1; - - while (tok != NULL) { - trim_space(tok); - if (!strcmp(tok, "OK")) - status_ok = true; - else if (!strcmp(tok, "DMA")) - *status = *status | (1 << RTE_BBDEV_DRV_ERROR); - else if (!strcmp(tok, "FCW")) - *status = *status | (1 << RTE_BBDEV_DATA_ERROR); - else if (!strcmp(tok, "SYNCRC")) { - *status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR); - *status = *status | (1 << RTE_BBDEV_CRC_ERROR); - } else if (!strcmp(tok, "SYN")) - *status = *status | (1 << RTE_BBDEV_SYNDROME_ERROR); - else if (!strcmp(tok, "CRC")) { - if ((op_type == RTE_BBDEV_OP_TURBO_DEC) || - (op_type == RTE_BBDEV_OP_LDPC_DEC)) - *status = *status | (1 << RTE_BBDEV_CRC_ERROR); - else { - printf( - "CRC is only a valid value for decoder\n"); - return -1; - } - } else { - printf("Not valid status: '%s'\n", tok); - return -1; - } - - tok = strtok(NULL, VALUE_DELIMITER); - if (tok == NULL) - break; - } - - if (status_ok && *status != 0) { - printf( - "Not valid status values. Cannot be OK and ERROR at the same time.\n"); - return -1; - } - - return 0; -} - -/* parse ops data entry (there can be more than 1 input entry, each will be - * contained in a separate op_data_buf struct) - */ -static int -parse_data_entry(const char *key_token, char *token, - struct test_bbdev_vector *vector, enum op_data_type type, - const char *prefix) -{ - int ret; - uint32_t data_length = 0; - uint32_t *data = NULL; - unsigned int id; - struct op_data_buf *op_data; - unsigned int *nb_ops; - - if (type >= DATA_NUM_TYPES) { - printf("Unknown op type: %d!\n", type); - return -1; - } -//printf("parse data entry \n"); - - op_data = vector->entries[type].segments; - nb_ops = &vector->entries[type].nb_segments; -//printf("nb segments %d\n",*nb_ops); - - if (*nb_ops >= RTE_BBDEV_TURBO_MAX_CODE_BLOCKS) { - printf("Too many segments (code blocks defined): %u, max %d!\n", - *nb_ops, RTE_BBDEV_TURBO_MAX_CODE_BLOCKS); - return -1; - } - - if (sscanf(key_token + strlen(prefix), "%u", &id) != 1) { - printf("Missing ID of %s\n", prefix); - return -1; - } - if (id != *nb_ops) { - printf( - "Please order data entries sequentially, i.e. %s0, %s1, ...\n", - prefix, prefix); - return -1; - } - - /* Clear new op data struct */ - memset(op_data + *nb_ops, 0, sizeof(struct op_data_buf)); - - ret = parse_values(token, &data, &data_length); -printf("data %x length %d\n",*data,data_length); - if (!ret) { - op_data[*nb_ops].addr = data; - op_data[*nb_ops].length = data_length; - ++(*nb_ops); - } - - return ret; -} - -/* parses turbo decoder parameters and assigns to global variable */ -static int -parse_decoder_params(const char *key_token, char *token, - struct test_bbdev_vector *vector) -{ - int ret = 0, status = 0; - uint32_t op_flags = 0; - char *err = NULL; - - struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; - - /* compare keys */ - if (starts_with(key_token, op_data_prefixes[DATA_INPUT])) - ret = parse_data_entry(key_token, token, vector, - DATA_INPUT, op_data_prefixes[DATA_INPUT]); - - else if (starts_with(key_token, op_data_prefixes[DATA_SOFT_OUTPUT])) - ret = parse_data_entry(key_token, token, vector, - DATA_SOFT_OUTPUT, - op_data_prefixes[DATA_SOFT_OUTPUT]); - - else if (starts_with(key_token, op_data_prefixes[DATA_HARD_OUTPUT])) - ret = parse_data_entry(key_token, token, vector, - DATA_HARD_OUTPUT, - op_data_prefixes[DATA_HARD_OUTPUT]); - else if (!strcmp(key_token, "e")) { - vector->mask |= TEST_BBDEV_VF_E; - turbo_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0); - } else if (!strcmp(key_token, "ea")) { - vector->mask |= TEST_BBDEV_VF_EA; - turbo_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "eb")) { - vector->mask |= TEST_BBDEV_VF_EB; - turbo_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "k")) { - vector->mask |= TEST_BBDEV_VF_K; - turbo_dec->cb_params.k = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "k_pos")) { - vector->mask |= TEST_BBDEV_VF_K_POS; - turbo_dec->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "k_neg")) { - vector->mask |= TEST_BBDEV_VF_K_NEG; - turbo_dec->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "c")) { - vector->mask |= TEST_BBDEV_VF_C; - turbo_dec->tb_params.c = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "c_neg")) { - vector->mask |= TEST_BBDEV_VF_C_NEG; - turbo_dec->tb_params.c_neg = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "cab")) { - vector->mask |= TEST_BBDEV_VF_CAB; - turbo_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "rv_index")) { - vector->mask |= TEST_BBDEV_VF_RV_INDEX; - turbo_dec->rv_index = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "iter_max")) { - vector->mask |= TEST_BBDEV_VF_ITER_MAX; - turbo_dec->iter_max = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "iter_min")) { - vector->mask |= TEST_BBDEV_VF_ITER_MIN; - turbo_dec->iter_min = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "expected_iter_count")) { - vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT; - turbo_dec->iter_count = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "ext_scale")) { - vector->mask |= TEST_BBDEV_VF_EXT_SCALE; - turbo_dec->ext_scale = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "num_maps")) { - vector->mask |= TEST_BBDEV_VF_NUM_MAPS; - turbo_dec->num_maps = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "r")) { - vector->mask |= TEST_BBDEV_VF_R; - turbo_dec->tb_params.r = (uint8_t)strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "code_block_mode")) { - vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE; - turbo_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "op_flags")) { - vector->mask |= TEST_BBDEV_VF_OP_FLAGS; - ret = parse_turbo_flags(token, &op_flags, - vector->op_type); - if (!ret) - turbo_dec->op_flags = op_flags; - } else if (!strcmp(key_token, "expected_status")) { - vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS; - ret = parse_expected_status(token, &status, vector->op_type); - if (!ret) - vector->expected_status = status; - } else { - printf("Not valid dec key: '%s'\n", key_token); - return -1; - } - - if (ret != 0) { - printf("Failed with convert '%s\t%s'\n", key_token, token); - return -1; - } - - return 0; -} - -/* parses turbo encoder parameters and assigns to global variable */ -static int -parse_encoder_params(const char *key_token, char *token, - struct test_bbdev_vector *vector) -{ - int ret = 0, status = 0; - uint32_t op_flags = 0; - char *err = NULL; - - - struct rte_bbdev_op_turbo_enc *turbo_enc = &vector->turbo_enc; - - if (starts_with(key_token, op_data_prefixes[DATA_INPUT])) - ret = parse_data_entry(key_token, token, vector, - DATA_INPUT, op_data_prefixes[DATA_INPUT]); - else if (starts_with(key_token, "output")) - ret = parse_data_entry(key_token, token, vector, - DATA_HARD_OUTPUT, "output"); - else if (!strcmp(key_token, "e")) { - vector->mask |= TEST_BBDEV_VF_E; - turbo_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "ea")) { - vector->mask |= TEST_BBDEV_VF_EA; - turbo_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "eb")) { - vector->mask |= TEST_BBDEV_VF_EB; - turbo_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "k")) { - vector->mask |= TEST_BBDEV_VF_K; - turbo_enc->cb_params.k = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "k_neg")) { - vector->mask |= TEST_BBDEV_VF_K_NEG; - turbo_enc->tb_params.k_neg = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "k_pos")) { - vector->mask |= TEST_BBDEV_VF_K_POS; - turbo_enc->tb_params.k_pos = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "c_neg")) { - vector->mask |= TEST_BBDEV_VF_C_NEG; - turbo_enc->tb_params.c_neg = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "c")) { - vector->mask |= TEST_BBDEV_VF_C; - turbo_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "cab")) { - vector->mask |= TEST_BBDEV_VF_CAB; - turbo_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "rv_index")) { - vector->mask |= TEST_BBDEV_VF_RV_INDEX; - turbo_enc->rv_index = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "ncb")) { - vector->mask |= TEST_BBDEV_VF_NCB; - turbo_enc->cb_params.ncb = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "ncb_neg")) { - vector->mask |= TEST_BBDEV_VF_NCB_NEG; - turbo_enc->tb_params.ncb_neg = - (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "ncb_pos")) { - vector->mask |= TEST_BBDEV_VF_NCB_POS; - turbo_enc->tb_params.ncb_pos = - (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "r")) { - vector->mask |= TEST_BBDEV_VF_R; - turbo_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "code_block_mode")) { - vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE; - turbo_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "op_flags")) { - vector->mask |= TEST_BBDEV_VF_OP_FLAGS; - ret = parse_turbo_flags(token, &op_flags, - vector->op_type); - if (!ret) - turbo_enc->op_flags = op_flags; - } else if (!strcmp(key_token, "expected_status")) { - vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS; - ret = parse_expected_status(token, &status, vector->op_type); - if (!ret) - vector->expected_status = status; - } else { - printf("Not valid enc key: '%s'\n", key_token); - return -1; - } - - if (ret != 0) { - printf("Failed with convert '%s\t%s'\n", key_token, token); - return -1; - } - - return 0; -} - - -/* parses LDPC encoder parameters and assigns to global variable */ -static int -parse_ldpc_encoder_params(const char *key_token, char *token, - struct test_bbdev_vector *vector) -{ - int ret = 0, status = 0; - uint32_t op_flags = 0; - char *err = NULL; - - struct rte_bbdev_op_ldpc_enc *ldpc_enc = &vector->ldpc_enc; - - if (starts_with(key_token, op_data_prefixes[DATA_INPUT])) - ret = parse_data_entry(key_token, token, vector, - DATA_INPUT, - op_data_prefixes[DATA_INPUT]); - else if (starts_with(key_token, "output")) - ret = parse_data_entry(key_token, token, vector, - DATA_HARD_OUTPUT, - "output"); - else if (!strcmp(key_token, "e")) { - vector->mask |= TEST_BBDEV_VF_E; - ldpc_enc->cb_params.e = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "ea")) { - vector->mask |= TEST_BBDEV_VF_EA; - ldpc_enc->tb_params.ea = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "eb")) { - vector->mask |= TEST_BBDEV_VF_EB; - ldpc_enc->tb_params.eb = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "c")) { - vector->mask |= TEST_BBDEV_VF_C; - ldpc_enc->tb_params.c = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "cab")) { - vector->mask |= TEST_BBDEV_VF_CAB; - ldpc_enc->tb_params.cab = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "rv_index")) { - vector->mask |= TEST_BBDEV_VF_RV_INDEX; - ldpc_enc->rv_index = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "n_cb")) { - vector->mask |= TEST_BBDEV_VF_NCB; - ldpc_enc->n_cb = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "r")) { - vector->mask |= TEST_BBDEV_VF_R; - ldpc_enc->tb_params.r = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "q_m")) { - vector->mask |= TEST_BBDEV_VF_QM; - ldpc_enc->q_m = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "basegraph")) { - vector->mask |= TEST_BBDEV_VF_BG; - ldpc_enc->basegraph = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "z_c")) { - vector->mask |= TEST_BBDEV_VF_ZC; - ldpc_enc->z_c = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "n_filler")) { - vector->mask |= TEST_BBDEV_VF_F; - ldpc_enc->n_filler = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "code_block_mode")) { - vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE; - ldpc_enc->code_block_mode = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "op_flags")) { - vector->mask |= TEST_BBDEV_VF_OP_FLAGS; - ret = parse_turbo_flags(token, &op_flags, vector->op_type); - if (!ret) - ldpc_enc->op_flags = op_flags; - } else if (!strcmp(key_token, "expected_status")) { - vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS; - ret = parse_expected_status(token, &status, vector->op_type); - if (!ret) - vector->expected_status = status; - } else { - printf("Not valid ldpc enc key: '%s'\n", key_token); - return -1; - } - - if (ret != 0) { - printf("Failed with convert '%s\t%s'\n", key_token, token); - return -1; - } - - return 0; -} - -/* parses LDPC decoder parameters and assigns to global variable */ -static int -parse_ldpc_decoder_params(const char *key_token, char *token, - struct test_bbdev_vector *vector) -{ - int ret = 0, status = 0; - uint32_t op_flags = 0; - char *err = NULL; - - struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec; - - if (starts_with(key_token, op_data_prefixes[DATA_INPUT])) - ret = parse_data_entry(key_token, token, vector, - DATA_INPUT, - op_data_prefixes[DATA_INPUT]); - else if (starts_with(key_token, "output")) - ret = parse_data_entry(key_token, token, vector, - DATA_HARD_OUTPUT, - "output"); - else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_INPUT])) - ret = parse_data_entry(key_token, token, vector, - DATA_HARQ_INPUT, - op_data_prefixes[DATA_HARQ_INPUT]); - else if (starts_with(key_token, op_data_prefixes[DATA_HARQ_OUTPUT])) - ret = parse_data_entry(key_token, token, vector, - DATA_HARQ_OUTPUT, - op_data_prefixes[DATA_HARQ_OUTPUT]); - else if (!strcmp(key_token, "e")) { - vector->mask |= TEST_BBDEV_VF_E; - ldpc_dec->cb_params.e = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "ea")) { - vector->mask |= TEST_BBDEV_VF_EA; - ldpc_dec->tb_params.ea = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "eb")) { - vector->mask |= TEST_BBDEV_VF_EB; - ldpc_dec->tb_params.eb = (uint32_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "c")) { - vector->mask |= TEST_BBDEV_VF_C; - ldpc_dec->tb_params.c = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "cab")) { - vector->mask |= TEST_BBDEV_VF_CAB; - ldpc_dec->tb_params.cab = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "rv_index")) { - vector->mask |= TEST_BBDEV_VF_RV_INDEX; - ldpc_dec->rv_index = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "n_cb")) { - vector->mask |= TEST_BBDEV_VF_NCB; - ldpc_dec->n_cb = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "r")) { - vector->mask |= TEST_BBDEV_VF_R; - ldpc_dec->tb_params.r = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "q_m")) { - vector->mask |= TEST_BBDEV_VF_QM; - ldpc_dec->q_m = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "basegraph")) { - vector->mask |= TEST_BBDEV_VF_BG; - ldpc_dec->basegraph = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "z_c")) { - vector->mask |= TEST_BBDEV_VF_ZC; - ldpc_dec->z_c = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "n_filler")) { - vector->mask |= TEST_BBDEV_VF_F; - ldpc_dec->n_filler = (uint16_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "expected_iter_count")) { - vector->mask |= TEST_BBDEV_VF_EXPECTED_ITER_COUNT; - ldpc_dec->iter_count = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "iter_max")) { - vector->mask |= TEST_BBDEV_VF_ITER_MAX; - ldpc_dec->iter_max = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "code_block_mode")) { - vector->mask |= TEST_BBDEV_VF_CODE_BLOCK_MODE; - ldpc_dec->code_block_mode = (uint8_t) strtoul(token, &err, 0); - ret = ((err == NULL) || (*err != '\0')) ? -1 : 0; - } else if (!strcmp(key_token, "op_flags")) { - vector->mask |= TEST_BBDEV_VF_OP_FLAGS; - ret = parse_turbo_flags(token, &op_flags, vector->op_type); - if (!ret) - ldpc_dec->op_flags = op_flags; - } else if (!strcmp(key_token, "expected_status")) { - vector->mask |= TEST_BBDEV_VF_EXPECTED_STATUS; - ret = parse_expected_status(token, &status, vector->op_type); - if (!ret) - vector->expected_status = status; - } else { - printf("Not valid ldpc dec key: '%s'\n", key_token); - return -1; - } - - if (ret != 0) { - printf("Failed with convert '%s\t%s'\n", key_token, token); - return -1; - } - - return 0; -} - -/* checks the type of key and assigns data */ -static int -parse_entry(char *entry, struct test_bbdev_vector *vector) -{ -//printf("parse entry \n"); - int ret = 0; - char *token, *key_token; - enum rte_bbdev_op_type op_type = RTE_BBDEV_OP_NONE; - - if (entry == NULL) { - printf("Expected entry value\n"); - return -1; - } - - /* get key */ - token = strtok(entry, ENTRY_DELIMITER); - key_token = token; - /* get values for key */ - token = strtok(NULL, ENTRY_DELIMITER); - - if (key_token == NULL || token == NULL) { - printf("Expected 'key = values' but was '%.40s'..\n", entry); - return -1; - } - trim_space(key_token); - - /* first key_token has to specify type of operation */ - if (vector->op_type == RTE_BBDEV_OP_NONE) { - if (!strcmp(key_token, "op_type")) { - ret = op_turbo_type_strtol(token, &op_type); - if (!ret) - vector->op_type = op_type; - return (!ret) ? 0 : -1; - } - printf("First key_token (%s) does not specify op_type\n", - key_token); - return -1; - } - - /* compare keys */ - if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) { - if (parse_decoder_params(key_token, token, vector) == -1) - return -1; - } else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) { - if (parse_encoder_params(key_token, token, vector) == -1) - return -1; - } else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) { - if (parse_ldpc_encoder_params(key_token, token, vector) == -1) - return -1; - } else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) { - if (parse_ldpc_decoder_params(key_token, token, vector) == -1) - return -1; - } - - return 0; -} - -static int -check_decoder_segments(struct test_bbdev_vector *vector) -{ - unsigned char i; - struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; - - if (vector->entries[DATA_INPUT].nb_segments == 0) - return -1; - - for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++) - if (vector->entries[DATA_INPUT].segments[i].addr == NULL) - return -1; - - if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0) - return -1; - - for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; - i++) - if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL) - return -1; - - if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) && - (vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0)) - return -1; - - for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments; - i++) - if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL) - return -1; - - return 0; -} - -static int -check_ldpc_decoder_segments(struct test_bbdev_vector *vector) -{ - unsigned char i; - struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec; - - for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++) - if (vector->entries[DATA_INPUT].segments[i].addr == NULL) - return -1; - - for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++) - if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL) - return -1; - - if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) && - (vector->entries[DATA_SOFT_OUTPUT].nb_segments == 0)) - return -1; - - for (i = 0; i < vector->entries[DATA_SOFT_OUTPUT].nb_segments; i++) - if (vector->entries[DATA_SOFT_OUTPUT].segments[i].addr == NULL) - return -1; - - if ((ldpc_dec->op_flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) && - (vector->entries[DATA_HARQ_OUTPUT].nb_segments == 0)) - return -1; - - for (i = 0; i < vector->entries[DATA_HARQ_OUTPUT].nb_segments; i++) - if (vector->entries[DATA_HARQ_OUTPUT].segments[i].addr == NULL) - return -1; - - return 0; -} - -static int -check_decoder_llr_spec(struct test_bbdev_vector *vector) -{ - struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; - - /* Check input LLR sign formalism specification */ - if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) && - (turbo_dec->op_flags & - RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) { - printf( - "Both positive and negative LLR input flags were set!\n"); - return -1; - } - if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN) && - !(turbo_dec->op_flags & - RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN)) { - printf( - "INFO: input LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n"); - turbo_dec->op_flags |= RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN; - } - - if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT)) - return 0; - - /* Check output LLR sign formalism specification */ - if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) && - (turbo_dec->op_flags & - RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) { - printf( - "Both positive and negative LLR output flags were set!\n"); - return -1; - } - if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT) && - !(turbo_dec->op_flags & - RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT)) { - printf( - "INFO: soft output LLR sign formalism was not specified and will be set to negative LLR for '1' bit\n"); - turbo_dec->op_flags |= - RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; - } - - return 0; -} - -static int -check_decoder_op_flags(struct test_bbdev_vector *vector) -{ - struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; - - if ((turbo_dec->op_flags & RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP) && - !(turbo_dec->op_flags & RTE_BBDEV_TURBO_CRC_TYPE_24B)) { - printf( - "WARNING: RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP flag is missing RTE_BBDEV_TURBO_CRC_TYPE_24B\n"); - return -1; - } - - return 0; -} - -/* checks decoder parameters */ -static int -check_decoder(struct test_bbdev_vector *vector) -{ - struct rte_bbdev_op_turbo_dec *turbo_dec = &vector->turbo_dec; - const int mask = vector->mask; - - if (check_decoder_segments(vector) < 0) - return -1; - - if (check_decoder_llr_spec(vector) < 0) - return -1; - - if (check_decoder_op_flags(vector) < 0) - return -1; - - /* Check which params were set */ - if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) { - printf( - "WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n"); - turbo_dec->code_block_mode = 1; - } - if (turbo_dec->code_block_mode == 0) { - if (!(mask & TEST_BBDEV_VF_EA)) - printf( - "WARNING: ea was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_EB)) - printf( - "WARNING: eb was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_K_NEG)) - printf( - "WARNING: k_neg was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_K_POS)) - printf( - "WARNING: k_pos was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_C_NEG)) - printf( - "WARNING: c_neg was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_C)) { - printf( - "WARNING: c was not specified in vector file and will be set to 1\n"); - turbo_dec->tb_params.c = 1; - } - if (!(mask & TEST_BBDEV_VF_CAB)) - printf( - "WARNING: cab was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_R)) - printf( - "WARNING: r was not specified in vector file and will be set to 0\n"); - } else { - if (!(mask & TEST_BBDEV_VF_E)) - printf( - "WARNING: e was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_K)) - printf( - "WARNING: k was not specified in vector file and will be set to 0\n"); - } - if (!(mask & TEST_BBDEV_VF_RV_INDEX)) - printf( - "INFO: rv_index was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_ITER_MIN)) - printf( - "WARNING: iter_min was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_ITER_MAX)) - printf( - "WARNING: iter_max was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT)) - printf( - "WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n"); - if (!(mask & TEST_BBDEV_VF_EXT_SCALE)) - printf( - "WARNING: ext_scale was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) { - printf( - "WARNING: op_flags was not specified in vector file and capabilities will not be validated\n"); - turbo_dec->num_maps = 0; - } else if (!(turbo_dec->op_flags & RTE_BBDEV_TURBO_MAP_DEC) && - mask & TEST_BBDEV_VF_NUM_MAPS) { - printf( - "INFO: RTE_BBDEV_TURBO_MAP_DEC was not set in vector file and num_maps will be set to 0\n"); - turbo_dec->num_maps = 0; - } - if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS)) - printf( - "WARNING: expected_status was not specified in vector file and will be set to 0\n"); - return 0; -} - -/* checks LDPC decoder parameters */ -static int -check_ldpc_decoder(struct test_bbdev_vector *vector) -{ - struct rte_bbdev_op_ldpc_dec *ldpc_dec = &vector->ldpc_dec; - const int mask = vector->mask; - - if (check_ldpc_decoder_segments(vector) < 0) - return -1; - - /* - * if (check_ldpc_decoder_llr_spec(vector) < 0) - * return -1; - * - * if (check_ldpc_decoder_op_flags(vector) < 0) - * return -1; - */ - - /* Check which params were set */ - if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) { - printf( - "WARNING: code_block_mode was not specified in vector file and will be set to 1 (0 - TB Mode, 1 - CB mode)\n"); - ldpc_dec->code_block_mode = 1; - } - if (ldpc_dec->code_block_mode == 0) { - if (!(mask & TEST_BBDEV_VF_EA)) - printf( - "WARNING: ea was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_EB)) - printf( - "WARNING: eb was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_C)) { - printf( - "WARNING: c was not specified in vector file and will be set to 1\n"); - ldpc_dec->tb_params.c = 1; - } - if (!(mask & TEST_BBDEV_VF_CAB)) - printf( - "WARNING: cab was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_R)) - printf( - "WARNING: r was not specified in vector file and will be set to 0\n"); - } else { - if (!(mask & TEST_BBDEV_VF_E)) - printf( - "WARNING: e was not specified in vector file and will be set to 0\n"); - } - if (!(mask & TEST_BBDEV_VF_RV_INDEX)) - printf( - "INFO: rv_index was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_ITER_MAX)) - printf( - "WARNING: iter_max was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT)) - printf( - "WARNING: expected_iter_count was not specified in vector file and iter_count will not be validated\n"); - if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) { - printf( - "WARNING: op_flags was not specified in vector file and capabilities will not be validated\n"); - } - if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS)) - printf( - "WARNING: expected_status was not specified in vector file and will be set to 0\n"); - return 0; -} - -/* checks encoder parameters */ -static int -check_encoder(struct test_bbdev_vector *vector) -{ - unsigned char i; - const int mask = vector->mask; - - if (vector->entries[DATA_INPUT].nb_segments == 0) - return -1; - - for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++) - if (vector->entries[DATA_INPUT].segments[i].addr == NULL) - return -1; - - if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0) - return -1; - - for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++) - if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL) - return -1; - - if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) { - printf( - "WARNING: code_block_mode was not specified in vector file and will be set to 1\n"); - vector->turbo_enc.code_block_mode = 1; - } - if (vector->turbo_enc.code_block_mode == 0) { - if (!(mask & TEST_BBDEV_VF_EA) && (vector->turbo_enc.op_flags & - RTE_BBDEV_TURBO_RATE_MATCH)) - printf( - "WARNING: ea was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_EB) && (vector->turbo_enc.op_flags & - RTE_BBDEV_TURBO_RATE_MATCH)) - printf( - "WARNING: eb was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_K_NEG)) - printf( - "WARNING: k_neg was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_K_POS)) - printf( - "WARNING: k_pos was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_C_NEG)) - printf( - "WARNING: c_neg was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_C)) { - printf( - "WARNING: c was not specified in vector file and will be set to 1\n"); - vector->turbo_enc.tb_params.c = 1; - } - if (!(mask & TEST_BBDEV_VF_CAB) && (vector->turbo_enc.op_flags & - RTE_BBDEV_TURBO_RATE_MATCH)) - printf( - "WARNING: cab was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_NCB_NEG)) - printf( - "WARNING: ncb_neg was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_NCB_POS)) - printf( - "WARNING: ncb_pos was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_R)) - printf( - "WARNING: r was not specified in vector file and will be set to 0\n"); - } else { - if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags & - RTE_BBDEV_TURBO_RATE_MATCH)) - printf( - "WARNING: e was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_K)) - printf( - "WARNING: k was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_NCB)) - printf( - "WARNING: ncb was not specified in vector file and will be set to 0\n"); - } - if (!(mask & TEST_BBDEV_VF_RV_INDEX)) - printf( - "INFO: rv_index was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) - printf( - "INFO: op_flags was not specified in vector file and capabilities will not be validated\n"); - if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS)) - printf( - "WARNING: expected_status was not specified in vector file and will be set to 0\n"); - - return 0; -} - - -/* checks encoder parameters */ -static int -check_ldpc_encoder(struct test_bbdev_vector *vector) -{ - unsigned char i; - const int mask = vector->mask; - - if (vector->entries[DATA_INPUT].nb_segments == 0) - return -1; - - for (i = 0; i < vector->entries[DATA_INPUT].nb_segments; i++) - if (vector->entries[DATA_INPUT].segments[i].addr == NULL) - return -1; - - if (vector->entries[DATA_HARD_OUTPUT].nb_segments == 0) - return -1; - - for (i = 0; i < vector->entries[DATA_HARD_OUTPUT].nb_segments; i++) - if (vector->entries[DATA_HARD_OUTPUT].segments[i].addr == NULL) - return -1; - - if (!(mask & TEST_BBDEV_VF_CODE_BLOCK_MODE)) { - printf( - "WARNING: code_block_mode was not specified in vector file and will be set to 1\n"); - vector->turbo_enc.code_block_mode = 1; - } - if (vector->turbo_enc.code_block_mode == 0) { - } else { - if (!(mask & TEST_BBDEV_VF_E) && (vector->turbo_enc.op_flags & - RTE_BBDEV_TURBO_RATE_MATCH)) - printf( - "WARNING: e was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_NCB)) - printf( - "WARNING: ncb was not specified in vector file and will be set to 0\n"); - } - if (!(mask & TEST_BBDEV_VF_BG)) - printf( - "WARNING: BG was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_ZC)) - printf( - "WARNING: Zc was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_RV_INDEX)) - printf( - "INFO: rv_index was not specified in vector file and will be set to 0\n"); - if (!(mask & TEST_BBDEV_VF_OP_FLAGS)) - printf( - "INFO: op_flags was not specified in vector file and capabilities will not be validated\n"); - if (!(mask & TEST_BBDEV_VF_EXPECTED_STATUS)) - printf( - "WARNING: expected_status was not specified in vector file and will be set to 0\n"); - - return 0; -} - -static int -bbdev_check_vector(struct test_bbdev_vector *vector) -{ - if (vector->op_type == RTE_BBDEV_OP_TURBO_DEC) { - if (check_decoder(vector) == -1) - return -1; - } else if (vector->op_type == RTE_BBDEV_OP_TURBO_ENC) { - if (check_encoder(vector) == -1) - return -1; - } else if (vector->op_type == RTE_BBDEV_OP_LDPC_ENC) { - if (check_ldpc_encoder(vector) == -1) - return -1; - } else if (vector->op_type == RTE_BBDEV_OP_LDPC_DEC) { - if (check_ldpc_decoder(vector) == -1) - return -1; - } else if (vector->op_type != RTE_BBDEV_OP_NONE) { - printf("Vector was not filled\n"); - return -1; - } - - return 0; -} - -int -test_bbdev_vector_read(const char *filename, - struct test_bbdev_vector *vector) -{ - int ret = 0; - size_t len = 0; - - FILE *fp = NULL; - char *line = NULL; - char *entry = NULL; -//sprintf(filename, "/home/wang/oai/openairinterface5g/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data"); - fp = fopen(filename, "r"); - if (fp == NULL) { - printf("File %s does not exist\n", filename); - return -1; - } - - while (getline(&line, &len, fp) != -1) { - - /* ignore comments and new lines */ - if (line[0] == '#' || line[0] == '/' || line[0] == '\n' - || line[0] == '\r') - continue; - - trim_space(line); - - /* buffer for multiline */ - entry = realloc(entry, strlen(line) + 1); - if (entry == NULL) { - printf("Fail to realloc %zu bytes\n", strlen(line) + 1); - ret = -ENOMEM; - goto exit; - } - - strcpy(entry, line); - - /* check if entry ends with , or = */ - if (entry[strlen(entry) - 1] == ',' - || entry[strlen(entry) - 1] == '=') { - while (getline(&line, &len, fp) != -1) { - trim_space(line); - - /* extend entry about length of new line */ - char *entry_extended = realloc(entry, - strlen(line) + - strlen(entry) + 1); - - if (entry_extended == NULL) { - printf("Fail to allocate %zu bytes\n", - strlen(line) + - strlen(entry) + 1); - ret = -ENOMEM; - goto exit; - } - - entry = entry_extended; - /* entry has been allocated accordingly */ - strcpy(&entry[strlen(entry)], line); - - if (entry[strlen(entry) - 1] != ',') - break; - } - } - ret = parse_entry(entry, vector); - if (ret != 0) { - printf("An error occurred while parsing!\n"); - goto exit; - } - } - ret = bbdev_check_vector(vector); - if (ret != 0) - printf("An error occurred while checking!\n"); - -exit: - fclose(fp); - free(line); - free(entry); - - return ret; -} diff --git a/targets/ARCH/test-bbdev/test_bbdev_vector.h b/targets/ARCH/test-bbdev/test_bbdev_vector.h deleted file mode 100644 index 4e5dbf5d50..0000000000 --- a/targets/ARCH/test-bbdev/test_bbdev_vector.h +++ /dev/null @@ -1,79 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2017 Intel Corporation - */ - -#ifndef TEST_BBDEV_VECTOR_H_ -#define TEST_BBDEV_VECTOR_H_ - -#include - -/* Flags which are set when specific parameter is define in vector file */ -enum { - TEST_BBDEV_VF_E = (1ULL << 0), - TEST_BBDEV_VF_EA = (1ULL << 1), - TEST_BBDEV_VF_EB = (1ULL << 2), - TEST_BBDEV_VF_K = (1ULL << 3), - TEST_BBDEV_VF_K_NEG = (1ULL << 4), - TEST_BBDEV_VF_K_POS = (1ULL << 5), - TEST_BBDEV_VF_C_NEG = (1ULL << 6), - TEST_BBDEV_VF_C = (1ULL << 7), - TEST_BBDEV_VF_CAB = (1ULL << 8), - TEST_BBDEV_VF_RV_INDEX = (1ULL << 9), - TEST_BBDEV_VF_ITER_MAX = (1ULL << 10), - TEST_BBDEV_VF_ITER_MIN = (1ULL << 11), - TEST_BBDEV_VF_EXPECTED_ITER_COUNT = (1ULL << 12), - TEST_BBDEV_VF_EXT_SCALE = (1ULL << 13), - TEST_BBDEV_VF_NUM_MAPS = (1ULL << 14), - TEST_BBDEV_VF_NCB = (1ULL << 15), - TEST_BBDEV_VF_NCB_NEG = (1ULL << 16), - TEST_BBDEV_VF_NCB_POS = (1ULL << 17), - TEST_BBDEV_VF_R = (1ULL << 18), - TEST_BBDEV_VF_BG = (1ULL << 19), - TEST_BBDEV_VF_ZC = (1ULL << 20), - TEST_BBDEV_VF_F = (1ULL << 21), - TEST_BBDEV_VF_QM = (1ULL << 22), - TEST_BBDEV_VF_CODE_BLOCK_MODE = (1ULL << 23), - TEST_BBDEV_VF_OP_FLAGS = (1ULL << 24), - TEST_BBDEV_VF_EXPECTED_STATUS = (1ULL << 25), -}; - -enum op_data_type { - DATA_INPUT = 0, - DATA_SOFT_OUTPUT, - DATA_HARD_OUTPUT, - DATA_HARQ_INPUT, - DATA_HARQ_OUTPUT, - DATA_NUM_TYPES, -}; - -struct op_data_buf { - uint32_t *addr; - uint32_t length; -}; - -struct op_data_entries { - struct op_data_buf segments[RTE_BBDEV_TURBO_MAX_CODE_BLOCKS]; - unsigned int nb_segments; -}; - -struct test_bbdev_vector { - enum rte_bbdev_op_type op_type; - int expected_status; - int mask; - union { - struct rte_bbdev_op_turbo_dec turbo_dec; - struct rte_bbdev_op_turbo_enc turbo_enc; - struct rte_bbdev_op_ldpc_dec ldpc_dec; - struct rte_bbdev_op_ldpc_enc ldpc_enc; - }; - /* Additional storage for op data entries */ - struct op_data_entries entries[DATA_NUM_TYPES]; -}; - -/* fills test vector parameters based on test file */ -int -test_bbdev_vector_read(const char *filename, - struct test_bbdev_vector *vector); - - -#endif /* TEST_BBDEV_VECTOR_H_ */ diff --git a/targets/ARCH/test-bbdev/test_vectors/bbdev_null.data b/targets/ARCH/test-bbdev/test_vectors/bbdev_null.data deleted file mode 100644 index c9a9abe9ea..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/bbdev_null.data +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_NONE \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_1_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_1_rv0_drv0.data deleted file mode 100755 index 98a3f1869a..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_1_rv0_drv0.data +++ /dev/null @@ -1,44 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x7f7f7f7f, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x817f8181, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x81817f81, 0x817f8181, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x81817f81, 0x81817f7f, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x81818181, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x817f7f81, 0x817f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x8181817f, 0x8181817f, 0x817f8181, 0x7f817f7f, 0x81818181, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x817f7f81, 0x7f81817f, 0x817f7f7f, 0x7f817f81, 0x817f8181, 0x7f818181, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x8181817f, 0x7f817f7f, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x817f7f81, 0x817f7f7f, 0x81817f7f, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f817f, 0x8181817f, 0x81817f81, 0x817f7f7f, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x817f817f, 0x817f8181, 0x81817f81, 0x7f7f7f81, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x8181817f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x817f8181, 0x8181817f, 0x7f7f817f, 0x81817f7f, 0x7f817f81, 0x817f817f, 0x81817f7f, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x817f7f7f, 0x7f81817f, 0x81818181, 0x8181817f, 0x817f817f, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x81817f7f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x81817f7f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x7f81817f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f818181, 0x817f8181, 0x817f8181, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x81818181, 0x81817f81, 0x81817f7f, 0x7f817f81, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x817f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x817f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x81817f81, 0x81817f7f, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f818181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, 0x817f817f, 0x81817f81, 0x7f81817f, 0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x817f8181, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x81818181, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x81817f7f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x817f7f81, 0x81818181, 0x7f817f81, 0x817f8181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x817f8181, 0x817f7f81, 0x817f7f81, 0x817f817f, 0x817f8181, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x817f8181, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, 0x7f817f7f, 0x7f818181, 0x7f817f7f, 0x7f7f817f, 0x817f8181, 0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x81818181, 0x817f817f, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x81818181, 0x817f817f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f7f, 0x7f817f81, 0x81817f81, 0x7f81817f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x81817f81, 0x7f7f7f7f, 0x8181817f, 0x817f817f, 0x81818181, 0x7f818181, 0x81817f81, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f7f8181, 0x817f8181, 0x817f8181, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x8181817f, 0x817f8181, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f818181, 0x7f817f7f, 0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x81818181, 0x7f817f7f, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x817f817f, 0x817f8181, 0x81817f81, 0x7f81817f, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f818181, 0x7f7f8181, 0x7f7f8181, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f817f, 0x7f81817f, 0x8181817f, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f7f, 0x8181817f, 0x81817f7f, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x8181817f, 0x7f7f817f, 0x8181817f, 0x817f8181, 0x7f818181, 0x7f7f8181, 0x817f7f7f, 0x81817f81, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x8181817f, 0x81817f81, 0x81818181, 0x81817f7f, 0x7f818181, 0x817f8181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x7f81817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x81818181, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, 0x81818181, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x81818181, 0x81817f7f, 0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, 0x8181817f, 0x7f818181, 0x817f817f, 0x81817f81, 0x817f7f7f, 0x81817f81, 0x817f8181, 0x81817f81, 0x817f817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f817f7f, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x7f7f817f, 0x817f7f81, 0x817f817f, 0x81818181, 0x8181817f, 0x8181817f, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x7f81817f, 0x7f7f7f81, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x7f818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x817f817f, 0x817f7f7f, 0x817f7f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x81818181, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x7f818181, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x7f817f81, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x817f8181, 0x7f817f81, 0x7f7f7f7f, 0x817f817f, 0x817f817f, 0x7f817f81, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x817f8181, 0x7f7f7f81, 0x81817f81, 0x7f7f7f7f, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f7f81, 0x81817f81, 0x8181817f, 0x81817f7f, 0x7f818181, 0x81817f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f81817f, 0x817f8181, 0x81818181, 0x8181817f, 0x81818181, 0x817f8181, 0x7f817f7f, 0x817f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f818181, 0x81817f7f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x8181817f, 0x7f7f8181, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x7f7f817f, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x7f818181, 0x81818181, 0x817f8181, 0x817f7f7f, 0x817f8181, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x7f7f817f, 0x7f81817f, 0x817f817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f81817f, 0x7f817f81, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f -output0 = -0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0xb2 - -basegraph= -1 - -z_c= -128 - -n_cb= -3200 - -q_m= -2 - -n_filler= -0 - -e = -3112 - -rv_index = -0 - -code_block_mode = -1 - -iter_max= -8 - -expected_iter_count= -6 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_2_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_2_rv0_drv0.data deleted file mode 100755 index 3247abeca0..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_2_rv0_drv0.data +++ /dev/null @@ -1,43 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x817f817f, 0x7f81817f, 0x8181817f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x81817f81, 0x817f817f, 0x81817f81, 0x81817f7f, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f8181, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x8181817f, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x8181817f, 0x817f7f7f, 0x817f8181, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f81, 0x817f8181, 0x817f8181, 0x817f817f, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x817f7f81, 0x817f817f, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x817f817f, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f818181, 0x81817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f817f81, 0x7f7f7f81, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x7f817f81, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x81818181, 0x7f81817f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x817f817f, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x7f817f81, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x817f817f, 0x7f81817f, 0x7f7f817f, 0x7f817f81, 0x81818181, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x81817f81, 0x817f7f7f, 0x7f7f7f81, 0x81817f81, 0x8181817f, 0x817f817f, 0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x817f7f81, 0x81818181, 0x8181817f, 0x81817f81, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x81817f81, 0x817f7f7f, 0x7f81817f, 0x7f7f7f7f, 0x7f817f7f, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x817f817f, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x7f818181, 0x7f81817f, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f817f, 0x7f817f7f, 0x8181817f, 0x81817f7f, 0x817f7f7f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f81, 0x81818181, 0x817f8181, 0x817f817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x8181817f, 0x7f818181, 0x81817f81, 0x7f817f7f, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x7f7f8181, 0x81818181, 0x7f7f7f81, 0x7f81817f, 0x817f8181, 0x7f818181, 0x7f81817f, 0x7f817f7f, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x817f8181, 0x81818181, 0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x7f81817f, 0x7f818181, 0x81817f7f, 0x7f818181, 0x8181817f, 0x8181817f, 0x817f817f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x81818181, 0x8181817f, 0x7f818181, 0x817f817f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x817f8181, 0x7f818181, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x8181817f, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x7f818181, 0x8181817f, 0x81817f7f, 0x81817f81, 0x817f8181, 0x817f7f7f, 0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x81817f7f, 0x7f81817f, 0x7f818181, 0x81818181, 0x7f818181, 0x7f817f81, 0x7f7f817f, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x81817f7f, 0x8181817f, 0x7f818181, 0x817f8181, 0x81817f7f, 0x7f7f817f, 0x817f8181, 0x817f7f81, 0x817f817f, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x817f8181, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f817f81, 0x7f7f7f7f, 0x817f817f, 0x81817f7f, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f817f81, 0x817f817f, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x81818181, 0x817f7f81, 0x7f818181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x817f8181, 0x817f8181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x817f8181, 0x7f817f81, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x817f8181, 0x7f7f817f, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x7f817f81, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x81818181, 0x8181817f, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x7f818181, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x7f818181, 0x81817f7f, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x817f8181, 0x817f7f7f, 0x817f7f81, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x81817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f81817f, 0x817f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, 0x7f817f81, 0x7f818181, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81817f81, 0x817f7f7f, 0x8181817f, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x817f7f81, 0x8181817f, 0x81818181, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x817f8181, 0x817f8181, 0x817f817f, 0x8181817f, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x81817f81, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x8181817f, 0x81818181, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f7f81, 0x817f817f, 0x81818181, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x7f7f8181, 0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x8181817f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x7f817f81, 0x817f7f7f, 0x817f7f81, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x81817f7f, 0x7f817f7f, 0x81817f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f818181, 0x81818181, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f817f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f817f, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f817f81, 0x817f817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f818181, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x7f818181, 0x7f7f817f, 0x81818181, 0x7f7f817f, 0x8181817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x817f7f81, 0x81818181, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x817f817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x7f81817f, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f7f8181, 0x817f8181, 0x8181817f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f81817f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x81818181, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x81818181, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x817f7f7f, 0x8181817f, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x81818181, 0x7f7f817f, 0x817f817f, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x7f7f7f81, 0x817f817f, 0x81817f81, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x81817f81, 0x817f8181, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x8181817f, 0x81818181, 0x81817f7f, 0x817f7f81, 0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f8181, 0x7f7f817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x8181817f, 0x817f817f, 0x81818181, 0x8181817f, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f818181, 0x7f7f8181, 0x8181817f, 0x7f7f817f, 0x81818181, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x81818181, 0x8181817f, 0x7f81817f, 0x81817f81, 0x81817f81, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x81818181, 0x817f8181, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x817f7f81, 0x817f817f, 0x817f817f, 0x81818181, 0x7f81817f, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x81817f7f, 0x7f817f7f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x7f818181, 0x7f7f817f, 0x817f817f, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x7f7f7f7f, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x8181817f, 0x81817f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x817f8181, 0x7f817f7f, 0x7f7f8181, 0x817f7f7f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x7f818181, 0x81818181, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f817f81, 0x817f8181, 0x81818181, 0x81818181, 0x817f7f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f81817f, 0x7f7f8181, 0x8181817f, 0x7f7f817f, 0x7f818181, 0x81817f81, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x817f8181, 0x7f818181, 0x7f818181, 0x817f8181, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x8181817f, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x8181817f, 0x81818181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f81, 0x817f8181, 0x817f7f81, 0x81818181, 0x817f8181, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f817f, 0x8181817f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, 0x817f8181, 0x81817f81, 0x81817f7f, 0x7f7f7f81, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x81817f81, 0x7f7f817f, 0x817f7f7f, 0x7f818181, 0x7f7f8181, 0x7f817f81, 0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x81817f7f, 0x817f7f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x8181817f, 0x817f817f, 0x8181817f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x817f8181, 0x7f81817f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x7f817f81, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x7f817f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f818181, 0x7f817f7f, 0x7f818181, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x7f818181, 0x81817f81, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x817f817f, 0x8181817f, 0x81818181, 0x7f7f7f81, 0x81818181, 0x817f817f, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x81817f7f, 0x7f81817f, 0x817f817f, 0x7f7f7f81, 0x7f818181, 0x81818181, 0x81818181, 0x7f7f7f81, 0x7f817f7f, 0x7f817f81, 0x81817f7f, 0x8181817f, 0x81817f81, 0x817f7f81, 0x817f817f, 0x8181817f, 0x7f818181, 0x817f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x817f8181, 0x817f817f, 0x81817f81, 0x8181817f, 0x7f81817f, 0x7f818181, 0x7f7f7f7f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x8181817f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x81818181, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f817f7f, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x7f817f81, 0x817f7f7f, 0x81817f7f, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x817f7f81, 0x81818181, 0x7f818181, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x81817f81, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x7f7f8181, 0x81817f81, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x7f818181, 0x817f817f, 0x7f818181, 0x817f7f81, 0x81817f81, 0x7f7f7f7f, 0x8181817f, 0x7f817f81, 0x8181817f, 0x81818181, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x817f7f81, 0x81817f7f, 0x817f7f7f, 0x8181817f, 0x81817f7f, 0x817f817f, 0x7f81817f, 0x817f817f, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f7f8181, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x817f7f7f, 0x817f7f7f, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x81817f7f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x81817f7f, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x7f81817f, 0x81817f81, 0x81817f7f, 0x8181817f, 0x8181817f, 0x7f7f8181, 0x7f7f7f7f, 0x81817f7f, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x817f817f, 0x81818181, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x817f8181, 0x81817f7f, 0x817f817f, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x817f8181, 0x817f8181, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x817f817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x81817f7f, 0x7f7f7f81, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x81818181, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x7f81817f, 0x8181817f, 0x817f8181, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x817f7f7f, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x8181817f, 0x817f8181, 0x7f81817f, 0x81817f7f, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x81818181, 0x817f817f, 0x817f8181, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f817f81, 0x7f817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f81, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x7f81817f, 0x81818181, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x7f818181, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f817f81, 0x81818181, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f81, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x81817f81, 0x817f7f7f, 0x7f817f7f, 0x7f818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x817f817f, 0x7f81817f, 0x7f818181, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f818181, 0x7f81817f, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x7f817f81, 0x81818181, 0x81818181, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x7f817f7f, 0x817f8181, 0x7f81817f, 0x81818181, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x817f817f, 0x81818181, 0x817f7f81, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x81817f7f, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x8181817f, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x7f7f817f, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x8181817f, 0x81817f81, 0x817f817f, 0x81818181, 0x7f817f81, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x8181817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x7f817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f7f, 0x817f817f, 0x7f818181, 0x81818181, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x7f818181, 0x817f817f, 0x81818181, 0x7f7f7f81, 0x81818181, 0x81817f7f, 0x817f7f7f, 0x7f818181, 0x817f817f, 0x81817f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x81817f81, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f818181, 0x817f8181, 0x817f7f7f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f81817f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x817f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x81817f81, 0x817f7f7f, 0x81817f7f, 0x7f818181, 0x7f818181, 0x7f817f81, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f81817f, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x7f81817f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x8181817f, 0x817f7f7f, 0x81818181, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x8181817f, 0x8181817f, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, 0x7f817f81, 0x7f818181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x8181817f, 0x817f817f, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x81817f7f, 0x7f81817f, 0x817f7f7f, 0x817f817f, 0x817f7f81, 0x81818181, 0x7f818181, 0x81818181, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x7f817f81, 0x817f7f7f, 0x817f817f, 0x817f8181, 0x817f7f81, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x817f8181, 0x7f818181, 0x7f81817f, 0x817f8181, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x81818181, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f81, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x7f7f7f81, 0x7f818181, 0x7f81817f, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x81818181, 0x81817f81, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f81817f, 0x81817f81, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x817f7f7f, 0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f817f81, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f8181, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x817f8181, 0x817f8181, 0x817f817f, 0x81818181, 0x7f81817f, 0x7f818181, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x81817f81, 0x7f7f7f81, 0x7f817f81, 0x817f7f7f, 0x81817f81, 0x81817f81, 0x7f818181, 0x81817f81, 0x7f817f7f, 0x7f7f8181, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x817f7f7f, 0x81818181, 0x817f8181, 0x7f7f8181, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x81818181, 0x7f81817f, 0x7f818181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x7f7f7f81, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x81817f81, 0x8181817f, 0x7f7f8181, 0x8181817f, 0x8181817f, 0x7f81817f, 0x81818181, 0x8181817f, 0x7f7f8181, 0x81818181, 0x817f8181, 0x817f8181, 0x7f818181, 0x81818181, 0x817f817f, 0x817f7f81, 0x81817f81, 0x81817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x8181817f, 0x817f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x81817f7f, 0x7f818181, 0x81818181, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x81817f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x7f818181, 0x81818181, 0x7f817f81, 0x81817f7f, 0x8181817f, 0x817f8181, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f81, 0x7f818181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x817f8181, 0x817f817f, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f817f, 0x7f817f81, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x7f817f81, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x8181817f, 0x7f818181, 0x8181817f, 0x81818181, 0x817f8181, 0x81817f7f, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, 0x817f8181, 0x8181817f, 0x81817f81, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x817f7f7f, 0x81817f7f, 0x81818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x817f7f81, 0x7f817f7f, 0x81817f81, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f81, 0x7f817f7f, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f81, 0x817f8181, 0x81817f81, 0x8181817f, 0x7f7f8181, 0x7f7f8181, 0x817f7f7f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x817f817f, 0x817f8181, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x817f7f7f, 0x7f818181, 0x81817f7f, 0x7f818181, 0x81818181, 0x817f8181, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x8181817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f818181, 0x7f818181, 0x7f818181, 0x81817f7f, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, 0x81818181, 0x817f817f, 0x81817f81, 0x817f817f, 0x7f817f7f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x8181817f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x81818181, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x7f817f7f, 0x7f81817f, 0x7f818181, 0x7f7f8181, 0x81817f81, 0x81817f81, 0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x817f7f7f, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x7f7f817f, 0x7f817f81, 0x81817f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f81, 0x81817f7f, 0x7f81817f, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f81, 0x81817f81, 0x81818181, 0x817f8181, 0x81818181, 0x817f817f, 0x7f817f7f, 0x81818181, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f7f7f, 0x817f8181, 0x81817f81, 0x81817f81, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x817f7f81, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x7f7f817f, 0x817f817f -output0 = -0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0x9cae44b2, 0xb0bb6e72, 0xf10de0af, 0x512b983d, 0x319a51ec, 0xbf548277, 0x4e71789d, 0xc2645c23, 0x5fb92dfe, 0xd3f357f9, 0x661045e9, 0x75c0cbc6, 0x7a3f88f9, 0x338d9b23, 0x91cddcb1, 0x26653b44, 0x59456601, 0xc96175e8, 0x9eca4c28, 0xcf94eb4e, 0xf2de9546, 0x75a5437b, 0x6506329d, 0xdec978f8, 0x4fdc9af2, 0x0119faa3, 0x2547fa31, 0x1af33692, 0x1670fe27, 0x1640a17f, 0x4fa73a5b, 0x26e5696d, 0x0af49c1e, 0x0f986c62, 0x33edbcd7, 0x7d888c5a, 0x342f5ee7, 0x66cb8e8c, 0x07060a3a, 0x2188b6b9, 0xf3c51f6f, 0x6eb156a6, 0x73c51893, 0xded24f9c, 0x019af43a, 0xa5395f1a, 0xc283f30b, 0x7b995783, 0xa0001c41, 0x6d7b0601, 0x6bf0aacf, 0xb78d3d51, 0x7f48cf8f, 0x8b302f20, 0xbedc689e, 0xcfeee53a, 0x7b3a9cf6, 0x06507c78, 0xc3aaa56e, 0xba5dd9c9, 0x20c3d1f2, 0x2bb833e5, 0x0fe6cb7e, 0x54efb0d6, 0x9f35e88a, 0x2bb893a7, 0xc0799177, 0x192ad6c1, 0x0c2e00c7, 0x11da4a91, 0xa5771c29, 0xe4374dc7, 0x1104c1b9, 0xd4638875, 0xd8fd103a, 0x0ba0c54c, 0x5ebefe53, 0x7d5c04ff, 0x5203d5ac, 0x0ff8744e, 0x2f597bec, 0x8522aab8, 0x19e86b6c, 0xd70574ec, 0x4f8e0649, 0x4c23b0ac, 0x1327dd27, 0xe9a85ef6, 0x4383b49c, 0xf0ed4320, 0xc11157d9, 0x0ab70023, 0xa13a3a3a, 0x4745de72, 0x588c1bd5, 0x9b5bde57, 0x8afc0658, 0xdcc8d4dd, 0x2a17c0ce, 0x4586d708, 0x925726ff, 0xc1a3cb82, 0x6faa49fb, 0xefc0bec4, 0x6d62a3ac, 0x24ae9d74, 0x66deb6d7, 0xb2654337, 0x8b0fa52a, 0x837f3061, 0x3a61cc89, 0x9f85ea27, 0x9d28a3e2, 0xc6d6fc58, 0x9c14864e, 0xad100cb2, 0xd6d7d579, 0x804049ff, 0xf910bfd9, 0xbf853137, 0x185f3010, 0x29674e69, 0xf8526a44, 0xd8a153c3, 0xae166339, 0xe28d1dc3, 0xa89aa0e9, 0x2ce8dbcd, 0x9333368d, 0x8bcda1ad, 0xaa3bb15f, 0xc35f690d, 0xf522728e, 0xffeb9813, 0x06f8ae05, 0x4af99305, 0xa77fb46f, 0x1c92eb48, 0xb26c8bf0, 0x504e3b6c, 0xae44b2fd, 0xbb6e729c, 0x0de0afb0, 0x2b983df1, 0x9a51ec51, 0x54827731, 0x71789dbf, 0x645c234e, 0xb92dfec2, 0xf357f95f, 0x1045e9d3, 0xc0cbc666, 0x3f88f975, 0x8d9b237a, 0xcddcb133, 0x653b4491, 0x45660126, 0x6175e859, 0xca4c28c9, 0x94eb4e9e, 0xde9546cf, 0xa5437bf2, 0x06329d75, 0xc978f865, 0xdc9af2de, 0x19faa34f, 0x47fa3101, 0xf3369225, 0x70fe271a, 0x40a17f16, 0xa73a5b16, 0xe5696d4f, 0xf49c1e26, 0x986c620a, 0xedbcd70f, 0x888c5a33, 0x7d - -basegraph= -1 - -z_c= -384 - -n_cb= -9600 - -q_m= -2 - -n_filler= -0 - -e = -9332 - -rv_index = -0 - -code_block_mode = -1 - -iter_max= -20 - -expected_iter_count= -4 - -op_flags = -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_3_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_3_rv0_drv0.data deleted file mode 100755 index 082d15e4c0..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_3_rv0_drv0.data +++ /dev/null @@ -1,44 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f7f8181, 0x81817f81, 0x7f817f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x817f7f7f, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f7f, 0x8181817f, 0x81817f81, 0x7f7f817f, 0x8181817f, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x81817f7f, 0x81818181, 0x8181817f, 0x817f817f, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x81818181, 0x7f817f7f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x81818181, 0x817f8181, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f7f, 0x7f81817f, 0x81817f7f, 0x81817f81, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x81818181, 0x81817f81, 0x7f817f7f, 0x8181817f, 0x817f817f, 0x817f7f7f, 0x7f818181, 0x817f8181, 0x817f7f81, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x7f818181, 0x81817f81, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x7f7f7f7f, 0x7f818181, 0x81817f81, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x7f817f7f, 0x81818181, 0x817f8181, 0x81818181, 0x81817f81, 0x81817f81, 0x81818181, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f81817f, 0x81818181, 0x817f7f7f, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x8181817f, 0x817f7f81, 0x817f7f81, 0x7f818181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f81, 0x81817f7f, 0x8181817f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x7f7f817f, 0x81817f81, 0x817f8181, 0x81817f7f, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x7f817f81, 0x7f818181, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x81817f81, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x817f8181, 0x7f818181, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x81818181, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x817f8181, 0x7f818181, 0x817f7f7f, 0x7f81817f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x81817f81, 0x7f7f8181, 0x81818181, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x8181817f, 0x817f817f, 0x817f817f, 0x7f7f7f7f, 0x81817f7f, 0x81817f7f, 0x81818181, 0x8181817f, 0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x817f7f81, 0x81817f7f, 0x7f7f817f, 0x81818181, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x817f817f, 0x7f7f7f81, 0x81817f81, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, 0x81817f7f, 0x817f817f, 0x7f817f81, 0x817f817f, 0x7f7f817f, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x81817f81, 0x7f817f7f, 0x81818181, 0x8181817f, 0x817f817f, 0x817f7f81, 0x7f817f7f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x8181817f, 0x8181817f, 0x81817f81, 0x7f7f7f81, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f817f, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x81817f81, 0x8181817f, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x81817f81, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x817f817f, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x81818181, 0x7f7f8181, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x8181817f, 0x7f817f81, 0x817f817f, 0x817f8181, 0x7f818181, 0x7f81817f, 0x7f818181, 0x7f7f8181, 0x8181817f, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x81817f7f, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f81, 0x81817f7f, 0x7f817f7f, 0x81817f7f, 0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x817f817f, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x81818181, 0x81818181, 0x7f817f7f, 0x81818181, 0x817f8181, 0x81817f7f, 0x7f817f7f, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x817f8181, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, 0x817f8181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x817f8181, 0x7f818181, 0x81817f7f, 0x81818181, 0x7f81817f, 0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x8181817f, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x817f817f, 0x7f818181, 0x7f7f8181, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f81817f, 0x8181817f, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x817f8181, 0x817f817f, 0x817f817f, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x81817f7f, 0x8181817f, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x7f81817f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x7f81817f, 0x8181817f, 0x81817f81, 0x81818181, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f817f7f, 0x7f817f81, 0x7f7f7f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x817f817f, 0x7f7f8181, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, 0x817f7f81, 0x817f7f81, 0x817f8181, 0x817f7f81, 0x7f81817f, 0x817f8181, 0x7f818181, 0x7f818181, 0x81818181, 0x817f817f, 0x7f817f7f, 0x7f7f817f, 0x817f8181, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x7f81817f, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x81817f7f, 0x81818181, 0x8181817f, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x7f818181, 0x8181817f, 0x817f8181, 0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x817f817f, 0x81818181, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x81818181, 0x817f8181, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x7f81817f, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x81817f7f, 0x7f7f8181, 0x81817f81, 0x817f817f, 0x817f8181, 0x7f7f817f, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x817f817f, 0x7f818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f817f, 0x7f7f8181, 0x81818181, 0x81817f7f, 0x817f8181, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x81817f7f, 0x81818181, 0x7f818181, 0x81817f81, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x81817f81, 0x7f7f817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x817f817f, 0x817f7f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x81817f7f, 0x7f817f7f, 0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x81817f7f, 0x817f8181, 0x7f818181, 0x7f7f817f, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x817f7f81, 0x7f7f7f7f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x817f817f, 0x817f8181, 0x7f81817f, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x81817f7f, 0x81818181, 0x817f7f81, 0x81817f7f, 0x7f818181, 0x7f817f7f, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x7f81817f, 0x7f817f7f, 0x81818181, 0x81818181, 0x81817f7f, 0x81817f7f, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x7f817f7f, 0x8181817f, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x7f817f7f, 0x817f8181, 0x7f817f81, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x7f817f7f, 0x81818181, 0x817f817f, 0x81818181, 0x817f817f, 0x7f81817f, 0x7f7f8181, 0x817f817f, 0x8181817f, 0x7f81817f, 0x817f7f81, 0x81817f81, 0x81818181, 0x7f818181, 0x817f817f, 0x8181817f, 0x817f817f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x7f7f8181, 0x817f8181, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x81817f7f, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x817f817f, 0x81818181, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x81817f7f, 0x8181817f, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x817f8181, 0x817f817f, 0x7f7f817f, 0x81818181, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x8181817f, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f7f, 0x817f7f81, 0x817f7f81, 0x817f8181, 0x817f7f81, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x7f818181, 0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x817f7f81, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81818181, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x81818181, 0x817f7f81, 0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x817f8181, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x8181817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x8181817f, 0x81817f81, 0x7f818181, 0x817f7f81, 0x81817f81, 0x817f817f, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f817f81, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x8181817f, 0x7f818181, 0x81818181, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f7f7f81, 0x7f7f817f, 0x7f7f8181, 0x81817f81, 0x81818181, 0x8181817f, 0x7f81817f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x7f817f81, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f817f81, 0x7f817f81, 0x81818181, 0x81818181, 0x7f818181, 0x7f7f817f, 0x7f7f7f7f, 0x8181817f, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f818181, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x8181817f, 0x817f8181, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f817f7f, 0x81817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f7f8181, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f7f, 0x81817f81, 0x7f7f7f81, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x817f7f7f, 0x817f8181, 0x817f817f, 0x7f817f7f, 0x7f818181, 0x817f7f7f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x817f7f7f, 0x7f7f8181, 0x817f817f, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f818181, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x817f817f, 0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x7f7f817f, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f818181, 0x7f817f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x817f7f7f, 0x817f8181, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x7f818181, 0x817f7f7f, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x81818181, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x81817f7f, 0x81817f81, 0x7f817f81, 0x7f7f817f, 0x8181817f, 0x817f817f, 0x7f817f81, 0x7f818181, 0x8181817f, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x7f817f7f, 0x817f7f7f, 0x8181817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x7f817f7f, 0x817f7f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, 0x817f7f7f, 0x7f817f7f, 0x81817f7f, 0x81818181, 0x81817f7f, 0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x81818181, 0x81818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x81817f81, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x7f7f817f, 0x81817f7f, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x81817f81, 0x817f8181, 0x817f817f, 0x817f8181, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x7f818181, 0x81818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x8181817f, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x81818181, 0x81817f81, 0x81817f7f, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f81817f, 0x7f81817f, 0x817f817f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f81817f, 0x817f8181, 0x81817f7f, 0x817f7f81, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x817f7f81, 0x81817f81, 0x817f817f, 0x817f8181, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f7f, 0x81817f81, 0x7f81817f, 0x7f817f7f, 0x7f818181, 0x7f818181, 0x817f8181, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x7f817f81, 0x81817f81, 0x7f818181, 0x8181817f, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x817f817f, 0x8181817f, 0x81818181, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x81818181, 0x817f817f, 0x81817f81, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x817f817f, 0x8181817f, 0x7f7f817f, 0x817f817f, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x7f7f817f, 0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x817f8181, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f817f, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f81, 0x7f7f8181, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x817f8181, 0x7f818181, 0x7f7f7f81, 0x8181817f, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x817f817f, 0x81818181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f7f81, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x81817f81, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f81817f, 0x8181817f, 0x81817f81, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x7f818181, 0x817f7f7f, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x81818181, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x81817f81, 0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f - -output0 = -0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0x9cae44b2, 0xb0bb6e72, 0xf10de0af, 0x512b983d, 0x319a51ec, 0xbf548277, 0x4e71789d, 0xc2645c23, 0x5fb92dfe, 0xd3f357f9, 0x661045e9, 0x75c0cbc6, 0x7a3f88f9, 0x338d9b23, 0x91cddcb1, 0x26653b44, 0x59456601, 0xc96175e8, 0x9eca4c28, 0xcf94eb4e, 0xf2de9546, 0x75a5437b, 0x6506329d, 0xdec978f8, 0x4fdc9af2, 0x0119faa3, 0x2547fa31, 0x1af33692, 0x1670fe27, 0x1640a17f, 0x4fa73a5b, 0x26e5696d, 0x0af49c1e, 0x0f986c62, 0x33edbcd7, 0x7d888c5a, 0x342f5ee7, 0x66cb8e8c, 0x07060a3a, 0x2188b6b9, 0xf3c51f6f, 0x6eb156a6, 0x73c51893, 0xded24f9c, 0x019af43a, 0xa5395f1a, 0xc283f30b, 0x7b995783, 0xa0001c41, 0x6d7b0601, 0x6bf0aacf, 0xb78d3d51, 0x7f48cf8f, 0x8b302f20, 0xbedc689e, 0xcfeee53a, 0x7b3a9cf6, 0x06507c78, 0xc3aaa56e, 0xba5dd9c9, 0x20c3d1f2, 0x2bb833e5, 0x0fe6cb7e, 0x54efb0d6, 0x9f35e88a, 0x2bb893a7, 0xc0799177, 0x192ad6c1, 0x0c2e00c7, 0x11da4a91, 0xa5771c29, 0xe4374dc7, 0x1104c1b9, 0xd4638875, 0xd8fd103a, 0x0ba0c54c, 0x5ebefe53, 0x7d5c04ff, 0x5203d5ac, 0x0ff8744e, 0x2f597bec, 0x8522aab8, 0x19e86b6c, 0xd70574ec, 0x4f8e0649, 0x4c23b0ac, 0x1327dd27, 0xe9a85ef6, 0x9c - -basegraph= -1 - -z_c= -256 - -n_cb= -6400 - -q_m= -2 - -n_filler= -0 - -e = -6224 - -rv_index = -0 - -code_block_mode = -1 - -iter_max= -63 - -expected_iter_count= -4 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_4_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_4_rv0_drv0.data deleted file mode 100755 index 23578c5650..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_4_rv0_drv0.data +++ /dev/null @@ -1,44 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x7f7f7f81, 0x8181817f, 0x7f81817f, 0x7f818181, 0x817f7f7f, 0x8181817f, 0x8181817f, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f7f8181, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x7f818181, 0x81818181, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f81, 0x8181817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x817f7f81, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x7f7f7f7f, 0x8181817f, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x81817f81, 0x7f81817f, 0x7f7f7f7f, 0x81818181, 0x7f817f7f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f7f, 0x81817f81, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x817f7f81, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x817f817f, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x817f8181, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x81818181, 0x8181817f, 0x8181817f, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x817f8181, 0x817f817f, 0x8181817f, 0x8181817f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x7f81817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x7f818181, 0x81818181, 0x8181817f, 0x817f817f, 0x7f7f8181, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x81817f81, 0x7f817f7f, 0x81818181, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x817f8181, 0x7f818181, 0x817f7f7f, 0x7f817f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x7f818181, 0x8181817f, 0x8181817f, 0x7f817f81, 0x81818181, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f7f81, 0x81817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x817f817f, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f818181, 0x817f7f81, 0x7f818181, 0x81818181, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x81817f81, 0x7f818181, 0x817f7f7f, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x7f817f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x81817f81, 0x7f7f8181, 0x7f817f7f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f818181, 0x7f7f817f, 0x7f7f8181, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f7f81, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x7f818181, 0x7f817f7f, 0x81817f7f, 0x817f7f7f, 0x817f8181, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x817f7f7f, 0x7f818181, 0x7f7f817f, 0x7f7f817f, 0x7f81817f, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f7f7f81, 0x817f7f7f, 0x7f818181, 0x7f7f7f81, 0x7f817f7f, 0x817f7f81, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f817f, 0x81818181, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x81817f7f, 0x81817f81, 0x817f8181, 0x81818181, 0x817f7f81, 0x81818181, 0x8181817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x81817f7f, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x817f8181, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x81818181, 0x7f7f7f81, 0x7f81817f, 0x817f8181, 0x817f8181, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x81818181, 0x81817f7f, 0x81817f81, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f817f7f, 0x7f7f8181, 0x817f8181, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x7f818181, 0x81817f81, 0x7f81817f, 0x817f817f, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f818181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f817f81, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x81818181, 0x7f7f817f, 0x817f8181, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x817f817f, 0x7f817f81, 0x7f818181, 0x7f817f7f, 0x81817f7f, 0x81818181, 0x7f81817f, 0x817f7f81, 0x81818181, 0x817f8181, 0x817f8181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x817f7f81, 0x81817f7f, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81817f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f817f7f, 0x7f817f7f, 0x8181817f, 0x81818181, 0x7f817f7f, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x817f7f81, 0x817f7f81, 0x817f7f7f, 0x81818181, 0x7f818181, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x7f817f7f, 0x81818181, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x8181817f, 0x7f818181, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x7f818181, 0x7f818181, 0x8181817f, 0x817f817f, 0x7f817f81, 0x7f7f7f81, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x8181817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f817f7f, 0x7f818181, 0x7f7f7f81, 0x7f818181, 0x8181817f, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x81817f7f, 0x817f7f81, 0x81818181, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x817f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x7f817f81, 0x81817f81, 0x7f81817f, 0x81817f7f, 0x8181817f, 0x8181817f, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x7f818181, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x81817f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f81, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x7f817f7f, 0x81817f7f, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f81, 0x7f7f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x817f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f817f7f, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x81817f81, 0x7f7f7f7f, 0x81818181, 0x7f817f81, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x7f7f8181, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f81817f, 0x817f8181, 0x81817f7f, 0x817f817f, 0x7f7f8181, 0x81817f81, 0x7f817f81, 0x8181817f, 0x7f817f7f, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x817f817f, 0x817f8181, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x8181817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x81817f7f, 0x81818181, 0x8181817f, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x7f817f81, 0x8181817f, 0x7f81817f, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x81818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x81817f81, 0x7f818181, 0x81817f7f, 0x817f7f81, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x817f817f, 0x817f817f, 0x81817f7f, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x7f817f81, 0x7f81817f, 0x817f8181, 0x7f81817f, 0x7f817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f81817f, 0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x7f81817f, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x8181817f, 0x7f818181, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x817f817f, 0x81818181, 0x7f817f7f, 0x81817f81, 0x7f7f7f7f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x817f7f7f, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x81817f81, 0x817f7f81, 0x817f8181, 0x81818181, 0x817f8181, 0x7f81817f, 0x81818181, 0x7f818181, 0x81817f81, 0x8181817f, 0x817f817f, 0x7f7f8181, 0x81817f7f, 0x7f7f817f, 0x817f817f, 0x7f81817f, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x7f817f81, 0x7f7f817f, 0x7f7f8181, 0x7f818181, 0x817f8181, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x7f81817f, 0x8181817f, 0x7f817f81, 0x7f818181, 0x817f817f, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x81817f7f, 0x81818181, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x817f8181, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f817f, 0x7f81817f, 0x81817f81, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x817f7f81, 0x7f7f817f, 0x7f817f81, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x7f817f81, 0x817f817f, 0x7f81817f, 0x817f8181, 0x81817f81, 0x817f817f, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x817f8181, 0x7f817f81, 0x81817f7f, 0x817f7f81, 0x817f8181, 0x817f8181, 0x81817f7f, 0x817f7f7f, 0x817f7f7f, 0x7f818181, 0x817f817f, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f81817f, 0x7f818181, 0x81818181, 0x7f817f7f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x81818181, 0x817f8181, 0x7f81817f, 0x81817f81, 0x7f818181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x7f818181, 0x817f8181, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x7f817f7f, 0x7f818181, 0x7f7f7f7f, 0x817f8181, 0x817f7f7f, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x817f817f, 0x7f817f81, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x817f7f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x81818181, 0x7f81817f, 0x81818181, 0x7f81817f, 0x81818181, 0x817f7f7f, 0x81817f7f, 0x81818181, 0x81817f7f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x81817f81, 0x7f81817f, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f81817f, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f81817f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x7f81817f, 0x8181817f, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x7f81817f, 0x817f7f81, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x81818181, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x81817f7f, 0x817f7f81, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x8181817f, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f7f, 0x817f8181, 0x7f817f81, 0x81818181, 0x817f7f81, 0x817f7f81, 0x81818181, 0x817f8181, 0x81817f7f, 0x81817f81, 0x7f7f7f81, 0x817f817f, 0x817f7f7f, 0x7f81817f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x81818181, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x817f7f81, 0x817f7f81, 0x817f817f, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x81818181, 0x7f7f8181, 0x8181817f, 0x817f8181, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x7f818181, 0x7f818181, 0x817f8181, 0x817f817f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f817f81, 0x817f817f, 0x7f817f7f, 0x8181817f, 0x81817f7f, 0x817f7f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x81818181, 0x81817f81, 0x81817f7f, 0x81817f81, 0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f7f7f, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x8181817f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x7f817f7f, 0x7f81817f, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x7f7f7f81, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x7f7f817f, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x81818181, 0x7f7f8181, 0x7f81817f, 0x7f81817f, 0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x81817f7f, 0x7f7f8181, 0x81818181, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f81817f, 0x81818181, 0x81817f81, 0x7f818181, 0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x7f818181, 0x8181817f, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x7f81817f, 0x817f817f, 0x817f8181, 0x81817f7f, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f817f7f, 0x7f817f7f, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f7f7f, 0x7f818181, 0x7f7f7f7f, 0x817f8181, 0x817f7f7f, 0x817f817f, 0x817f817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, 0x7f7f817f, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x817f817f, 0x8181817f, 0x81817f7f, 0x81817f81, 0x81818181, 0x7f7f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, 0x817f7f81, 0x7f818181, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x81817f7f, 0x8181817f, 0x7f7f8181, 0x8181817f, 0x7f81817f, 0x7f818181, 0x8181817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x817f7f81, 0x81817f7f, 0x817f817f, 0x7f818181, 0x817f7f7f, 0x81817f7f, 0x817f817f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x7f818181, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x81818181, 0x8181817f, 0x817f8181, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x81817f81, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f817f81, 0x817f817f, 0x7f818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x7f81817f, 0x81817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f817f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x817f8181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x817f7f81, 0x81818181, 0x7f7f817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x81817f81, 0x817f8181, 0x8181817f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x81817f81, 0x7f818181 - -output0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xf1f312fe, 0x8abcb1ed, 0xf3550fd6, 0x8060deb6, 0x82380005, 0xc1ea99de, 0xd0cfc143, 0x58fa9ca5, 0x5c2f5980, 0x39f24b7b, 0xc918a3ce, 0x656a8d76, 0xf6f8a3cf, 0x9d6d1184, 0x5c5060e0, 0x3171d366, 0xe77af42c, 0xf24290f4, 0x1df2f5e8, 0x56c1a6eb, 0x3be35b07, 0xdaee3c1b, 0x65dfcb90, 0x8ba0ede7, 0x311e72b1, 0x772ffa8a, 0xd863ce1d, 0x8974177a, 0x87d85875, 0x927596d1, 0x0481e7fa, 0x9768d335, 0x90a5f29b, 0x13e11b45, 0x73cbac15, 0x9301bfde, 0xf3026564, 0x794a8697, 0x552e6f6b, 0x2880a6cd, 0xe780e65f, 0xf68c45fe, 0x254e9ac4, 0x8509c8f8, 0xfc - -basegraph= -1 - -z_c= -128 - -n_cb= -8448 - -q_m= -2 - -n_filler= -0 - -e= -5632 - -rv_index= -0 - -code_block_mode= -1 - -iter_max= -20 - -expected_iter_count= -4 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - -expected_status= -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_5_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_5_rv0_drv0.data deleted file mode 100755 index 5dfb56fbe9..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_5_rv0_drv0.data +++ /dev/null @@ -1,44 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x8181817f, 0x81817f7f, 0x817f817f, 0x7f7f817f, 0x81817f81, 0x817f7f81, 0x81818181, 0x7f817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f817f, 0x8181817f, 0x817f817f, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x81818181, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x817f817f, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x817f7f81, 0x81817f7f, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x817f817f, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x81818181, 0x7f817f81, 0x817f7f7f, 0x817f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f817f, 0x7f81817f, 0x817f7f7f, 0x81818181, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x817f817f, 0x817f8181, 0x81817f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f817f7f, 0x817f8181, 0x8181817f, 0x8181817f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x81817f81, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x817f8181, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x81818181, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f7f817f, 0x81818181, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x7f7f8181, 0x8181817f, 0x7f817f81, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x7f81817f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x817f7f81, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f8181, 0x8181817f, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x81817f81, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f81817f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x8181817f, 0x7f81817f, 0x817f7f7f, 0x8181817f, 0x817f817f, 0x7f817f7f, 0x8181817f, 0x81817f7f, 0x81817f7f, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x81817f81, 0x8181817f, 0x81818181, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x8181817f, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f7f, 0x81817f7f, 0x7f817f81, 0x7f818181, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f7f, 0x7f818181, 0x8181817f, 0x81817f7f, 0x817f8181, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x81818181, 0x81817f81, 0x81818181, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x81817f81, 0x81817f7f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x7f7f817f, 0x7f7f7f7f, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f81, 0x81817f81, 0x817f7f81, 0x81817f81, 0x81817f81, 0x81817f81, 0x817f7f7f, 0x817f817f, 0x817f7f81, 0x817f7f7f, 0x8181817f, 0x81817f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x817f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x81817f7f, 0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x81818181, 0x817f8181, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x7f7f7f7f, 0x7f7f8181, 0x81817f81, 0x817f8181, 0x817f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x7f817f81, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x7f81817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f818181, 0x7f7f817f, 0x817f817f, 0x81817f7f, 0x7f817f81, 0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f7f7f81, 0x817f8181, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x817f7f7f, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x7f817f81, 0x7f7f8181, 0x7f818181, 0x7f81817f, 0x7f817f7f, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x7f817f81, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x817f8181, 0x81817f7f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x817f8181, 0x7f7f8181, 0x7f818181, 0x7f7f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x7f817f81, 0x7f81817f, 0x81817f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x817f8181, 0x81818181, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x7f7f817f, 0x7f7f817f, 0x81818181, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x7f7f8181, 0x81818181, 0x7f818181, 0x7f817f81, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x7f7f8181, 0x8181817f, 0x81817f81, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x7f817f81, 0x7f81817f, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f818181, 0x8181817f, 0x81817f7f, 0x817f817f, 0x817f817f, 0x8181817f, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x817f817f, 0x817f817f, 0x8181817f, 0x7f7f7f7f, 0x81818181, 0x817f817f, 0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x7f818181, 0x7f817f7f, 0x817f8181, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x817f7f81, 0x81817f81, 0x817f7f81, 0x8181817f, 0x817f817f, 0x7f817f81, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x7f81817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x817f7f81, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x81817f7f, 0x7f817f81, 0x7f7f7f81 - -output0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xfe - -basegraph= -1 - -z_c= -64 - -n_cb= -4224 - -q_m= -2 - -n_filler= -0 - -e= -2240 - -rv_index= -0 - -code_block_mode= -1 - -iter_max= -63 - -expected_iter_count= -4 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - -expected_status= -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_6_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_6_rv0_drv0.data deleted file mode 100755 index e9867645ec..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_6_rv0_drv0.data +++ /dev/null @@ -1,44 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x81818181, 0x7f818181, 0x817f7f7f, 0x817f817f, 0x817f817f, 0x7f81817f, 0x81818181, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x7f817f81, 0x7f7f7f81, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x7f81817f, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x81817f81, 0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f818181, 0x7f7f7f7f, 0x81818181, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x7f7f8181, 0x817f817f, 0x81818181, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x81817f81, 0x81818181, 0x81817f81, 0x81818181, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x817f7f81, 0x8181817f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x7f817f81, 0x81818181, 0x81818181, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x817f7f81, 0x817f7f7f, 0x8181817f, 0x817f7f81, 0x81817f81, 0x817f7f81, 0x81817f81, 0x7f818181, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x817f817f, 0x817f7f81, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x817f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x81817f7f, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f817f81, 0x817f817f, 0x817f7f81, 0x7f818181, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x81818181, 0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x8181817f, 0x81818181, 0x817f8181, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x81818181, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f81, 0x817f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x817f817f, 0x81817f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x817f8181, 0x81817f7f, 0x817f8181, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x7f7f8181, 0x7f817f7f, 0x81817f81, 0x817f8181, 0x817f7f81, 0x817f7f7f, 0x817f7f81, 0x8181817f, 0x7f818181, 0x817f8181, 0x81817f81, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f817f7f, 0x817f7f81, 0x7f7f8181, 0x81818181, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x81818181, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x81817f81, 0x7f817f7f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x7f818181, 0x7f818181, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x81817f7f, 0x7f817f81, 0x81818181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x7f818181, 0x8181817f, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f81, 0x7f81817f, 0x81818181, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x81818181, 0x817f7f81, 0x817f817f, 0x7f7f8181, 0x81818181, 0x8181817f, 0x7f7f817f, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x817f817f, 0x81817f81, 0x7f818181, 0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, 0x7f81817f, 0x7f817f7f, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x81818181, 0x7f7f8181, 0x81818181, 0x8181817f, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x7f7f817f, 0x817f7f7f, 0x81817f81, 0x7f7f8181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x81818181, 0x7f817f81, 0x81818181, 0x7f818181, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x81817f81, 0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x817f7f7f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x7f817f81, 0x817f8181, 0x81817f81, 0x817f817f, 0x81817f7f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x8181817f, 0x81818181, 0x7f817f7f, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x817f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x817f7f7f, 0x7f818181, 0x7f817f81, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x7f817f81, 0x7f7f7f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x7f817f81, 0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x81818181, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x7f7f8181, 0x817f817f, 0x7f7f7f7f, 0x81817f81, 0x81818181, 0x8181817f, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f817f81, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x81818181, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x81818181, 0x7f7f8181, 0x7f81817f, 0x7f7f8181, 0x7f7f817f, 0x817f817f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f7f, 0x817f817f, 0x817f7f7f, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x7f7f8181, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f8181, 0x7f818181, 0x817f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x81817f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f817f7f, 0x7f818181, 0x817f7f7f, 0x81817f81, 0x81818181, 0x81817f81, 0x7f817f7f, 0x817f817f, 0x817f817f, 0x817f7f81, 0x817f8181, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x7f7f817f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x817f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f818181, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x81817f7f, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x817f8181, 0x7f817f7f, 0x7f7f7f81, 0x8181817f, 0x8181817f, 0x7f818181, 0x817f817f, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x817f817f, 0x81818181, 0x81818181, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f81817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f817f, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x817f8181, 0x8181817f, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x7f81817f, 0x81817f81, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x7f817f81, 0x817f817f, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x7f81817f, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x8181817f, 0x81817f81, 0x7f817f81, 0x7f818181, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x817f817f, 0x8181817f, 0x817f817f, 0x817f817f, 0x817f8181, 0x7f818181, 0x7f818181, 0x7f7f817f, 0x817f8181, 0x7f818181, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x81818181, 0x7f818181, 0x7f81817f, 0x7f817f7f, 0x7f817f81, 0x7f817f81, 0x817f817f, 0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f818181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x81818181, 0x7f7f7f7f, 0x817f817f, 0x81817f7f, 0x8181817f, 0x8181817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x7f81817f, 0x817f8181, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x817f817f, 0x7f818181, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x7f818181, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f818181, 0x817f7f81, 0x81818181, 0x7f7f7f81, 0x7f818181, 0x8181817f, 0x817f8181, 0x7f7f8181, 0x7f7f7f81, 0x7f817f7f, 0x817f817f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x81818181, 0x81817f81, 0x7f81817f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x81817f7f - -output0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xf1f312fe, 0x8abcb1ed, 0xf3550fd6, 0x8060deb6, 0x82380005, 0xc1ea99de, 0xd0cfc143, 0x58fa9ca5, 0x5c2f5980, 0x39f24b7b, 0xc918a3ce, 0x656a8d76, 0xf6f8a3cf, 0x9d6d1184, 0x5c5060e0, 0x3171d366, 0xe77af42c, 0xf24290f4, 0x1df2f5e8, 0x56c1a6eb, 0x3be35b07, 0xdaee3c1b, 0x65dfcb90, 0x8ba0ede7, 0x311e72b1, 0x772ffa8a, 0xd863ce1d, 0x8974177a, 0x87d85875, 0x927596d1, 0x0481e7fa, 0x9768d335, 0x90a5f29b, 0x13e11b45, 0x73cbac15, 0x9301bfde, 0x64 - -basegraph= -2 - -z_c= -256 - -n_cb= -12800 - -q_m= -2 - -n_filler= -0 - -e= -3200 - -rv_index= -0 - -code_block_mode= -1 - -iter_max= -63 - -expected_iter_count= -4 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - -expected_status= -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_7_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_7_rv0_drv0.data deleted file mode 100755 index 24568bd062..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_7_rv0_drv0.data +++ /dev/null @@ -1,45 +0,0 @@ - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x7f7f7f81, 0x81817f7f, 0x7f817f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x81818181, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f7f81, 0x81818181, 0x817f817f, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f818181, 0x8181817f, 0x8181817f, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f7f8181, 0x7f817f7f, 0x81817f81, 0x817f817f, 0x8181817f, 0x8181817f, 0x7f7f8181, 0x817f817f, 0x7f7f7f7f, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x817f8181, 0x817f8181, 0x81817f81, 0x817f8181, 0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f8181, 0x81818181, 0x817f7f81, 0x817f7f7f, 0x81817f81, 0x8181817f, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x81817f7f, 0x7f817f7f, 0x81818181, 0x81817f81, 0x81817f7f, 0x7f81817f, 0x817f7f81, 0x7f7f817f, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x817f817f, 0x7f81817f, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x817f7f7f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x81818181, 0x7f817f7f, 0x7f818181, 0x81817f81, 0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f7f7f, 0x7f818181, 0x81817f7f, 0x81818181, 0x81817f81, 0x7f818181, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x7f7f817f, 0x817f7f7f, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x817f7f81, 0x817f817f, 0x81817f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x7f817f81, 0x7f818181, 0x7f817f81, 0x7f818181, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x817f8181, 0x8181817f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f817f81, 0x7f817f81, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f7f817f, 0x81818181, 0x7f7f7f7f, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x8181817f, 0x7f817f81, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x817f7f81, 0x817f7f7f, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x7f7f7f81, 0x817f8181, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x817f817f, 0x817f817f, 0x81818181, 0x817f7f81, 0x7f817f7f, 0x7f818181, 0x7f817f7f, 0x817f817f, 0x817f8181, 0x8181817f, 0x81818181, 0x81817f81, 0x7f7f7f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x817f817f, 0x81818181, 0x817f7f81, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x7f818181, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x81817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f81817f, 0x817f7f7f, 0x81817f81, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f817f, 0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x7f7f7f81, 0x817f7f7f, 0x81817f7f, 0x7f817f7f, 0x7f81817f, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x817f817f, 0x81818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x8181817f, 0x81817f81, 0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x817f7f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x8181817f, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x7f817f81, 0x81817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f8181, 0x7f818181, 0x7f817f81, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x81817f7f, 0x81818181, 0x7f818181, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, 0x81817f7f, 0x7f817f81, 0x7f817f81, 0x7f7f7f81, 0x81817f81, 0x81817f7f, 0x8181817f, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x81817f81, 0x7f817f7f, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x817f7f7f, 0x7f818181, 0x7f7f817f, 0x7f7f817f, 0x81817f81, 0x817f8181, 0x817f7f7f, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x8181817f, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x7f817f7f, 0x7f81817f, 0x7f81817f, 0x817f8181, 0x817f7f81, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f81817f, 0x817f8181, 0x8181817f, 0x7f7f7f81, 0x817f817f, 0x817f817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f818181, 0x7f7f7f81, 0x7f7f7f81, 0x817f7f81, 0x817f817f, 0x81818181, 0x7f818181, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x81818181, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f817f81, 0x7f817f7f, 0x7f7f817f, 0x7f7f817f, 0x817f817f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x817f817f, 0x817f8181, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f7f81, 0x81817f7f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x7f81817f, 0x81818181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x81818181, 0x7f818181, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f7f8181, 0x7f818181, 0x81817f81, 0x817f7f81, 0x817f7f81, 0x81817f81, 0x817f8181, 0x817f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x81817f81, 0x81817f7f, 0x817f8181, 0x7f7f8181, 0x7f7f817f, 0x7f7f8181, 0x817f7f7f, 0x7f818181, 0x81817f7f, 0x817f8181, 0x817f7f7f, 0x81817f7f, 0x8181817f, 0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f7f81, 0x8181817f, 0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x817f7f7f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x7f817f81, 0x7f7f7f81, 0x817f7f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x81818181, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x817f8181 - -output0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60 - -basegraph= -2 - -z_c= -128 - -n_cb= -6400 - -q_m= -2 - -n_filler= -8 - -e = -2624 - -rv_index = -0 - -code_block_mode = -1 - -iter_max= -63 - -expected_iter_count= -4 - -op_flags = -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_8_rv0_drv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_8_rv0_drv0.data deleted file mode 100755 index eb8de69067..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_dec_scn_8_rv0_drv0.data +++ /dev/null @@ -1,45 +0,0 @@ - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x81817f81, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x817f7f81, 0x7f7f7f81, 0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f7f7f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x7f7f7f7f, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x7f7f817f, 0x81817f7f, 0x81817f7f, 0x7f7f817f, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x7f818181, 0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x817f817f, 0x81817f7f, 0x817f817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f81, 0x81817f81, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f818181, 0x8181817f, 0x7f818181, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x817f817f, 0x7f7f7f7f, 0x7f817f7f, 0x817f7f7f, 0x7f818181, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x817f7f7f, 0x817f817f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f81, 0x7f818181, 0x8181817f, 0x7f7f817f, 0x7f817f81, 0x817f8181, 0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x8181817f, 0x81817f81, 0x7f7f7f7f, 0x7f81817f, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x8181817f, 0x817f8181, 0x81817f81, 0x81817f81, 0x81818181, 0x7f7f817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x817f817f, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x817f7f81, 0x81817f81, 0x7f7f817f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x7f7f7f81, 0x7f817f81, 0x7f7f7f81, 0x7f817f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f8181, 0x817f8181, 0x81817f81, 0x81817f81, 0x81817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x817f8181, 0x817f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f81817f, 0x7f7f7f81, 0x81818181, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, 0x7f81817f, 0x7f7f817f, 0x7f818181, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x817f817f, 0x817f7f81, 0x817f8181, 0x81817f7f, 0x7f818181, 0x817f7f7f, 0x817f7f81, 0x81818181, 0x7f81817f, 0x7f81817f, 0x81817f7f, 0x81817f7f, 0x7f7f8181, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x81817f7f, 0x8181817f, 0x81818181, 0x7f81817f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f7f817f, 0x817f8181, 0x7f818181, 0x7f817f7f, 0x7f81817f, 0x7f818181, 0x81818181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f7f7f, 0x7f81817f, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x7f817f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f7f817f, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x8181817f, 0x817f8181, 0x817f8181, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x7f7f8181, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x7f817f81, 0x7f7f7f81, 0x817f7f7f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x7f818181, 0x81817f7f, 0x81817f7f, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x817f7f81, 0x7f818181, 0x81818181, 0x7f817f7f, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x8181817f, 0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f818181, 0x8181817f, 0x817f7f7f, 0x817f8181, 0x7f7f8181, 0x7f7f817f, 0x7f818181, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x81818181, 0x7f817f81, 0x817f817f, 0x817f8181, 0x817f7f81, 0x7f818181, 0x7f7f7f7f, 0x817f8181, 0x7f817f81, 0x817f817f, 0x8181817f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f81817f, 0x81817f81, 0x817f7f81, 0x7f818181, 0x81817f81, 0x81817f7f, 0x7f818181, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f7f817f, 0x817f7f81, 0x81817f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x7f817f7f, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x817f817f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x81818181 - -output0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xc8 - -basegraph= -2 - -z_c= -32 - -n_cb= -1600 - -q_m= -2 - -n_filler= -0 - -e= -1600 - -rv_index= -0 - -code_block_mode= -1 - -iter_max= -63 - -expected_iter_count= -4 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - -expected_status= -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_1_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_1_rv0.data deleted file mode 100755 index 8377b7da76..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_1_rv0.data +++ /dev/null @@ -1,38 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0xb2 - -output0 = -0xd0cb4a0f, 0xad2b9e58, 0x7cbd8ee4, 0x69b3ea44, 0xeeac54df, 0xc9c02427, 0x774a91f9, 0x7a9cfbd2, 0xc0de1a96, 0x6b3a8b1c, 0x822e47d2, 0x46a001f0, 0xd9493df3, 0x7bb5d313, 0xb85d5514, 0x4282b041, 0xcde3d920, 0xd7080357, 0x2f3fa543, 0x6fb16289, 0x2f0aa375, 0x83df31a8, 0x304116e0, 0x263f1656, 0x1e3890c1, 0xdd0e31e6, 0xb3af5042, 0xf121c4a7, 0x14c927e0, 0x4e368b05, 0xa98ff8fe, 0xfefbe873, 0xe4637404, 0xe4cce32a, 0x5b5172e2, 0xac605c67, 0x85fb607a, 0xe1adaf14, 0xc673ce2f, 0xc0dbfa09, 0x4d5d99cd, 0xe46d2781, 0x94f98a6c, 0xf0fd9343, 0x3754602f, 0xd7242ea6, 0xe9852911, 0xf5cdfe60, 0x4e1900df, 0x2a48f574, 0x6b19a2b6, 0x38eb5f07, 0xc5ddbc66, 0xe4d797b8, 0x5ec0309f, 0x010c4b65, 0xe2a85f70, 0xc7f214ef, 0x07523e26, 0x1b5c12e5, 0x6fdb5500, 0xcd0a8d04, 0x991ecc5e, 0x1d7f56c8, 0x3760b9e2, 0x67e67b31, 0xb5c1de47, 0x7b27c063, 0x8e62edf3, 0x9062db82, 0xf0ba6801, 0xe2f689d4, 0x81f430f3, 0xbdb1e5b7, 0x2f1250b5, 0x9554c91d, 0x68857ff7, 0xefba6225, 0x7e723d48, 0x19854d96, 0x5f889ef4, 0x9abe12b5, 0x98dd9261, 0x24f1aa29, 0x55a0ed8b, 0xb0d8aba8, 0x0c284a99, 0x313eb738, 0xe988a692, 0x6ff36048, 0xfdf76d8b, 0x3f0e282d, 0x67285a34, 0x984d4dca, 0xef506288, 0x462ddbd1, 0xba6a415e, 0xc0 - -basegraph= -1 - -z_c= -128 - -n_cb= -3200 - -q_m= -2 - -n_filler= -0 - -e = -3112 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_2_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_2_rv0.data deleted file mode 100755 index 69b18b7f0f..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_2_rv0.data +++ /dev/null @@ -1,38 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0x9cae44b2, 0xb0bb6e72, 0xf10de0af, 0x512b983d, 0x319a51ec, 0xbf548277, 0x4e71789d, 0xc2645c23, 0x5fb92dfe, 0xd3f357f9, 0x661045e9, 0x75c0cbc6, 0x7a3f88f9, 0x338d9b23, 0x91cddcb1, 0x26653b44, 0x59456601, 0xc96175e8, 0x9eca4c28, 0xcf94eb4e, 0xf2de9546, 0x75a5437b, 0x6506329d, 0xdec978f8, 0x4fdc9af2, 0x0119faa3, 0x2547fa31, 0x1af33692, 0x1670fe27, 0x1640a17f, 0x4fa73a5b, 0x26e5696d, 0x0af49c1e, 0x0f986c62, 0x33edbcd7, 0x7d888c5a, 0x342f5ee7, 0x66cb8e8c, 0x07060a3a, 0x2188b6b9, 0xf3c51f6f, 0x6eb156a6, 0x73c51893, 0xded24f9c, 0x019af43a, 0xa5395f1a, 0xc283f30b, 0x7b995783, 0xa0001c41, 0x6d7b0601, 0x6bf0aacf, 0xb78d3d51, 0x7f48cf8f, 0x8b302f20, 0xbedc689e, 0xcfeee53a, 0x7b3a9cf6, 0x06507c78, 0xc3aaa56e, 0xba5dd9c9, 0x20c3d1f2, 0x2bb833e5, 0x0fe6cb7e, 0x54efb0d6, 0x9f35e88a, 0x2bb893a7, 0xc0799177, 0x192ad6c1, 0x0c2e00c7, 0x11da4a91, 0xa5771c29, 0xe4374dc7, 0x1104c1b9, 0xd4638875, 0xd8fd103a, 0x0ba0c54c, 0x5ebefe53, 0x7d5c04ff, 0x5203d5ac, 0x0ff8744e, 0x2f597bec, 0x8522aab8, 0x19e86b6c, 0xd70574ec, 0x4f8e0649, 0x4c23b0ac, 0x1327dd27, 0xe9a85ef6, 0x4383b49c, 0xf0ed4320, 0xc11157d9, 0x0ab70023, 0xa13a3a3a, 0x4745de72, 0x588c1bd5, 0x9b5bde57, 0x8afc0658, 0xdcc8d4dd, 0x2a17c0ce, 0x4586d708, 0x925726ff, 0xc1a3cb82, 0x6faa49fb, 0xefc0bec4, 0x6d62a3ac, 0x24ae9d74, 0x66deb6d7, 0xb2654337, 0x8b0fa52a, 0x837f3061, 0x3a61cc89, 0x9f85ea27, 0x9d28a3e2, 0xc6d6fc58, 0x9c14864e, 0xad100cb2, 0xd6d7d579, 0x804049ff, 0xf910bfd9, 0xbf853137, 0x185f3010, 0x29674e69, 0xf8526a44, 0xd8a153c3, 0xae166339, 0xe28d1dc3, 0xa89aa0e9, 0x2ce8dbcd, 0x9333368d, 0x8bcda1ad, 0xaa3bb15f, 0xc35f690d, 0xf522728e, 0xffeb9813, 0x06f8ae05, 0x4af99305, 0xa77fb46f, 0x1c92eb48, 0xb26c8bf0, 0x504e3b6c, 0xae44b2fd, 0xbb6e729c, 0x0de0afb0, 0x2b983df1, 0x9a51ec51, 0x54827731, 0x71789dbf, 0x645c234e, 0xb92dfec2, 0xf357f95f, 0x1045e9d3, 0xc0cbc666, 0x3f88f975, 0x8d9b237a, 0xcddcb133, 0x653b4491, 0x45660126, 0x6175e859, 0xca4c28c9, 0x94eb4e9e, 0xde9546cf, 0xa5437bf2, 0x06329d75, 0xc978f865, 0xdc9af2de, 0x19faa34f, 0x47fa3101, 0xf3369225, 0x70fe271a, 0x40a17f16, 0xa73a5b16, 0xe5696d4f, 0xf49c1e26, 0x986c620a, 0xedbcd70f, 0x888c5a33, 0x7d - -output0 = -0xa1673514, 0xb589a27b, 0x1a0473b3, 0xe9254c23, 0x84ef742f, 0xf1e8aa50, 0xd7638a2f, 0xd0cbba1d, 0x4959dd98, 0xa56c6695, 0x84bd9e6c, 0xf1a88653, 0x2340702a, 0x97657fa2, 0xb9942d50, 0xb598fa31, 0x5a48108a, 0x7a59a420, 0x6a5ce2a6, 0x6cfe4a56, 0xc5d8b962, 0xb183c3bd, 0x1a91758b, 0x010d5e34, 0xf7b90b34, 0xd6b641bf, 0x02167b36, 0x0e5d47a1, 0x3f9f4504, 0x8d0e8d11, 0xcd0f8d1f, 0x583b0288, 0x2724e8e6, 0x63a37e31, 0xf0d59f03, 0x7e33c163, 0xcf22ecb2, 0xd562de86, 0xf1fe3d00, 0xe3e69c84, 0x84a175e7, 0xada0e5f7, 0x2e4754e5, 0xc140d948, 0x2cd13be7, 0xeaef3635, 0x7e332d49, 0x49954dd3, 0x5bd9cae1, 0x9eeb53a0, 0xccccc270, 0x74a5ba69, 0x10e0f98e, 0xf4ddabf8, 0x1d2c5e88, 0x306aa32d, 0xfdc9e2d6, 0x3ea3644c, 0xece27d9f, 0x2e4e7868, 0x273c1b35, 0xcd190ddf, 0xee056389, 0x0639ca81, 0xea7a041f, 0x86900a85, 0x177cb1e5, 0x7f199d1b, 0x73d5cdb9, 0x0ca8bb86, 0x941c0f88, 0x8532f2d7, 0x78f3b0fe, 0xbc213cf0, 0x201278d5, 0x589fa1d2, 0x1146a114, 0xd26be38d, 0x2ba333e6, 0xefba69e6, 0x51208774, 0x97e25490, 0x1156aa9e, 0x6e1bd2ea, 0x7280474f, 0x1507be9f, 0xbe66454a, 0xc63c8442, 0x3f2dad64, 0x2064d71c, 0x18278c6d, 0x5ef0c0fb, 0x16cd5e32, 0x960f95e2, 0x7c175b2c, 0x5ef4b8d8, 0xb385e246, 0xd7bd19ec, 0xc9875488, 0xe7e0c0d8, 0xd4b89af3, 0xf7c4a51c, 0x1e0b785f, 0xa2dc4fc7, 0xb6a14289, 0xbb76df90, 0xde4f438e, 0xf65589d9, 0xaf26d369, 0xe8905ee4, 0x0c580d3f, 0x0e4773ae, 0x8aedc1d2, 0x6305fbfe, 0x94ffad98, 0x26016950, 0x83bf4ec7, 0xee6dc970, 0xae7a74de, 0x80607fcd, 0x18d29fad, 0x00beb457, 0xb538dbc4, 0xb43809cf, 0xb970ca1e, 0xe3aa5473, 0x74750c9b, 0xa1d6b99d, 0xe82d197a, 0x019fdbca, 0x45a8afc9, 0x16efe255, 0xd597b35e, 0x57339b5c, 0x5732f5f8, 0x120b99c6, 0x4dc12b3a, 0xff8e6523, 0x957ba382, 0xa824167e, 0xe0765b5d, 0x5cb47468, 0xf658b8af, 0xaf3797da, 0x3b3296af, 0x5bf60aab, 0x626192e9, 0x69691102, 0x9fb439a1, 0x337b01e4, 0x908497ea, 0x8d2fab4e, 0xcb974e0c, 0x5e4ee785, 0xf1a7079b, 0x1793e6a1, 0xcb5a6535, 0x7c08737c, 0x3c791341, 0xc2723235, 0x376bc1a9, 0x87f4037c, 0xe535950c, 0xed96ccf0, 0xdeada935, 0xeaf475c2, 0x32823834, 0x49febdf2, 0x1e61da2b, 0x677b6298, 0x481ef2d2, 0x637d7d41, 0xc13b80fa, 0xb9e2d6f5, 0xc99308aa, 0xee74f0b6, 0xd9af5bc9, 0x17449347, 0xc8eb124b, 0x271d6e35, 0x690e08d3, 0x8c474bea, 0xfdaf2a1c, 0x2d57543b, 0x53d8ba6f, 0x2c074434, 0x9d5f8b26, 0xee317acc, 0xc679a779, 0x2d1972ad, 0xb5d7b943, 0x8c4164fa, 0xa078097c, 0xef158487, 0xe5de2bf3, 0x5b1ef3f8, 0xb1808963, 0xb67b9490, 0xed267ab9, 0x640aba19, 0xbd80e584, 0x2c6d8fe0, 0x9d14dc4a, 0x3e512944, 0x699a929a, 0x424cd494, 0xee13bb2c, 0x1eeb37a4, 0x68726dcd, 0xa97916cf, 0xc1571f97, 0x5a7a77a1, 0xea30e5d2, 0xe9b30ce3, 0x75ab881f, 0x47019996, 0xea23d812, 0x36dd921e, 0x4eef9f15, 0x5da10bd0, 0x3a234a95, 0xca3e93d2, 0xa1070324, 0x00894405, 0x39404211, 0xa36dde6e, 0x989cfff5, 0xde3800bf, 0xa34b4327, 0x6a8ea7d0, 0xaaf4fbc5, 0xbb6b9020, 0xee5d144d, 0xcb81055a, 0xd56dbc96, 0xeccee1f6, 0x72fc980a, 0xbba1b8bc, 0xa0972ceb, 0x9f6edc1f, 0xf12a816e, 0x2c040067, 0x27ccf828, 0x0af0cd8d, 0xc7b793a4, 0xddcff776, 0x07b359ef, 0x004d1be4, 0x0e1f37ec, 0x8f59c5cb, 0x9bf0f93e, 0xef517ded, 0x11da7da3, 0x6062efa8, 0x80f8c8d5, 0xea86625a, 0x0a876ac9, 0x9b5cc49a, 0x52d37f7e, 0x41b0d72a, 0x3df313a1, 0x9242d958, 0x15417eb0, 0xb005e90c, 0x8d604792, 0x5612ccb7, 0xe407875d, 0x72896e3a, 0xf3306fb4, 0x71fd3e1e, 0x12f0c6ce, 0x02477141, 0x8190676f, 0x70e70f79, 0x5542d84a, 0x80b2e3ee, 0x27b5f520, 0xca41149c, 0xacfb5e73, 0xec26f8de, 0x3114efbb, 0xf22af467, 0x32a3b48c, 0x48364a10, 0x342fa930, 0xab0490ea, 0xcf2ff5fd, 0xbb1dc322, 0xc8c990da, 0x67c40d0c, 0x8e2df179, 0x5094e8 - -basegraph= -1 - -z_c= -384 - -n_cb= -9600 - -q_m= -2 - -n_filler= -0 - -e = -9332 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_3_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_3_rv0.data deleted file mode 100755 index 7c9040ed6a..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_3_rv0.data +++ /dev/null @@ -1,38 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0x9e8b30df, 0x3abedc68, 0xf6cfeee5, 0x787b3a9c, 0x6e06507c, 0xc9c3aaa5, 0xf2ba5dd9, 0xe520c3d1, 0x7e2bb833, 0xd60fe6cb, 0x8a54efb0, 0xa79f35e8, 0x772bb893, 0xc1c07991, 0xc7192ad6, 0x910c2e00, 0x2911da4a, 0xc7a5771c, 0xb9e4374d, 0x751104c1, 0x3ad46388, 0x4cd8fd10, 0x530ba0c5, 0xff5ebefe, 0xac7d5c04, 0x4e5203d5, 0xec0ff874, 0xb82f597b, 0x6c8522aa, 0xec19e86b, 0x49d70574, 0xac4f8e06, 0x274c23b0, 0xf61327dd, 0x9ce9a85e, 0x204383b4, 0xd9f0ed43, 0x23c11157, 0x3a0ab700, 0x72a13a3a, 0xd54745de, 0x57588c1b, 0x589b5bde, 0xdd8afc06, 0xcedcc8d4, 0x082a17c0, 0xff4586d7, 0x82925726, 0xfbc1a3cb, 0xc46faa49, 0xacefc0be, 0x746d62a3, 0xd724ae9d, 0x3766deb6, 0x2ab26543, 0x618b0fa5, 0x89837f30, 0x273a61cc, 0xe29f85ea, 0x589d28a3, 0x4ec6d6fc, 0xb29c1486, 0x79ad100c, 0xffd6d7d5, 0xd9804049, 0x37f910bf, 0x10bf8531, 0x69185f30, 0x4429674e, 0xc3f8526a, 0x39d8a153, 0xc3ae1663, 0xe9e28d1d, 0xcda89aa0, 0x8d2ce8db, 0xad933336, 0x5f8bcda1, 0x0daa3bb1, 0x8ec35f69, 0x13f52272, 0x05ffeb98, 0x0506f8ae, 0x6f4af993, 0x48a77fb4, 0xf01c92eb, 0x6cb26c8b, 0xfd504e3b, 0x9cae44b2, 0xb0bb6e72, 0xf10de0af, 0x512b983d, 0x319a51ec, 0xbf548277, 0x4e71789d, 0xc2645c23, 0x5fb92dfe, 0xd3f357f9, 0x661045e9, 0x75c0cbc6, 0x7a3f88f9, 0x338d9b23, 0x91cddcb1, 0x26653b44, 0x59456601, 0xc96175e8, 0x9eca4c28, 0xcf94eb4e, 0xf2de9546, 0x75a5437b, 0x6506329d, 0xdec978f8, 0x4fdc9af2, 0x0119faa3, 0x2547fa31, 0x1af33692, 0x1670fe27, 0x1640a17f, 0x4fa73a5b, 0x26e5696d, 0x0af49c1e, 0x0f986c62, 0x33edbcd7, 0x7d888c5a, 0x342f5ee7, 0x66cb8e8c, 0x07060a3a, 0x2188b6b9, 0xf3c51f6f, 0x6eb156a6, 0x73c51893, 0xded24f9c, 0x019af43a, 0xa5395f1a, 0xc283f30b, 0x7b995783, 0xa0001c41, 0x6d7b0601, 0x6bf0aacf, 0xb78d3d51, 0x7f48cf8f, 0x8b302f20, 0xbedc689e, 0xcfeee53a, 0x7b3a9cf6, 0x06507c78, 0xc3aaa56e, 0xba5dd9c9, 0x20c3d1f2, 0x2bb833e5, 0x0fe6cb7e, 0x54efb0d6, 0x9f35e88a, 0x2bb893a7, 0xc0799177, 0x192ad6c1, 0x0c2e00c7, 0x11da4a91, 0xa5771c29, 0xe4374dc7, 0x1104c1b9, 0xd4638875, 0xd8fd103a, 0x0ba0c54c, 0x5ebefe53, 0x7d5c04ff, 0x5203d5ac, 0x0ff8744e, 0x2f597bec, 0x8522aab8, 0x19e86b6c, 0xd70574ec, 0x4f8e0649, 0x4c23b0ac, 0x1327dd27, 0xe9a85ef6, 0x35fb9a9c - -output0 = -0x9db2cc75, 0x86491306, 0x2f7fb407, 0x3fa46689, 0x2a1ff675, 0xd79f34a9, 0x201003e4, 0x673b1603, 0x1f6cc485, 0xd91e75b2, 0xb3fe4116, 0xf42194a6, 0x10dd72e1, 0x0e36ce00, 0xe8cbf8be, 0xbffbfd22, 0xf1767045, 0xe499a72f, 0x4a4072e2, 0xbd745937, 0xd5ae743b, 0xf0e8ba05, 0xc772de6a, 0xc48fbe1c, 0x1c08cc88, 0xe16d3780, 0xc0e89e6d, 0xf5bc8306, 0x3350752b, 0x96642ff7, 0xa9c53c11, 0xa5c9fe34, 0x1b58408b, 0x7a49a535, 0x2e59f7b2, 0x6caf5e53, 0xc4c9b877, 0xe48383a8, 0x4b85759b, 0x45081b64, 0xa7e80f75, 0x87e204fa, 0x43433f33, 0x0b1847b5, 0x2a8a5001, 0x890a8844, 0xcd1f9c0a, 0x5d7a539c, 0x2275ece6, 0x23b36f34, 0xf1c0db07, 0x7f629567, 0xca32fdf2, 0x8026df97, 0xa0af7d04, 0xf6e3cdc0, 0xd0f160b6, 0xeca5f4e7, 0x7e5611f4, 0x9455dd58, 0x6c857ae3, 0xeabf6735, 0x2a33781d, 0x5c941c82, 0x4ecc9be4, 0xcbfa07f0, 0xd999c371, 0x24f5ee6d, 0x05f0a9db, 0xb1dcaaac, 0x486d0f8d, 0x743fe72c, 0xbcdce7d2, 0x3ef37508, 0xfdf628cf, 0x6e4a3839, 0x332d4a74, 0x9d4c5dcb, 0xea4527c9, 0x173dcf84, 0xeb3f014b, 0x83d00ad0, 0x462cb4f1, 0x3f58c90b, 0x768488a8, 0x09e9fa82, 0xc4594e98, 0xc126a383, 0x3db7f0ab, 0xbd7039e4, 0x35077990, 0x49cfb0d6, 0x1002a150, 0x933fa389, 0x2fb662e2, 0xeeaf38f3, 0x51758221, 0xd2b240d1, 0x0046bbda, 0x2f1bc7aa, 0x76c5565f, 0x5557fe9b, 0xfa33100a, 0xd26cd117, 0x2f28b971, 0x74308619, 0x4877983d, 0x5af4d5aa, 0x43994f37, 0xc24fd5a6, 0x2c064e6c, 0x5ab4b9c8, 0xe2d4e716, 0xd2fc49a9, 0x9982109d, 0xe3b095d9, 0xd4e89ea2, 0xf2c4f518, 0x0f0e284f, 0xb78c5a92, 0xb7a453d9, 0xbe778f81, 0xca4e569b, 0xf241c9dc, 0xef77c669, 0xec841ba5, 0x4c48092a, 0x4a4376bf, 0x9ae98593, 0x7640feaf, 0xc0eae9c9, 0x67503900, 0xc2bb0ed7, 0xbf3c9831, 0xfa2a749a, 0xc1747e88, 0x1dc2ceb8, 0x11aee152, 0xe1388ac5, 0xa42959ce, 0xa824ce4e, 0xa2fb0566, 0x61741d8f, 0xe1d6e8d9, 0xa8290d7a, 0x10cfdf8b, 0x45e9af8c, 0x47bab310, 0x9596e75a, 0x17729a18, 0x1662b4ac, 0x121bd883, 0x48843f3f, 0xfa8f7436, 0x902ae297, 0xec20067f, 0xb4361b5c, 0x18b5643d, 0xb25dbdfb, 0xae36838f, 0x6a7697fa, 0x1eb30feb, 0x326596e9, 0x396d4413, 0xdfb579e0, 0x622b04f4, 0xd5c1d3ee, 0x8c7ebe1a, 0xca824e1d, 0x1f0eb7c5, 0xa0f7578a, 0x5687b7f5, 0x8a5f7435, 0x69493629, 0x3d381245, 0xd6767264, 0x276f84f8, 0x96b1166d, 0xa471851c, 0xbdc698b0, 0xdeb9bd21, 0xfae52587, 0x76c27934, 0x4dbba8b2, 0x1e619b6b, 0x227b7698, 0x195ee786, 0x76396951, 0xc52b81be, 0xe9f393a4, 0x89c70cfb, 0xbb71f1e3, 0xccbe0b8c, 0x1200c647, 0x421a - -basegraph= -1 - -z_c= -256 - -n_cb= -6400 - -q_m= -2 - -n_filler= -0 - -e = -6224 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_4_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_4_rv0.data deleted file mode 100755 index 57e81468a8..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_4_rv0.data +++ /dev/null @@ -1,40 +0,0 @@ - -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xf1f312fe, 0x8abcb1ed, 0xf3550fd6, 0x8060deb6, 0x82380005, 0xc1ea99de, 0xd0cfc143, 0x58fa9ca5, 0x5c2f5980, 0x39f24b7b, 0xc918a3ce, 0x656a8d76, 0xf6f8a3cf, 0x9d6d1184, 0x5c5060e0, 0x3171d366, 0xe77af42c, 0xf24290f4, 0x1df2f5e8, 0x56c1a6eb, 0x3be35b07, 0xdaee3c1b, 0x65dfcb90, 0x8ba0ede7, 0x311e72b1, 0x772ffa8a, 0xd863ce1d, 0x8974177a, 0x87d85875, 0x927596d1, 0x0481e7fa, 0x9768d335, 0x90a5f29b, 0x13e11b45, 0x73cbac15, 0x9301bfde, 0xf3026564, 0x794a8697, 0x552e6f6b, 0x2880a6cd, 0xe780e65f, 0xf68c45fe, 0x254e9ac4, 0x8509c8f8, 0xb5235ffc - -output0 = -0x72176e87, 0xef78cd6b, 0x71b884e4, 0x64e89b8f, 0x35a0484a, 0x721ab211, 0x576e1cee, 0x09875528, 0x559cdeec, 0x6e4ee95d, 0x2b06d496, 0x2d5b79f7, 0x7474578d, 0xa7176633, 0x8d8661eb, 0x2f5bf8f2, 0xfb0205ff, 0x093ab91d, 0x10a19d30, 0x631ade9d, 0x894bac8f, 0xeaba510c, 0xe77a9c3f, 0xd9b0fe7a, 0x724110f2, 0x185f4e89, 0xfb9e9e02, 0xa4269001, 0x68e1db0d, 0xe9881752, 0x541dc095, 0xf3d65fc0, 0xe4ad7a49, 0x0be958cb, 0xb9bd36dc, 0x7096c51a, 0xce72c185, 0x87d41d23, 0x716a441e, 0x1ef80511, 0x20729182, 0x5bc5da2d, 0xb9864f01, 0xf9bd83d1, 0xf30225f7, 0x66ad97f0, 0xb0dd86bf, 0x02666b12, 0x3bbadc59, 0xde2ce355, 0x7e2941be, 0xe96f5ab6, 0xa74671b2, 0x7bddf4e4, 0x5ee57400, 0xaa31dad1, 0xdd9ff623, 0x0b938f82, 0x73675ab4, 0x2d7f22c8, 0x99410078, 0xb947ed1f, 0xf132f8a6, 0xab38961a, 0x2a3b0eff, 0xf0677e99, 0x8e5ae76e, 0x976e3907, 0xa00017f6, 0x210534aa, 0x4803bcfb, 0x12eb4bfb, 0x439be7e8, 0x98d1a09f, 0xba447cf6, 0x0bfe7263, 0xf9b738cb, 0x50c11478, 0x11017210, 0x18d0944b, 0x86d2a8b2, 0x12e19cb9, 0x16b04a21, 0x45b7fab0, 0xa0c6239c, 0x9073d9ae, 0xd3660485, 0xf072ba5c, 0x8f25cf3b, 0xc60f58ae, 0x4a9cbcb0, 0xd2a0c056, 0xa7c47c3f, 0x7629986d, 0x4ec9aaf4, 0x39bec0fb, 0x065674d4, 0xa296e279, 0x116900ac, 0xe0675076, 0x5fa3382d, 0x165e032b, 0x25afa51d, 0x6ffd9d7b, 0x45c375eb, 0x59ba4861, 0x26fbd5ec, 0xe7124cab, 0x7dcc8bf9, 0x7c3213f4, 0x8a676b05, 0xca0e4af9, 0xe05fdb56, 0x9da3ada9, 0xcee511d3, 0x777ceef7, 0xa6fc3ea8, 0xde8144cc, 0x0d2e46db, 0x165aa912, 0x99aad991, 0x6f6fbf08, 0xe9f4f313, 0xc4b64b7c, 0x6a02cd7e, 0xc280657f, 0xd476672e, 0x2f8094f6, 0x699213b2, 0x0d86733f, 0x3bfd99af, 0x34101685, 0x1ba2664f, 0x2fd29569, 0x49abdfc7, 0x148276d8, 0xde023764, 0x5a4256ed, 0xf0997352, 0x5f2bcae4, 0xaedab8b3, 0x0ac35311, 0x2669713d, 0x0efe1855, 0x69842e96, 0xc63fdc64, 0xee3cda68, 0x3323e84d, 0x799cb3b1, 0xd5580190, 0x2ca9ba22, 0x6fbd40d0, 0x3260b8be, 0x79aef4c0, 0xdcd365b4, 0x2249a834, 0x95b0d5ae, 0x66d48311, 0x3d73a5af, 0x47bc98aa, 0xcb8268f0, 0x767c3314, 0x35f998e7, 0xbee335e1, 0x5cce5171, 0x7efd26fb, 0x2c657d06, 0xdab1199b, 0x19dc335e, 0x43906378, 0x5d854831, 0x28e1cc04, 0x3f73e9f7, 0x0027b04d, 0x14f95dd1, 0xbe06dde2 - -basegraph= -1 - -z_c= -128 - -n_cb= -8448 - -q_m= -2 - -n_filler= -0 - -e = -5632 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK - diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_5_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_5_rv0.data deleted file mode 100755 index 79e6ef5daf..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_5_rv0.data +++ /dev/null @@ -1,39 +0,0 @@ - -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xfe - -output0 = -0xf2b95473, 0x75b44105, 0x95950fd5, 0xda939dec, 0x6f8ffb15, 0x61151ca1, 0x52a009f1, 0x920ab25d, 0x76537ed7, 0xbe7c986b, 0x20adc5a1, 0x30eccb8b, 0x34f4195f, 0x760af744, 0x477a1cae, 0x4886016c, 0x449d8fac, 0x2a5ba809, 0x3a4294c7, 0x680e3db6, 0x756157cd, 0xb7523327, 0xd89364fa, 0x7a4bfcb7, 0xae1301bf, 0x192fb859, 0x01b19821, 0x730eda8c, 0x994eaddb, 0xfafb5049, 0xb36a8c6f, 0xcdb5fa2a, 0x264041f6, 0x580b5b9d, 0xbb9b9b02, 0xf0739115, 0x2ca0ca4d, 0xac891702, 0x114890c0, 0xe3861bc1, 0xf1fd6e19, 0x1abd0c9e, 0xe9ad729c, 0x60d2c14b, 0xcf3690c0, 0x96c00c66, 0x753a455e, 0x4fac1440, 0x7126c483, 0x1fc5db38, 0xf8861f14, 0xace8d3c1, 0xa25724e6, 0x33f8d3b5, 0xe0dcc3ae, 0x42636a42, 0x2afbdd0d, 0xcf7df244, 0x7b3c40ea, 0xf96b4aa3, 0xa75735e7, 0x6e88f5f0, 0x1ef57055, 0xfb21de90, 0x8cdee233, 0x5a979bc6, 0x76631ae4, 0x2c2b2289, 0xdc500039, 0xa813e95a - -basegraph= -1 - -z_c= -64 - -n_cb= -4224 - -q_m= -2 - -n_filler= -0 - -e = -2240 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_6_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_6_rv0.data deleted file mode 100755 index 7aa8161156..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_6_rv0.data +++ /dev/null @@ -1,39 +0,0 @@ - -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60, 0x6f395cde, 0x5ca777f3, 0x79163b7d, 0x04f40cd1, 0xf1f312fe, 0x8abcb1ed, 0xf3550fd6, 0x8060deb6, 0x82380005, 0xc1ea99de, 0xd0cfc143, 0x58fa9ca5, 0x5c2f5980, 0x39f24b7b, 0xc918a3ce, 0x656a8d76, 0xf6f8a3cf, 0x9d6d1184, 0x5c5060e0, 0x3171d366, 0xe77af42c, 0xf24290f4, 0x1df2f5e8, 0x56c1a6eb, 0x3be35b07, 0xdaee3c1b, 0x65dfcb90, 0x8ba0ede7, 0x311e72b1, 0x772ffa8a, 0xd863ce1d, 0x8974177a, 0x87d85875, 0x927596d1, 0x0481e7fa, 0x9768d335, 0x90a5f29b, 0x13e11b45, 0x73cbac15, 0x9301bfde, 0x64 - -output0 = -0xfb5615fe, 0x4d6aa84c, 0x04b58965, 0x230fde89, 0xcc5fecca, 0xbfbf550c, 0xf67ad92b, 0xc8f1af3e, 0x370144b7, 0x494a1a9d, 0xea9b9b17, 0xb562c051, 0x3ce18b59, 0xacc91317, 0x155cc4d5, 0xb2820bc0, 0xa5f93b0d, 0x1fe9489e, 0xacfd67c9, 0x20c3914e, 0xcf239190, 0x87810976, 0x706e110b, 0x0fbd4550, 0x7567d4d3, 0x0fc18b28, 0xbdc21a14, 0xbced9791, 0xb21260a2, 0x27b9c3b5, 0xf49cc2bb, 0x12266f03, 0x2fff9d4c, 0x9e28b204, 0x2b6814ee, 0xf83a1fb2, 0xe75270a2, 0x6fd8b0a4, 0x5fb42455, 0xaa74cf95, 0xd88bb226, 0x5b828b86, 0x27624ee1, 0x382a36cc, 0x88405568, 0xfc53e81a, 0xb427b8f7, 0xfa3dc31b, 0x3e6b1efe, 0xf1263f88, 0xdb0aa37e, 0xc76f6953, 0xe04117f2, 0x345174ee, 0x1c13bcea, 0x17aa1eee, 0x02cae3a8, 0xd981f1df, 0xbf506ce6, 0x0eae2777, 0xfcf7789f, 0x10d5456c, 0x15047241, 0x4894851e, 0xc3c7f9f7, 0x03e18cb9, 0x12b01f64, 0x55b2bfe1, 0xa496679d, 0xc07289be, 0x826314c4, 0xf033eb1c, 0xca749a3a, 0xc65b19ea, 0x1f9db8b4, 0xc6e59002, 0xa790382b, 0x7728dd7c, 0x5f89fbe5, 0x28bbc5fb, 0x064320d0, 0xf393f369, 0x402810ad, 0xa4720036, 0x4ef67d2d, 0x024b166b, 0x34eaa55c, 0x7bacc96e, 0x45d220ae, 0x4dee5d75, 0x62fed1ed, 0xe21259aa, 0x3ccccab9, 0x697753f0, 0xdf266f01, 0x9a4f5ea8, 0xe51ede07, 0xdce7f8e9, 0xdfa05182, 0x6328afb6 - -basegraph= -2 - -z_c= -256 - -n_cb= -12800 - -q_m= -2 - -n_filler= -0 - -e = -3200 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_7_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_7_rv0.data deleted file mode 100755 index 55d3cbdcf4..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_7_rv0.data +++ /dev/null @@ -1,38 +0,0 @@ -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xe4bbe4c8, 0x350dc432, 0x926071f2, 0x372ea0eb, 0x36d61798, 0x1d5544a1, 0x37de9af4, 0x722e1ff0, 0x35abc04a, 0xff203abe, 0xca7f7d7a, 0x32a305d0, 0x5c08bf1b, 0xae11c62b, 0x9d832088, 0xe3b2ec27, 0x9438eea5, 0x89525b88, 0xe3007430, 0x836b5498, 0xee899e03, 0xe5c91dd4, 0x5117acf9, 0x6b0df72a, 0x7ed367f0, 0xa7cc1dd4, 0x4f8bc304, 0x939bba5d, 0x76a555c3, 0x1e3e0a60 - -output0 = -0x23062a83, 0xbe78896f, 0x34e984b1, 0x70a9cf9a, 0x65f5095b, 0x771ea744, 0x572b5cba, 0x48d2507c, 0x11d9dbad, 0x7b1bf95c, 0x2f538596, 0x3c4b69b3, 0x6161569d, 0xf2136773, 0x8cc275eb, 0x3f0ee8f2, 0xbb5245be, 0x0c2ab808, 0x14a4d971, 0x661edfd8, 0xcd5be9ce, 0xaeae555c, 0xf67a9d3e, 0xc9a1ea6b, 0x720154a6, 0x190f4f8c, 0xbf9ada12, 0xa1278144, 0x79a1ce09, 0xf88c1216, 0x444cc0d1, 0xe2925fc5, 0xb0b87f5d, 0x5fbc588f, 0xece93699, 0x21c2804b, 0xdb62d094, 0xd6804837, 0x606e111b, 0x0ead4500, 0x653281c3, 0x0b808f7c, 0xfc925f51, 0xbcbc87d1, 0xe30330e7, 0x66e9c3b5, 0xb18c92af, 0x02272f03, 0x6aafd818, 0xce2da351, 0x3f7d41af, 0xa83a0ae2, 0xb21375b3, 0x3fdda0a5, 0x4be46114, 0xaf70ced1, 0xcdcaf662, 0x5a969a87, 0x66724ef5, 0x6d6b66d9, 0xd9005578, 0xe806bc4e, 0x3dea5f89, 0x2c13678f, 0x16617450, 0x9a5144a2, 0x55bd665d, 0x1d1cc783, 0x0cfaf626, 0xb780e63f, 0xb9ce7360, 0xb330d19b, 0x3d1e4cdc, 0xf4307513, 0x667b381c, 0x1d18aea4, 0x10a8531e, 0x131ceb64, 0x3f823938, 0x6574c7d9, 0x2c6bc220, 0x4d0d4701 - -basegraph= -2 - -z_c= -128 - -n_cb= -6400 - -q_m= -2 - -n_filler= -8 - -e = -2624 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_8_rv0.data b/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_8_rv0.data deleted file mode 100755 index fc38760fe5..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/demo_enc_scn_8_rv0.data +++ /dev/null @@ -1,39 +0,0 @@ - -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0xea7bdad9, 0xabd8311a, 0x4e7ba2e2, 0x5c5c5c85, 0xc400ed50, 0x9bea8883, 0x04c2b70f, 0x392dc1c2, 0x6f7a1597, 0xc8 - -output0 = -0x0dcd08ac, 0xf9309a7b, 0xb1663784, 0xe466b066, 0xe7f84133, 0x35a54111, 0x90c00f90, 0x8b829dbc, 0x7edeaa50, 0x215048f0, 0x53f11de5, 0xd34ae718, 0x62067b86, 0xbb7dc97e, 0xf995c5f4, 0x8311e2c5, 0xdf419b04, 0x1a828a85, 0x8639bbcd, 0x02137d25, 0x52356871, 0xca2d0387, 0x51f5687f, 0xa9cdb410, 0x1b4e4664, 0x193e9d65, 0xa03c63f6, 0xb26b7fd3, 0x26dee48e, 0x9a2d9bef, 0x16b40bf5, 0x00cab368, 0x4916c4b1, 0xe684ddd7, 0xfc0fd461, 0x1ca8fa78, 0x643ce308, 0xec27ef99, 0xe726ca76, 0x21e3c41d, 0x0d9e5dfa, 0x461972a5, 0xee3eebb9, 0x029b245a, 0x28069caf, 0xd8161167, 0xc8c880a3, 0xec2b2d8c, 0xb1290350, 0x9f37480d - -basegraph= -2 - -z_c= -32 - -n_cb= -1600 - -q_m= -2 - -n_filler= -0 - -e = -1600 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_0.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_0.data deleted file mode 100644 index 5d4d27d607..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_0.data +++ /dev/null @@ -1,353 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0xF301FC03, 0xF50F0EFA, 0xE70BF902, 0x1013060C, 0xF7F6FCE7, 0x04F3F709, 0x0C07FBF1, 0xFCF7070F, -0xEA0FFAF8, 0x0FF71209, 0x070906F2, 0xF705F004, 0x15FA05F7, 0xF4F8010A, 0x0B0E09F5, 0xF70014F6, -0xF106F80D, 0x0A06F9FC, 0x0DFBF803, 0x0308060D, 0x0CF9F8F9, 0xF2F409ED, 0x12FEF3EA, 0xF2FC07F9, -0xEF12EEF8, 0xF90F030C, 0xEC171408, 0x11F902F3, 0xF102F6FF, 0x0AF6090C, 0x0103FA10, 0xF9FFF011, -0x010FFB0F, 0xF80BFEF8, 0x10F2F1EE, 0x140204F6, 0x020AF206, 0x0BED04F2, 0x06FEF5F2, 0x0F070009, -0xECF0F9F0, 0x081405F5, 0xF1000E18, 0xF4F7090C, 0xFD0F01EF, 0x0D12E702, 0x07EF1008, 0xEF06FD02, -0x0302FD00, 0xF2F4040A, 0xF60BF9FC, 0x0BEEF20C, 0xF9ED0901, 0x00060406, 0xFF09F6F3, 0x0FF209F7, -0x0D0EF210, 0xF3150611, 0x06060EF8, 0x0E06EFEC, 0x070C05F8, 0x0CFBF4F1, 0xFBFE0CF6, 0xFD03F714, -0x03FCE40C, 0xF4F5F2F4, 0xF400F6FF, 0x0EF0090C, 0x04F9F9F6, 0xF5F6FEFD, 0xFE08FE01, 0x0607F3F3, -0x11F4020C, 0xFD0FFB04, 0xEEF30D05, 0xFD040406, 0xFCF8F108, 0x0DFAFBF9, 0xE9F10B09, 0xEEF2140D, -0xEE0A09F8, 0xFB010C0A, 0xF1FC0803, 0x0C07130A, 0x0312FD0A, 0xF6F10708, 0xFCF1FAEC, 0x0BF8F4F9, -0xF009FBFF, 0x14EEF2EB, 0xEF0DF701, 0xFA14F90C, 0x08EF0110, 0xF50401E5, 0xEE13F30C, 0xF1F60916, -0x05F414EC, 0xFF030A14, 0x0409FFF2, 0x0C0906FA, 0xF7F70414, 0xFBFA0EFA, 0xFD010BFD, 0xF5FA0EF1, -0xF40FFAF4, 0xFF060503, 0x0BEF0BFA, 0x0717E7F3, 0xF4F1FD09, 0xEF09FEFE, 0x07F9F3FB, 0x0DFD08FE, -0x0D0BF602, 0x05F21008, 0x1A0B0807, 0xEF0CFAF9, 0x090D0A06, 0x02EB0D0F, 0xF709FDFE, 0xFFF7F510, -0xF10A0AF8, 0x15EF1311, 0xF20BEDF9, 0xF10A0BF7, 0x15150B08, 0x0B170F0A, 0x06FAFAF1, 0xF1F803FD, -0x11F3EEEB, 0x0902FB04, 0x0703F215, 0x06EF10FE, 0xFB00140B, 0xF70CF806, 0x040AEE0E, 0xF9F1070C, -0xEAF9F6FC, 0x0AECF80E, 0x09F2F9F3, 0xF708E8F0, 0x0902E9F7, 0x0209F6FD, 0x02F6EE10, 0x090BE811, -0x0BF8E8F7, 0x03F8F5F1, 0x040AF109, 0x04F80CFB, 0x100A0913, 0x0CFBF403, 0xEE04FAF0, 0xFB040008, -0x16081113, 0xFCE80708, 0xF2FF03F3, 0xF9F1F1F4, 0xF4ED09F7, 0x0BEBF0FC, 0xF80A01E8, 0x02F714F0, -0xF516040E, 0x0A000AF1, 0xF5F3F101, 0x05F00807, 0xE9F20011, 0xE90E1613, 0xF6150AF4, 0x0707F4F8, -0x10F7F20B, 0xF9F9F0EE, 0xF5FE0715, 0xF90E06F7, 0x0AE8F40C, 0x0B07FB06, 0xF0F6F10E, 0xF4060811, -0x0A0C06F5, 0x0EFBFD0B, 0x0A0EF611, 0x03F4F8F5, 0xFDF10CEB, 0x13140CFD, 0xF712F80A, 0xF1F4E903, -0xF5030203, 0xF80900F8, 0xFDF8F40B, 0xFEFBFD0A, 0x070813F5, 0xF9FA0B14, 0xFAF7FD17, 0xF5F50603, -0xF916F210, 0x070F12FB, 0x0DF3F5FC, 0xEA11F207, 0x0DF70DF7, 0x10F1F4F4, 0x0BF409E8, 0x0606050E, -0x09F50EFF, 0xF70406F8, 0xED0C11FA, 0x0F0400F3, 0x0208F4F8, 0xF9100EF0, 0xFCEEEDF3, 0xF1F5FE14, -0xE0E80DFE, 0x0A0EF5ED, 0xF3E7F90B, 0x06E7F7FE, 0x12FE06F9, 0x0804F804, 0xF409F5F9, 0xF3F80EF5, -0x02F6EFF2, 0x120AFF0E, 0x0D0EF4F8, 0xF7F80408, 0x0400F0F3, 0x150112F2, 0x0719ECF2, 0x0403EDFC, -0xFBF205F8, 0xF00DF30F, 0xFC0CF413, 0x08F9F2FD, 0x1107FA03, 0xEC11EDFE, 0x0DF1F810, 0xFC0B11F9, -0xF9FE0AFD, 0x0B0EF4F3, 0xF9F1050C, 0xFC0EF9F8, 0x000F14EA, 0xF00A0107, 0xF903F810, 0x0A040EFA, -0x0C000203, 0xF40C02FE, 0xFA06130D, 0x100CFDF3, 0x0BF505FA, 0xF5FB00FC, 0xF8110808, 0x05ECEA0D, -0x04F7F30A, 0xFE090FEC, 0xF9FBEE08, 0xFD0CEF0E, 0x09F80B0A, 0xF90BF9F4, 0x0EFB0C0C, 0x10EFF2F0, -0x09F8F0FA, 0x060B0909, 0xF4FF0F13, 0x06FA0E16, 0x0515F512, 0x0E0B0708, 0xF6FBF9F7, 0xFBF405F2, -0x050A1207, 0xFA001C0C, 0xFB0FEBEE, 0x0B13100C, 0x0D08F6FB, 0x16FEF2F9, 0x12F9F412, 0x09F600F5, -0x02040B09, 0x0AF11310, 0x0C160A06, 0x0E09FF0E, 0xEF0B0CF3, 0x13F40DF5, 0x0BF704F9, 0x07EE0A00, -0xF0F504F6, 0x0BFAFCFB, 0x0B0BF70A, 0x0207FF08, 0xF20B09E7, 0xF9F1F115, 0xF0090812, 0xFF0DF5F8, -0x0C080709, 0x0512F3EF, 0xEE110708, 0x03EBFCFF, 0xEE0D08FE, 0x110BFCF6, 0x15F61408, 0xF413F30D, -0x06F2F2F1, 0x04120BEF, 0xF90CF30B, 0xE40400FB, 0x0BFC1A09, 0x130109FD, 0xFF08E7F9, 0xF2FAF4F8, -0x060BF901, 0xF112EE02, 0xFF060D0F, 0xFAFC0DED, 0x09FFF6FF, 0xF304ED0D, 0x050AF8F3, 0xF40403F8, -0xF5F6070B, 0xF8F7FF00, 0x170E0708, 0xF808FFF4, 0x03F80C0F, 0x0A06FCF7, 0xF3EFF404, 0xF10D09FD, -0xFDF9F016, 0x04FD06EF, 0xF5070EEF, 0xEFF20411, 0xF310FDF1, 0xF50AFB11, 0x040DF4F3, 0xF30307F7, -0xFC031C00, 0xF008ECF5, 0xF011F5F9, 0xFCF1ECF7, 0x16FF0F0C, 0xF9F611FC, 0x0CF70D04, 0x020C0BFF, -0x06FE0B09, 0xF9080C0C, 0x080DE706, 0x030FFAF8, 0xFF0C0D08, 0x03051108, 0xF402FA10, 0xF4FE0502, -0xF7F6F2E9, 0x0DFBEB11, 0xFAF2F2F1, 0x0E06F60B, 0xEDEA0EF9, 0x09EDF30B, 0xEF0CF202, 0xFE0208F3, -0x000D08FB, 0x0FF817F4, 0x0F0DFC01, 0x0D02FF0D, 0xED060EF1, 0x0B0CF0F4, 0x0EF80712, 0x0DF31402, -0x110EF3F2, 0xF208F60C, 0x02000B06, 0x1106E901, 0xF309F708, 0xEEF003FA, 0x00F9EF05, 0xFC08FDF9, -0x09050B08, 0xF5FB180A, 0x10F7EEF4, 0xF10F15F0, 0x0712FF10, 0xF5FFFB08, 0x11F6F0F1, 0xFEEEFC18, -0xF0E806F2, 0x10F90DF9, 0xF30900FD, 0x0A06F40B, 0x12EE0004, 0xED0A0AFE, 0xED04F5F8, 0xFE09F7F3, -0x01F601F8, 0xF7EA0405, 0x04080EF5, 0x0F1CF201, 0x0712F70F, 0xF0F21205, 0xFF0A1004, 0x0AF4F30D, -0x0DF3000D, 0xF6000B01, 0xEF0DEDFA, 0x0700F8FF, 0x03F7FBF7, 0x06020D0B, 0xFCF7F6F0, 0xFA0208F2, -0xFA0B04F1, 0xEE04F6F9, 0xFFEEF907, 0x080106EF, 0x0FF8F007, 0xFFEB0BE4, 0xF10FF8EF, 0x080AF3F9, -0xEF0BF311, 0xF00FF504, 0x0D100100, 0xF10BEEF9, 0xF3F8F612, 0xFB00FE0C, 0x06F30BF0, 0xF2030D11, -0x0002EB18, 0xEFF8FE07, 0x03F6EE14, 0x08ED08FF, 0x12150AF1, 0x06F0170C, 0x050F0C16, 0x1200100D, -0xFAF70707, 0xF0FA100E, 0xEF090D01, 0x09EE0808, 0x0809F2F5, 0x03FF090C, 0x060410F1, 0x01EE16F7, -0xF41015F9, 0x12F10B0C, 0x0FEBF1F7, 0xF906F40B, 0x0CFD02F6, 0x0FFAF00E, 0x0D030BF2, 0x0BF711F4, -0xF1F30A06, 0x0CF5F9F0, 0x031A0D0F, 0x0CEC0608, 0x08EEF5F5, 0xF202020A, 0xFAF7F1FB, 0x0FFB07F9, -0xF5010C0A, 0xF0F6FA0C, 0xF70FF0FF, 0x08ECF80E, 0x0EFBEC10, 0x01F0EF14, 0xE9030C08, 0x0A0EEFFD, -0xF7001415, 0xEF04FCF3, 0xFF0C13EE, 0x05F4F2FC, 0xF9F3E7F7, 0xEC0CF6FE, 0xFDF70702, 0xFE12EFF0, -0x0FFB0D07, 0xF6E8ED03, 0xF40607F5, 0x06040F0D, 0xF60700F1, 0x080503FA, 0xEE0B06F8, 0x0114050A, -0x0DFF0B11, 0xF5EFF7ED, 0x11EE0F13, 0x0201EAEF, 0xF80BF80F, 0x070D0F0C, 0x090502F0, 0x0BE70401, -0x0A0CF0F4, 0xF601F3F7, 0x1AEEF912, 0x11060C03, 0x09EDF7F9, 0xF6ED1708, 0xF0FA0E02, 0x0DF20FFC, -0xEFFCF7F3, 0x090EF50C, 0xFAF8FDF9, 0x0F0E1304, 0xF117F3F9, 0x0CF3020D, 0xF8FBF705, 0xFBFEF0ED, -0xF5F1EB14, 0x0D07F81B, 0xF9F704F4, 0xF1F3FE09, 0x03030DF6, 0xFA02F1F5, 0x11F4F600, 0x16081215, -0xF5090B0A, 0xFA0C0AF0, 0xF60F0E02, 0xF3E8160D, 0x08FDEEF8, 0x10F907FC, 0x0AFE00F5, 0x0AF0F00F, -0xF4F7EE0B, 0xFFF3F4F5, 0xFDF718EF, 0x0CFC0B10, 0xF70AFEFE, 0xFCF2EDFB, 0x08EC0F15, 0xFBEE11EC, -0x0BF6080E, 0x0D02F702, 0xF3FE09F9, 0xF9F30A10, 0x0FF20809, 0xF910FDF8, 0xFA060EEE, 0x10FBFE06, -0x150C0810, 0xEE0D160B, 0xFF08FB0C, 0x0411FC10, 0x09F8FEF6, 0x0BFC10F2, 0x0DEE0D07, 0x0C03F40D, -0xF1F5FC11, 0xF80C0011, 0x06EF0208, 0x070C08F6, 0xF807F80C, 0x10090000, 0x050EFD0F, 0xF80CF216, -0xF9FFF2F9, 0x08EE09F8, 0x09EEFFF5, 0xF8F70CF0, 0xF609F803, 0xF90AF509, 0x0E00FE0E, 0x05F7FE0A, -0xF807F1F6, 0xFCF5F6FF, 0x0AFE0BFD, 0x09F500E5, 0x0DF8FC0C, 0x070808F1, 0xEDEEF00D, 0x0900FBF2, -0xF407FAEA, 0xEFFA0CED, 0x10170A0B, 0xF807F6EA, 0xF1ECF9FF, 0xF5FEF4FF, 0x0E020B11, 0xFFEDFC0B, -0xF3F4ECE6, 0xEE0AF6F4, 0x09F7FE05, 0xF4F2EAFA, 0xF7F70D06, 0xF708EF07, 0x10F8FCF7, 0xEFFB08F2, -0xFA05FDF7, 0xF3F31111, 0x0109ECFB, 0x0DF1F208, 0x0EF3F307, 0xFFF1F4FE, 0xEDFF12FA, 0x13080405, -0xF307040D, 0xF408FCFC, 0x10120500, 0x090AEC07, 0x0CF10907, 0x09EEF8ED, 0xFCED0CFB, 0x0CF91008, -0xFB0FFCF2, 0xF709F7F6, 0x080608F8, 0xF70BF60C, 0x03F60808, 0x0507F9FC, 0x13F3F40C, 0xEC000A0F, -0xF7F307FD, 0xF2FF0B0E, 0x03FCF5F4, 0x04E4FE0B, 0x0F0BFEF4, 0x100C02F5, 0x13E9ED0D, 0x0204F4ED, -0xF5F3FAF1, 0x05FD0A05, 0x00F4E4FA, 0xF9FA0EEC, 0xF308F50F, 0xFAF8FB0C, 0x14F70B0A, 0x090A080B, -0x011207F4, 0xF0070AF0, 0xEDFE0EF3, 0x1311EF09, 0xF8F9F5F1, 0x04F5F507, 0xFFF70FFD, 0xF1F50413, -0xF6F8F50F, 0xF7FEF00A, 0xF70104F1, 0x0D04F717, 0xEBF31209, 0xFFF50CE7, 0x0CF7070C, 0xFA0AF50A, -0xF5FEF6F1, 0x050EEF00, 0x0705F6EF, 0x1204FAE5, 0xF80BF9FD, 0x0AF4FDEF, 0x08F80307, 0xEE04050C, -0xFBEFED07, 0x0A120401, 0x1208F2F1, 0xF6F31315, 0xF7F3E909, 0xF1F90F08, 0x03E40709, 0xFB0BFD0E, -0xF5F9F7F8, 0x0AF7FEEB, 0x12F4F306, 0x12F1FBF7, 0xF20606F6, 0xFAFB1402, 0x0E11FBF2, 0xFAECF8FD, -0xFAEEFCF6, 0xFA07FD02, 0x0DFCF604, 0xFAF4FC09, 0xF100EF10, 0xFDEE08F8, 0x0D0B14F0, 0x0BF30DEC, -0xF9000FF1, 0xF8090E06, 0x09EB03F7, 0x0FF90DF5, 0xEC11F6F8, 0xF6EE09FE, 0xF5F0F9FA, 0xF907EF0B, -0xFCEE06F8, 0x0FFEFB16, 0x0AFD0805, 0x05F10A08, 0x0CF303F7, 0x0115F3FA, 0xEE0D0A0D, 0xF9F6F80E, -0x100A0AF8, 0x0BF702FC, 0xF6080705, 0xFD01F3F4, 0x0DFE0101, 0x0EF7FF0A, 0xF00BFFF9, 0xF8FBEF0F, -0x1101F7F6, 0x1104F5E7, 0xF81709F6, 0x0809F7F5, 0xFEF509F8, 0xEBFB00E8, 0x0800FFF6, 0xF111FAFE, -0x14F2F6F5, 0xFAEF0108, 0x0FFB100F, 0xF0FB090C, 0xF608EF0B, 0xF304FB19, 0xFEEE0E11, 0x12030908, -0xF3090907, 0xF707FC11, 0xF8EDFD0F, 0x04F2F5F5, 0x03FEF2F6, 0xF00B02FA, 0xFBF805F9, 0xF5FA1012, -0x08060E06, 0x12E8F709, 0x0AEAFCEC, 0x080EF10C, 0xF510FEF8, 0xEF06F6FD, 0x0F0508FD, 0xFFF8FA05, -0xF6091212, 0x07F114F7, 0x070CF50B, 0xF3F501EF, 0x080BF00B, 0x06F9FDEF, 0x08F5EEF2, 0xFA0D0C05, -0x02FFF90E, 0x050AFA08, 0x0803FF00, 0xF40901F5, 0xF113F514, 0xF9080DF9, 0x03F6000A, 0x170AFCFE, -0x08050A04, 0x09E5F2FC, 0x0B00F00E, 0x10EF100A, 0x0BFF10F1, 0x120602FD, 0x0AF1F703, 0xF50DF811, -0xEBF5F012, 0xF908020C, 0x030112F2, 0x16F9E0F5, 0x06070008, 0xFEFAEAF6, 0xFA0D1305, 0xFFFEFA14, -0x0602F9EF, 0xF2F90202, 0xEF0E10ED, 0x06F00BFD, 0xF0E90503, 0x1506FAF2, 0x01F80A0D, 0xF6E90304, -0xF1F810F8, 0xF5F60A00, 0x0309F9F5, 0xF1F4F9FA, 0xF4FA0A07, 0xE5080803, 0xF7F9040B, 0x0FFC0FF9, -0x0AF4FCF5, 0xF0F20B02, 0xFAFB02FE, 0xF3000D0E, 0xF3FAF9FD, 0x02040209, 0xED0DF1F4, 0xF6F00DEA, -0xFC0004FF, 0x050BFF0D, 0xFFFBF80D, 0xF40302F8, 0xF8FA07F2, 0xF103F907, 0x050B08FB, 0xEF010E0C, -0xF8030DFD, 0xF814F60C, 0xFA09F506, 0xF4F4F2FE, 0x09F8EFED, 0x03F612F6, 0xF609F20D, 0xF90BFB11, -0xF60EF5F8, 0x00F60AF9, 0x0D0112E8, 0xF60900F0, 0x0C0008F8, 0xF5ECFD06, 0xEFF9000E, 0x0411FA09, -0x110B0BEF, 0x11EA0301, 0x0B0CF10A, 0xF1EFF50A, 0x111004FD, 0x0807FDF5, 0x0AF5F100, 0xF8080BF3, -0x0D01F7F5, 0x000716ED, 0xF3F6F80A, 0xFDF30513, 0xF8FA0B0E, 0x0DF80103, 0x020DF308, 0x10F6050B, -0x09F7F609, 0xFCF103F0, 0x0709F6F4, 0xF40D12F6, 0x0B02FD0B, 0xF2FC10ED, 0x04EDF7E9, 0x040E0E0E, -0x090708F2, 0xE90808F9, 0x0E0CEA13, 0x06F103FC, 0xF80C0506, 0xF4FF0DFB, 0x060A08F7, 0x09EBEE07, -0xF4F8FB0A, 0x0CF60306, 0xFB1EF1FF, 0x08F90C0E, 0x160BF5F5, 0x10F604EE, 0xF40302F7, 0x040507FF, -0xFDF3FD09, 0xFD0FFB0D, 0xF8F406F8, 0x0BFAF40C, 0x16F6FFF3, 0xFC1F0B0C, 0xF3EEF50F, 0x08F5EB0D, -0xF0FD0BF4, 0xECF5F9F7, 0xF30100EF, 0xF80BE9F5, 0x0200F50F, 0x08F7F8FA, 0x10F0F4F5, 0xF3ECEFFA, -0x09FEF5F1, 0xFEEAF402, 0xFAFC13FC, 0x15F8F70F, 0xF7060700, 0x07100D0B, 0x1705F901, 0x0EFF0605, -0xF407FA16, 0x02FA0615, 0xFDFF0BF4, 0xF211FA0F, 0x0F0406F8, 0x10EEEB0B, 0xEBF1FF12, 0x170E130F, -0x0B0BF3F4, 0x03120AF8, 0x00160304, 0xF7F6E3F4, 0x0DE6EEEF, 0xEC07F5ED, 0x050F060B, 0x141705EE, -0xFCFE0AF2, 0x16050AF5, 0x01FEF6F5, 0x0EEFFD0B, 0x0BFDEB15, 0x02FF0507, 0x1507F409, 0x03011609, -0xFCEE090D, 0xF202F3EB, 0x07FB040D, 0xFAF614F9, 0x0F07070E, 0x0AEFF2F6, 0xFE0604F6, 0xF709F908, -0xECFE06F1, 0xF1140E0F, 0x0BEEFCEB, 0x13F60DFC, 0xED140FF2, 0xF607F3EF, 0x10040D0B, 0xF2FB0D03, -0xF4F40CFC, 0xF10AF605, 0xF1FBF20D, 0x0E0D0BF6, 0xF50213F8, 0x0C060F0B, 0x13FBFB0E, 0xEBFFEE0F, -0xF40909F7, 0xF8090E07, 0xEC0F0A02, 0xF6F70818, 0x0DF0F105, 0xF90B09F8, 0xEFF6090D, 0xF6FE020C, -0xF6ECEFF0, 0x1409F7F4, 0xF9F3F00A, 0xF4040110, 0x10F1FB05, 0x13EB0B05, 0x110C0111, 0x0F05F3F9, -0x12F3ED0B, 0xECFC09F1, 0xF90BF8F3, 0x0D12030B, 0xF10403FC, 0xF403FA11, 0xF1FC0A0F, 0xFE03F40B, -0xE9EF0AFC, 0xF6FB0B09, 0xF7FBF111, 0xFFF5F00C, 0xF205F004, 0xF80B01F8, 0x0BFC1AF7, 0x00F61509, -0x13FB0F00, 0x09FEEE0C, 0xF7F7EAFB, 0x130F0D08, 0x00060809, 0x130BFBFD, 0xF00F0E15, 0xF10EF912, -0xF507F0F8, 0x0502010B, 0x0BFAF8F0, 0x0307F614, 0xFEF30508, 0x09060B15, 0xFAF8F3F9, 0xEBF2F8FD, -0xF9060AF8, 0xEAEE12F6, 0xF406F0E8, 0xF405FC09, 0x130612F7, 0x0D07F811, 0x0D03F8F8, 0x0100130C, -0x0CF9F20A, 0xF30406F9, 0x0CF5F4F7, 0x0006F10B, 0x11F2F0F7, 0xE80DF60C, 0xFE02F6F7, 0xF70607FB, -0x130AFCF5, 0xF8F71006, 0x0AFCFDF4, 0xF00E04F1, 0x16F5FCFE, 0xF6FA06FA, 0x09F9ED17, 0xFE051106, -0x0D0CED0A, 0xEDFC14F4, 0xF81012E8, 0x030303FC, 0xF400F8FD, 0xFDF3F407, 0x0B091406, 0x0CFCF6F4, -0x180D110B, 0x0DFBF10B, 0xFBE4FAF9, 0x0B10F417, 0x0608F9F2, 0xF2F2F904, 0xF80306F7, 0x0902F3FA, -0x080EFA07, 0x03F00600, 0xE2ED0DF1, 0x0AFB140A, 0xF50FFAEB, 0x0AE608F5, 0x0DF8FB0B, 0xE7F206FC, -0x050D0BFB, 0x0204FDF5, 0xFBF70706, 0xF4F0F60B, 0x0B07F7FC, 0x01F7F905, 0x0F16F309, 0x0C0AFAF0, -0xFDF2010F, 0x0BFF040D, 0x060E04F2, 0x0FEA0915, 0x0F020AF3, 0x06080E02, 0xFFF906F5, 0xF600F1FA, -0x060E1104, 0xFCEF0CF7, 0x0CF30D14, 0x010F03F6, 0xF9FAF6EE, 0xF6F112FE, 0xF0F302F2, 0x12080FF1, -0xF911F002, 0xF0F6F010, 0x0D02FC06, 0x10F8FEF2, 0xF6FCE703, 0xEA12FC0D, 0xFFF6FC13, 0xF407F0F8, -0x0DF5010D, 0xEA0C08F4, 0x02050AFB, 0x090DF6FF, 0xF2F4F709, 0xF104ED0E, 0x0906F8F6, 0xF8F806FB, -0xF8F20F0D, 0xF8F3F7FA, 0xFE04FB02, 0xF80DF7F9, 0x030EF400, 0x0A05EE08, 0x04EB06EC, 0xF6F50FEF, -0xEF0E03E7, 0x13FE090B, 0xF70FFC0E, 0x120B150E, 0x0712EDF4, 0x0E04EDF8, 0x0D0DF510, 0x080EF3EE, -0x0DF702EF, 0x0902E91A, 0xFD10F4EC, 0xF1F7FA0F, 0xFEFDF4FA, 0xFDF60F04, 0xF10FF20B, 0x031017E9, -0x12EF03FE, 0xF3F6110C, 0xFEF4FC07, 0xF20A08EB, 0x020613F0, 0xF5F6FB0A, 0x07160207, 0x15F5F20B, -0x18FFED0B, 0x0F11F911, 0xFFEF0B08, 0xF3F8F8F8, 0x0AF40B10, 0x0FF70A04, 0x0AEB13FE, 0xEE0B0C0A, -0xF5020605, 0x0A140A00, 0x010EF6F2, 0x1A0304FC, 0x08EB0FFF, 0xF0FDF617, 0x12FC01F4, 0xEC1709FA, -0x0C0C02FA, 0xF90DF9F9, 0xF0F50311, 0xF1100C04, 0xF20200FC, 0xF2141703, 0xFA051100, 0x0D14F8FC, -0x03F2F6FE, 0x04FCF6F6, 0x10FAFA03, 0x0309FB05, 0x09F00DF4, 0x0A08F4F3, 0xF3F5EFEF, 0xF106FBFE, -0x050105F8, 0x0D09F0F8, 0x0E130EF1, 0xFAF00B09, 0x080D11ED, 0xFDF703F8, 0xF8F10AFC, 0xFE04ED0A, -0xF4100B08, 0xF1FCF10F, 0x050E14F4, 0x05070D04, 0x0AEC100C, 0x0D0BFCF6, 0x01FAEB0C, 0xFF0C0DF8, -0x010E0DFF, 0x07F7F70F, 0x00FBF6FC, 0xF9FB0D09, 0xF1ED080D, 0xFCF9EDF4, 0xF3F80C0B, 0xFD0210F4, -0xFBF206F2, 0xF3F5F7FC, 0xF8FDFFF1, 0xF0020908, 0xF804F505, 0xF8F2080B, 0xF0FA09F3, 0xEFF8120A, -0x14EDF8EA, 0x0CF40E15, 0x0EEB0600, 0x02FD01FB, 0xF5F30D0F, 0xFFF400F1, 0xF30F0909, 0xF9ECF107, -0xEE0AF0FF, 0x05FA070D, 0xFD0CFB06, 0xF8F7EFEE, 0x13F0030B, 0x050404F4, 0xEE0FF6F5, 0xFC0813F5 - -output0 = -0xCE63DECD, 0xD5F54E4C, 0xB969BECF, 0x67199350, 0x73BD1B5F, 0xF3FA3DD7, 0xB72F3304, 0xCA6C9E7F, -0xC75EBD3C, 0xE9183BC1, 0xD2EFF1F5, 0xDB98D960, 0x9183FF24, 0x84E53C2E, 0xBC0ACB99, 0x7544F27D, -0x61B01F8C, 0x6F8E7BCA, 0x0F9A1912, 0xA4DE41C3, 0xFB1F18F3, 0x44764A35, 0x9525E193, 0xAD6AFC2C, -0xEAC9CBE7, 0x82E626C3, 0x6764F162, 0xB7180FC5, 0x92F0BF10, 0x6BE2A423, 0x6652CA83, 0x76AB8A79, -0xD2DC0142, 0x3684A5B0, 0x6AF81D1E, 0xCE7B11D8, 0x5C0A7AA6, 0x9B519157, 0xCF71DB9C, 0xE66B5219, -0x0976A858, 0x97CCD7A4, 0xBD21A44D, 0x694DB77D, 0x2046F400, 0x66BF01FF, 0x4FE7F1B2, 0x7D287C99, -0xA6DD65A8, 0xDDAC14DF, 0xB4EA7458, 0x9BF75449, 0xBCCF3BC5, 0x59B3E1D5, 0x04D5FEAA, 0xA91CED07, -0x264A3E33, 0x314BE435, 0x47FB659B, 0xC8C6CBDD, 0xD4BAF083, 0x51A5AE91, 0x39A33C7A, 0xC54DBA59, -0x81FD7FFA, 0xE2A3941C, 0x386750ED, 0x85C6A1CF, 0x52E46581, 0x2DD58578, 0x4F8C20DC, 0xCA6C89B8, -0xD33AF49E, 0xB73D9A1C, 0x8F5992A5, 0x4613FE36, 0x8F724B6A, 0xD2C9A290, 0x5C4791D6, 0x8AA4DE2A, -0xBCA9EEF4, 0x769D6618, 0x71DF1DFC, 0xE9DC6A93, 0x99E831C3, 0x88B8CBD4, 0x4C9E63C5, 0xBEBC2792, -0x9E54A535, 0x55181DEF, 0x0F83F8D2, 0x79A8094D, 0x2DA8AAEB, 0xD64C6C17, 0x4F0AADB5, 0x20CB1D7F, -0x2D6E9F16, 0xB97E8AA9, 0x36167C67, 0x8D84329F, 0x4002AA1C, 0x6326776B, 0xB9B50F8F, 0xF9C52D71, -0x4D1A117F, 0x604A6DEE, 0xBB19DFB2, 0x96121F4E, 0x9E7C8D9E, 0x00F8F1F3, 0x204B8054, 0xA67E9C60, -0xC534F776, 0x94B8C032, 0x38E7CFEC, 0xF1E48A55, 0x821E3625, 0xFAC9EBD0, 0xF3D38EF2, 0xB4DA79FB, -0xF32472 - -harq_output0 = -0x0FFA0103, 0x130C0B02, 0xF309F6E7, 0xF70F07F1, 0xF7090FF8, 0x050409F2, 0xF80AFAF7, 0x00F60EF5, -0x06FC060D, 0x080DFB03, 0xF4EDF9F9, 0xFCF9FEEA, 0x0F0C12F8, 0xF9F31708, 0xF60C02FF, 0xFF110310, -0x0BF80F0F, 0x02F6F2EE, 0xEDF20A06, 0x0709FEF2, 0x14F5F0F0, 0xF70C0018, 0x12020FEF, 0x0602EF08, -0xF40A0200, 0xEE0C0BFC, 0x0606ED01, 0xF2F709F3, 0x15110E10, 0x06EC06F8, 0xFBF10CF8, 0x0314FEF6, -0xF5F4FC0C, 0xF00C00FF, 0xF6FDF9F6, 0x07F30801, 0x0F04F40C, 0x0406F305, 0xFAF9F808, 0xF20DF109, -0x010A0AF8, 0x070AFC03, 0xF108120A, 0xF8F9F1EC, 0xEEEB09FF, 0x140C0D01, 0x04E5EF10, 0xF616130C, -0x0314F4EC, 0x09FA09F2, 0xFAFAF714, 0xFAF101FD, 0x06030FF4, 0x17F3EFFA, 0x09FEF109, 0xFDFEF9FB, -0xF2080B02, 0x0CF90B07, 0xEB0F0D06, 0xF71009FE, 0xEF110AF8, 0x0AF70BF9, 0x170A1508, 0xF8FDFAF1, -0x0204F3EB, 0xEFFE0315, 0x0C06000B, 0xF10C0A0E, 0xEC0EF9FC, 0x08F0F2F3, 0x09FD02F7, 0x0B11F610, -0xF8F1F8F7, 0xF8FB0A09, 0xFB030A13, 0x040804F0, 0xE8080813, 0xF1F4FFF3, 0xEBFCEDF7, 0xF7F00AE8, -0x00F1160E, 0xF007F301, 0x0E13F211, 0x07F815F4, 0xF9EEF70B, 0x0EF7FE15, 0x0706E80C, 0x0611F60E, -0xFB0B0CF5, 0xF4F50E11, 0x14FDF1EB, 0xF403120A, 0x09F80303, 0xFB0AF80B, 0xFA1408F5, 0xF503F717, -0x0FFB1610, 0x1107F3FC, 0xF1F4F7F7, 0x060EF4E8, 0x04F8F5FF, 0x04F30CFA, 0x10F008F8, 0xF514EEF3, -0x0EEDE8FE, 0xE7FEE70B, 0x0404FEF9, 0xF8F509F9, 0x0A0EF6F2, 0xF8080EF8, 0x01F200F3, 0x03FC19F2, -0x0D0FF2F8, 0xF9FD0C13, 0x11FE0703, 0x0BF9F110, 0x0EF3FEFD, 0x0EF8F10C, 0x0A070FEA, 0x04FA0310, -0x0CFE0003, 0x0CF3060D, 0xFBFCF5FA, 0xEC0D1108, 0x09ECF70A, 0x0C0EFB08, 0x0BF4F80A, 0xEFF0FB0C, -0x0B09F8FA, 0xFA16FF13, 0x0B081512, 0xF4F2FBF7, 0x000C0A07, 0x130C0FEE, 0xFEF908FB, 0xF6F5F912, -0xF1100409, 0x090E1606, 0xF4F50BF3, 0xEE00F7F9, 0xFAFBF5F6, 0x07080B0A, 0xF1150BE7, 0x0DF80912, -0x12EF0809, 0xEBFF1108, 0x0BF60DFE, 0x130DF608, 0x12EFF2F1, 0x04FB0C0B, 0x01FDFC09, 0xFAF808F9, -0x12020B01, 0xFCED060F, 0x040DFFFF, 0x04F80AF3, 0xF700F60B, 0x08F40E08, 0x06F7F80F, 0x0DFDEF04, -0xFDEFF916, 0xF21107EF, 0x0A1110F1, 0x03F70DF3, 0x08F50300, 0xF1F711F9, 0xF6FCFF0C, 0x0CFFF704, -0x080CFE09, 0x0FF80D06, 0x05080C08, 0xFE020210, 0xFB11F6E9, 0x060BF2F1, 0xED0BEAF9, 0x02F30C02, -0xF8F40DFB, 0x020D0D01, 0x0CF406F1, 0xF302F812, 0x080C0EF2, 0x06010006, 0xF0FA0908, 0x08F9F905, -0xFB0A0508, 0x0FF0F7F4, 0xFF081210, 0xEE18F6F1, 0xF9F9E8F2, 0x060B09FD, 0x0AFEEE04, 0x09F304F8, -0xEA05F6F8, 0x1C0108F5, 0xF205120F, 0xF40D0A04, 0x0001F30D, 0x00FF0DFA, 0x020BF7F7, 0x02F2F7F0, -0x04F90BF1, 0x01EFEE07, 0xEBE4F807, 0x0AF90FEF, 0x0F040B11, 0x0BF91000, 0x000CF812, 0x0311F3F0, -0xF8070218, 0xEDFFF614, 0xF00C15F1, 0x000D0F16, 0xFA0EF707, 0xEE080901, 0xFF0C09F5, 0xEEF704F1, -0xF10C10F9, 0x060BEBF7, 0xFA0EFDF6, 0xF7F403F2, 0xF5F0F306, 0xEC081A0F, 0x020AEEF5, 0xFBF9F7FB, -0xF60C010A, 0xEC0E0FFF, 0xF014FB10, 0x0EFD0308, 0x04F30015, 0xF4FC0CEE, 0x0CFEF3F7, 0x12F0F702, -0xE803FB07, 0x040D06F5, 0x05FA07F1, 0x140A0BF8, 0xEFEDFF11, 0x01EFEE13, 0x0D0C0B0F, 0xE70105F0, -0x01F70CF4, 0x0603EE12, 0xED08EDF9, 0xF2FCFA02, 0x0E0CFCF3, 0x0E04F8F9, 0xF30D17F9, 0xFEEDFB05, -0x071BF114, 0xF309F7F4, 0x02F503F6, 0x0815F400, 0x0CF0090A, 0xE80D0F02, 0xF9FCFDF8, 0xF00FFEF5, -0xF3F5F70B, 0xFC10F7EF, 0xF2FB0AFE, 0xEEECEC15, 0x0202F60E, 0xF310FEF9, 0x10F8F209, 0xFB0606EE, -0x0D0B0C10, 0x1110080C, 0xFCF2F8F6, 0x030DEE07, 0x0C11F511, 0x0CF6EF08, 0x0900070C, 0x0C160E0F, -0xEEF8FFF9, 0xF7F0EEF5, 0x0A090903, 0xF70A000E, 0xF5FF07F6, 0xF5E5FEFD, 0x08F1F80C, 0x00F2EE0D, -0xFAED07EA, 0x07EA170B, 0xFEFFECFF, 0xED0B0211, 0x0AF4F4E6, 0xF2FAF705, 0x0807F706, 0xFBF2F8F7, -0xF31105F7, 0xF10809FB, 0xF1FEF307, 0x0805FFFA, 0x08FC070D, 0x0A071200, 0xEEEDF107, 0xF908EDFB, -0x09F60FF2, 0x0B0C06F8, 0x07FCF608, 0x000FF30C, 0xFF0EF3FD, 0xE40BFCF4, 0x0CF50BF4, 0x04EDE90D, -0xFD05F3F1, 0xFAECF4FA, 0xF80C080F, 0x0A0BF70A, 0x07F012F4, 0x1109FEF3, 0xF507F9F1, 0xF513F7FD, -0xFE0AF80F, 0x041701F1, 0xF5E7F309, 0x0A0AF70C, 0x0E00FEF1, 0x04E505EF, 0xF4EF0BFD, 0x040CF807, -0x1201EF07, 0xF31508F1, 0xF908F309, 0x0B0EE409, 0xF7EBF9F8, 0xF1F7F406, 0xFB0206F6, 0xECFD11F2, -0x0702EEF6, 0xF409FC04, 0xEEF80010, 0xF3EC0BF0, 0x090600F1, 0xF9F5EBF7, 0xEEFE11F8, 0x070BF0FA, -0xFE16EEF8, 0xF108FD05, 0x15FAF3F7, 0xF60E0D0D, 0xF7FC0AF8, 0x01F40805, 0xF70AFE01, 0xFB0F0BF9, -0x04E701F6, 0x09F517F6, 0xFBE8F5F8, 0x11FE00F6, 0xEF08F2F5, 0xFB0CFB0F, 0x0419080B, 0x0308EE11, -0x07110907, 0xF2F5ED0F, 0x0BFAFEF6, 0xFA12F8F9, 0xE8090606, 0x0E0CEAEC, 0x06FD10F8, 0xF80505FD, -0xF1F70912, 0xF5EF0C0B, 0xF9EF0B0B, 0x0D05F5F2, 0x0A08FF0E, 0x09F50300, 0x08F91314, 0x0AFEF60A, -0xE5FC0504, 0xEF0A000E, 0x06FDFFF1, 0x0D11F103, 0x080CF512, 0xF9F501F2, 0xFAF60708, 0xFE140D05, -0xF90202EF, 0xF0FD0EED, 0x06F2E903, 0xE904F80D, 0xF600F8F8, 0xF4FA09F5, 0x0803FA07, 0xFCF9F90B, -0xF202F4F5, 0x000EFBFE, 0x0409FAFD, 0xF0EA0DF4, 0x0B0D00FF, 0x03F8FB0D, 0x0307FAF2, 0x010C0BFB, -0x140C03FD, 0xF4FE0906, 0xF6F6F8ED, 0x0B11090D, 0xF6F90EF8, 0x09F001E8, 0xEC0600F8, 0x1109F90E, -0xEA010BEF, 0xEF0A0C0A, 0x07F510FD, 0x08F3F500, 0x07ED01F5, 0xF313F60A, 0xF803FA0E, 0xF60B0D08, -0xF1F0F709, 0x0DF609F4, 0xFCED020B, 0x0E0EEDE9, 0x08F907F2, 0xF1FC0C13, 0xFFFB0C06, 0xEB070AF7, -0xF606F80A, 0xF90E1EFF, 0xF6EE0BF5, 0x05FF03F7, 0x0F0DF309, 0xFA0CF4F8, 0x1F0CF6F3, 0xF50DEE0F, -0xF5F7FDF4, 0x0BF501EF, 0xF7FA000F, 0xECFAF0F5, 0xEA02FEF1, 0xF80FFCFC, 0x100B0600, 0xFF050501, -0xFA150716, 0x110FFFF4, 0xEE0B04F8, 0x0E0FF112, 0x12F80BF4, 0xF6F41604, 0x07EDE6EF, 0x17EE0F0B, -0x05F5FEF2, 0xEF0BFEF5, 0xFF07FD15, 0x01090709, 0x02EBEE0D, 0xF6F9FB0D, 0xEFF6070E, 0x090806F6, -0x140FFEF1, 0xF6FCEEEB, 0x07EF14F2, 0xFB03040B, 0x0A05F4FC, 0x0DF6FB0D, 0x060B02F8, 0xFF0FFB0E, -0x090709F7, 0xF7180F02, 0x0BF8F005, 0xFE0CF60D, 0x09F4ECF0, 0x0410F30A, 0xEB05F105, 0x05F90C11, -0xFCF1F30B, 0x120B0BF3, 0x031104FC, 0x030BFC0F, 0xFB09EFFC, 0xF50CFB11, 0x0BF80504, 0xF609FCF7, -0xFE0CFB00, 0x0F08F7FB, 0x0BFD0609, 0x0E120F15, 0x020B07F8, 0x0714FAF0, 0x0615F308, 0xF2FDF8F9, -0xEEF606F8, 0x050906E8, 0x071106F7, 0x000C03F8, 0x04F9F90A, 0x060BF5F7, 0x0D0CF2F7, 0x06FB02F7, -0xF7060AF5, 0x0EF1FCF4, 0xFAFAF5FE, 0x0506F917, 0xFCF40C0A, 0x03FC10E8, 0xF30700FD, 0xFCF40906, -0xFB0B0D0B, 0x1017E4F9, 0xF20408F2, 0x02FA03F7, 0xF0000E07, 0xFB0AEDF1, 0xE6F50FEB, 0xF2FCF80B, -0x04F50DFB, 0xF00BF706, 0xF70507FC, 0x0AF01609, 0xFF0DF20F, 0xEA150EF2, 0x080202F3, 0x00FAF9F5, -0xEFF70E04, 0x0FF6F314, 0xF1FEFAEE, 0x08F1F3F2, 0xF6101102, 0xF8F20206, 0x120DFC03, 0x07F8F613, -0x0CF4F50D, 0x0DFF05FB, 0x040EF409, 0xF8FB06F6, 0xF3FAF20D, 0x0DF90402, 0x05080E00, 0xF5EFEBEC, -0xFE0B0EE7, 0x0B0E0F0E, 0x04F812F4, 0x0EEE0D10, 0x021AF7EF, 0xF70F10EC, 0xF604FDFA, 0x10E90F0B, -0xF60CEFFE, 0x0AEBF407, 0xF60A06F0, 0xF50B1607, 0x1111FF0B, 0xF8F8EF08, 0xF704F410, 0x0B0AEBFE, -0x14000205, 0x03FC0EF2, 0xFD17EBFF, 0x17FAFCF4, 0x0DF90CFA, 0x1004F511, 0x140302FC, 0x14FC0500, -0xFCF6F2FE, 0x0905FA03, 0x08F3F0F4, 0x06FEF5EF, 0x09F801F8, 0xF00913F1, 0xF7F80DED, 0x040AF1FC, -0xFC0F1008, 0x07040EF4, 0x0BF6EC0C, 0x0CF8FA0C, 0xF70F0EFF, 0xFB09FBFC, 0xF9F4ED0D, 0x02F4F80B, -0xF5FCF2F2, 0x0208FDF1, 0xF20B0405, 0xF80AFAF3, 0xF415EDEA, 0xFDFBEB00, 0xF4F1F30F, 0xEC070F09, -0xFA0D0AFF, 0xF7EE0C06, 0x04F4F00B, 0x08F50FF5, 0xF50EF3FC, 0x1006E7F9, 0x04F7F7FC, 0xFC070CFB, -0x0F12EAFA, 0xF7F00706, 0xF4011505, 0xF7140B09, 0x0AF9F1F8, 0x03060DF8, 0xF2090CF8, 0xF20712F3, -0xF903EFEE, 0x1102EC14, 0x0A09F1F6, 0xF9F001FA, 0xF8FE01FB, 0x140410F1, 0x0B0402F2, 0x0F0006F5, -0x0805ECF9, 0xF409F10E, 0x0DE7FD01, 0xEFFD0710, 0xF20403FD, 0x0BF2F6F9, 0x0004F909, 0x0F09FFF6, -0xF3060DF2, 0x0EEF060E, 0x0CF40705, 0xFDF7FB0C, 0xF4F203E4, 0x0E09F4F6, 0xF5FE04F9, 0x06F3FEFE, -0xFDFB1102, 0xFD04EE0D, 0x0DFBFCF1, 0xEE14E90B, 0xFB0CEE09, 0x0C13F108, 0xF60703FD, 0x0BF4FCFA, -0x14F2F0FB, 0xFAF9EFF7, 0xF5010801, 0xF109EEF3, 0xFF0A0514, 0x0C0604FF, 0xFB0EF704, 0xF50EFD0B, -0xFF05F4FA, 0x07E70B0B, 0xEFFEF4FD, 0x0D0807F3, 0x05100DF6, 0xEFFA1A08, 0x020D090A, 0xFFF5F7FD, -0x1513F10A, 0xF10BF2ED, 0x0B0F150B, 0xF10306FA, 0x09FB11EE, 0x061007F2, 0xF7F8FB14, 0xF90704EE, -0x0AF8EAF6, 0xF7E809F9, 0x02F609E9, 0x09E802EE, 0x03F50BE8, 0x040C04F1, 0x0CF41009, 0xFB00EEFA, -0xFC071611, 0xF9F1F203, 0x0BF0F409, 0x0214F801, 0x0A0AF504, 0x0508F5F1, 0xE916E900, 0x07F4F60A, -0xF9F010F2, 0xF906F507, 0x0BFB0AF4, 0xF408F0F1, 0x0EFD0A06, 0x03F80AF6, 0x130CFD0C, 0xF1E9F7F8, -0xF800F502, 0xFEFDFDF4, 0xF90B0713, 0xF506FAFD, 0x0712F9F2, 0xEAF20DF5, 0x10F40D0D, 0x06050B09, -0xF706090E, 0x0F00ED11, 0xF90E02F4, 0xF1FEFCED, 0x0AF5E00D, 0x06F7F3F9, 0x08F81206, 0xF30EF4F5, -0x12FF02EF, 0xF7040DF4, 0x151204F0, 0x04ED07EC, 0xF0F3FB05, 0x08F2FCF4, 0xECED11FA, 0xFC110DF8, -0x0BF4F90A, 0xFCF9F905, 0xF0010014, 0x0A0EF9F8, 0xF4020C02, 0x10FDFA13, 0xF5000B05, 0x05EAF808, -0xFE0F04F3, 0xFDEFF9EE, 0xF9F9090B, 0x10F20E0C, 0x060909F0, 0x060EF40F, 0x0E0705F5, 0xFB05F6F9, -0xFA1C0512, 0x0B10FBEB, 0x16F20DF6, 0x090012F4, 0x0A13020B, 0x0EFF0C0A, 0x130DEF0C, 0x070A0B04, -0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, -0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, -0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, -0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, -0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, -0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, -0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, -0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, -0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, -0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, -0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, -0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, -0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, -0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, -0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, -0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, -0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, -0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, -0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, -0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, -0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, -0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, -0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, -0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, -0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, -0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, -0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, -0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, -0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, -0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, -0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, -0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, -0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, -0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, -0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, -0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, -0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, -0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, -0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, -0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, -0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, -0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, -0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, -0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, -0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, -0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, -0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, -0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, -0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, -0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, -0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, -0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, -0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, -0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, -0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6 - -basegraph= -1 - -z_c= -176 - -n_cb= -11616 - -q_m= -2 - -n_filler= -8 - -e= -4640 - -rv_index= -0 - -code_block_mode= -1 - -iter_max= -20 - -expected_iter_count= -20 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE - -expected_status= -SYN diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_1.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_1.data deleted file mode 100644 index 63c2d3b618..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_1.data +++ /dev/null @@ -1,684 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0xF30110EF, 0x09FB0E0E, 0xFB0BF902, 0x10FF060C, 0xF70A10FB, 0xF007F709, 0x0CF30FF1, 0xFC0B07FB, -0xEA0FFA0D, 0xFB0B1209, 0x0709F1F2, 0x0BF1F004, 0x000EF10B, 0x08F8010A, 0xF70E0909, 0xF7EC00F6, -0x05F2F8F9, 0x0A060D10, 0x0DFB0CEF, 0xEFF4F2F9, 0xF80DF8F9, 0xF20809ED, 0xFDFEF3FE, 0xF2FC07F9, -0xEF12EEF8, 0x0D0FEF0C, 0x011714F4, 0xFDF902F3, 0x05020A13, 0x0A0BF5F8, 0x1517FA10, 0x0DFF04FD, -0xED0F0FFB, 0x0C0B12F8, 0x10F205EE, 0x14EEF0F6, 0xEEF50606, 0xF701F006, 0xF2120906, 0x0FF31409, -0x0004F9F0, 0x080005F5, 0x05000E18, 0x080BF50C, 0xE9FA01EF, 0x0DFDE702, 0xF303FC08, 0x0306FDED, -0x0302FD15, 0xF2F404F6, 0xF60B0DFC, 0xF702F2F8, 0x0D0109ED, 0xECF2F006, 0xFFF50AF3, 0xFB0609F7, -0xF9FAF2FC, 0xF3010611, 0xF2F20EF8, 0x0EF203EC, 0xF30C050D, 0x0CFB0905, 0x10EAF80A, 0x1103F714, -0x17FCE4F8, 0xF409F2F4, 0x09000A13, 0x0EF009F8, 0xF00DF90A, 0x0AF612E9, 0x12F4FE15, 0x06F3F307, -0xFDF4EEF8, 0xFDFBFB04, 0x02F30DF1, 0xE9F0F006, 0x10F80508, 0x0DFAFBF9, 0xE9F10B09, 0x020600F9, -0x020AF50C, 0x0FED0C0A, 0x05FCF403, 0xF8F3FFF6, 0x0312FD0A, 0x0A05F308, 0x10F10E00, 0x0B0CF40D, -0x04090FFF, 0x1402F2FF, 0xEF0D0B01, 0x0E00F9F8, 0x08040110, 0x0A04EDE5, 0xEE13080C, 0x05F6F516, -0x05F414EC, 0xFF030A00, 0xF0F5FF06, 0xF809F20E, 0xF70CF014, 0x0FFAFA0E, 0x1201F611, 0xE10E0EF1, -0xF40FFA09, 0x13F2F103, 0x0B030B0E, 0xF303FCF3, 0xF405FD09, 0xEF09FEEA, 0x07F908FB, 0xF9FD08FE, -0xF9F7F602, 0x0506FCF4, 0x060BF4F3, 0x040C0E0D, 0xF5F9F606, 0x02FF0DFB, 0x0BF51112, 0x13F7F5FB, -0xF10AF6F8, 0x15031311, 0x07F7ED0D, 0x050AF7F7, 0x0101F708, 0xF717FBF6, 0x06FAFA05, 0xF1F8EF11, -0x11070200, 0x09EEFB04, 0x07EF0601, 0x0603FCFE, 0x0FEC140B, 0xF7F7F806, 0xF00A02FA, 0x0E06F30C, -0xFEF90A10, 0x0AECF80E, 0xF5F2F907, 0x0B08E804, 0x0902E9F7, 0xEE09F6E9, 0xEEF60210, 0x09F7E8FD, -0x0B0CFC0B, 0x030C0905, 0xF0F6F109, 0xF0F8F8E7, 0x100A0913, 0xF8FB0817, 0x0204FA04, 0x0FF00008, -0x02F4FD13, 0xFCE8F208, 0x06EBEF07, 0x0DF1F1F4, 0x0801F5F7, 0xF7EB04FC, 0x0C0A15E8, 0x020B1404, -0xF502EF0E, 0xF600F6F1, 0x090705EC, 0xF1F008F2, 0xFDF2EC11, 0xE90E02FF, 0xF615F6F4, 0xF3F3F4F8, -0xFC0BF20B, 0xF9F90402, 0xF512F301, 0xF90E06F7, 0x0AFC080C, 0xF707FB06, 0xF0F6F1FA, 0x0806F4FD, -0xF6F8F10A, 0x0EFBFDF7, 0xF60EF6FD, 0x0308F809, 0x11050CFF, 0xFF140CFD, 0xF7FEF80A, 0xF1F4FD03, -0xF5EF0203, 0xF8F514F8, 0x11F808F7, 0x12FBFD0A, 0xF3F41309, 0x0D0FF700, 0xFA0B1103, 0xF50A06EF, -0xF902F210, 0x070FFEFB, 0x0D070910, 0xEA11F207, 0x0D0B0D0B, 0xFCF1F408, 0xF70809E8, 0x06F2F10E, -0x1DF5FAEB, 0xF7F0F20C, 0xED0C110E, 0xFBF000F3, 0x0208080D, 0x0DFCFAF0, 0x11EE0107, 0xF109FE00, -0xF4FCF9FE, 0x0AFAF501, 0xF3E7F90B, 0x06E70B12, 0xFDFE06F9, 0x08F00C04, 0xF409090D, 0xF30C0EF5, -0x02F6EF06, 0x12F6EB0E, 0x0DFA09F8, 0x0BF8EFF4, 0xF015F007, 0x15ED1206, 0x07050006, 0x18EF0111, -0x0FF2050C, 0x05F9070F, 0xFCF80813, 0xF3F90611, 0xFDF30EEF, 0x00FC0112, 0x0DF1F8FC, 0x10F7FDF9, -0xF9EA0AE9, 0xF70E0807, 0x0DF105F8, 0x100E0DF8, 0x140F14EA, 0x04F60107, 0x0D030C10, 0x0AF0F9FA, -0xF814EE17, 0xF4F802FE, 0xFA06FFF9, 0xFCF811F3, 0xF6F5050E, 0xF5FB00FC, 0xF811F4F3, 0xF0ECEA0D, -0x04F7070A, 0x12090F00, 0xF9FBEEF3, 0x11F8030E, 0xF5F8F7F6, 0xF90BF908, 0x0E0FF80C, 0x10EF06F0, -0xF5F804FA, 0x06F70909, 0x08EB0F13, 0xF20E0E16, 0xF11509FE, 0x0E0BF3F4, 0xF60F0E0B, 0xFBF405F2, -0x050AFDF3, 0x0EEC1C0C, 0xFBFBEB02, 0xF71310F8, 0xF9080BFB, 0x1612F2F9, 0xFE0DF412, 0xF50A0009, -0xEEF0F7F5, 0x0AF11310, 0x0C02F61B, 0x0EF4FF0E, 0x03F7F8F3, 0xFF08F909, 0x0B0BF00D, 0xF3EE0A00, -0xF0F504F6, 0xF70EFC0F, 0xF70B0BF6, 0x16F313F4, 0x060BF5E7, 0xF9050515, 0xF00908FE, 0xEB0D09F8, -0x0C08F309, 0x0512F303, 0xEEFCF308, 0x03FF1013, 0x02F9F412, 0xFD0B10F6, 0x010A14F4, 0x091307F9, -0x06F206F1, 0x04FE0B03, 0xF90C07F7, 0xE40400FB, 0x0BE81AF5, 0x1301F4FD, 0xEBF4E70D, 0x060EF4F8, -0x06F7F9ED, 0xF1FEEE02, 0x13F20DFB, 0xFAE7F9ED, 0x09FF0A13, 0xF304EDF9, 0x050AF807, 0x08F0EFF8, -0xF5F607F7, 0xF8F71400, 0x170E07F4, 0xF8F41308, 0xEFF80C0F, 0x1EF2FCF7, 0x07EF08F0, 0xF10D09FD, -0x11F9F002, 0x0411F2EF, 0x09070E03, 0xEFF2F0FC, 0xF310FDF1, 0x090AFBFD, 0x040DF407, 0xF317F2F7, -0xFCEF1CEB, 0xF00800F5, 0xF01109F9, 0xFCF1000B, 0x16FF0FF8, 0xF9F6FD10, 0xF80B0D18, 0x160CF713, -0x06FE0BF5, 0x0D08F80C, 0xF4F9FB06, 0x03FBFAF8, 0xFF0C0D08, 0x03F1FD08, 0xF4EE0E10, 0xF4EAF1EE, -0xF7F6F2FD, 0xF90FEB11, 0xFA0606F1, 0x0E06F6F7, 0xEDEAFA0D, 0x09EDF30B, 0xEF0CF202, 0xFEEEF4F3, -0x000DF40F, 0x0FF803F4, 0xFB0DFCEC, 0x0D02EB0D, 0x01060E05, 0x1F0CF0F4, 0x0E0C0712, 0xF9071402, -0xFD0E07F2, 0xF2F4F60C, 0x02150BF2, 0x1106E901, 0x07F50B08, 0xEEF017E6, 0x00F903F0, 0x10F4FD0D, -0xF505F7F4, 0x090F040A, 0xFC0BEE08, 0x050F15F0, 0x07FEFFFC, 0x09EB0F08, 0x110A04F1, 0x12EEFC03, -0xF0E8F106, 0x100DF9F9, 0x07F500FD, 0x0AF208F7, 0x12EE00F0, 0x010A0A12, 0x01EFF5F8, 0x12090BF3, -0xEDF601F8, 0xF7FEF005, 0x04F40EF5, 0xFB1C06ED, 0xF3120BFB, 0xF006FE05, 0x130AFCF0, 0x0A0807F9, -0xF907ECF9, 0xF600F701, 0x03F9EDFA, 0x0714F8FF, 0xEF0B0F0B, 0xF216F9F7, 0x10F70A04, 0xFAEEF4F2, -0xFA0B04F1, 0x02040AF9, 0x13020DF3, 0x08150603, 0x0FF804F3, 0xFFEB0BF8, 0x050FF8EF, 0x08F607F9, -0x03F7F3FD, 0x04FBF5F0, 0xF910ED00, 0x05F7EE0D, 0xF30C0A12, 0xFBECFEF7, 0xF2F30BF0, 0xF203F9FD, -0xEC16EB04, 0x03E4FEF3, 0x03F60200, 0x0802F4FF, 0xFE010A05, 0x06F0170C, 0x050F0C02, 0xFEEC100D, -0xFAF7F307, 0x04FA10FA, 0xEFF5F901, 0xF5020808, 0x0809F2F5, 0x03FF09F8, 0x0604FC05, 0x01EE02F7, -0xF4FC15F9, 0xFD05F70C, 0x0FEB05F7, 0xF9F2080B, 0x0C11EEF6, 0xFBFAF00E, 0x0D030BF2, 0x0BF7FDF4, -0xF1F30A06, 0xF7F5F9F0, 0x031AF90F, 0xF8000608, 0xF4EEF509, 0xF20202F6, 0xFA0B050F, 0x0F0F070D, -0x09EDF8F6, 0x040AFAF7, 0x0B0F04EB, 0x08ECF8FA, 0x0EFB00FC, 0xEDF00300, 0xFD03F8F4, 0x0AF90411, -0x0B001401, 0xEFF0FCF3, 0xFFF8FEEE, 0x0508F2FC, 0x0EF3FB0B, 0xEC0CF6FE, 0xFD0B0702, 0xFEFE0404, -0xFB0F0DF3, 0x0AFCED03, 0xF4F20709, 0xF2040FF9, 0x0A070005, 0xF4F1030E, 0xEE0BF20C, 0x1514F1F6, -0x0D130B11, 0xF5030BED, 0x11EEFB13, 0x02EDFE03, 0xF8F7F80F, 0xF3F9FBF8, 0xF5051604, 0xF7FBF001, -0x0A0C0408, 0xF6ED07F7, 0x1A020DFE, 0xFD060C18, 0xF5010BF9, 0xF6ED0308, 0x04FAFA16, 0x0D060FFC, -0xEFFCF7F3, 0xF50EF5F8, 0x0F0CE90E, 0xFB0E13F0, 0x0517F30D, 0x0CF302F9, 0x0C0FF705, 0xFBFE0501, -0x0905FF00, 0xF9F3F81B, 0x0D0BF0F4, 0xF10712F5, 0x0303F80A, 0x0EEE0509, 0xFDF4F600, 0x16F4FE01, -0xF509F70A, 0xFA0C0A04, 0xF60FF902, 0xF3FC02F9, 0xF4FDEE0C, 0xFC0D0710, 0x0AEA0009, 0x0AF0040F, -0x090BEEF7, 0xFFF3F4F5, 0xFDF718EF, 0xF8FCF7FC, 0xF70AEA12, 0xFC0601FB, 0xF4EC0F01, 0x0F021100, -0xF70A080E, 0x0D02F702, 0x08FE090D, 0x0DF3F6FC, 0x0FF20809, 0x0DFCFD0C, 0xFAF20EEE, 0x10FB1206, -0x150CF410, 0x02F9160B, 0xEBF4FB0C, 0x04FDFCFC, 0x09F8FE0B, 0xF7FCFC06, 0x0D02F9F3, 0x0CEF08F9, -0x0509FC11, 0xF80CEB11, 0xF2EFEEF3, 0x07F8080A, 0xF8F30C0C, 0xFC091400, 0xF10E110F, 0x0CF80616, -0xF913F20D, 0x08EE090D, 0x0902FF09, 0x0C0BF8F0, 0x0A09F8EF, 0x0D0AF5F5, 0x0E1412FA, 0x05F7EAF6, -0xF807050A, 0xFCF5F613, 0x0A120BFD, 0xF509ECE5, 0x0D0D100C, 0xF2F30805, 0xED02040D, 0x0900FB06, -0xF4070EFE, 0xEFFAF7ED, 0x1017F60B, 0xF807F6FE, 0xF100F9FF, 0x0912F413, 0x0E020BFD, 0xFF02FCF6, -0xF308ECFA, 0x020A0AF4, 0x09F7FEF1, 0xF406EAFA, 0xF7F70D1A, 0xF708EF07, 0x100CFC0B, 0xEFFBF4F2, -0x0E05FDF7, 0x07F3FDFD, 0x0109000F, 0x0D0606F4, 0xFAF3F307, 0x13F1F4FE, 0x01EBFEFA, 0xFF08F005, -0x0707F00D, 0x0808FC10, 0xFC120514, 0x09F600F3, 0xF7060907, 0xF502F8ED, 0x10010C0F, 0x0C0DFC08, -0xFB0FFCF2, 0xF709F7F6, 0x08F2F40C, 0xF70BF6F8, 0x03F608F4, 0x051BF9FC, 0xFF07080C, 0xECECF6FB, -0x0BF307FD, 0xF213F7FA, 0x03FCF5F4, 0x04F8FEF7, 0xFBF7FEF4, 0xFC0C0209, 0x13E901F9, 0x02F0F401, -0xF5F30E05, 0xF111F6F1, 0x0008E4FA, 0xF9FAFAEC, 0x07F4090F, 0x0EF8FBF8, 0x000BF70A, 0xF5F608F7, -0xEC1207F4, 0x04070AF0, 0x01FEFAF3, 0x13FD03F5, 0xF80E09F1, 0x04090907, 0xEAF70FE9, 0xF10904FF, -0x0A0C090F, 0xF7EAF0F6, 0xF7010406, 0xF8040B03, 0x0007FE09, 0x13F5F8E7, 0x0CF7F30C, 0xFA0AF5F6, -0x09FE0AF1, 0xF1FA0314, 0xF3190A03, 0x12F0FAE5, 0xF80BF911, 0xF6F411EF, 0xF40C03F3, 0x02F0F1F8, -0x0F03ED07, 0x0A1204ED, 0xFEF4F205, 0x0AF3FF01, 0xF7F3FDF5, 0x05F9FBF4, 0x03F8F309, 0x0F0BE90E, -0x09F90BF8, 0xF6F7EAEB, 0xFEF40706, 0x12F10F0B, 0x06F2F2F6, 0xFAFB14EE, 0x0E11FBF2, 0x0EECF811, -0xFAEEFCF6, 0x0E07FD16, 0x0D100AF0, 0x0E08FC09, 0x0500EF10, 0x12EE080D, 0xF9F700F0, 0xF7070DEC, -0xE500FB05, 0x0C090E06, 0xF5EB030B, 0x0F0D0DF5, 0x00110A0C, 0xF6020912, 0xF504F9FA, 0x0DF303F7, -0x1002060C, 0x0FEAFB02, 0x0A1108F1, 0x0505F608, 0xF807EFF7, 0xED0107FA, 0xEE0D0A0D, 0xF9F60C0E, -0x10F60A0C, 0x0BF71611, 0xF6F407F1, 0xFD010708, 0x0DFE0101, 0x0EF7FFF6, 0x04F7EBF9, 0x0C0FEF0F, -0xFD010B0A, 0x11EFF5E7, 0x0C02F5F6, 0x08090B09, 0xFE09F5F8, 0xFF0F14E8, 0xF40013F6, 0xF1FDFAFE, -0x0006F6F5, 0xFAEF0108, 0x0F0FFC0F, 0xF01009F8, 0x0AF4EF0B, 0xF304FB19, 0xFEEE0EFD, 0xFEEF0908, -0xF3F5F507, 0xF7071011, 0x0C0111FB, 0x04F20909, 0xEF13F20A, 0x040BEEFA, 0x0F0CF1F9, 0x09FAFC12, -0xF4F2F9F2, 0xFEE80B09, 0x0AFEFC00, 0x08FAF1F8, 0xF5FCFEF8, 0x03F20AFD, 0x0FF1F4FD, 0x13F8FA05, -0x0A09FE12, 0x07F100F7, 0x07F8F50B, 0x07091503, 0x08F7F00B, 0x06F9FDEF, 0x08F5EEF2, 0x0F0D0C05, -0x02FF0D0E, 0x190A0E08, 0xF4EEEB00, 0x0809EDF5, 0xF1130914, 0x0D080DF9, 0xEFF6000A, 0x020A10FE, -0x08050AF0, 0xF5E50610, 0xF7ECF0FA, 0x1004101E, 0xF7FFFB05, 0xFE0602FD, 0xF6F1F7EF, 0x090DF811, -0xFF090412, 0xF9F402F8, 0x0301FE06, 0x160DE009, 0x1AF30008, 0x12FAEAF6, 0x0FF8FFF1, 0x13FE0E14, -0xF2EEF903, 0x070D0202, 0xEFFAFCED, 0xF1F00BFD, 0x04E9F103, 0x01F20EF2, 0x150CF60D, 0xF6E9EF04, -0x05F810F8, 0xF50A0A00, 0xEF090D09, 0x05F40DFA, 0xF4FAF61B, 0xF9F408EF, 0x0B0DF00B, 0x0FFC0F0D, -0xF608FCF5, 0x04F2F7EE, 0xFA0FEE12, 0x0700F90E, 0x070FF911, 0x02F0EEF5, 0x01F905F4, 0xF604F9FE, -0xFC1404EB, 0xF10BFFF9, 0xEBFB0CF9, 0x0817020C, 0x0C0EF306, 0xF1030EF3, 0x05F7080F, 0x03010EF8, -0x0CEFF9FD, 0x0C14F6F8, 0x0EF5F5F2, 0x08F4F212, 0x090CEF01, 0xEF0AFEF6, 0x0A09060D, 0xF9F7FB11, -0xF6F9F50C, 0x14F6F60D, 0x0DECFEE8, 0xF60914F0, 0xF814F40C, 0xF5EC1106, 0xEF0D00FA, 0xF0FDFA09, -0xFCF70BEF, 0x11EA0301, 0x0BF805F6, 0xF103090A, 0x11FCF0FD, 0xF4F3FDF5, 0xF6F5F100, 0xF8F40BF3, -0x0DEC0BF5, 0x14F316ED, 0x070A0CF6, 0x11F30513, 0xF8FA0B0E, 0x0DF8EDEF, 0xEE0D07F4, 0x100A050B, -0xF5F7E2F5, 0xFCF1EFF0, 0xF309F6F4, 0x080D120A, 0x0BEEFDF7, 0xF21010ED, 0xF0ED0BFE, 0x040EFA0E, -0xF5F30806, 0xFDF408F9, 0x0EF8EAFF, 0x060503FC, 0x0CF705F2, 0xF413F9FB, 0x06F608F7, 0xF5FFEE07, -0xF4F80FF6, 0x0C0AEEF2, 0xFB1E06FF, 0xF40DF8FA, 0x160B0909, 0xFCF6F0EE, 0xF403020B, 0x04F10713, -0xFDF3FDF5, 0xFDFAFBF9, 0xF808060C, 0x0BFAF40C, 0x01F6EB07, 0xFC0BF7F8, 0x070209FB, 0x0809EBF9, -0x04FD0B08, 0xECF5F90B, 0xF31500EF, 0xF8F7E9F5, 0xEE00F5FB, 0x1C0B0CFA, 0xFCF00809, 0x070103FA, -0x09FE0905, 0xFEEAF402, 0x0EFCFF10, 0x150C0BFB, 0x0BF20714, 0xF3FB0DF7, 0x03F1F9ED, 0xFA13F205, -0x09F2FA16, 0x02FAF201, 0xFDFFF7F4, 0x06FD0EFB, 0x0F04F20C, 0xFCEEEB0B, 0xFF0513FD, 0x03FA13FB, -0x0BF707F4, 0x03FE0AF8, 0x000203EF, 0x0BF6F708, 0x0DE60203, 0x00F30901, 0xF1FA06F7, 0x140305EE, -0xFCEAF6F2, 0x02F10A09, 0x01FEF6F5, 0xFAEFFD0B, 0xF711EB15, 0xEEFF05F3, 0x01F3F409, 0x03ED0209, -0x10EE090D, 0x060207FF, 0x070F04F9, 0x0EF6000D, 0x0F0707FA, 0x0A03060A, 0xFE06040A, 0x0CF50DF4, -0x00FE1AF1, 0xF114FA0F, 0x0BEE10FF, 0xFFF6F9FC, 0xED000F06, 0xF6070703, 0x10040DF7, 0x06FBF9EF, -0xF4090CFC, 0x050AF6F0, 0xF10F06F9, 0x0EF90B0A, 0x0902FFF8, 0xF8F2FBF7, 0x13FBFB0E, 0xEBFFEEFB, -0xF409F50B, 0x0C090E07, 0xEC0F0A02, 0xF60B0818, 0xF9040505, 0xF90BF50C, 0x030AF5F9, 0x0A12EEF8, -0x0A0003F0, 0x00090BF4, 0xF907040A, 0x08F01510, 0x10050FF1, 0x13EBF7F1, 0x110CED11, 0xFB0507F9, -0xFDF3010B, 0xECE8F505, 0xF90B0CF3, 0x0D1203F7, 0x05EFEFFC, 0xF4EFFA11, 0x05FC0A0F, 0x12EF09F7, -0xFDEF0A10, 0xF6E70B09, 0xF7FB06FD, 0xFFF5040C, 0x0605F0F0, 0xF8F7EDF8, 0xF7FC1AF7, 0x00F60109, -0xFF0FFA00, 0x09EAEEF8, 0x0B0BEA10, 0xFFFB0DF4, 0x0006F4F5, 0x13F70F11, 0x04FBFA01, 0xF1FAF912, -0xF5F3040C, 0x0502ED0B, 0xF7FAF804, 0x03070A14, 0x1207F108, 0x0906F701, 0x0E0D070D, 0xFFF20C11, -0xF9F2F6F8, 0xFEEE12F6, 0x08F1F0E8, 0x08F0FC09, 0x1306FEF7, 0xF907F8FD, 0x0DEF0C0C, 0x0114FFF8, -0x0CF906F6, 0xF3F0F10D, 0xF7F5F40B, 0xECF2050B, 0xFD0604F7, 0xFCF9F60C, 0xFE02F6F7, 0x0B0607FB, -0x130AE809, 0xF8F7FCF2, 0xF6101108, 0xF0FA0405, 0x02091013, 0xF60E06FA, 0xF50DED03, 0x1205FD06, -0xF90CEDF6, 0x01FC00F4, 0xF8FCFEFC, 0xEE0303E8, 0xF4140C11, 0x11F3F4F3, 0xF6091406, 0x0CFC0BF4, -0x04F911F7, 0x0DFB050B, 0x0FF8FA0D, 0x0BFC0802, 0x0608F9F2, 0xF2F2F904, 0xF8EFF20B, 0xF5EEF30E, -0x080E0EF3, 0xEFF00600, 0xF6ED0DF1, 0xF6FB14F6, 0x0A0F0EEB, 0x0AFA08F5, 0xF90CFB0B, 0xFB06F2FC, -0xF1F8F70F, 0x16F01209, 0x0FF7F306, 0xF4F0F6F7, 0x0B070BFC, 0x01F70D05, 0xFB020709, 0x0C0A0EF0, -0xFDF2ED0F, 0x0BFF040D, 0x06FA0406, 0xFAEAF515, 0xFBED0AF3, 0xF208FA16, 0xFFF9F2F5, 0x0A00F10E, -0x06FA1104, 0x10EF0CF7, 0x0C08F914, 0x010FEFF6, 0xF9FA0A02, 0x0BF112FE, 0xF0F30206, 0x1208FB05, -0x0DFD05EE, 0x04F60410, 0xF9161006, 0x10F8FE06, 0x0AFCE7EF, 0xEAFEFC0D, 0xFFF6FC13, 0xF40704F8, -0xF909EDF9, 0xEA0C0808, 0x16F0F6FB, 0xF50DF6EB, 0x06F4F7F4, 0xF1F0010E, 0xF5F2F80A, 0xF8F806E7, -0x0CF2FA0D, 0xF8F3F7FA, 0xFE04FBEE, 0x0CF9F70D, 0xEF0E0800, 0x0AF1EEF4, 0xF0FFF2EC, 0x0A09FBEF, -0xEF0EEFE7, 0x13FEF50B, 0x0B0FFC0E, 0xFDF701FA, 0xF3FEEDF4, 0xFAF0010C, 0x0DF909FC, 0x08FAF3EE, -0xF9F70203, 0x0916FE1A, 0xFD10F4EC, 0x05F70F0F, 0xFE1108FA, 0x11F6FAF0, 0xF1FBF20B, 0x171003FD, -0xFE0303FE, 0xF3F6FC0C, 0xEA0810F3, 0x060AF4FF, 0xEE0613F0, 0x09F60FF6, 0x071602F3, 0x00F5F2F7, -0x04EB01F7, 0xFBFDF9FD, 0xEBEFF7F4, 0x070C0CF8, 0xF5090B10, 0x0FE3F6EF, 0xF6FFFF12, 0xEEF7F8F6, -0xF50206F1, 0x0A000A14, 0x010E0AF2, 0x0603F010, 0xF4EBFBFF, 0xF011F617, 0x12100108, 0x0017F5FA, -0x0CF8020E, 0x0D0DF9F9, 0xF0F5EF11, 0xF1FCF8F0, 0x06EEECFC, 0x06141703, 0x0EF1FD00, 0x0D00F810, -0x03060A12, 0xF011F60A, 0x10FA0EEF, 0x03F5FB05, 0xF5040DF4, 0xF6F408F3, 0x0809EFEF, 0xF1060F12, -0xF115050C, 0xF909F00C, 0xFA130E06, 0x0E04F7F4, 0x080D11ED, 0xFD0B030C, 0x0CF1F610, 0x12F0EDF6, -0x0810F708, 0x05FC050F, 0x050E1408, 0x05F3F9EF, 0x0AEC10F8, 0x0D0B100A, 0x01FAFF0C, 0xEA0CF9F8, -0x010E0DFF, 0x07F70BFB, 0x140F0AFC, 0xF90F0DF5, 0xF1EDF4F8, 0xFC0D02F4, 0xF30CF80B, 0xE902FC08, -0x0FF2F2F2, 0x07F5F710, 0xF8FDFFF1, 0x04020908, 0x0C04F5F1, 0x0C06080B, 0xF0E6F507, 0x03F8FEF6, -0x00ED0CFF, 0xF8F40E15, 0xFAEBF2EC, 0x02E801FB, 0x09F30D0F, 0x13081405, 0x070FF509, 0xF90005F3, -0x02F6F0EB, 0x05FAF30D, 0xFDF8FB06, 0x0C0BEFEE, 0x13F0EF0B, 0xF1041808, 0xEEFBF609, 0x10F4FFF5 - -harq_input0 = -0x0FFA0103, 0x130C0B02, 0xF309F6E7, 0xF70F07F1, 0xF7090FF8, 0x050409F2, 0xF80AFAF7, 0x00F60EF5, -0x06FC060D, 0x080DFB03, 0xF4EDF9F9, 0xFCF9FEEA, 0x0F0C12F8, 0xF9F31708, 0xF60C02FF, 0xFF110310, -0x0BF80F0F, 0x02F6F2EE, 0xEDF20A06, 0x0709FEF2, 0x14F5F0F0, 0xF70C0018, 0x12020FEF, 0x0602EF08, -0xF40A0200, 0xEE0C0BFC, 0x0606ED01, 0xF2F709F3, 0x15110E10, 0x06EC06F8, 0xFBF10CF8, 0x0314FEF6, -0xF5F4FC0C, 0xF00C00FF, 0xF6FDF9F6, 0x07F30801, 0x0F04F40C, 0x0406F305, 0xFAF9F808, 0xF20DF109, -0x010A0AF8, 0x070AFC03, 0xF108120A, 0xF8F9F1EC, 0xEEEB09FF, 0x140C0D01, 0x04E5EF10, 0xF616130C, -0x0314F4EC, 0x09FA09F2, 0xFAFAF714, 0xFAF101FD, 0x06030FF4, 0x17F3EFFA, 0x09FEF109, 0xFDFEF9FB, -0xF2080B02, 0x0CF90B07, 0xEB0F0D06, 0xF71009FE, 0xEF110AF8, 0x0AF70BF9, 0x170A1508, 0xF8FDFAF1, -0x0204F3EB, 0xEFFE0315, 0x0C06000B, 0xF10C0A0E, 0xEC0EF9FC, 0x08F0F2F3, 0x09FD02F7, 0x0B11F610, -0xF8F1F8F7, 0xF8FB0A09, 0xFB030A13, 0x040804F0, 0xE8080813, 0xF1F4FFF3, 0xEBFCEDF7, 0xF7F00AE8, -0x00F1160E, 0xF007F301, 0x0E13F211, 0x07F815F4, 0xF9EEF70B, 0x0EF7FE15, 0x0706E80C, 0x0611F60E, -0xFB0B0CF5, 0xF4F50E11, 0x14FDF1EB, 0xF403120A, 0x09F80303, 0xFB0AF80B, 0xFA1408F5, 0xF503F717, -0x0FFB1610, 0x1107F3FC, 0xF1F4F7F7, 0x060EF4E8, 0x04F8F5FF, 0x04F30CFA, 0x10F008F8, 0xF514EEF3, -0x0EEDE8FE, 0xE7FEE70B, 0x0404FEF9, 0xF8F509F9, 0x0A0EF6F2, 0xF8080EF8, 0x01F200F3, 0x03FC19F2, -0x0D0FF2F8, 0xF9FD0C13, 0x11FE0703, 0x0BF9F110, 0x0EF3FEFD, 0x0EF8F10C, 0x0A070FEA, 0x04FA0310, -0x0CFE0003, 0x0CF3060D, 0xFBFCF5FA, 0xEC0D1108, 0x09ECF70A, 0x0C0EFB08, 0x0BF4F80A, 0xEFF0FB0C, -0x0B09F8FA, 0xFA16FF13, 0x0B081512, 0xF4F2FBF7, 0x000C0A07, 0x130C0FEE, 0xFEF908FB, 0xF6F5F912, -0xF1100409, 0x090E1606, 0xF4F50BF3, 0xEE00F7F9, 0xFAFBF5F6, 0x07080B0A, 0xF1150BE7, 0x0DF80912, -0x12EF0809, 0xEBFF1108, 0x0BF60DFE, 0x130DF608, 0x12EFF2F1, 0x04FB0C0B, 0x01FDFC09, 0xFAF808F9, -0x12020B01, 0xFCED060F, 0x040DFFFF, 0x04F80AF3, 0xF700F60B, 0x08F40E08, 0x06F7F80F, 0x0DFDEF04, -0xFDEFF916, 0xF21107EF, 0x0A1110F1, 0x03F70DF3, 0x08F50300, 0xF1F711F9, 0xF6FCFF0C, 0x0CFFF704, -0x080CFE09, 0x0FF80D06, 0x05080C08, 0xFE020210, 0xFB11F6E9, 0x060BF2F1, 0xED0BEAF9, 0x02F30C02, -0xF8F40DFB, 0x020D0D01, 0x0CF406F1, 0xF302F812, 0x080C0EF2, 0x06010006, 0xF0FA0908, 0x08F9F905, -0xFB0A0508, 0x0FF0F7F4, 0xFF081210, 0xEE18F6F1, 0xF9F9E8F2, 0x060B09FD, 0x0AFEEE04, 0x09F304F8, -0xEA05F6F8, 0x1C0108F5, 0xF205120F, 0xF40D0A04, 0x0001F30D, 0x00FF0DFA, 0x020BF7F7, 0x02F2F7F0, -0x04F90BF1, 0x01EFEE07, 0xEBE4F807, 0x0AF90FEF, 0x0F040B11, 0x0BF91000, 0x000CF812, 0x0311F3F0, -0xF8070218, 0xEDFFF614, 0xF00C15F1, 0x000D0F16, 0xFA0EF707, 0xEE080901, 0xFF0C09F5, 0xEEF704F1, -0xF10C10F9, 0x060BEBF7, 0xFA0EFDF6, 0xF7F403F2, 0xF5F0F306, 0xEC081A0F, 0x020AEEF5, 0xFBF9F7FB, -0xF60C010A, 0xEC0E0FFF, 0xF014FB10, 0x0EFD0308, 0x04F30015, 0xF4FC0CEE, 0x0CFEF3F7, 0x12F0F702, -0xE803FB07, 0x040D06F5, 0x05FA07F1, 0x140A0BF8, 0xEFEDFF11, 0x01EFEE13, 0x0D0C0B0F, 0xE70105F0, -0x01F70CF4, 0x0603EE12, 0xED08EDF9, 0xF2FCFA02, 0x0E0CFCF3, 0x0E04F8F9, 0xF30D17F9, 0xFEEDFB05, -0x071BF114, 0xF309F7F4, 0x02F503F6, 0x0815F400, 0x0CF0090A, 0xE80D0F02, 0xF9FCFDF8, 0xF00FFEF5, -0xF3F5F70B, 0xFC10F7EF, 0xF2FB0AFE, 0xEEECEC15, 0x0202F60E, 0xF310FEF9, 0x10F8F209, 0xFB0606EE, -0x0D0B0C10, 0x1110080C, 0xFCF2F8F6, 0x030DEE07, 0x0C11F511, 0x0CF6EF08, 0x0900070C, 0x0C160E0F, -0xEEF8FFF9, 0xF7F0EEF5, 0x0A090903, 0xF70A000E, 0xF5FF07F6, 0xF5E5FEFD, 0x08F1F80C, 0x00F2EE0D, -0xFAED07EA, 0x07EA170B, 0xFEFFECFF, 0xED0B0211, 0x0AF4F4E6, 0xF2FAF705, 0x0807F706, 0xFBF2F8F7, -0xF31105F7, 0xF10809FB, 0xF1FEF307, 0x0805FFFA, 0x08FC070D, 0x0A071200, 0xEEEDF107, 0xF908EDFB, -0x09F60FF2, 0x0B0C06F8, 0x07FCF608, 0x000FF30C, 0xFF0EF3FD, 0xE40BFCF4, 0x0CF50BF4, 0x04EDE90D, -0xFD05F3F1, 0xFAECF4FA, 0xF80C080F, 0x0A0BF70A, 0x07F012F4, 0x1109FEF3, 0xF507F9F1, 0xF513F7FD, -0xFE0AF80F, 0x041701F1, 0xF5E7F309, 0x0A0AF70C, 0x0E00FEF1, 0x04E505EF, 0xF4EF0BFD, 0x040CF807, -0x1201EF07, 0xF31508F1, 0xF908F309, 0x0B0EE409, 0xF7EBF9F8, 0xF1F7F406, 0xFB0206F6, 0xECFD11F2, -0x0702EEF6, 0xF409FC04, 0xEEF80010, 0xF3EC0BF0, 0x090600F1, 0xF9F5EBF7, 0xEEFE11F8, 0x070BF0FA, -0xFE16EEF8, 0xF108FD05, 0x15FAF3F7, 0xF60E0D0D, 0xF7FC0AF8, 0x01F40805, 0xF70AFE01, 0xFB0F0BF9, -0x04E701F6, 0x09F517F6, 0xFBE8F5F8, 0x11FE00F6, 0xEF08F2F5, 0xFB0CFB0F, 0x0419080B, 0x0308EE11, -0x07110907, 0xF2F5ED0F, 0x0BFAFEF6, 0xFA12F8F9, 0xE8090606, 0x0E0CEAEC, 0x06FD10F8, 0xF80505FD, -0xF1F70912, 0xF5EF0C0B, 0xF9EF0B0B, 0x0D05F5F2, 0x0A08FF0E, 0x09F50300, 0x08F91314, 0x0AFEF60A, -0xE5FC0504, 0xEF0A000E, 0x06FDFFF1, 0x0D11F103, 0x080CF512, 0xF9F501F2, 0xFAF60708, 0xFE140D05, -0xF90202EF, 0xF0FD0EED, 0x06F2E903, 0xE904F80D, 0xF600F8F8, 0xF4FA09F5, 0x0803FA07, 0xFCF9F90B, -0xF202F4F5, 0x000EFBFE, 0x0409FAFD, 0xF0EA0DF4, 0x0B0D00FF, 0x03F8FB0D, 0x0307FAF2, 0x010C0BFB, -0x140C03FD, 0xF4FE0906, 0xF6F6F8ED, 0x0B11090D, 0xF6F90EF8, 0x09F001E8, 0xEC0600F8, 0x1109F90E, -0xEA010BEF, 0xEF0A0C0A, 0x07F510FD, 0x08F3F500, 0x07ED01F5, 0xF313F60A, 0xF803FA0E, 0xF60B0D08, -0xF1F0F709, 0x0DF609F4, 0xFCED020B, 0x0E0EEDE9, 0x08F907F2, 0xF1FC0C13, 0xFFFB0C06, 0xEB070AF7, -0xF606F80A, 0xF90E1EFF, 0xF6EE0BF5, 0x05FF03F7, 0x0F0DF309, 0xFA0CF4F8, 0x1F0CF6F3, 0xF50DEE0F, -0xF5F7FDF4, 0x0BF501EF, 0xF7FA000F, 0xECFAF0F5, 0xEA02FEF1, 0xF80FFCFC, 0x100B0600, 0xFF050501, -0xFA150716, 0x110FFFF4, 0xEE0B04F8, 0x0E0FF112, 0x12F80BF4, 0xF6F41604, 0x07EDE6EF, 0x17EE0F0B, -0x05F5FEF2, 0xEF0BFEF5, 0xFF07FD15, 0x01090709, 0x02EBEE0D, 0xF6F9FB0D, 0xEFF6070E, 0x090806F6, -0x140FFEF1, 0xF6FCEEEB, 0x07EF14F2, 0xFB03040B, 0x0A05F4FC, 0x0DF6FB0D, 0x060B02F8, 0xFF0FFB0E, -0x090709F7, 0xF7180F02, 0x0BF8F005, 0xFE0CF60D, 0x09F4ECF0, 0x0410F30A, 0xEB05F105, 0x05F90C11, -0xFCF1F30B, 0x120B0BF3, 0x031104FC, 0x030BFC0F, 0xFB09EFFC, 0xF50CFB11, 0x0BF80504, 0xF609FCF7, -0xFE0CFB00, 0x0F08F7FB, 0x0BFD0609, 0x0E120F15, 0x020B07F8, 0x0714FAF0, 0x0615F308, 0xF2FDF8F9, -0xEEF606F8, 0x050906E8, 0x071106F7, 0x000C03F8, 0x04F9F90A, 0x060BF5F7, 0x0D0CF2F7, 0x06FB02F7, -0xF7060AF5, 0x0EF1FCF4, 0xFAFAF5FE, 0x0506F917, 0xFCF40C0A, 0x03FC10E8, 0xF30700FD, 0xFCF40906, -0xFB0B0D0B, 0x1017E4F9, 0xF20408F2, 0x02FA03F7, 0xF0000E07, 0xFB0AEDF1, 0xE6F50FEB, 0xF2FCF80B, -0x04F50DFB, 0xF00BF706, 0xF70507FC, 0x0AF01609, 0xFF0DF20F, 0xEA150EF2, 0x080202F3, 0x00FAF9F5, -0xEFF70E04, 0x0FF6F314, 0xF1FEFAEE, 0x08F1F3F2, 0xF6101102, 0xF8F20206, 0x120DFC03, 0x07F8F613, -0x0CF4F50D, 0x0DFF05FB, 0x040EF409, 0xF8FB06F6, 0xF3FAF20D, 0x0DF90402, 0x05080E00, 0xF5EFEBEC, -0xFE0B0EE7, 0x0B0E0F0E, 0x04F812F4, 0x0EEE0D10, 0x021AF7EF, 0xF70F10EC, 0xF604FDFA, 0x10E90F0B, -0xF60CEFFE, 0x0AEBF407, 0xF60A06F0, 0xF50B1607, 0x1111FF0B, 0xF8F8EF08, 0xF704F410, 0x0B0AEBFE, -0x14000205, 0x03FC0EF2, 0xFD17EBFF, 0x17FAFCF4, 0x0DF90CFA, 0x1004F511, 0x140302FC, 0x14FC0500, -0xFCF6F2FE, 0x0905FA03, 0x08F3F0F4, 0x06FEF5EF, 0x09F801F8, 0xF00913F1, 0xF7F80DED, 0x040AF1FC, -0xFC0F1008, 0x07040EF4, 0x0BF6EC0C, 0x0CF8FA0C, 0xF70F0EFF, 0xFB09FBFC, 0xF9F4ED0D, 0x02F4F80B, -0xF5FCF2F2, 0x0208FDF1, 0xF20B0405, 0xF80AFAF3, 0xF415EDEA, 0xFDFBEB00, 0xF4F1F30F, 0xEC070F09, -0xFA0D0AFF, 0xF7EE0C06, 0x04F4F00B, 0x08F50FF5, 0xF50EF3FC, 0x1006E7F9, 0x04F7F7FC, 0xFC070CFB, -0x0F12EAFA, 0xF7F00706, 0xF4011505, 0xF7140B09, 0x0AF9F1F8, 0x03060DF8, 0xF2090CF8, 0xF20712F3, -0xF903EFEE, 0x1102EC14, 0x0A09F1F6, 0xF9F001FA, 0xF8FE01FB, 0x140410F1, 0x0B0402F2, 0x0F0006F5, -0x0805ECF9, 0xF409F10E, 0x0DE7FD01, 0xEFFD0710, 0xF20403FD, 0x0BF2F6F9, 0x0004F909, 0x0F09FFF6, -0xF3060DF2, 0x0EEF060E, 0x0CF40705, 0xFDF7FB0C, 0xF4F203E4, 0x0E09F4F6, 0xF5FE04F9, 0x06F3FEFE, -0xFDFB1102, 0xFD04EE0D, 0x0DFBFCF1, 0xEE14E90B, 0xFB0CEE09, 0x0C13F108, 0xF60703FD, 0x0BF4FCFA, -0x14F2F0FB, 0xFAF9EFF7, 0xF5010801, 0xF109EEF3, 0xFF0A0514, 0x0C0604FF, 0xFB0EF704, 0xF50EFD0B, -0xFF05F4FA, 0x07E70B0B, 0xEFFEF4FD, 0x0D0807F3, 0x05100DF6, 0xEFFA1A08, 0x020D090A, 0xFFF5F7FD, -0x1513F10A, 0xF10BF2ED, 0x0B0F150B, 0xF10306FA, 0x09FB11EE, 0x061007F2, 0xF7F8FB14, 0xF90704EE, -0x0AF8EAF6, 0xF7E809F9, 0x02F609E9, 0x09E802EE, 0x03F50BE8, 0x040C04F1, 0x0CF41009, 0xFB00EEFA, -0xFC071611, 0xF9F1F203, 0x0BF0F409, 0x0214F801, 0x0A0AF504, 0x0508F5F1, 0xE916E900, 0x07F4F60A, -0xF9F010F2, 0xF906F507, 0x0BFB0AF4, 0xF408F0F1, 0x0EFD0A06, 0x03F80AF6, 0x130CFD0C, 0xF1E9F7F8, -0xF800F502, 0xFEFDFDF4, 0xF90B0713, 0xF506FAFD, 0x0712F9F2, 0xEAF20DF5, 0x10F40D0D, 0x06050B09, -0xF706090E, 0x0F00ED11, 0xF90E02F4, 0xF1FEFCED, 0x0AF5E00D, 0x06F7F3F9, 0x08F81206, 0xF30EF4F5, -0x12FF02EF, 0xF7040DF4, 0x151204F0, 0x04ED07EC, 0xF0F3FB05, 0x08F2FCF4, 0xECED11FA, 0xFC110DF8, -0x0BF4F90A, 0xFCF9F905, 0xF0010014, 0x0A0EF9F8, 0xF4020C02, 0x10FDFA13, 0xF5000B05, 0x05EAF808, -0xFE0F04F3, 0xFDEFF9EE, 0xF9F9090B, 0x10F20E0C, 0x060909F0, 0x060EF40F, 0x0E0705F5, 0xFB05F6F9, -0xFA1C0512, 0x0B10FBEB, 0x16F20DF6, 0x090012F4, 0x0A13020B, 0x0EFF0C0A, 0x130DEF0C, 0x070A0B04, -0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, -0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, -0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, -0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, -0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, -0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, -0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, -0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, -0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, -0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, -0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, -0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, -0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, -0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, -0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, -0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, -0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, -0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, -0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, -0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, -0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, -0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, -0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, -0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, -0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, -0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, -0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, -0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, -0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, -0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, -0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, -0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, -0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, -0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, -0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, -0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, -0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, -0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, -0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, -0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, -0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, -0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, -0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, -0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, -0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, -0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, -0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, -0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, -0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, -0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, -0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, -0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, -0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, -0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, -0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -output0 = -0x8EC35F65, 0xF1011E4E, 0x01283C76, 0x46C59B44, 0x66BD1E7E, 0x71CC3D13, 0xF54F7B59, 0xC2E51E78, -0x878ACD1F, 0x0BB83AD9, 0xD6EB81F6, 0xDA98D960, 0x9583FF24, 0x84E13C2E, 0xB80A4BD9, 0x7546DA7D, -0x61301F84, 0x4E8E7BCA, 0x0F9A1992, 0x84DE01C3, 0xFB1B38F1, 0x44764A25, 0x9525C193, 0xAD6AFC2C, -0xEAC9CBE7, 0x822626C3, 0x6764F1E2, 0xB7080FC1, 0x92F0BF18, 0x2BE2A423, 0x6652CA22, 0x7E2B8B7D, -0xDADC0042, 0x1684A5B0, 0x6AF80D1E, 0xDE4B11F8, 0x4C027AA7, 0x9B499047, 0xDF71DF9C, 0xE66B5211, -0x0976A858, 0x97CCDFA6, 0xF921AC4D, 0x684DB77D, 0x2046F400, 0x66BF05FF, 0xCFE771B2, 0x7D285899, -0xA6DD74A8, 0xD5AC14DF, 0xB4EE744D, 0x9BF75449, 0xBCCF7BE5, 0xD9B3E1C5, 0x04D5FEEA, 0xA91CED17, -0x260A3E33, 0xB14FA433, 0xC7FB659B, 0xD847CBDD, 0xD4BAF083, 0x51A5AEB1, 0x39A13C7A, 0xC54DBA51, -0x81DD7FFE, 0xE2A3941C, 0x386750AD, 0x85C6A1CF, 0x52E46581, 0x2DC58468, 0x4F8C204C, 0xCA6C89B8, -0xD338F49E, 0xB71D9A1C, 0xAE5992A5, 0x461FFEB6, 0x0F724968, 0xD2D9A290, 0x4C0791D6, 0x8AA45E2A, -0xBCE9EEF4, 0x769D6618, 0x71D659F8, 0xE9DC6A13, 0x99E831C3, 0x8AB8CFD6, 0x489E23C5, 0xBEFC2792, -0x9E54E534, 0x54101DEF, 0x1F83D8D2, 0x69A8094D, 0x2DA8AAEB, 0x564C6C07, 0x4F2AADB5, 0x20CB1D7F, -0x2D6E9D54, 0xB97A8BC9, 0x36365C67, 0x8D84329F, 0x4000A81C, 0x6326766B, 0xB9B50B8D, 0xF9D51D73, -0x4D1A117F, 0x70486DEE, 0xBB19FFB6, 0x96929F46, 0x8E7C8D1C, 0x04B8D1F3, 0x204B8156, 0xA67E9C62, -0x4534F672, 0x94B8C832, 0x38E7CFE4, 0x71F48255, 0x82181625, 0xF8C9EB50, 0xF3D38EF0, 0xB4DE79FB, -0xF32452 - -harq_output0 = -0x0FFA0103, 0x130C0B02, 0xF309F6E7, 0xF70F07F1, 0xF7090FF8, 0x050409F2, 0xF80AFAF7, 0x00F60EF5, -0x06FC060D, 0x080DFB03, 0xF4EDF9F9, 0xFCF9FEEA, 0x0F0C12F8, 0xF9F31708, 0xF60C02FF, 0xFF110310, -0x0BF80F0F, 0x02F6F2EE, 0xEDF20A06, 0x0709FEF2, 0x14F5F0F0, 0xF70C0018, 0x12020FEF, 0x0602EF08, -0xF40A0200, 0xEE0C0BFC, 0x0606ED01, 0xF2F709F3, 0x15110E10, 0x06EC06F8, 0xFBF10CF8, 0x0314FEF6, -0xF5F4FC0C, 0xF00C00FF, 0xF6FDF9F6, 0x07F30801, 0x0F04F40C, 0x0406F305, 0xFAF9F808, 0xF20DF109, -0x010A0AF8, 0x070AFC03, 0xF108120A, 0xF8F9F1EC, 0xEEEB09FF, 0x140C0D01, 0x04E5EF10, 0xF616130C, -0x0314F4EC, 0x09FA09F2, 0xFAFAF714, 0xFAF101FD, 0x06030FF4, 0x17F3EFFA, 0x09FEF109, 0xFDFEF9FB, -0xF2080B02, 0x0CF90B07, 0xEB0F0D06, 0xF71009FE, 0xEF110AF8, 0x0AF70BF9, 0x170A1508, 0xF8FDFAF1, -0x0204F3EB, 0xEFFE0315, 0x0C06000B, 0xF10C0A0E, 0xEC0EF9FC, 0x08F0F2F3, 0x09FD02F7, 0x0B11F610, -0xF8F1F8F7, 0xF8FB0A09, 0xFB030A13, 0x040804F0, 0xE8080813, 0xF1F4FFF3, 0xEBFCEDF7, 0xF7F00AE8, -0x00F1160E, 0xF007F301, 0x0E13F211, 0x07F815F4, 0xF9EEF70B, 0x0EF7FE15, 0x0706E80C, 0x0611F60E, -0xFB0B0CF5, 0xF4F50E11, 0x14FDF1EB, 0xF403120A, 0x09F80303, 0xFB0AF80B, 0xFA1408F5, 0xF503F717, -0x0FFB1610, 0x1107F3FC, 0xF1F4F7F7, 0x060EF4E8, 0x04F8F5FF, 0x04F30CFA, 0x10F008F8, 0xF514EEF3, -0x0EEDE8FE, 0xE7FEE70B, 0x0404FEF9, 0xF8F509F9, 0x0A0EF6F2, 0xF8080EF8, 0x01F200F3, 0x03FC19F2, -0x0D0FF2F8, 0xF9FD0C13, 0x11FE0703, 0x0BF9F110, 0x0EF3FEFD, 0x0EF8F10C, 0x0A070FEA, 0x04FA0310, -0x0CFE0003, 0x0CF3060D, 0xFBFCF5FA, 0xEC0D1108, 0x09ECF70A, 0x0C0EFB08, 0x0BF4F80A, 0xEFF0FB0C, -0x0B09F8FA, 0xFA16FF13, 0x0B081512, 0xF4F2FBF7, 0x000C0A07, 0x130C0FEE, 0xFEF908FB, 0xF6F5F912, -0xF1100409, 0x090E1606, 0xF4F50BF3, 0xEE00F7F9, 0xFAFBF5F6, 0x07080B0A, 0xF1150BE7, 0x0DF80912, -0x12EF0809, 0xEBFF1108, 0x0BF60DFE, 0x130DF608, 0x12EFF2F1, 0x04FB0C0B, 0x01FDFC09, 0xFAF808F9, -0x12020B01, 0xFCED060F, 0x040DFFFF, 0x04F80AF3, 0xF700F60B, 0x08F40E08, 0x06F7F80F, 0x0DFDEF04, -0xFDEFF916, 0xF21107EF, 0x0A1110F1, 0x03F70DF3, 0x08F50300, 0xF1F711F9, 0xF6FCFF0C, 0x0CFFF704, -0x080CFE09, 0x0FF80D06, 0x05080C08, 0xFE020210, 0xFB11F6E9, 0x060BF2F1, 0xED0BEAF9, 0x02F30C02, -0xF8F40DFB, 0x020D0D01, 0x0CF406F1, 0xF302F812, 0x080C0EF2, 0x06010006, 0xF0FA0908, 0x08F9F905, -0xFB0A0508, 0x0FF0F7F4, 0xFF081210, 0xEE18F6F1, 0xF9F9E8F2, 0x060B09FD, 0x0AFEEE04, 0x09F304F8, -0xEA05F6F8, 0x1C0108F5, 0xF205120F, 0xF40D0A04, 0x0001F30D, 0x00FF0DFA, 0x020BF7F7, 0x02F2F7F0, -0x04F90BF1, 0x01EFEE07, 0xEBE4F807, 0x0AF90FEF, 0x0F040B11, 0x0BF91000, 0x000CF812, 0x0311F3F0, -0xF8070218, 0xEDFFF614, 0xF00C15F1, 0x000D0F16, 0xFA0EF707, 0xEE080901, 0xFF0C09F5, 0xEEF704F1, -0xF10C10F9, 0x060BEBF7, 0xFA0EFDF6, 0xF7F403F2, 0xF5F0F306, 0xEC081A0F, 0x020AEEF5, 0xFBF9F7FB, -0xF60C010A, 0xEC0E0FFF, 0xF014FB10, 0x0EFD0308, 0x04F30015, 0xF4FC0CEE, 0x0CFEF3F7, 0x12F0F702, -0xE803FB07, 0x040D06F5, 0x05FA07F1, 0x140A0BF8, 0xEFEDFF11, 0x01EFEE13, 0x0D0C0B0F, 0xE70105F0, -0x01F70CF4, 0x0603EE12, 0xED08EDF9, 0xF2FCFA02, 0x0E0CFCF3, 0x0E04F8F9, 0xF30D17F9, 0xFEEDFB05, -0x071BF114, 0xF309F7F4, 0x02F503F6, 0x0815F400, 0x0CF0090A, 0xE80D0F02, 0xF9FCFDF8, 0xF00FFEF5, -0xF3F5F70B, 0xFC10F7EF, 0xF2FB0AFE, 0xEEECEC15, 0x0202F60E, 0xF310FEF9, 0x10F8F209, 0xFB0606EE, -0x0D0B0C10, 0x1110080C, 0xFCF2F8F6, 0x030DEE07, 0x0C11F511, 0x0CF6EF08, 0x0900070C, 0x0C160E0F, -0xEEF8FFF9, 0xF7F0EEF5, 0x0A090903, 0xF70A000E, 0xF5FF07F6, 0xF5E5FEFD, 0x08F1F80C, 0x00F2EE0D, -0xFAED07EA, 0x07EA170B, 0xFEFFECFF, 0xED0B0211, 0x0AF4F4E6, 0xF2FAF705, 0x0807F706, 0xFBF2F8F7, -0xF31105F7, 0xF10809FB, 0xF1FEF307, 0x0805FFFA, 0x08FC070D, 0x0A071200, 0xEEEDF107, 0xF908EDFB, -0x09F60FF2, 0x0B0C06F8, 0x07FCF608, 0x000FF30C, 0xFF0EF3FD, 0xE40BFCF4, 0x0CF50BF4, 0x04EDE90D, -0xFD05F3F1, 0xFAECF4FA, 0xF80C080F, 0x0A0BF70A, 0x07F012F4, 0x1109FEF3, 0xF507F9F1, 0xF513F7FD, -0xFE0AF80F, 0x041701F1, 0xF5E7F309, 0x0A0AF70C, 0x0E00FEF1, 0x04E505EF, 0xF4EF0BFD, 0x040CF807, -0x1201EF07, 0xF31508F1, 0xF908F309, 0x0B0EE409, 0xF7EBF9F8, 0xF1F7F406, 0xFB0206F6, 0xECFD11F2, -0x0702EEF6, 0xF409FC04, 0xEEF80010, 0xF3EC0BF0, 0x090600F1, 0xF9F5EBF7, 0xEEFE11F8, 0x070BF0FA, -0xFE16EEF8, 0xF108FD05, 0x15FAF3F7, 0xF60E0D0D, 0xF7FC0AF8, 0x01F40805, 0xF70AFE01, 0xFB0F0BF9, -0x04E701F6, 0x09F517F6, 0xFBE8F5F8, 0x11FE00F6, 0xEF08F2F5, 0xFB0CFB0F, 0x0419080B, 0x0308EE11, -0x07110907, 0xF2F5ED0F, 0x0BFAFEF6, 0xFA12F8F9, 0xE8090606, 0x0E0CEAEC, 0x06FD10F8, 0xF80505FD, -0xF1F70912, 0xF5EF0C0B, 0xF9EF0B0B, 0x0D05F5F2, 0x0A08FF0E, 0x09F50300, 0x08F91314, 0x0AFEF60A, -0xE5FC0504, 0xEF0A000E, 0x06FDFFF1, 0x0D11F103, 0x080CF512, 0xF9F501F2, 0xFAF60708, 0xFE140D05, -0xF90202EF, 0xF0FD0EED, 0x06F2E903, 0xE904F80D, 0xF600F8F8, 0xF4FA09F5, 0x0803FA07, 0xFCF9F90B, -0xF202F4F5, 0x000EFBFE, 0x0409FAFD, 0xF0EA0DF4, 0x0B0D00FF, 0x03F8FB0D, 0x0307FAF2, 0x010C0BFB, -0x140C03FD, 0xF4FE0906, 0xF6F6F8ED, 0x0B11090D, 0xF6F90EF8, 0x09F001E8, 0xEC0600F8, 0x1109F90E, -0xEA010BEF, 0xEF0A0C0A, 0x07F510FD, 0x08F3F500, 0x07ED01F5, 0xF313F60A, 0xF803FA0E, 0xF60B0D08, -0xF1F0F709, 0x0DF609F4, 0xFCED020B, 0x0E0EEDE9, 0x08F907F2, 0xF1FC0C13, 0xFFFB0C06, 0xEB070AF7, -0xF606F80A, 0xF90E1EFF, 0xF6EE0BF5, 0x05FF03F7, 0x0F0DF309, 0xFA0CF4F8, 0x1F0CF6F3, 0xF50DEE0F, -0xF5F7FDF4, 0x0BF501EF, 0xF7FA000F, 0xECFAF0F5, 0xEA02FEF1, 0xF80FFCFC, 0x100B0600, 0xFF050501, -0xFA150716, 0x110FFFF4, 0xEE0B04F8, 0x0E0FF112, 0x12F80BF4, 0xF6F41604, 0x07EDE6EF, 0x17EE0F0B, -0x05F5FEF2, 0xEF0BFEF5, 0xFF07FD15, 0x01090709, 0x02EBEE0D, 0xF6F9FB0D, 0xEFF6070E, 0x090806F6, -0x140FFEF1, 0xF6FCEEEB, 0x07EF14F2, 0xFB03040B, 0x0A05F4FC, 0x0DF6FB0D, 0x060B02F8, 0xFF0FFB0E, -0x090709F7, 0xF7180F02, 0x0BF8F005, 0xFE0CF60D, 0x09F4ECF0, 0x0410F30A, 0xEB05F105, 0x05F90C11, -0xFCF1F30B, 0x120B0BF3, 0x031104FC, 0x030BFC0F, 0xFB09EFFC, 0xF50CFB11, 0x0BF80504, 0xF609FCF7, -0xFE0CFB00, 0x0F08F7FB, 0x0BFD0609, 0x0E120F15, 0x020B07F8, 0x0714FAF0, 0x0615F308, 0xF2FDF8F9, -0xEEF606F8, 0x050906E8, 0x071106F7, 0x000C03F8, 0x04F9F90A, 0x060BF5F7, 0x0D0CF2F7, 0x06FB02F7, -0xF7060AF5, 0x0EF1FCF4, 0xFAFAF5FE, 0x0506F917, 0xFCF40C0A, 0x03FC10E8, 0xF30700FD, 0xFCF40906, -0xFB0B0D0B, 0x1017E4F9, 0xF20408F2, 0x02FA03F7, 0xF0000E07, 0xFB0AEDF1, 0xE6F50FEB, 0xF2FCF80B, -0x04F50DFB, 0xF00BF706, 0xF70507FC, 0x0AF01609, 0xFF0DF20F, 0xEA150EF2, 0x080202F3, 0x00FAF9F5, -0xEFF70E04, 0x0FF6F314, 0xF1FEFAEE, 0x08F1F3F2, 0xF6101102, 0xF8F20206, 0x120DFC03, 0x07F8F613, -0x0CF4F50D, 0x0DFF05FB, 0x040EF409, 0xF8FB06F6, 0xF3FAF20D, 0x0DF90402, 0x05080E00, 0xF5EFEBEC, -0xFE0B0EE7, 0x0B0E0F0E, 0x04F812F4, 0x0EEE0D10, 0x021AF7EF, 0xF70F10EC, 0xF604FDFA, 0x10E90F0B, -0xF60CEFFE, 0x0AEBF407, 0xF60A06F0, 0xF50B1607, 0x1111FF0B, 0xF8F8EF08, 0xF704F410, 0x0B0AEBFE, -0x14000205, 0x03FC0EF2, 0xFD17EBFF, 0x17FAFCF4, 0x0DF90CFA, 0x1004F511, 0x140302FC, 0x14FC0500, -0xFCF6F2FE, 0x0905FA03, 0x08F3F0F4, 0x06FEF5EF, 0x09F801F8, 0xF00913F1, 0xF7F80DED, 0x040AF1FC, -0xFC0F1008, 0x07040EF4, 0x0BF6EC0C, 0x0CF8FA0C, 0xF70F0EFF, 0xFB09FBFC, 0xF9F4ED0D, 0x02F4F80B, -0xF5FCF2F2, 0x0208FDF1, 0xF20B0405, 0xF80AFAF3, 0xF415EDEA, 0xFDFBEB00, 0xF4F1F30F, 0xEC070F09, -0xFA0D0AFF, 0xF7EE0C06, 0x04F4F00B, 0x08F50FF5, 0xF50EF3FC, 0x1006E7F9, 0x04F7F7FC, 0xFC070CFB, -0x0F12EAFA, 0xF7F00706, 0xF4011505, 0xF7140B09, 0x0AF9F1F8, 0x03060DF8, 0xF2090CF8, 0xF20712F3, -0xF903EFEE, 0x1102EC14, 0x0A09F1F6, 0xF9F001FA, 0xF8FE01FB, 0x140410F1, 0x0B0402F2, 0x0F0006F5, -0x0805ECF9, 0xF409F10E, 0x0DE7FD01, 0xEFFD0710, 0xF20403FD, 0x0BF2F6F9, 0x0004F909, 0x0F09FFF6, -0xF3060DF2, 0x0EEF060E, 0x0CF40705, 0xFDF7FB0C, 0xF4F203E4, 0x0E09F4F6, 0xF5FE04F9, 0x06F3FEFE, -0xFDFB1102, 0xFD04EE0D, 0x0DFBFCF1, 0xEE14E90B, 0xFB0CEE09, 0x0C13F108, 0xF60703FD, 0x0BF4FCFA, -0x14F2F0FB, 0xFAF9EFF7, 0xF5010801, 0xF109EEF3, 0xFF0A0514, 0x0C0604FF, 0xFB0EF704, 0xF50EFD0B, -0xFF05F4FA, 0x07E70B0B, 0xEFFEF4FD, 0x0D0807F3, 0x05100DF6, 0xEFFA1A08, 0x020D090A, 0xFFF5F7FD, -0x1513F10A, 0xF10BF2ED, 0x0B0F150B, 0xF10306FA, 0x09FB11EE, 0x061007F2, 0xF7F8FB14, 0xF90704EE, -0x0AF8EAF6, 0xF7E809F9, 0x02F609E9, 0x09E802EE, 0x03F50BE8, 0x040C04F1, 0x0CF41009, 0xFB00EEFA, -0xFC071611, 0xF9F1F203, 0x0BF0F409, 0x0214F801, 0x0A0AF504, 0x0508F5F1, 0xE916E900, 0x07F4F60A, -0xF9F010F2, 0xF906F507, 0x0BFB0AF4, 0xF408F0F1, 0x0EFD0A06, 0x03F80AF6, 0x130CFD0C, 0xF1E9F7F8, -0xF800F502, 0xFEFDFDF4, 0xF90B0713, 0xF506FAFD, 0x0712F9F2, 0xEAF20DF5, 0x10F40D0D, 0x06050B09, -0xF706090E, 0x0F00ED11, 0xF90E02F4, 0xF1FEFCED, 0x0AF5E00D, 0x06F7F3F9, 0x08F81206, 0xF30EF4F5, -0x12FF02EF, 0xF7040DF4, 0x151204F0, 0x04ED07EC, 0xF0F3FB05, 0x08F2FCF4, 0xECED11FA, 0xFC110DF8, -0x0BF4F90A, 0xFCF9F905, 0xF0010014, 0x0A0EF9F8, 0xF4020C02, 0x10FDFA13, 0xF5000B05, 0x05EAF808, -0xFE0F04F3, 0xFDEFF9EE, 0xF9F9090B, 0x10F20E0C, 0x060909F0, 0x060EF40F, 0x0E0705F5, 0xFB05F6F9, -0xFA1C0512, 0x0B10FBEB, 0x16F20DF6, 0x090012F4, 0x0A13020B, 0x0EFF0C0A, 0x130DEF0C, 0x070A0B04, -0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, -0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, -0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, -0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, -0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, -0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, -0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, -0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, -0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, -0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, -0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, -0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, -0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, -0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, -0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, -0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, -0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, -0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, -0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, -0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, -0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, -0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, -0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, -0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, -0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, -0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, -0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, -0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, -0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, -0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, -0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, -0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, -0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, -0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, -0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, -0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, -0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, -0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, -0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, -0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, -0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, -0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, -0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, -0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, -0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, -0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, -0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, -0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, -0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, -0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, -0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, -0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, -0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, -0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, -0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0xFB0E01EF, 0xFF0C0B02, 0x07090AFB, 0x0BFBF3F1, 0x0B090F0D, 0xF10409F2, -0xF80A0E0B, 0xECF60E09, 0x0610F2F9, 0xF4F9FBEF, 0x08ED0DF9, 0xFCF9FEFE, 0x0F0C12F8, 0xF9F317F4, -0x0BF80213, 0xFFFD1710, 0x0BF80FFB, 0xEEF6F2EE, 0x0106F506, 0xF3091206, 0x00F504F0, 0x0B0C0018, -0xFD02FAEF, 0x06ED0308, 0xF4F60215, 0x02F80BFC, 0xF20601ED, 0x06F7F5F3, 0x0111FAFC, 0xF2ECF2F8, -0xFB050C0D, 0x0314EA0A, 0x09F4FCF8, 0xF0F80013, 0xF6E90D0A, 0xF307F415, 0xFB04F4F8, 0xF006F3F1, -0xFAF9F808, 0x06F9F109, 0xED0A0A0C, 0xF3F6FC03, 0x0508120A, 0x0C0DF100, 0x02FF09FF, 0x00F80D01, -0x04E50410, 0xF616130C, 0x0300F4EC, 0x090EF506, 0xFA0E0C14, 0x0EF10111, 0xF2030F09, 0x03F3030E, -0x09EA0509, 0xFDFEF9FB, 0x06F4F702, 0x0C0D0BF3, 0xFFFBF906, 0xF7FBF512, 0x03110AF8, 0x0AF7F70D, -0x17F60108, 0xF811FA05, 0xEE040700, 0x03FEEF01, 0xF706EC0B, 0x060C0AFA, 0xEC0EF910, 0x0804F207, -0x09E902F7, 0xF7FDF610, 0x0C050C0B, 0xF8E7F609, 0xFB170A13, 0xF0080404, 0xE808F413, 0xF1F4EB07, -0xEBFC01F7, 0x0B040AE8, 0x00F1020E, 0xF0F207EC, 0x0EFFF211, 0xF3F815F4, 0xF9020B0B, 0x0EF71201, -0x0706FC0C, 0x06FDF6FA, 0xFBF7F80A, 0x08090EFD, 0x14FD05FF, 0xF403FE0A, 0xF5F8EF03, 0xFB0AF8F7, -0x0F00F409, 0x0AEF0B03, 0x0FFB0210, 0x11070710, 0xF1080B0B, 0xF20E08E8, 0xF00CF5EB, 0xF0F30C0E, -0xFCF0080D, 0x0900EE07, 0xFA01FCFE, 0xE712E70B, 0xF004FEF9, 0x0CF5090D, 0xF60EF606, 0xF8F4FAF8, -0xED061507, 0xEF110506, 0xF90FF20C, 0xF911F813, 0xFC12F3EF, 0xF7F9F1FC, 0x0E07EAE9, 0x0EF8F1F8, -0xF6070FEA, 0xF0FA0310, 0xF8FE1417, 0xF8F306F9, 0xFBFCF50E, 0xEC0D11F3, 0x0900F70A, 0xF80EFBF3, -0x0B08F8F6, 0xEFF00F0C, 0xF709F8FA, 0x0E16EB13, 0x0BF415FE, 0xF4F20F0B, 0xEC0C0AF3, 0x13F8FB02, -0x12F908FB, 0x0A090D12, 0xF110F0F5, 0xF40E021B, 0x0809F7F3, 0xEE000B0D, 0x0E0FF5F6, 0xF3F40BF6, -0x05150BE7, 0x0DF809FE, 0x12030809, 0xFF13FC08, 0x0BF6F912, 0x13F90AF4, 0xFE03F2F1, 0x04FB0CF7, -0x01FDE8F5, 0x0EF8F40D, 0xFE02F7ED, 0xE7EDF2FB, 0x04F9FF13, 0xF0F80A07, 0xF700F6F7, 0xF4080EF4, -0xF2F7F80F, 0x0DFDEFF0, 0x11EFF902, 0xF2FC0703, 0x0AFD10F1, 0x17F70D07, 0x08F5EFEB, 0xF10B11F9, -0xF610FFF8, 0x0C130B18, 0x080CFEF5, 0xFBF8F906, 0xF1080C08, 0xEAEEEE10, 0x0F11F6FD, 0x06F706F1, -0xED0BEA0D, 0xEEF30C02, 0xF8F40D0F, 0x020D0DEC, 0x0CF40605, 0x07020C12, 0xF40C0EF2, 0x060115F2, -0xF0E6F508, 0xF40DF9F0, 0x0F0A05F4, 0x0FF00B08, 0xEB08FEFC, 0xEE030AF1, 0x0DF9E806, 0xF2F7F5FD, -0x0A12EEF0, 0x09F3EFF8, 0xFE05F6F8, 0x1CEDF4F5, 0x060512FB, 0x08F90AF0, 0x000107F9, 0x14FFF9FA, -0x16F70B0B, 0xEEF2F704, 0x04F90BF1, 0x150302F3, 0xEBF8F8F3, 0xF6F90FEF, 0xFBF0F7FD, 0xF70D1000, -0xECF70C12, 0x03FDF3F0, 0xE4F31604, 0x02FFF600, 0xF00C0105, 0xEC0D0F02, 0xFAFAF707, 0x0208F501, -0xFFF809F5, 0xEEF70405, 0x050CFCF9, 0xF20BEBF7, 0xFA0E11F6, 0xF7F403F2, 0xF5F0F306, 0x00081A0F, -0x02F6EE09, 0x0F0D0B0F, 0x0AF7EDF6, 0xECFA0FEB, 0xF000FBFC, 0xF91103F4, 0xF0F30001, 0x08FCF8EE, -0x0CFEF30B, 0xFE040B02, 0xFC030FF3, 0x04F9F209, 0xF10E0705, 0x14F60B0C, 0x03ED1311, 0xED03EE13, -0xF9F8F70F, 0xFB010504, 0xEDF70C08, 0x061802FE, 0xED0801F9, 0x06FCFA16, 0x0EF8FCF3, 0x0EF00C0E, -0xF3F9170D, 0xFE010F05, 0xF31B0500, 0x07F50BF4, 0xEE09030A, 0xF401F400, 0x0C04090A, 0xFCF90F02, -0x0D10FD0C, 0xF00FEA09, 0xF3F50BF7, 0xFCFCF7EF, 0x06FB0A12, 0x0200EC01, 0x02020A0E, 0xF3FCFE0D, -0xFC0CF209, 0xFB06F2EE, 0xF90B0C10, 0xFDFCF40C, 0xFC06F80B, 0xEFF902F3, 0x0C110911, 0xF80AEFF3, -0x0900F30C, 0xF8160E0F, 0xEE0D130D, 0x0BF00209, 0x0AF509EF, 0xF7F614FA, 0xF513070A, 0x09E512FD, -0xF3050D0C, 0x0006020D, 0xFAED07FE, 0x07FE170B, 0x121300FF, 0x02F602FD, 0x0AF408FA, 0x06FAF7F1, -0x0807F71A, 0xFBF20C0B, 0xF3FD05F7, 0x06F4090F, 0xF1FEF307, 0x0805EBFA, 0x0810070D, 0xF6F31214, -0x02ED0607, 0x0D08010F, 0x09F60FF2, 0x0BF8F20C, 0x1BFCF6F4, 0xECFB070C, 0x13FAF3FD, 0xF8F7FCF4, -0x0C09F7F4, 0xF001E9F9, 0x11F1F305, 0xFAEC08FA, 0xF8F8F40F, 0xF6F70B0A, 0x07F012F4, 0xFDF5FEF3, -0x09070EF1, 0x09FFF7E9, 0xEAF60C0F, 0x04030106, 0xF5E70709, 0x0AF6F70C, 0xFA14FEF1, 0xF0E51903, -0xF4EF0B11, 0xF0F80CF3, 0x12ED0307, 0xF301F405, 0xF9F4F3F5, 0x0B0EF809, 0xF7EBF9F8, 0xF10BF406, -0xFBEEF2F6, 0xEC1111F2, 0x0716EEF6, 0x080910F0, 0xEE0D0010, 0x07ECF7F0, 0x09060005, 0x0DF5EB0B, -0x0212110C, 0xF3F704FA, 0xEA02020C, 0x050811F1, 0x01FA07F7, 0xF60E0D0D, 0xF711F60C, 0x0108F4F1, -0xF7F6FE01, 0x0F0FF7F9, 0xEFE7010A, 0x090902F6, 0x0FE809F8, 0xFDFE00F6, 0xEF0806F5, 0x10F80F0F, -0x0419F40B, 0xEF08EEFD, 0x0711F507, 0xF20901FB, 0x0BFA130A, 0xFA120CF9, 0xE809F2F2, 0xFAF8FE00, -0xF2FDFCF8, 0xF805F1FD, 0xF1F70912, 0x0903F80B, 0xF9EFF70B, 0x0D05F5F2, 0x0A08FF0E, 0x09F5EE00, -0x08F91314, 0x0AFEF60A, 0xE51005F0, 0x041EECFA, 0x06FDFF05, 0x0D11F1EF, 0xF4F80912, 0x0D090106, -0xFAF6F308, 0xFE14F8F1, 0x0D02EE03, 0xF0FDFAED, 0xF2F2E903, 0xE9040C0D, 0x0A00F8F8, 0xF4FA0909, -0xF4EFFA1B, 0xFC0D0D0B, 0xF2EE08F5, 0x000E0F12, 0xF0F50F11, 0x04FEF9F4, 0x0BF914EB, 0x170CFBF9, -0x03F30E06, 0x01F8F70F, 0x14F8EFFD, 0xF412F5F2, 0x0AF60C01, 0xF711090D, 0xF60DF90C, 0x09F0ECE8, -0xEC06140C, 0xFD090DFA, 0xEA01F7EF, 0x030AF8F6, 0xF3F5FCFD, 0xF4F3F500, 0xF3EDECF5, 0xF3130AF6, -0xF8EFFA0E, 0x0A0B0DF4, 0xF1F0F7F5, 0x0D0A09F4, 0x10EDEEF7, 0x0E0EEDFE, 0xF4F9F306, 0x05FCF8FF, -0x13FBF7F2, 0xFF07F6F7, 0x0AF2F8F6, 0x0DFA1EFF, 0xF6EE0B09, 0xF113030B, 0xFAF9F3F5, 0xFA0C080C, -0x0BF8F607, 0x09F902FB, 0xF50BFD08, 0xF7F515EF, 0x0BFA00FB, 0x01FAF009, 0xEA02FE05, 0x0CFBFC10, -0xFBF7F214, 0x1305F1ED, 0xFA01F216, 0xFDFBFFF4, 0xEE0B040C, 0xFAFB05FD, 0xFEF8F7F4, 0xF60802EF, -0xF301E603, 0x03EEFAF7, 0xF109EAF2, 0xEF0BFEF5, 0xFFF31115, 0xED09F309, 0x02FFEE0D, 0xF60D0FF9, -0x030A07FA, 0xF5F4060A, 0x140FFEF1, 0xF6FCEEFF, 0x07030006, 0xFBEF04F7, 0x0AF009FC, 0xF90A0FF9, -0xF2F702F8, 0xFFFBFB0E, 0x0907090B, 0x0B180F02, 0x0B0C0405, 0x12F80AF9, 0x09F400F0, 0xF010070A, -0xEBF105F1, 0x05F90C11, 0xE805F30B, 0x12F70BF3, 0xEF11EFFC, 0xEFF7FC0F, 0xE709EF10, 0xF50CFBFD, -0xF7F805F0, 0xF609FCF7, 0xEAF80F00, 0xFBF40B10, 0xF71106F5, 0xFA12FB01, 0x020BF30C, 0x0714FA04, -0x06010708, 0xF2110D0D, 0xEEF6F2F8, 0xF009F1E8, 0x07FD06F7, 0x14F8EF0C, 0xF00DF9F6, 0xF20BF50B, -0xF90C06F7, 0x06FB02F7, 0xF7F20A09, 0xFA051008, 0x0EFA0913, 0x05060D03, 0xFCF40CF6, 0x03E8FCFC, -0xF3F31411, 0xFCF40906, 0xFB0BF9F7, 0xFC02F80D, 0xF20408F2, 0xEE0EEF0B, 0xF0000EF3, 0xFBF6EDF1, -0xFAF50FEB, 0x06FC0C0B, 0xF009F80F, 0xF0F7F706, 0xF70507FC, 0x0AF00209, 0xFF0DF20F, 0xEA15FA06, -0x0816EDF3, 0x000EF9F5, 0xEFF7FA04, 0x0FF60814, 0xF1FEFA02, 0x0805F306, 0xF610FDEE, 0xF8061606, -0xFE0DFCEF, 0x07F8F613, 0x0C0809F9, 0x0DEBF0FB, 0xF00EF4F4, 0xF8E7F20A, 0xF3FAF20D, 0xF90D04EE, -0xF1F40E00, 0x09EFFFEC, 0xFE0B0EE7, 0xF7FA0F0E, 0xF00CFEF4, 0xFAEEF9FC, 0x161AF703, 0xF70F10EC, -0xF6F011FA, 0x10FDFB0B, 0xF60C03FE, 0x0AFF08F3, 0xF6F606F0, 0xF5F716F3, 0xFDFDEBF7, 0x0CF8EFF4, -0xE3EF0910, 0xF7F6FF12, 0x001402F1, 0x03100EF2, 0x1117EBFF, 0x17FA1008, 0x0DF9F80E, 0xFCF0F511, -0x1403EEFC, 0x0010F100, 0x110A0612, 0xF505FAEF, 0xF4F304F4, 0x061209EF, 0x090C150C, 0x04F41306, -0x0B0C0DED, 0xF0F6F110, 0xFC0F1008, 0xF3EF0E08, 0x0B0AECF8, 0x0CF8FA0C, 0xF7FB0EFF, 0x0FF50FFC, -0x0DF4EDF8, 0x02080C0B, 0xF510F2F2, 0x0208FDF1, 0x060B04F1, 0xF8F6E607, 0xF415EDFF, 0xE8FBEBEC, -0x0805F30F, 0x00F30F09, 0xFA0DF6EB, 0x0BEEF806, 0x0408F00B, 0xF4F5FB09, 0x090EF310, 0x1006FBF9, -0xF0F7F710, 0xFC070C0F, 0xFB12EAFA, 0x0BF007F1, 0x080100F1, 0xF700F709, 0x0A0D05F8, 0xEFF20D0C, -0xF209F8F8, 0xF207FDF3, 0x0DEFEFEE, 0xFD020114, 0x0AF5050A, 0x0D0415FA, 0x0C12ED0F, 0x14F01005, -0xF7F0EE06, 0x0F14F209, 0x080500F9, 0x08F5050E, 0x0DE7E901, 0x03FDF3FC, 0xF20403FD, 0xF7F2F60D, -0xECF00D09, 0xFB09FF0A, 0xF306F9F2, 0x0E03F20E, 0x0C09F305, 0x11F710F8, 0xF4F217E4, 0x0E09090A, -0x0A12F0F9, 0x06F312FE, 0xFDFBFDEE, 0xE9F0020D, 0x0DFB1005, 0x0200E90B, 0x0F0C02F5, 0xF8FF05F4, -0x0AF303FD, 0x0BF4100E, 0x14F2040F, 0x0EF9EF0B, 0x0AED0801, 0x05F5EE08, 0xFF0A0514, 0xF8F2F0FF, -0x0FFAF7F0, 0xE10E12F6, 0x13F1F4FA, 0xF3FC0B0B, 0xEFFEF4FD, 0xF9080708, 0x05FCF9F6, 0x040E06F4, -0x020DF5F6, 0x13F50B11, 0x1513F1F6, 0x05F707ED, 0xF7FB01F7, 0xF1EF06FA, 0x09FB1102, 0x06FC0706, -0xF7F80F14, 0x0EF3F002, 0x0AF8FE0A, 0x0BE8F5F9, 0xEEF609E9, 0x09E8EE02, 0x03090BFC, 0xF0F8F0F1, -0xF8081009, 0x0F0002FA, 0xFCF202FD, 0x0DF106EF, 0xF70408F5, 0x02140C15, 0xF6F6F5EF, 0xF1080905, -0xE902FDEC, 0xF3F4F6F6, 0xF904FCF2, 0xF906F5F3, 0xF7FB0A08, 0x08F4F0F1, 0x0EFDF6F1, 0x03F8F6F6, -0xFF0C110C, 0xF1FDF7F8, 0xF814F502, 0x12FD1108, 0x0DF7F313, 0xF506FA11, 0x07FEF9F2, 0xEAF20D09, -0xFCF40D0D, 0x06F1F709, 0xF7F21DFA, 0xFB00ED11, 0x0DFA0208, 0xF1FE1101, 0x0AF5F4F9, 0x060BF3F9, -0x080CFD06, 0xF30EF409, 0x12EB02EF, 0x0BEF0D09, 0x1512F0F0, 0x18010700, 0x05070F05, 0xF306FC08, -0x0001FD0E, 0x10FD0DF8, 0xF708F90A, 0x100D0D05, 0x04011414, 0x0AF90D0C, 0xF402F8EE, 0xFC11FAFF, -0xF500F605, 0xF0EAF8F4, 0x120F0407, 0x1103F9EE, 0xF9F9F5F7, 0x10060EF8, 0x0609F504, 0xF20E080F, -0x0EF3F109, 0xFB05F60E, 0x0E1C05FD, 0xF710FBEB, 0x16F2F90B, 0xF500FEF4, 0x0A13EEF7, 0x0EFF0CF6, -0xFFF903F8, 0xF30A0BF0, 0xF7FCF004, 0x1613F70B, 0xF90506F5, 0xEB09F008, 0x05F30CF3, 0x0310EEF3, -0xFD1002F4, 0x09070114, 0x040B0606, 0xE400F907, 0x13F40B1A, 0x06F4EBE7, 0xF1EE06F9, 0xFAF9130D, -0xF3ED090A, 0x08EF05F8, 0xF814F507, 0xF8131707, 0x1EFCEF0C, 0xF1090708, 0x04F211F0, 0xEFF0090E, -0x09FBF3FD, 0xF3F204F4, 0xF000FC1C, 0xFC00F009, 0xF9FD160F, 0x16F7F80D, 0x0DF8060B, 0x03FAF4FB, -0x03FDFF0D, 0xF4F1F40E, 0xF9EBF7F2, 0x0EF6FA06, 0x09F3EDFA, 0xFEF4EFF2, 0x0F0300F4, 0x0DEBFBFC, -0x1FF0010E, 0xF9140E07, 0xF2F6FD07, 0x11E9020B, 0xEE17070B, 0x10FD0003, 0x0904F5F7, 0x0515FCEE, -0x090F07FF, 0x12FC1104, 0x10F9F0F1, 0x0A080700, 0x010A1200, 0x120B01F5, 0xF7F0ED01, 0xFB06040E, -0xF0FEF30B, 0x0A0713FC, 0xF6F7F9EC, 0x07F803ED, 0xF2F9EF0F, 0xFAF4100A, 0x020AFA04, 0x0806130D, -0xFF0B0F04, 0x080705F8, 0x04F503F3, 0x05EEF9ED, 0xFBFEF30A, 0xF2F9F20B, 0x03FEECEB, 0x08F40302, -0x0617FE0A, 0xFE10050C, 0x0410FAF3, 0xF508EFF9, 0x030908F2, 0x010206FC, 0xFDF7F415, 0xF9080F05, -0xFBF00CEE, 0x0BFD0D0B, 0xF7F9F10A, 0xF80603F9, 0xF202F4F5, 0x0F07FA05, 0x04FA09F8, 0x08F80B04, -0xED030E00, 0x0A04FDF8, 0xEFFC0B14, 0x05F2FFFE, 0xECF60EFB, 0xFE04FD07, 0x0AEDFB0D, 0xF20FF407, -0xF4030A00, 0x15F1EEF2, 0xF50B0D0B, 0x02FE11FB, 0xF3FBF8F8, 0xF7F0F516, 0xF6070A04, 0xFD0C1A0D, -0xF603F50B, 0x0D0F04FA, 0xF5F5EFF7, 0xFB130FE9, 0x0C0205F3, 0xFB050CF7, 0xF9F809FF, 0xF1120DF0, -0x0E0503F8, 0x16FEFDF6, 0xFA0AF5F7, 0xF302F6F9, 0xFC07F4EE, 0x0A040A00, 0xFFF409EE, 0xF8F7FD18, -0xFC01F7EA, 0x0F11F40F, 0x0DF7F708, 0x0DF60809, 0x0DFD0F08, 0x1012FA0E, 0x021615F4, 0x04FCEBFB, -0xF7FC09FE, 0x0C080DF9, 0xF8EB05FC, 0x0708F2EE, 0xFC14F80C, 0x0C06F111, 0x0809F9F2, 0x0CF809FF, -0x0DF50AF8, 0x05EA0E12, 0xFCF6F805, 0xF5EC0A0B, 0xF2080D10, 0x09FBED04, 0xEFF7F40E, 0xF8F610F6, -0x09F4F1F9, 0xFFFC0E0B, 0x020AF3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEFF410FC, 0x07FD0EFD, 0x0D060100, -0x13F4FAF3, 0xFFF001FE, 0x08FC07F0, 0x0900FC05, 0xF5F8F709, 0x0CFC100C, 0xF7F7FBFC, 0xF7F608F4, -0x05F90308, 0xECF6FF08, 0xF2F70B07, 0x04FE03F5, 0xFC02FBFE, 0x02F41301, 0xF1F6F50E, 0xF9FA00E4, -0x0EFB0709, 0xF50800F7, 0x040AEC07, 0x130301FA, 0x0409F809, 0xF104EA0F, 0xF7F00A09, 0xF80BF704, -0x13F800FE, 0xFAF50CF3, 0xF103090A, 0x12FAF30A, 0xF611F8F9, 0x02F1F403, 0x0A040FED, 0x0AFFFEF2, -0x05FBF7FD, 0x0FE903F3, 0xF6EA090B, 0x120FFE07, 0xFA1406F2, 0x0EF80EFB, 0x0EFDFAFC, 0x0EFC0D0A, -0x120805EF, 0xF70DF900, 0x0C0EE5FB, 0x0F0DF503, 0xF609000A, 0x0D03F5F9, 0x0FFB1006, 0x05F60A08, -0xED07F8EF, 0xF90CEE0A, 0x0B16100A, 0xFD07F607, 0x0EFF0D01, 0x0CEF04EB, 0x11F5FD0B, 0x080B0CF5, -0xFF14FEF5, 0xF1FAF413, 0xFA0100F6, 0xF0090FFC, 0xF3FB0AEF, 0xFE09FE0E, 0xF710F3F5, 0x04090C11, -0x04EEEFF2, 0x09FC0FF1, 0xFE0BF4F9, 0x08F10AFC, 0x030AF5FE, 0x13FA0FF4, 0x07000AFE, 0x071507F5, -0x06FD08F0, 0x0F0C08EE, 0x190E020D, 0x08EDF4EB, 0x0D0DF109, 0x0210EF00, 0xF506080A, 0x1010F7F0, -0xFE02F7FB, 0x09F8F6F7, 0xF902FF04, 0x16E003FE, 0x12EA1A00, 0x130E0FFF, 0x0702F2F9, 0xF10BEFFC, -0x010E04F1, 0xF6EF15F6, 0xF50A0510, 0x050DEF0D, 0xF908F4F6, 0x0F0F0BF0, 0x04F7F6FC, 0x07F9FAEE, -0x02EE07F9, 0xF6F90105, 0xF1FFFC04, 0x0802EB0C, 0xF10E0CF3, 0x030E0508, 0x0CF60CF9, 0x08F20EF5, -0xEFFE09EF, 0xF9FB0A06, 0x14F6F6F5, 0xF6140DFE, 0xF511F8F4, 0xF0FAEF00, 0x1103FC0B, 0xF1090B05, -0xF4FD11F0, 0xF80BF6F1, 0x14160D0B, 0x1105070C, 0x0DEDF80B, 0x1005EE07, 0xFCEFF5E2, 0x0812F3F6, -0xF2100BFD, 0x04FAF00B, 0xFD08F508, 0x06030EEA, 0xF4F90C05, 0xF5EE0608, 0x0CEEF40F, 0xF4F8FB06, -0xFCF01609, 0x0407F402, 0xFDFBFDFD, 0x0BF4F806, 0xFCF701EB, 0x08EB0709, 0xECF9040B, 0xF8E9F300, -0x1C0CEEF5, 0x0703FC08, 0xFEF40909, 0x150B0EFF, 0xF30D0B07, 0xFAF203F9, 0x02F209FA, 0x060EFDF7, -0xFCEB0FF2, 0x0313FF13, 0x030A0B07, 0x0BF70003, 0x00090D02, 0x1405F106, 0x020AFCF6, 0xFAFD01F6, -0xEE05F7EB, 0x030201F4, 0x06071009, 0x0E000704, 0x0A060F07, 0x0C0DFE04, 0xF1FA001A, 0xFFF90B10, -0xF607ED0F, 0x06F9100D, 0x05F6F40C, 0x0E0BF106, 0xF8FB09FF, 0xEBEE13FB, 0x0C0EF4F5, 0xF608EC0A, -0xF9F5F905, 0x0AEE03F5, 0x000B0A03, 0x0815F904, 0x13F7100F, 0xFB0711ED, 0xECF5FD01, 0x0D03F90C, -0xF4FA05EF, 0x1209050A, 0xF60BFD0A, 0xFF04F706, 0xF8ED06F0, 0x0001F71A, 0x09EEFFFA, 0xFF0D0BEA, -0x130F00F4, 0xF1F904FA, 0x05EDF504, 0x030AF7F8, 0x09F712F1, 0xFF0C0E07, 0xFE12F9F6, 0x08FC08F0, -0xF9F813FE, 0x01FF0D0C, 0xF3F10C06, 0xEC05F7F4, 0xFCF6FD04, 0x0B07FEF6, 0xF8FC13E8, 0xF004F611, -0xF6060210, 0x12FDF5ED, 0x0100F9ED, 0xEE03F8FE, 0x11F4F40C, 0x0C0BF614, 0x0D050411, 0x0B080FFA, -0xF2F906F9, 0xF5F3F8F2, 0xEF06080E, 0xF614F60D, 0x0A080A0E, 0xFBF2F9FB, 0x1612F1F7, 0xF4F60FF3, -0x010D0B0B, 0x0C0EFB07, 0x0B04FDED, 0xFAF50604, 0xF2FAFB0A, 0x0AF1FFF2, 0x100C0611, 0x01EF0CF9, -0x0B12F90A, 0x12FBF002, 0x04040D05, 0x10FEF910, 0xEAFC0AE7, 0xF404FFFC, 0xEA08F9ED, 0xF5F616F6, -0xF10106F7, 0xF806F5F8, 0xF8F70CFA, 0x0CF7FEFB, 0x0AEEEF08, 0x0AFBF0F2, 0x13F5EFEF, 0xFD010BFC, -0xFA01F3ED, 0x08F30D09, 0x09FEF902, 0x050FFDF4, 0x11FAFE08, 0x1703F1F2, 0xF3FCFE03, 0x06F4EA10, -0x090FEE13, 0x00F20702, 0xFBF90401, 0x070CEBF7, 0x0FF6F50B, 0xEEF8F6FF, 0x0A0AF506, 0x06F0010A, -0xF0F6F4FB, 0x00F51201, 0x0DF90C02, 0xF1F8F0EF, 0x061706EC, 0x0DF80EFD, 0xF0F6030A, 0x03FB100E, -0xF608F50D, 0xF10F08EF, 0xF9F0F105, 0x0EF7FA0E, 0xFD030811, 0x12ED0CF6, 0x050508F7, 0x05F90514, -0x0D100A10, 0xEAF901FF, 0x070B010D, 0xF90D140A, 0xFC02F1F4, 0xE9FCF3F8, 0x07F70FF2, 0x0409F8FF, -0x0C080CF5, 0x03FEF0F5, 0xF80E000C, 0x0201FAF2, 0x1314090D, 0xF90507F5, 0x05F302F0, 0x0CEFFDFB, -0xF11813EF, 0x10FFEEF6 - - -basegraph= -1 - -z_c= -176 - -n_cb= -11616 - -q_m= -2 - -n_filler= -8 - -e= -4640 - -rv_index= -2 - -code_block_mode= -1 - -iter_max= -20 - -expected_iter_count= -4 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE - -expected_status= -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_2.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_2.data deleted file mode 100644 index 2463df6178..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_HARQ_1_2.data +++ /dev/null @@ -1,902 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0xF315FCEF, 0xF50FFAFA, 0xFBF70DEE, 0x1013060C, 0x0B0AFCE7, 0xF0F30BF4, 0x0C070F06, 0x10F7F30F, -0xFE0F0E0D, 0x0FF7FE09, 0x07090606, 0xF705F004, 0x150EF10B, 0x080C010A, 0xF7FA0909, 0x0B00140A, -0xF1F2F8F9, 0x0AF2F910, 0x0D0F0CEF, 0x03F4F20D, 0x0CF90CF9, 0x06F4F501, 0x12FEF3EA, 0xF210F3F9, -0x0312020C, 0x0D0FEF0C, 0x011714F4, 0x110E02F3, 0xF102F613, 0x0A0B090C, 0x1503FA10, 0x0D13F011, -0xED0F0F0F, 0xF8F712F8, 0x10060502, 0x14EEF0F6, 0xEEF50606, 0x0BEDF006, 0xF2120906, 0x0F0700F4, -0xECF00D04, 0xF414F1F5, 0xF1ECF918, 0xF40B090C, 0xFD0FEDEF, 0x0DFDFBED, 0x0703FCF3, 0xEFF2FDED, -0x03021100, 0x0608F00A, 0x0BF7F910, 0xF7EEF20C, 0xF9ED0901, 0xECF2F0F2, 0xEB09F6F3, 0x0F06F5F7, -0xF90E0610, 0x07010611, 0x06F20E0D, 0x0E06EF00, 0x070C050D, 0x0C0F09F1, 0x10FE0CF6, 0x11EF0B14, -0x03FCE40C, 0xF4F506F4, 0xF400F613, 0x0E0509F8, 0xF00DF9F6, 0xF5F612E9, 0x1208FE15, 0x0607F307, -0x1108EE0C, 0xFDFBFB04, 0x02F30D05, 0xFDF0041A, 0x100CF1F4, 0x0DFAFBF9, 0xE9F10B09, 0xEEF214F9, -0x02F6F5F8, 0x0F010CF6, 0xF11008EF, 0x0CF3130A, 0x03FE11F5, 0xF6050708, 0xFC050EEC, 0x0BF8F4F9, -0x04F50FFF, 0x000206EB, 0xEFF9F7ED, 0x0E14F90C, 0x080401FC, 0x0A0401E5, 0xEE13F30C, 0xF10A0916, -0xF0F400EC, 0xFF03F614, 0x0409EBF2, 0x0C0906FA, 0xF70C0400, 0x0FFAFAFA, 0x1201F611, 0xF5FAFAF1, -0xF40FFA09, 0xFFF2F1EF, 0x0BEFF7FA, 0x0703FC07, 0x08F11109, 0xEF09FEEA, 0x07F908FB, 0xF9FD0812, -0xF90B0A02, 0x05F210F4, 0x1AF7F407, 0xEFF8FA0D, 0xF5F9F606, 0x02EB0D0F, 0xF7F5FDFE, 0x130BF5FB, -0x05F6F6F8, 0x1503FFFD, 0xF2F701F9, 0xF1F6F70B, 0x01010B08, 0xF717FBF6, 0x06FAFA05, 0x050CEF11, -0x11F30200, 0x09020F04, 0x07030601, 0x0603FC12, 0xFB0014F7, 0xF7F70CF2, 0xF0F6EEFA, 0x0EF107F8, -0xEA0D0A10, 0x0AEC0C0E, 0xF5060D07, 0xF7F4E804, 0x0902E90B, 0xEE090AFD, 0x02F60210, 0x090BFCFD, -0xF7F8FCF7, 0x030C0905, 0x040AF1F5, 0xF0F80CE7, 0x100AF413, 0xF8FB0817, 0x02EFFA04, 0xFB04EC08, -0x16F4FDFE, 0xE8FD07F4, 0xF2FFEF07, 0x0DF105F4, 0xF4EDF50B, 0xF7EB04FC, 0xF8F601E8, 0xEE0B00F0, -0xF516040E, 0xF600F605, 0x090705EC, 0xF10408F2, 0xE9F2EC11, 0xE90E1613, 0xF601F6F4, 0xF307F4F8, -0x100B060B, 0xF90D0402, 0x09FE0715, 0xF90E06F7, 0xF6FC08F7, 0xF7F30FF2, 0x040A05FA, 0x08F1F411, -0xF6F806F5, 0x0EFBFD0B, 0x0A0EF6FD, 0xEFF4F8F5, 0xFD05F8EB, 0x1300F8FD, 0xF7FE0CF6, 0x05F4E903, -0xF50302EF, 0xF8F514F8, 0x11F8F4F7, 0x120F11F6, 0x07F4FF09, 0x0D0FF700, 0x0EF7FD03, 0x090A06EF, -0xF90206FC, 0xF20FFEFB, 0xF90709FC, 0xFEFDF2F3, 0x0DF70DF7, 0x10F10808, 0x0B08F5FC, 0xF20605F9, -0x1DF5FAFF, 0x0B04F20C, 0xEDF811FA, 0x0F04EC07, 0xEEF4F40D, 0xF9100EF0, 0xFCEEEDF3, 0xF109EA00, -0xE0E8F913, 0x0AFA0AED, 0xF3E7F90B, 0x06FB0BFE, 0x12FEF20D, 0xF4040C04, 0xF409090D, 0xF3F8FAF5, -0x02F60306, 0x12F6FFFA, 0xF9FAF4F8, 0xF70D0408, 0x0400F007, 0x1501FDF2, 0xF305ECF2, 0x18EF01FC, -0x0FF2050C, 0x050DF30F, 0xFCF80813, 0xF3F906FD, 0xFDF3FAEF, 0xECFCEDFE, 0x0D05F810, 0xFC0B11F9, -0xF9FE0AE9, 0xF70EF4F3, 0xF9F1F1F8, 0xFCFA0DF8, 0x140F00EA, 0xF00AED07, 0xF9030CFC, 0xF604F9FA, -0xF8140217, 0x08F816FE, 0xFA06FF0D, 0xFC0C11F3, 0xF6F5050E, 0x09FB0010, 0x0C11F4F3, 0x05ECFE0D, -0x04F7070A, 0x12F50FEC, 0x0DFB0208, 0x110C03FA, 0xF50CF70A, 0xF90BF908, 0xFA0F0CF8, 0x100306F0, -0xF50C04FA, 0x060B0909, 0xF4FF0F13, 0x06FAFA02, 0x05150912, 0x0E0BF308, 0x0BFB0E0B, 0x0FF405F2, -0xF10AFD07, 0xFA00080C, 0xFB0FEB02, 0xF7FFFC0C, 0x0DF40BFB, 0x16FE060D, 0xFEF908FE, 0xF5F600F5, -0x0204F7F5, 0xF605FFFC, 0xF802F606, 0xFA09EB0E, 0xEF0B0CF3, 0x1308F909, 0xF7F704F9, 0x0702F600, -0x04F5F00A, 0xF7FAFC0F, 0x0BF70BF6, 0x16F3FF08, 0xF20B09FB, 0xF905F115, 0x040908FE, 0xEBF9090C, -0xF808F3F5, 0x0512F3EF, 0xEEFC07F4, 0xEFFFFCFF, 0xEE0DF4FE, 0x11F7100A, 0x01F600F4, 0xF413F3F9, -0x06F2F2F1, 0xF0120B03, 0x0D0CF3F7, 0xE4F000FB, 0xF7FC1A09, 0xFFED0912, 0xFF08E7F9, 0x06FA08F8, -0x06F70D01, 0x05FEEE16, 0x13F2F90F, 0x0EFC0D01, 0xF5130AFF, 0xF3F0ED0D, 0xF10AF807, 0xF4F0030C, -0x090AF3F7, 0x0C0BFFEC, 0x17FAF3F4, 0x0C0813F4, 0xEF0C0C0F, 0x0AF2E7F7, 0xF3EF0804, 0x05F90912, -0xFDF9F002, 0x041106EF, 0xF51BFAEF, 0xEFF20411, 0x07FCFDF1, 0x09F6FB11, 0xF00D0907, 0x0717F20B, -0xFCEF0800, 0xF0080009, 0xF011F50D, 0xFC06EC0B, 0x16FF0FF8, 0xF9F611FC, 0xF8F70D18, 0x160C0B13, -0x0612F7F5, 0x0D08F80C, 0xF4F9E7F2, 0x03FB0EF8, 0xFF0CF908, 0xEFF111F4, 0xF4EE0EFB, 0xF4FE0502, -0xF70A06FD, 0x0DFBFFFD, 0xFAF2F205, 0xFA060A0B, 0xEDFE0EF9, 0xF5EDF30B, 0xEF0C0616, 0x12020807, -0x00F9F4FB, 0x0FF803F4, 0xFBF8FC01, 0x0D02EB0D, 0x01F2F9F1, 0x0B0CF0F4, 0xFA0C0712, 0x0DF314EE, -0xFD0E0706, 0x06080AF8, 0x1600F7F2, 0xFCF2FEED, 0xF3090BF4, 0xEE0417FA, 0x00F90305, 0x1008110D, -0xF5F1F7F4, 0xF5FB04F6, 0xFC0B02F4, 0xF1FB00F0, 0x0712FF10, 0xF5EB0FF4, 0x110AF005, 0xFE02FC18, -0xF0E8F106, 0x100DF90D, 0xF30900FD, 0xF6F208F7, 0xFE021404, 0xED0AF612, 0x0104F5F8, 0xFE09F7F3, -0xED0A01F8, 0x0BFE0405, 0xF008FA0A, 0xFB1CF201, 0x0712F70F, 0xF0F2FE05, 0xFFF6FC04, 0x0AF4070D, -0xF9F3ECF9, 0x0AEC0BED, 0xEF0D010E, 0xF314F8FF, 0xEF0BFB0B, 0x0602F90B, 0x10F70A04, 0xFAEE0806, -0x0EF7F005, 0xEEF0F60D, 0x13EE0D07, 0xF415F203, 0xFBF8F0F3, 0xEBEB0BE4, 0x05FBF803, 0xF40A07F9, -0xEFF7F311, 0x040FF5F0, 0x0DFCED00, 0x050BEEF9, 0xF30CF612, 0xFB00EA0C, 0xF208F7F0, 0x0603F911, -0xEC02EB04, 0xEFF812F3, 0xEFF60200, 0xF40208FF, 0x12010A05, 0x06F017F8, 0x050F0C16, 0x120010F9, -0x0EF70707, 0xF0FA100E, 0xEFF50D01, 0xF5EE0808, 0xF409F2F5, 0x03FFF50C, 0xF2F0FCF1, 0x01EE16F7, -0x081015F9, 0xFDF10BF7, 0xFBEBF10B, 0x0EF208F7, 0x0C11EE0A, 0x0FFAF00E, 0x0D03F706, 0xF7F711F4, -0x05F30A06, 0xF709F904, 0x031A0DFB, 0xF8EC0608, 0x08EE0909, 0xF202EEF6, 0xFAF7F10F, 0x0F0FF3F9, -0x09010CF6, 0x04F60EF7, 0x0B0FF0EB, 0x08ECF80E, 0x0EFB0010, 0x0104EF14, 0xE9EF0CF4, 0x0AF9EFFD, -0x0B001415, 0xEF04FC07, 0xFF0C13EE, 0xF1F4F2FC, 0x0E08E7F7, 0x000CF612, 0xFD0B07EE, 0xFEFE04F0, -0xFBFB0D07, 0x0AE80103, 0xF4F2F309, 0xF2EFFBF9, 0x0A07EC05, 0xF405EEFA, 0x03F706F8, 0x010005F6, -0x0DFFF711, 0xF5030BED, 0x11EEFB13, 0xEE01EAEF, 0xF8F70DFB, 0x070DFBF8, 0xF5F116F0, 0xF7FB0401, -0xF6F8F008, 0xF6EDF3F7, 0x1A02F912, 0xFD06F803, 0xF501F70D, 0x0A011708, 0xF0FA0E02, 0xF906FBFC, -0xEFFCF707, 0xF50E09F8, 0xFA0CE9F9, 0xFB0E13F0, 0xF117F30D, 0x0C0702F9, 0x0CFBF705, 0xFB12F0ED, -0xF5F1FF14, 0x0D070C07, 0xF90B0409, 0xF1F3FE09, 0xEF03F80A, 0xFAEE0509, 0x11F4F600, 0x16081215, -0x0909F7F6, 0x0EF80A04, 0x0AFB0EEE, 0xF3FC020D, 0xF4FDEEF8, 0xFCF9F310, 0x0AEA00F5, 0x0AF0040F, -0x09F7EEF7, 0xFFF3F409, 0x11F704EF, 0x0C10F710, 0xF70AEA12, 0xFCF201FB, 0xF4000F01, 0x0F021100, -0x0B0AF4FA, 0xF802F702, 0x0812090D, 0xF9F30A10, 0x0FF2F309, 0x0DFCE9F8, 0xFA06FA02, 0x10E7FE06, -0x15F8F410, 0x020D02F7, 0xEB0810F8, 0xF011FC10, 0xF5F812F6, 0xF71010F2, 0x0DEE0DF3, 0xF8EF08F9, -0xF1F5FC11, 0xF8F8EBFD, 0x0604EEF3, 0x070CF40A, 0x0C070CF8, 0xFC090014, 0xF10EFDFB, 0x0CF80616, -0x0DFFF2F9, 0x0802F5F8, 0x09EE1309, 0xF8F70C04, 0x0AF50C03, 0xF90AF5F5, 0x0E00FE0E, 0xF1F7FEF6, -0xF8F3050A, 0xFCF50A13, 0x0AFE0B11, 0xF5F500E5, 0x0D0DFCF8, 0xF208F405, 0x01EEF0F9, 0x0900FB06, -0xF4F30EEA, 0x03FA0C02, 0xFC03F60B, 0xF8070AEA, 0xF1ECF9FF, 0x09FE0813, 0xFA020B11, 0xFF0210F6, -0xF3F4ECE6, 0xEEF6F6F4, 0xF50CFEF1, 0x08F2EA0E, 0xF7F70D06, 0xF708EF07, 0xFB0CFC0B, 0xEF0FF4F2, -0xFAF0FD0C, 0xF3F311FD, 0x01F5EC0F, 0xF9F10608, 0x0E07F3F3, 0x130508FE, 0x01EB12FA, 0xFF0804F1, -0x0707040D, 0xF408FCFC, 0xFCFEF014, 0x090A0007, 0x0C06F5F3, 0xF5020CED, 0xFCED0C0F, 0x0C0D1008, -0x0F0FFC06, 0x0B09F7F6, 0x08F208F8, 0xF7F7F60C, 0x030AF408, 0x051BF9FC, 0x1307080C, 0x0000F60F, -0x0B07F211, 0x0613F70E, 0x0310F5F4, 0xF0F812F7, 0xFB0B1308, 0xFC0C02F5, 0x13FD010D, 0x02F008ED, -0xF5F30EF1, 0x0511F605, 0x0008F80E, 0xF90EFA00, 0x0708090F, 0xFAF8FB0C, 0x14F7F70A, 0x09F608F7, -0xEC120708, 0x04070A04, 0xEDFEFA08, 0xFF11EFF5, 0x0CF9F5F1, 0x04F5F507, 0xFFF70FFD, 0xF10904FF, -0xF6F8F50F, 0x0BFE040A, 0xF71504F1, 0x0D04F717, 0x00F3FEF5, 0x13F50CFB, 0xF8F707F8, 0xFA0A09F6, -0x09FEF605, 0x050E0300, 0x07190AEF, 0xFE040EE5, 0xF8F70D11, 0x0A08FD03, 0xF40C03F3, 0xEEF0050C, -0xFBEFED07, 0x0AFEEFED, 0xFE0806F1, 0x0A071315, 0xF707FDF5, 0xF10D0FF4, 0x03F80709, 0x0F0BE9FA, -0xF50D0B0C, 0x0AF7EAEB, 0x12F4F306, 0x12F10FF7, 0x06F2F20A, 0x0E0F14EE, 0xFAFC0F06, 0x0E000CFD, -0xFAEEFCF6, 0x0EF3FD02, 0xF9100A04, 0xFAF410F5, 0x051403FB, 0x12EEF40D, 0xF90B0004, 0xF7070DEC, -0xE5140FF1, 0x0C090E06, 0xF5FFEFF7, 0x0FF90D09, 0x00FD0A0C, 0x0A02F5FE, 0x09040DFA, 0x0D07030B, -0x10EEF2F8, 0x0FEA0F16, 0xF611F405, 0x05F10A08, 0xF80703F7, 0x010107FA, 0xEE0DF60D, 0xF9F6F80E, -0x10F6F5F8, 0x0B0B02FC, 0x0A08F305, 0x110107F4, 0x0D120101, 0x0EF7130A, 0x04F7EBF9, 0xF8FB03FB, -0xFD160BF6, 0x1104F5E7, 0xF802F5F6, 0x08090BF5, 0xEA09F50D, 0xFFFB14E8, 0x0800FF0A, 0x05FDE612, -0x14F2F609, 0xFA0301F4, 0xFBFBFC0F, 0x0410F40C, 0xF6F4EF0B, 0xF304FB05, 0xFEEE0E11, 0x12030908, -0x07090907, 0xF707FC11, 0x0C01FDFB, 0x04F20909, 0xEFFEF20A, 0xF00B02FA, 0x0FF8050D, 0xF50EFCFE, -0x08F20EF2, 0xFEFC0BF5, 0xF6EAFCEC, 0x08FA05F8, 0x0AFCFE0C, 0xEFF20A11, 0x0FF1F411, 0x13F8FAF1, -0x0A0912FE, 0x070514F7, 0xF3F8F50B, 0xF3091503, 0x080BF00B, 0xF2F9FD03, 0xF3F503F2, 0xFAF9F819, -0x02FFF9FA, 0x19F6FA08, 0xF403FF00, 0xF40901F5, 0x0613F514, 0xF9F40DF9, 0x030A14F6, 0x170AFC12, -0xF4F10AF0, 0xF5E506FC, 0x0BECF0FA, 0xFC04101E, 0x0BFFFBF1, 0x12F2EEFD, 0xF605F7EF, 0x090DF8FD, -0xFF09F012, 0xF9F4020C, 0x03011206, 0x16F9E009, 0x0607EC1D, 0xFE0EEAF6, 0xFA0DFFF1, 0x13FEFA14, -0x06020D03, 0xF2F902EE, 0xEF0EFCED, 0xF104F711, 0xF0E90503, 0x15060EF2, 0x01F80AF9, 0x0AFDEF04, -0xF10C100D, 0x090AF600, 0x03F5F909, 0x05080DFA, 0xF40E0A1B, 0xF9F408EF, 0x0BF9F0F7, 0xFB100FF9, -0xF6081009, 0xF006F7EE, 0xFA0F0212, 0x0714F90E, 0x070F0DFD, 0x160402F5, 0xED0DF108, 0xF6F0F9EA, -0x1000F0FF, 0xF10B130D, 0xFF0F0C0D, 0x081702F8, 0x0C0EF306, 0x0517F907, 0x05F708FB, 0x0301FAF8, -0xF803F912, 0xF8140AF8, 0x0EF5F506, 0xF4F406FE, 0xF5F8EFED, 0xEF0A120A, 0x0A0906F9, 0x0D0BFB11, -0xF60EF5F8, 0x000B0A0D, 0xF9EC12E8, 0x0A0900F0, 0x0C14F40C, 0xF50011F2, 0x030D000E, 0xF0FD0E09, -0x11F70B03, 0x11EA0316, 0xF7F8050A, 0xF103F5F6, 0xFD1004FD, 0x08F31109, 0xF6F5F114, 0x0CF40BF3, -0x0DEC0BF5, 0x14F30202, 0x070AF80A, 0x11F3F1FF, 0xF8FA0BFA, 0xF90C01EF, 0xEE0DF308, 0x10F6F10B, -0x09F7E2F5, 0x10F1EF04, 0xF3F50AF4, 0x08F9120A, 0x0B02FDF7, 0x06FC1001, 0x0401F7FE, 0x18FAFAFA, -0xF5F3F4F2, 0xE9F4F40D, 0xFA0CFEFF, 0x060503FC, 0xF8F7F106, 0x0813F9FB, 0xF20AF4F7, 0x09EBEEF3, -0xF40CFBF6, 0x0CF6EEF2, 0x0F1EF1EB, 0xF4F90C0E, 0x160BF5F5, 0xFCF6F0EE, 0xF403EEF7, 0x04F10713, -0x11071109, 0xFDFA0F0D, 0x0C08060C, 0x0BFA08F8, 0x010AFF07, 0x101FF7F8, 0xF3EE090F, 0x08F5EBF9, -0x04FDF708, 0xEC090DF7, 0xF3150003, 0xF80BFD0A, 0xEE000A0F, 0x08F7F8FA, 0xFCF008F5, 0x0701EFFA, -0xF5FEF505, 0xEAEAF4EE, 0x0EFCFF10, 0x15F80BFB, 0xF7060700, 0xF3100D0B, 0x1705F901, 0xFA130605, -0xF4F2FA16, 0xEEFA0615, 0xFD130BF4, 0x06FDFA0F, 0xFB0406F8, 0xFC03EB0B, 0xFFF113FD, 0x03FA130F, -0x0B0B07F4, 0x03120AF8, 0x00020304, 0xF70AE308, 0xF9FA0203, 0x0007F501, 0x05FAF2F7, 0x1417F1EE, -0xFCEAF606, 0x02050AF5, 0xED12F609, 0x0E03FD0B, 0xF7FDEB01, 0x02FFF107, 0x1507F4F5, 0xEFED1609, -0xFC02F5F9, 0x06ED07FF, 0x070F18F9, 0xFA0A000D, 0x0FF307FA, 0xF6EFF20A, 0x120604F6, 0xF7090DF4, -0xEC120605, 0x0514FAFB, 0x0BEEFCFF, 0x130A0D10, 0x0100FAF2, 0xF6F307EF, 0x10F0F9F7, 0xF2FB0DEF, -0xF409F8FC, 0xF10A0A05, 0xF10F060D, 0x0EF9F7F6, 0xF502FFF8, 0x0CF20F0B, 0xFFFBFB0E, 0xEBFFEE0F, -0x0809F50B, 0xF809FAF3, 0x00FBF6EE, 0x0A0B0804, 0x0D04F105, 0x0DF709F8, 0x03F6F5F9, 0x0A12EE0C, -0xF6ECEFF0, 0x14090BF4, 0xF907040A, 0xF4F01510, 0x10050FF1, 0x13FFF705, 0x11F80111, 0xFB05F30D, -0x12F3EDF7, 0xECE80905, 0xF90BF8F3, 0x0DFE030B, 0xF1EF0310, 0x08030E11, 0x0510F6FB, 0x12EF09F7, -0xFD03F610, 0xF6FB0B09, 0x0B0F06FD, 0x1309F0F8, 0x060504F0, 0x0CF7EDF8, 0xF7101AF7, 0x000A0109, -0xFFFBFA00, 0xF5EAEEF8, 0xF7F7EAFB, 0x13FB0D08, 0x14F2F4F5, 0xFFF7FB11, 0xF00FFA01, 0x050EF9FE, -0x09F3040C, 0xF002ED0B, 0xF7FA0C04, 0x03070A00, 0xFEF3F108, 0x09F2F701, 0xFAF8070D, 0xEBF20C11, -0xF9060AF8, 0xEA02120A, 0xF4F104FC, 0x08051009, 0x1306FE0C, 0xF9F30C11, 0xF9EFF8F8, 0x1500FFF8, -0xF80DF20A, 0x07F0F1F9, 0xF709F40B, 0xEC06F10B, 0x11F2040B, 0xE80D0AF8, 0xFE02F60B, 0xF7F2070F, -0x13F6FCF5, 0xF80B1006, 0x0A1011F4, 0x040E04F1, 0x02F51013, 0xF6FA06FA, 0xF50D0103, 0x12F111F2, -0xF90CEDF6, 0xED111408, 0x0DFC12E8, 0x0303EFE8, 0xF400F811, 0xFD070807, 0x0BF500F2, 0x0C100BF4, -0x180DFDF7, 0x0DFB050B, 0x0FF80E0D, 0xF710F402, 0x06080D06, 0xF2F20D04, 0xF803F2F7, 0xF5EEF30E, -0xF40E0EF3, 0x03F00600, 0xE201F9F1, 0xF60F14F6, 0x0A0F0EFF, 0x0AFA0809, 0x0DF8E6F7, 0xE7F206FC, -0x05F8F7FB, 0x1604FD09, 0x0F0BF306, 0x08F00AF7, 0xF7070B11, 0x150BF905, 0x0F16F309, 0xF8F60E04, -0xFDF2EDFB, 0x0BFF040D, 0x06FAF0F2, 0xFAFEF501, 0x0F02F6F3, 0x0608FA16, 0x13F9F20A, 0x0A00F10E, -0x06FAFD04, 0x10EFF8F7, 0x0C08F914, 0x01FB030A, 0x0D0E0A02, 0x0BF1FEFE, 0xF00702F2, 0xFE080F05, -0x0D110502, 0x04F60410, 0xF9161006, 0xFCF8FEF2, 0xF6FCFCEF, 0xFEFEFCF8, 0xEB0AFCFF, 0x08F304F8, -0xF909010D, 0xFE0C08F4, 0x02F0F60F, 0x09F90AFF, 0xF2F40B09, 0xF104010E, 0xF5060CF6, 0x0C0CF2E7, -0x0CF2FA0D, 0xF8F3F7FA, 0xFEF00F02, 0xF80D0BF9, 0x03FAF400, 0x0A05EE08, 0xF0EBF200, 0xF6090F03, -0x030E03E7, 0x13FEF50B, 0x0B0FFC0E, 0x12F701FA, 0xF3FE01F4, 0x0E04010C, 0xF90DF510, 0xF4FAF302, -0xF90B0203, 0xF516E906, 0xFDFCF400, 0xF1F7FA0F, 0x121108FA, 0xFDF60F04, 0xF1FBF20B, 0x03FC17FD, -0xFE03EE12, 0x070A11F8, 0xFEF4FCF3, 0xF20AF4FF, 0x02F213F0, 0x09F6FBF6, 0x070202F3, 0x1509060B, -0x04EB010B, 0xFB110DFD, 0xEB030BF4, 0x070C0CF8, 0x0A09F7FC, 0xFAF70AEF, 0xF6EBFFFE, 0xEEF70C0A, -0xF5EE06F1, 0x0A14F500, 0x01FAF606, 0x1AEFF0FC, 0x08EB0FEB, 0x0411F617, 0xFE10EDF4, 0xEC0309FA, -0xF8F802FA, 0x0D0D0D0D, 0x0409EFFD, 0xF1FC0C04, 0x06EEECFC, 0x061417EF, 0x0E05FD00, 0xF914F8FC, -0xEFF20AFE, 0xF011F60A, 0x100EFA03, 0x03F5FBF1, 0x0904F808, 0xF608F4F3, 0x08F5EF03, 0xF1060FFE, -0xF115050C, 0x0D09F0F8, 0xFAFF0E06, 0xFA04F7F4, 0xF40D11ED, 0xE90B030C, 0xF805F610, 0x120401F6, -0x08FC0BF4, 0xF110F1FB, 0xF10E1408, 0x1907F9EF, 0x0AEC10F8, 0xF9F7FCF6, 0x010EFF0C, 0xFFF8F90C, -0x01FAF913, 0xF30B0BFB, 0x00FBF610, 0xF90FF809, 0x05ED080D, 0xFC0DEDF4, 0x07F80C0B, 0xFDEEFCF4, -0x0FF2F2F2, 0x07090B10, 0xF8FD1305, 0x04EE0908, 0x0C18F505, 0x0C06080B, 0xF0E6F5F3, 0xEFF812F6, -0x14010CFF, 0xF8080E15, 0xFAFFF2EC, 0x16FD010F, 0x0907F9FB, 0x13F400F1, 0x07FBF509, 0x0DEC05F3, -0x020A04FF, 0x05FA070D, 0x110C0FF2, 0x0C0B0302, 0xFF0403F7, 0x05F018F4, 0x02FB0BF5, 0x10F413F5 - -harq_input0 = -0x0FFA0103, 0x130C0B02, 0xF309F6E7, 0xF70F07F1, 0xF7090FF8, 0x050409F2, 0xF80AFAF7, 0x00F60EF5, -0x06FC060D, 0x080DFB03, 0xF4EDF9F9, 0xFCF9FEEA, 0x0F0C12F8, 0xF9F31708, 0xF60C02FF, 0xFF110310, -0x0BF80F0F, 0x02F6F2EE, 0xEDF20A06, 0x0709FEF2, 0x14F5F0F0, 0xF70C0018, 0x12020FEF, 0x0602EF08, -0xF40A0200, 0xEE0C0BFC, 0x0606ED01, 0xF2F709F3, 0x15110E10, 0x06EC06F8, 0xFBF10CF8, 0x0314FEF6, -0xF5F4FC0C, 0xF00C00FF, 0xF6FDF9F6, 0x07F30801, 0x0F04F40C, 0x0406F305, 0xFAF9F808, 0xF20DF109, -0x010A0AF8, 0x070AFC03, 0xF108120A, 0xF8F9F1EC, 0xEEEB09FF, 0x140C0D01, 0x04E5EF10, 0xF616130C, -0x0314F4EC, 0x09FA09F2, 0xFAFAF714, 0xFAF101FD, 0x06030FF4, 0x17F3EFFA, 0x09FEF109, 0xFDFEF9FB, -0xF2080B02, 0x0CF90B07, 0xEB0F0D06, 0xF71009FE, 0xEF110AF8, 0x0AF70BF9, 0x170A1508, 0xF8FDFAF1, -0x0204F3EB, 0xEFFE0315, 0x0C06000B, 0xF10C0A0E, 0xEC0EF9FC, 0x08F0F2F3, 0x09FD02F7, 0x0B11F610, -0xF8F1F8F7, 0xF8FB0A09, 0xFB030A13, 0x040804F0, 0xE8080813, 0xF1F4FFF3, 0xEBFCEDF7, 0xF7F00AE8, -0x00F1160E, 0xF007F301, 0x0E13F211, 0x07F815F4, 0xF9EEF70B, 0x0EF7FE15, 0x0706E80C, 0x0611F60E, -0xFB0B0CF5, 0xF4F50E11, 0x14FDF1EB, 0xF403120A, 0x09F80303, 0xFB0AF80B, 0xFA1408F5, 0xF503F717, -0x0FFB1610, 0x1107F3FC, 0xF1F4F7F7, 0x060EF4E8, 0x04F8F5FF, 0x04F30CFA, 0x10F008F8, 0xF514EEF3, -0x0EEDE8FE, 0xE7FEE70B, 0x0404FEF9, 0xF8F509F9, 0x0A0EF6F2, 0xF8080EF8, 0x01F200F3, 0x03FC19F2, -0x0D0FF2F8, 0xF9FD0C13, 0x11FE0703, 0x0BF9F110, 0x0EF3FEFD, 0x0EF8F10C, 0x0A070FEA, 0x04FA0310, -0x0CFE0003, 0x0CF3060D, 0xFBFCF5FA, 0xEC0D1108, 0x09ECF70A, 0x0C0EFB08, 0x0BF4F80A, 0xEFF0FB0C, -0x0B09F8FA, 0xFA16FF13, 0x0B081512, 0xF4F2FBF7, 0x000C0A07, 0x130C0FEE, 0xFEF908FB, 0xF6F5F912, -0xF1100409, 0x090E1606, 0xF4F50BF3, 0xEE00F7F9, 0xFAFBF5F6, 0x07080B0A, 0xF1150BE7, 0x0DF80912, -0x12EF0809, 0xEBFF1108, 0x0BF60DFE, 0x130DF608, 0x12EFF2F1, 0x04FB0C0B, 0x01FDFC09, 0xFAF808F9, -0x12020B01, 0xFCED060F, 0x040DFFFF, 0x04F80AF3, 0xF700F60B, 0x08F40E08, 0x06F7F80F, 0x0DFDEF04, -0xFDEFF916, 0xF21107EF, 0x0A1110F1, 0x03F70DF3, 0x08F50300, 0xF1F711F9, 0xF6FCFF0C, 0x0CFFF704, -0x080CFE09, 0x0FF80D06, 0x05080C08, 0xFE020210, 0xFB11F6E9, 0x060BF2F1, 0xED0BEAF9, 0x02F30C02, -0xF8F40DFB, 0x020D0D01, 0x0CF406F1, 0xF302F812, 0x080C0EF2, 0x06010006, 0xF0FA0908, 0x08F9F905, -0xFB0A0508, 0x0FF0F7F4, 0xFF081210, 0xEE18F6F1, 0xF9F9E8F2, 0x060B09FD, 0x0AFEEE04, 0x09F304F8, -0xEA05F6F8, 0x1C0108F5, 0xF205120F, 0xF40D0A04, 0x0001F30D, 0x00FF0DFA, 0x020BF7F7, 0x02F2F7F0, -0x04F90BF1, 0x01EFEE07, 0xEBE4F807, 0x0AF90FEF, 0x0F040B11, 0x0BF91000, 0x000CF812, 0x0311F3F0, -0xF8070218, 0xEDFFF614, 0xF00C15F1, 0x000D0F16, 0xFA0EF707, 0xEE080901, 0xFF0C09F5, 0xEEF704F1, -0xF10C10F9, 0x060BEBF7, 0xFA0EFDF6, 0xF7F403F2, 0xF5F0F306, 0xEC081A0F, 0x020AEEF5, 0xFBF9F7FB, -0xF60C010A, 0xEC0E0FFF, 0xF014FB10, 0x0EFD0308, 0x04F30015, 0xF4FC0CEE, 0x0CFEF3F7, 0x12F0F702, -0xE803FB07, 0x040D06F5, 0x05FA07F1, 0x140A0BF8, 0xEFEDFF11, 0x01EFEE13, 0x0D0C0B0F, 0xE70105F0, -0x01F70CF4, 0x0603EE12, 0xED08EDF9, 0xF2FCFA02, 0x0E0CFCF3, 0x0E04F8F9, 0xF30D17F9, 0xFEEDFB05, -0x071BF114, 0xF309F7F4, 0x02F503F6, 0x0815F400, 0x0CF0090A, 0xE80D0F02, 0xF9FCFDF8, 0xF00FFEF5, -0xF3F5F70B, 0xFC10F7EF, 0xF2FB0AFE, 0xEEECEC15, 0x0202F60E, 0xF310FEF9, 0x10F8F209, 0xFB0606EE, -0x0D0B0C10, 0x1110080C, 0xFCF2F8F6, 0x030DEE07, 0x0C11F511, 0x0CF6EF08, 0x0900070C, 0x0C160E0F, -0xEEF8FFF9, 0xF7F0EEF5, 0x0A090903, 0xF70A000E, 0xF5FF07F6, 0xF5E5FEFD, 0x08F1F80C, 0x00F2EE0D, -0xFAED07EA, 0x07EA170B, 0xFEFFECFF, 0xED0B0211, 0x0AF4F4E6, 0xF2FAF705, 0x0807F706, 0xFBF2F8F7, -0xF31105F7, 0xF10809FB, 0xF1FEF307, 0x0805FFFA, 0x08FC070D, 0x0A071200, 0xEEEDF107, 0xF908EDFB, -0x09F60FF2, 0x0B0C06F8, 0x07FCF608, 0x000FF30C, 0xFF0EF3FD, 0xE40BFCF4, 0x0CF50BF4, 0x04EDE90D, -0xFD05F3F1, 0xFAECF4FA, 0xF80C080F, 0x0A0BF70A, 0x07F012F4, 0x1109FEF3, 0xF507F9F1, 0xF513F7FD, -0xFE0AF80F, 0x041701F1, 0xF5E7F309, 0x0A0AF70C, 0x0E00FEF1, 0x04E505EF, 0xF4EF0BFD, 0x040CF807, -0x1201EF07, 0xF31508F1, 0xF908F309, 0x0B0EE409, 0xF7EBF9F8, 0xF1F7F406, 0xFB0206F6, 0xECFD11F2, -0x0702EEF6, 0xF409FC04, 0xEEF80010, 0xF3EC0BF0, 0x090600F1, 0xF9F5EBF7, 0xEEFE11F8, 0x070BF0FA, -0xFE16EEF8, 0xF108FD05, 0x15FAF3F7, 0xF60E0D0D, 0xF7FC0AF8, 0x01F40805, 0xF70AFE01, 0xFB0F0BF9, -0x04E701F6, 0x09F517F6, 0xFBE8F5F8, 0x11FE00F6, 0xEF08F2F5, 0xFB0CFB0F, 0x0419080B, 0x0308EE11, -0x07110907, 0xF2F5ED0F, 0x0BFAFEF6, 0xFA12F8F9, 0xE8090606, 0x0E0CEAEC, 0x06FD10F8, 0xF80505FD, -0xF1F70912, 0xF5EF0C0B, 0xF9EF0B0B, 0x0D05F5F2, 0x0A08FF0E, 0x09F50300, 0x08F91314, 0x0AFEF60A, -0xE5FC0504, 0xEF0A000E, 0x06FDFFF1, 0x0D11F103, 0x080CF512, 0xF9F501F2, 0xFAF60708, 0xFE140D05, -0xF90202EF, 0xF0FD0EED, 0x06F2E903, 0xE904F80D, 0xF600F8F8, 0xF4FA09F5, 0x0803FA07, 0xFCF9F90B, -0xF202F4F5, 0x000EFBFE, 0x0409FAFD, 0xF0EA0DF4, 0x0B0D00FF, 0x03F8FB0D, 0x0307FAF2, 0x010C0BFB, -0x140C03FD, 0xF4FE0906, 0xF6F6F8ED, 0x0B11090D, 0xF6F90EF8, 0x09F001E8, 0xEC0600F8, 0x1109F90E, -0xEA010BEF, 0xEF0A0C0A, 0x07F510FD, 0x08F3F500, 0x07ED01F5, 0xF313F60A, 0xF803FA0E, 0xF60B0D08, -0xF1F0F709, 0x0DF609F4, 0xFCED020B, 0x0E0EEDE9, 0x08F907F2, 0xF1FC0C13, 0xFFFB0C06, 0xEB070AF7, -0xF606F80A, 0xF90E1EFF, 0xF6EE0BF5, 0x05FF03F7, 0x0F0DF309, 0xFA0CF4F8, 0x1F0CF6F3, 0xF50DEE0F, -0xF5F7FDF4, 0x0BF501EF, 0xF7FA000F, 0xECFAF0F5, 0xEA02FEF1, 0xF80FFCFC, 0x100B0600, 0xFF050501, -0xFA150716, 0x110FFFF4, 0xEE0B04F8, 0x0E0FF112, 0x12F80BF4, 0xF6F41604, 0x07EDE6EF, 0x17EE0F0B, -0x05F5FEF2, 0xEF0BFEF5, 0xFF07FD15, 0x01090709, 0x02EBEE0D, 0xF6F9FB0D, 0xEFF6070E, 0x090806F6, -0x140FFEF1, 0xF6FCEEEB, 0x07EF14F2, 0xFB03040B, 0x0A05F4FC, 0x0DF6FB0D, 0x060B02F8, 0xFF0FFB0E, -0x090709F7, 0xF7180F02, 0x0BF8F005, 0xFE0CF60D, 0x09F4ECF0, 0x0410F30A, 0xEB05F105, 0x05F90C11, -0xFCF1F30B, 0x120B0BF3, 0x031104FC, 0x030BFC0F, 0xFB09EFFC, 0xF50CFB11, 0x0BF80504, 0xF609FCF7, -0xFE0CFB00, 0x0F08F7FB, 0x0BFD0609, 0x0E120F15, 0x020B07F8, 0x0714FAF0, 0x0615F308, 0xF2FDF8F9, -0xEEF606F8, 0x050906E8, 0x071106F7, 0x000C03F8, 0x04F9F90A, 0x060BF5F7, 0x0D0CF2F7, 0x06FB02F7, -0xF7060AF5, 0x0EF1FCF4, 0xFAFAF5FE, 0x0506F917, 0xFCF40C0A, 0x03FC10E8, 0xF30700FD, 0xFCF40906, -0xFB0B0D0B, 0x1017E4F9, 0xF20408F2, 0x02FA03F7, 0xF0000E07, 0xFB0AEDF1, 0xE6F50FEB, 0xF2FCF80B, -0x04F50DFB, 0xF00BF706, 0xF70507FC, 0x0AF01609, 0xFF0DF20F, 0xEA150EF2, 0x080202F3, 0x00FAF9F5, -0xEFF70E04, 0x0FF6F314, 0xF1FEFAEE, 0x08F1F3F2, 0xF6101102, 0xF8F20206, 0x120DFC03, 0x07F8F613, -0x0CF4F50D, 0x0DFF05FB, 0x040EF409, 0xF8FB06F6, 0xF3FAF20D, 0x0DF90402, 0x05080E00, 0xF5EFEBEC, -0xFE0B0EE7, 0x0B0E0F0E, 0x04F812F4, 0x0EEE0D10, 0x021AF7EF, 0xF70F10EC, 0xF604FDFA, 0x10E90F0B, -0xF60CEFFE, 0x0AEBF407, 0xF60A06F0, 0xF50B1607, 0x1111FF0B, 0xF8F8EF08, 0xF704F410, 0x0B0AEBFE, -0x14000205, 0x03FC0EF2, 0xFD17EBFF, 0x17FAFCF4, 0x0DF90CFA, 0x1004F511, 0x140302FC, 0x14FC0500, -0xFCF6F2FE, 0x0905FA03, 0x08F3F0F4, 0x06FEF5EF, 0x09F801F8, 0xF00913F1, 0xF7F80DED, 0x040AF1FC, -0xFC0F1008, 0x07040EF4, 0x0BF6EC0C, 0x0CF8FA0C, 0xF70F0EFF, 0xFB09FBFC, 0xF9F4ED0D, 0x02F4F80B, -0xF5FCF2F2, 0x0208FDF1, 0xF20B0405, 0xF80AFAF3, 0xF415EDEA, 0xFDFBEB00, 0xF4F1F30F, 0xEC070F09, -0xFA0D0AFF, 0xF7EE0C06, 0x04F4F00B, 0x08F50FF5, 0xF50EF3FC, 0x1006E7F9, 0x04F7F7FC, 0xFC070CFB, -0x0F12EAFA, 0xF7F00706, 0xF4011505, 0xF7140B09, 0x0AF9F1F8, 0x03060DF8, 0xF2090CF8, 0xF20712F3, -0xF903EFEE, 0x1102EC14, 0x0A09F1F6, 0xF9F001FA, 0xF8FE01FB, 0x140410F1, 0x0B0402F2, 0x0F0006F5, -0x0805ECF9, 0xF409F10E, 0x0DE7FD01, 0xEFFD0710, 0xF20403FD, 0x0BF2F6F9, 0x0004F909, 0x0F09FFF6, -0xF3060DF2, 0x0EEF060E, 0x0CF40705, 0xFDF7FB0C, 0xF4F203E4, 0x0E09F4F6, 0xF5FE04F9, 0x06F3FEFE, -0xFDFB1102, 0xFD04EE0D, 0x0DFBFCF1, 0xEE14E90B, 0xFB0CEE09, 0x0C13F108, 0xF60703FD, 0x0BF4FCFA, -0x14F2F0FB, 0xFAF9EFF7, 0xF5010801, 0xF109EEF3, 0xFF0A0514, 0x0C0604FF, 0xFB0EF704, 0xF50EFD0B, -0xFF05F4FA, 0x07E70B0B, 0xEFFEF4FD, 0x0D0807F3, 0x05100DF6, 0xEFFA1A08, 0x020D090A, 0xFFF5F7FD, -0x1513F10A, 0xF10BF2ED, 0x0B0F150B, 0xF10306FA, 0x09FB11EE, 0x061007F2, 0xF7F8FB14, 0xF90704EE, -0x0AF8EAF6, 0xF7E809F9, 0x02F609E9, 0x09E802EE, 0x03F50BE8, 0x040C04F1, 0x0CF41009, 0xFB00EEFA, -0xFC071611, 0xF9F1F203, 0x0BF0F409, 0x0214F801, 0x0A0AF504, 0x0508F5F1, 0xE916E900, 0x07F4F60A, -0xF9F010F2, 0xF906F507, 0x0BFB0AF4, 0xF408F0F1, 0x0EFD0A06, 0x03F80AF6, 0x130CFD0C, 0xF1E9F7F8, -0xF800F502, 0xFEFDFDF4, 0xF90B0713, 0xF506FAFD, 0x0712F9F2, 0xEAF20DF5, 0x10F40D0D, 0x06050B09, -0xF706090E, 0x0F00ED11, 0xF90E02F4, 0xF1FEFCED, 0x0AF5E00D, 0x06F7F3F9, 0x08F81206, 0xF30EF4F5, -0x12FF02EF, 0xF7040DF4, 0x151204F0, 0x04ED07EC, 0xF0F3FB05, 0x08F2FCF4, 0xECED11FA, 0xFC110DF8, -0x0BF4F90A, 0xFCF9F905, 0xF0010014, 0x0A0EF9F8, 0xF4020C02, 0x10FDFA13, 0xF5000B05, 0x05EAF808, -0xFE0F04F3, 0xFDEFF9EE, 0xF9F9090B, 0x10F20E0C, 0x060909F0, 0x060EF40F, 0x0E0705F5, 0xFB05F6F9, -0xFA1C0512, 0x0B10FBEB, 0x16F20DF6, 0x090012F4, 0x0A13020B, 0x0EFF0C0A, 0x130DEF0C, 0x070A0B04, -0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, -0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, -0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, -0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, -0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, -0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, -0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, -0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, -0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, -0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, -0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, -0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, -0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, -0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, -0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, -0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, -0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, -0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, -0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, -0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, -0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, -0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, -0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, -0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, -0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, -0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, -0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, -0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, -0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, -0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, -0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, -0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, -0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, -0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, -0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, -0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, -0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, -0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, -0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, -0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, -0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, -0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, -0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, -0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, -0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, -0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, -0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, -0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, -0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, -0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, -0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, -0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, -0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, -0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, -0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0xFB0E01EF, 0xFF0C0B02, 0x07090AFB, 0x0BFBF3F1, 0x0B090F0D, 0xF10409F2, -0xF80A0E0B, 0xECF60E09, 0x0610F2F9, 0xF4F9FBEF, 0x08ED0DF9, 0xFCF9FEFE, 0x0F0C12F8, 0xF9F317F4, -0x0BF80213, 0xFFFD1710, 0x0BF80FFB, 0xEEF6F2EE, 0x0106F506, 0xF3091206, 0x00F504F0, 0x0B0C0018, -0xFD02FAEF, 0x06ED0308, 0xF4F60215, 0x02F80BFC, 0xF20601ED, 0x06F7F5F3, 0x0111FAFC, 0xF2ECF2F8, -0xFB050C0D, 0x0314EA0A, 0x09F4FCF8, 0xF0F80013, 0xF6E90D0A, 0xF307F415, 0xFB04F4F8, 0xF006F3F1, -0xFAF9F808, 0x06F9F109, 0xED0A0A0C, 0xF3F6FC03, 0x0508120A, 0x0C0DF100, 0x02FF09FF, 0x00F80D01, -0x04E50410, 0xF616130C, 0x0300F4EC, 0x090EF506, 0xFA0E0C14, 0x0EF10111, 0xF2030F09, 0x03F3030E, -0x09EA0509, 0xFDFEF9FB, 0x06F4F702, 0x0C0D0BF3, 0xFFFBF906, 0xF7FBF512, 0x03110AF8, 0x0AF7F70D, -0x17F60108, 0xF811FA05, 0xEE040700, 0x03FEEF01, 0xF706EC0B, 0x060C0AFA, 0xEC0EF910, 0x0804F207, -0x09E902F7, 0xF7FDF610, 0x0C050C0B, 0xF8E7F609, 0xFB170A13, 0xF0080404, 0xE808F413, 0xF1F4EB07, -0xEBFC01F7, 0x0B040AE8, 0x00F1020E, 0xF0F207EC, 0x0EFFF211, 0xF3F815F4, 0xF9020B0B, 0x0EF71201, -0x0706FC0C, 0x06FDF6FA, 0xFBF7F80A, 0x08090EFD, 0x14FD05FF, 0xF403FE0A, 0xF5F8EF03, 0xFB0AF8F7, -0x0F00F409, 0x0AEF0B03, 0x0FFB0210, 0x11070710, 0xF1080B0B, 0xF20E08E8, 0xF00CF5EB, 0xF0F30C0E, -0xFCF0080D, 0x0900EE07, 0xFA01FCFE, 0xE712E70B, 0xF004FEF9, 0x0CF5090D, 0xF60EF606, 0xF8F4FAF8, -0xED061507, 0xEF110506, 0xF90FF20C, 0xF911F813, 0xFC12F3EF, 0xF7F9F1FC, 0x0E07EAE9, 0x0EF8F1F8, -0xF6070FEA, 0xF0FA0310, 0xF8FE1417, 0xF8F306F9, 0xFBFCF50E, 0xEC0D11F3, 0x0900F70A, 0xF80EFBF3, -0x0B08F8F6, 0xEFF00F0C, 0xF709F8FA, 0x0E16EB13, 0x0BF415FE, 0xF4F20F0B, 0xEC0C0AF3, 0x13F8FB02, -0x12F908FB, 0x0A090D12, 0xF110F0F5, 0xF40E021B, 0x0809F7F3, 0xEE000B0D, 0x0E0FF5F6, 0xF3F40BF6, -0x05150BE7, 0x0DF809FE, 0x12030809, 0xFF13FC08, 0x0BF6F912, 0x13F90AF4, 0xFE03F2F1, 0x04FB0CF7, -0x01FDE8F5, 0x0EF8F40D, 0xFE02F7ED, 0xE7EDF2FB, 0x04F9FF13, 0xF0F80A07, 0xF700F6F7, 0xF4080EF4, -0xF2F7F80F, 0x0DFDEFF0, 0x11EFF902, 0xF2FC0703, 0x0AFD10F1, 0x17F70D07, 0x08F5EFEB, 0xF10B11F9, -0xF610FFF8, 0x0C130B18, 0x080CFEF5, 0xFBF8F906, 0xF1080C08, 0xEAEEEE10, 0x0F11F6FD, 0x06F706F1, -0xED0BEA0D, 0xEEF30C02, 0xF8F40D0F, 0x020D0DEC, 0x0CF40605, 0x07020C12, 0xF40C0EF2, 0x060115F2, -0xF0E6F508, 0xF40DF9F0, 0x0F0A05F4, 0x0FF00B08, 0xEB08FEFC, 0xEE030AF1, 0x0DF9E806, 0xF2F7F5FD, -0x0A12EEF0, 0x09F3EFF8, 0xFE05F6F8, 0x1CEDF4F5, 0x060512FB, 0x08F90AF0, 0x000107F9, 0x14FFF9FA, -0x16F70B0B, 0xEEF2F704, 0x04F90BF1, 0x150302F3, 0xEBF8F8F3, 0xF6F90FEF, 0xFBF0F7FD, 0xF70D1000, -0xECF70C12, 0x03FDF3F0, 0xE4F31604, 0x02FFF600, 0xF00C0105, 0xEC0D0F02, 0xFAFAF707, 0x0208F501, -0xFFF809F5, 0xEEF70405, 0x050CFCF9, 0xF20BEBF7, 0xFA0E11F6, 0xF7F403F2, 0xF5F0F306, 0x00081A0F, -0x02F6EE09, 0x0F0D0B0F, 0x0AF7EDF6, 0xECFA0FEB, 0xF000FBFC, 0xF91103F4, 0xF0F30001, 0x08FCF8EE, -0x0CFEF30B, 0xFE040B02, 0xFC030FF3, 0x04F9F209, 0xF10E0705, 0x14F60B0C, 0x03ED1311, 0xED03EE13, -0xF9F8F70F, 0xFB010504, 0xEDF70C08, 0x061802FE, 0xED0801F9, 0x06FCFA16, 0x0EF8FCF3, 0x0EF00C0E, -0xF3F9170D, 0xFE010F05, 0xF31B0500, 0x07F50BF4, 0xEE09030A, 0xF401F400, 0x0C04090A, 0xFCF90F02, -0x0D10FD0C, 0xF00FEA09, 0xF3F50BF7, 0xFCFCF7EF, 0x06FB0A12, 0x0200EC01, 0x02020A0E, 0xF3FCFE0D, -0xFC0CF209, 0xFB06F2EE, 0xF90B0C10, 0xFDFCF40C, 0xFC06F80B, 0xEFF902F3, 0x0C110911, 0xF80AEFF3, -0x0900F30C, 0xF8160E0F, 0xEE0D130D, 0x0BF00209, 0x0AF509EF, 0xF7F614FA, 0xF513070A, 0x09E512FD, -0xF3050D0C, 0x0006020D, 0xFAED07FE, 0x07FE170B, 0x121300FF, 0x02F602FD, 0x0AF408FA, 0x06FAF7F1, -0x0807F71A, 0xFBF20C0B, 0xF3FD05F7, 0x06F4090F, 0xF1FEF307, 0x0805EBFA, 0x0810070D, 0xF6F31214, -0x02ED0607, 0x0D08010F, 0x09F60FF2, 0x0BF8F20C, 0x1BFCF6F4, 0xECFB070C, 0x13FAF3FD, 0xF8F7FCF4, -0x0C09F7F4, 0xF001E9F9, 0x11F1F305, 0xFAEC08FA, 0xF8F8F40F, 0xF6F70B0A, 0x07F012F4, 0xFDF5FEF3, -0x09070EF1, 0x09FFF7E9, 0xEAF60C0F, 0x04030106, 0xF5E70709, 0x0AF6F70C, 0xFA14FEF1, 0xF0E51903, -0xF4EF0B11, 0xF0F80CF3, 0x12ED0307, 0xF301F405, 0xF9F4F3F5, 0x0B0EF809, 0xF7EBF9F8, 0xF10BF406, -0xFBEEF2F6, 0xEC1111F2, 0x0716EEF6, 0x080910F0, 0xEE0D0010, 0x07ECF7F0, 0x09060005, 0x0DF5EB0B, -0x0212110C, 0xF3F704FA, 0xEA02020C, 0x050811F1, 0x01FA07F7, 0xF60E0D0D, 0xF711F60C, 0x0108F4F1, -0xF7F6FE01, 0x0F0FF7F9, 0xEFE7010A, 0x090902F6, 0x0FE809F8, 0xFDFE00F6, 0xEF0806F5, 0x10F80F0F, -0x0419F40B, 0xEF08EEFD, 0x0711F507, 0xF20901FB, 0x0BFA130A, 0xFA120CF9, 0xE809F2F2, 0xFAF8FE00, -0xF2FDFCF8, 0xF805F1FD, 0xF1F70912, 0x0903F80B, 0xF9EFF70B, 0x0D05F5F2, 0x0A08FF0E, 0x09F5EE00, -0x08F91314, 0x0AFEF60A, 0xE51005F0, 0x041EECFA, 0x06FDFF05, 0x0D11F1EF, 0xF4F80912, 0x0D090106, -0xFAF6F308, 0xFE14F8F1, 0x0D02EE03, 0xF0FDFAED, 0xF2F2E903, 0xE9040C0D, 0x0A00F8F8, 0xF4FA0909, -0xF4EFFA1B, 0xFC0D0D0B, 0xF2EE08F5, 0x000E0F12, 0xF0F50F11, 0x04FEF9F4, 0x0BF914EB, 0x170CFBF9, -0x03F30E06, 0x01F8F70F, 0x14F8EFFD, 0xF412F5F2, 0x0AF60C01, 0xF711090D, 0xF60DF90C, 0x09F0ECE8, -0xEC06140C, 0xFD090DFA, 0xEA01F7EF, 0x030AF8F6, 0xF3F5FCFD, 0xF4F3F500, 0xF3EDECF5, 0xF3130AF6, -0xF8EFFA0E, 0x0A0B0DF4, 0xF1F0F7F5, 0x0D0A09F4, 0x10EDEEF7, 0x0E0EEDFE, 0xF4F9F306, 0x05FCF8FF, -0x13FBF7F2, 0xFF07F6F7, 0x0AF2F8F6, 0x0DFA1EFF, 0xF6EE0B09, 0xF113030B, 0xFAF9F3F5, 0xFA0C080C, -0x0BF8F607, 0x09F902FB, 0xF50BFD08, 0xF7F515EF, 0x0BFA00FB, 0x01FAF009, 0xEA02FE05, 0x0CFBFC10, -0xFBF7F214, 0x1305F1ED, 0xFA01F216, 0xFDFBFFF4, 0xEE0B040C, 0xFAFB05FD, 0xFEF8F7F4, 0xF60802EF, -0xF301E603, 0x03EEFAF7, 0xF109EAF2, 0xEF0BFEF5, 0xFFF31115, 0xED09F309, 0x02FFEE0D, 0xF60D0FF9, -0x030A07FA, 0xF5F4060A, 0x140FFEF1, 0xF6FCEEFF, 0x07030006, 0xFBEF04F7, 0x0AF009FC, 0xF90A0FF9, -0xF2F702F8, 0xFFFBFB0E, 0x0907090B, 0x0B180F02, 0x0B0C0405, 0x12F80AF9, 0x09F400F0, 0xF010070A, -0xEBF105F1, 0x05F90C11, 0xE805F30B, 0x12F70BF3, 0xEF11EFFC, 0xEFF7FC0F, 0xE709EF10, 0xF50CFBFD, -0xF7F805F0, 0xF609FCF7, 0xEAF80F00, 0xFBF40B10, 0xF71106F5, 0xFA12FB01, 0x020BF30C, 0x0714FA04, -0x06010708, 0xF2110D0D, 0xEEF6F2F8, 0xF009F1E8, 0x07FD06F7, 0x14F8EF0C, 0xF00DF9F6, 0xF20BF50B, -0xF90C06F7, 0x06FB02F7, 0xF7F20A09, 0xFA051008, 0x0EFA0913, 0x05060D03, 0xFCF40CF6, 0x03E8FCFC, -0xF3F31411, 0xFCF40906, 0xFB0BF9F7, 0xFC02F80D, 0xF20408F2, 0xEE0EEF0B, 0xF0000EF3, 0xFBF6EDF1, -0xFAF50FEB, 0x06FC0C0B, 0xF009F80F, 0xF0F7F706, 0xF70507FC, 0x0AF00209, 0xFF0DF20F, 0xEA15FA06, -0x0816EDF3, 0x000EF9F5, 0xEFF7FA04, 0x0FF60814, 0xF1FEFA02, 0x0805F306, 0xF610FDEE, 0xF8061606, -0xFE0DFCEF, 0x07F8F613, 0x0C0809F9, 0x0DEBF0FB, 0xF00EF4F4, 0xF8E7F20A, 0xF3FAF20D, 0xF90D04EE, -0xF1F40E00, 0x09EFFFEC, 0xFE0B0EE7, 0xF7FA0F0E, 0xF00CFEF4, 0xFAEEF9FC, 0x161AF703, 0xF70F10EC, -0xF6F011FA, 0x10FDFB0B, 0xF60C03FE, 0x0AFF08F3, 0xF6F606F0, 0xF5F716F3, 0xFDFDEBF7, 0x0CF8EFF4, -0xE3EF0910, 0xF7F6FF12, 0x001402F1, 0x03100EF2, 0x1117EBFF, 0x17FA1008, 0x0DF9F80E, 0xFCF0F511, -0x1403EEFC, 0x0010F100, 0x110A0612, 0xF505FAEF, 0xF4F304F4, 0x061209EF, 0x090C150C, 0x04F41306, -0x0B0C0DED, 0xF0F6F110, 0xFC0F1008, 0xF3EF0E08, 0x0B0AECF8, 0x0CF8FA0C, 0xF7FB0EFF, 0x0FF50FFC, -0x0DF4EDF8, 0x02080C0B, 0xF510F2F2, 0x0208FDF1, 0x060B04F1, 0xF8F6E607, 0xF415EDFF, 0xE8FBEBEC, -0x0805F30F, 0x00F30F09, 0xFA0DF6EB, 0x0BEEF806, 0x0408F00B, 0xF4F5FB09, 0x090EF310, 0x1006FBF9, -0xF0F7F710, 0xFC070C0F, 0xFB12EAFA, 0x0BF007F1, 0x080100F1, 0xF700F709, 0x0A0D05F8, 0xEFF20D0C, -0xF209F8F8, 0xF207FDF3, 0x0DEFEFEE, 0xFD020114, 0x0AF5050A, 0x0D0415FA, 0x0C12ED0F, 0x14F01005, -0xF7F0EE06, 0x0F14F209, 0x080500F9, 0x08F5050E, 0x0DE7E901, 0x03FDF3FC, 0xF20403FD, 0xF7F2F60D, -0xECF00D09, 0xFB09FF0A, 0xF306F9F2, 0x0E03F20E, 0x0C09F305, 0x11F710F8, 0xF4F217E4, 0x0E09090A, -0x0A12F0F9, 0x06F312FE, 0xFDFBFDEE, 0xE9F0020D, 0x0DFB1005, 0x0200E90B, 0x0F0C02F5, 0xF8FF05F4, -0x0AF303FD, 0x0BF4100E, 0x14F2040F, 0x0EF9EF0B, 0x0AED0801, 0x05F5EE08, 0xFF0A0514, 0xF8F2F0FF, -0x0FFAF7F0, 0xE10E12F6, 0x13F1F4FA, 0xF3FC0B0B, 0xEFFEF4FD, 0xF9080708, 0x05FCF9F6, 0x040E06F4, -0x020DF5F6, 0x13F50B11, 0x1513F1F6, 0x05F707ED, 0xF7FB01F7, 0xF1EF06FA, 0x09FB1102, 0x06FC0706, -0xF7F80F14, 0x0EF3F002, 0x0AF8FE0A, 0x0BE8F5F9, 0xEEF609E9, 0x09E8EE02, 0x03090BFC, 0xF0F8F0F1, -0xF8081009, 0x0F0002FA, 0xFCF202FD, 0x0DF106EF, 0xF70408F5, 0x02140C15, 0xF6F6F5EF, 0xF1080905, -0xE902FDEC, 0xF3F4F6F6, 0xF904FCF2, 0xF906F5F3, 0xF7FB0A08, 0x08F4F0F1, 0x0EFDF6F1, 0x03F8F6F6, -0xFF0C110C, 0xF1FDF7F8, 0xF814F502, 0x12FD1108, 0x0DF7F313, 0xF506FA11, 0x07FEF9F2, 0xEAF20D09, -0xFCF40D0D, 0x06F1F709, 0xF7F21DFA, 0xFB00ED11, 0x0DFA0208, 0xF1FE1101, 0x0AF5F4F9, 0x060BF3F9, -0x080CFD06, 0xF30EF409, 0x12EB02EF, 0x0BEF0D09, 0x1512F0F0, 0x18010700, 0x05070F05, 0xF306FC08, -0x0001FD0E, 0x10FD0DF8, 0xF708F90A, 0x100D0D05, 0x04011414, 0x0AF90D0C, 0xF402F8EE, 0xFC11FAFF, -0xF500F605, 0xF0EAF8F4, 0x120F0407, 0x1103F9EE, 0xF9F9F5F7, 0x10060EF8, 0x0609F504, 0xF20E080F, -0x0EF3F109, 0xFB05F60E, 0x0E1C05FD, 0xF710FBEB, 0x16F2F90B, 0xF500FEF4, 0x0A13EEF7, 0x0EFF0CF6, -0xFFF903F8, 0xF30A0BF0, 0xF7FCF004, 0x1613F70B, 0xF90506F5, 0xEB09F008, 0x05F30CF3, 0x0310EEF3, -0xFD1002F4, 0x09070114, 0x040B0606, 0xE400F907, 0x13F40B1A, 0x06F4EBE7, 0xF1EE06F9, 0xFAF9130D, -0xF3ED090A, 0x08EF05F8, 0xF814F507, 0xF8131707, 0x1EFCEF0C, 0xF1090708, 0x04F211F0, 0xEFF0090E, -0x09FBF3FD, 0xF3F204F4, 0xF000FC1C, 0xFC00F009, 0xF9FD160F, 0x16F7F80D, 0x0DF8060B, 0x03FAF4FB, -0x03FDFF0D, 0xF4F1F40E, 0xF9EBF7F2, 0x0EF6FA06, 0x09F3EDFA, 0xFEF4EFF2, 0x0F0300F4, 0x0DEBFBFC, -0x1FF0010E, 0xF9140E07, 0xF2F6FD07, 0x11E9020B, 0xEE17070B, 0x10FD0003, 0x0904F5F7, 0x0515FCEE, -0x090F07FF, 0x12FC1104, 0x10F9F0F1, 0x0A080700, 0x010A1200, 0x120B01F5, 0xF7F0ED01, 0xFB06040E, -0xF0FEF30B, 0x0A0713FC, 0xF6F7F9EC, 0x07F803ED, 0xF2F9EF0F, 0xFAF4100A, 0x020AFA04, 0x0806130D, -0xFF0B0F04, 0x080705F8, 0x04F503F3, 0x05EEF9ED, 0xFBFEF30A, 0xF2F9F20B, 0x03FEECEB, 0x08F40302, -0x0617FE0A, 0xFE10050C, 0x0410FAF3, 0xF508EFF9, 0x030908F2, 0x010206FC, 0xFDF7F415, 0xF9080F05, -0xFBF00CEE, 0x0BFD0D0B, 0xF7F9F10A, 0xF80603F9, 0xF202F4F5, 0x0F07FA05, 0x04FA09F8, 0x08F80B04, -0xED030E00, 0x0A04FDF8, 0xEFFC0B14, 0x05F2FFFE, 0xECF60EFB, 0xFE04FD07, 0x0AEDFB0D, 0xF20FF407, -0xF4030A00, 0x15F1EEF2, 0xF50B0D0B, 0x02FE11FB, 0xF3FBF8F8, 0xF7F0F516, 0xF6070A04, 0xFD0C1A0D, -0xF603F50B, 0x0D0F04FA, 0xF5F5EFF7, 0xFB130FE9, 0x0C0205F3, 0xFB050CF7, 0xF9F809FF, 0xF1120DF0, -0x0E0503F8, 0x16FEFDF6, 0xFA0AF5F7, 0xF302F6F9, 0xFC07F4EE, 0x0A040A00, 0xFFF409EE, 0xF8F7FD18, -0xFC01F7EA, 0x0F11F40F, 0x0DF7F708, 0x0DF60809, 0x0DFD0F08, 0x1012FA0E, 0x021615F4, 0x04FCEBFB, -0xF7FC09FE, 0x0C080DF9, 0xF8EB05FC, 0x0708F2EE, 0xFC14F80C, 0x0C06F111, 0x0809F9F2, 0x0CF809FF, -0x0DF50AF8, 0x05EA0E12, 0xFCF6F805, 0xF5EC0A0B, 0xF2080D10, 0x09FBED04, 0xEFF7F40E, 0xF8F610F6, -0x09F4F1F9, 0xFFFC0E0B, 0x020AF3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEFF410FC, 0x07FD0EFD, 0x0D060100, -0x13F4FAF3, 0xFFF001FE, 0x08FC07F0, 0x0900FC05, 0xF5F8F709, 0x0CFC100C, 0xF7F7FBFC, 0xF7F608F4, -0x05F90308, 0xECF6FF08, 0xF2F70B07, 0x04FE03F5, 0xFC02FBFE, 0x02F41301, 0xF1F6F50E, 0xF9FA00E4, -0x0EFB0709, 0xF50800F7, 0x040AEC07, 0x130301FA, 0x0409F809, 0xF104EA0F, 0xF7F00A09, 0xF80BF704, -0x13F800FE, 0xFAF50CF3, 0xF103090A, 0x12FAF30A, 0xF611F8F9, 0x02F1F403, 0x0A040FED, 0x0AFFFEF2, -0x05FBF7FD, 0x0FE903F3, 0xF6EA090B, 0x120FFE07, 0xFA1406F2, 0x0EF80EFB, 0x0EFDFAFC, 0x0EFC0D0A, -0x120805EF, 0xF70DF900, 0x0C0EE5FB, 0x0F0DF503, 0xF609000A, 0x0D03F5F9, 0x0FFB1006, 0x05F60A08, -0xED07F8EF, 0xF90CEE0A, 0x0B16100A, 0xFD07F607, 0x0EFF0D01, 0x0CEF04EB, 0x11F5FD0B, 0x080B0CF5, -0xFF14FEF5, 0xF1FAF413, 0xFA0100F6, 0xF0090FFC, 0xF3FB0AEF, 0xFE09FE0E, 0xF710F3F5, 0x04090C11, -0x04EEEFF2, 0x09FC0FF1, 0xFE0BF4F9, 0x08F10AFC, 0x030AF5FE, 0x13FA0FF4, 0x07000AFE, 0x071507F5, -0x06FD08F0, 0x0F0C08EE, 0x190E020D, 0x08EDF4EB, 0x0D0DF109, 0x0210EF00, 0xF506080A, 0x1010F7F0, -0xFE02F7FB, 0x09F8F6F7, 0xF902FF04, 0x16E003FE, 0x12EA1A00, 0x130E0FFF, 0x0702F2F9, 0xF10BEFFC, -0x010E04F1, 0xF6EF15F6, 0xF50A0510, 0x050DEF0D, 0xF908F4F6, 0x0F0F0BF0, 0x04F7F6FC, 0x07F9FAEE, -0x02EE07F9, 0xF6F90105, 0xF1FFFC04, 0x0802EB0C, 0xF10E0CF3, 0x030E0508, 0x0CF60CF9, 0x08F20EF5, -0xEFFE09EF, 0xF9FB0A06, 0x14F6F6F5, 0xF6140DFE, 0xF511F8F4, 0xF0FAEF00, 0x1103FC0B, 0xF1090B05, -0xF4FD11F0, 0xF80BF6F1, 0x14160D0B, 0x1105070C, 0x0DEDF80B, 0x1005EE07, 0xFCEFF5E2, 0x0812F3F6, -0xF2100BFD, 0x04FAF00B, 0xFD08F508, 0x06030EEA, 0xF4F90C05, 0xF5EE0608, 0x0CEEF40F, 0xF4F8FB06, -0xFCF01609, 0x0407F402, 0xFDFBFDFD, 0x0BF4F806, 0xFCF701EB, 0x08EB0709, 0xECF9040B, 0xF8E9F300, -0x1C0CEEF5, 0x0703FC08, 0xFEF40909, 0x150B0EFF, 0xF30D0B07, 0xFAF203F9, 0x02F209FA, 0x060EFDF7, -0xFCEB0FF2, 0x0313FF13, 0x030A0B07, 0x0BF70003, 0x00090D02, 0x1405F106, 0x020AFCF6, 0xFAFD01F6, -0xEE05F7EB, 0x030201F4, 0x06071009, 0x0E000704, 0x0A060F07, 0x0C0DFE04, 0xF1FA001A, 0xFFF90B10, -0xF607ED0F, 0x06F9100D, 0x05F6F40C, 0x0E0BF106, 0xF8FB09FF, 0xEBEE13FB, 0x0C0EF4F5, 0xF608EC0A, -0xF9F5F905, 0x0AEE03F5, 0x000B0A03, 0x0815F904, 0x13F7100F, 0xFB0711ED, 0xECF5FD01, 0x0D03F90C, -0xF4FA05EF, 0x1209050A, 0xF60BFD0A, 0xFF04F706, 0xF8ED06F0, 0x0001F71A, 0x09EEFFFA, 0xFF0D0BEA, -0x130F00F4, 0xF1F904FA, 0x05EDF504, 0x030AF7F8, 0x09F712F1, 0xFF0C0E07, 0xFE12F9F6, 0x08FC08F0, -0xF9F813FE, 0x01FF0D0C, 0xF3F10C06, 0xEC05F7F4, 0xFCF6FD04, 0x0B07FEF6, 0xF8FC13E8, 0xF004F611, -0xF6060210, 0x12FDF5ED, 0x0100F9ED, 0xEE03F8FE, 0x11F4F40C, 0x0C0BF614, 0x0D050411, 0x0B080FFA, -0xF2F906F9, 0xF5F3F8F2, 0xEF06080E, 0xF614F60D, 0x0A080A0E, 0xFBF2F9FB, 0x1612F1F7, 0xF4F60FF3, -0x010D0B0B, 0x0C0EFB07, 0x0B04FDED, 0xFAF50604, 0xF2FAFB0A, 0x0AF1FFF2, 0x100C0611, 0x01EF0CF9, -0x0B12F90A, 0x12FBF002, 0x04040D05, 0x10FEF910, 0xEAFC0AE7, 0xF404FFFC, 0xEA08F9ED, 0xF5F616F6, -0xF10106F7, 0xF806F5F8, 0xF8F70CFA, 0x0CF7FEFB, 0x0AEEEF08, 0x0AFBF0F2, 0x13F5EFEF, 0xFD010BFC, -0xFA01F3ED, 0x08F30D09, 0x09FEF902, 0x050FFDF4, 0x11FAFE08, 0x1703F1F2, 0xF3FCFE03, 0x06F4EA10, -0x090FEE13, 0x00F20702, 0xFBF90401, 0x070CEBF7, 0x0FF6F50B, 0xEEF8F6FF, 0x0A0AF506, 0x06F0010A, -0xF0F6F4FB, 0x00F51201, 0x0DF90C02, 0xF1F8F0EF, 0x061706EC, 0x0DF80EFD, 0xF0F6030A, 0x03FB100E, -0xF608F50D, 0xF10F08EF, 0xF9F0F105, 0x0EF7FA0E, 0xFD030811, 0x12ED0CF6, 0x050508F7, 0x05F90514, -0x0D100A10, 0xEAF901FF, 0x070B010D, 0xF90D140A, 0xFC02F1F4, 0xE9FCF3F8, 0x07F70FF2, 0x0409F8FF, -0x0C080CF5, 0x03FEF0F5, 0xF80E000C, 0x0201FAF2, 0x1314090D, 0xF90507F5, 0x05F302F0, 0x0CEFFDFB, -0xF11813EF, 0x10FFEEF6, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 - - -output0 = -0x8EC35F65, 0xF1011E4E, 0x01283C76, 0x46C59B44, 0x66BD1E7E, 0x71CC3D13, 0xF54F7B59, 0xC2E51E78, -0x878ACD1F, 0x0BB83AD9, 0xD6EB81F6, 0xDA98D960, 0x9583FF24, 0x84E13C2E, 0xB80A4BD9, 0x7546DA7D, -0x61301F84, 0x4E8E7BCA, 0x0F9A1992, 0x84DE01C3, 0xFB1B38F1, 0x44764A25, 0x9525C193, 0xAD6AFC2C, -0xEAC9CBE7, 0x822626C3, 0x6764F1E2, 0xB7080FC1, 0x92F0BF18, 0x2BE2A423, 0x6652CA22, 0x7E2B8B7D, -0xDADC0042, 0x1684A5B0, 0x6AF80D1E, 0xDE4B11F8, 0x4C027AA7, 0x9B499047, 0xDF71DF9C, 0xE66B5211, -0x0976A858, 0x97CCDFA6, 0xF921AC4D, 0x684DB77D, 0x2046F400, 0x66BF05FF, 0xCFE771B2, 0x7D285899, -0xA6DD74A8, 0xD5AC14DF, 0xB4EE744D, 0x9BF75449, 0xBCCF7BE5, 0xD9B3E1C5, 0x04D5FEEA, 0xA91CED17, -0x260A3E33, 0xB14FA433, 0xC7FB659B, 0xD847CBDD, 0xD4BAF083, 0x51A5AEB1, 0x39A13C7A, 0xC54DBA51, -0x81DD7FFE, 0xE2A3941C, 0x386750AD, 0x85C6A1CF, 0x52E46581, 0x2DC58468, 0x4F8C204C, 0xCA6C89B8, -0xD338F49E, 0xB71D9A1C, 0xAE5992A5, 0x461FFEB6, 0x0F724968, 0xD2D9A290, 0x4C0791D6, 0x8AA45E2A, -0xBCE9EEF4, 0x769D6618, 0x71D659F8, 0xE9DC6A13, 0x99E831C3, 0x8AB8CFD6, 0x489E23C5, 0xBEFC2792, -0x9E54E534, 0x54101DEF, 0x1F83D8D2, 0x69A8094D, 0x2DA8AAEB, 0x564C6C07, 0x4F2AADB5, 0x20CB1D7F, -0x2D6E9D54, 0xB97A8BC9, 0x36365C67, 0x8D84329F, 0x4000A81C, 0x6326766B, 0xB9B50B8D, 0xF9D51D73, -0x4D1A117F, 0x70486DEE, 0xBB19FFB6, 0x96929F46, 0x8E7C8D1C, 0x04B8D1F3, 0x204B8156, 0xA67E9C62, -0x4534F672, 0x94B8C832, 0x38E7CFE4, 0x71F48255, 0x82181625, 0xF8C9EB50, 0xF3D38EF0, 0xB4DE79FB, -0xF32452 - -harq_output0 = -0x14EFEB09, 0x16171D0B, 0xF210F3E8, 0xE4180EE6, 0xE40811F1, 0x0F1118EB, 0xE714EDF1, 0x09EA14EB, -0x1AF71812, 0x121DE902, 0xE7DCF9EB, 0xF7E8EEE1, 0x19111BF4, 0xF2E92615, 0xE81704F7, 0xFE20FE1E, -0x14EB181A, 0x0DFAEDDC, 0xE4EA0E0B, 0x1915F4EB, 0x1DE9DCE0, 0xE71C0722, 0x110714E0, 0x0B0FE719, -0xDC0FF5F7, 0xEC1716EF, 0x0917DC11, 0xE1EE19EE, 0x101A1120, 0x0FE415F5, 0xF2E911E8, 0x0D1D0EED, -0xDFECF70C, 0xEB14F7FA, 0xED0EEBEB, 0x15F11702, 0x110FE718, 0x0B06ED09, 0xECFAEB10, 0xE41EE916, -0x031410F0, 0x0C13EDFF, 0xE4191816, 0xF8F1E0E4, 0xDEE41609, 0x1A17160C, 0x11DDE11B, 0xE8251517, -0x0E1AEAE1, 0x17EB19E6, 0xF4F4EC27, 0xEBE30E00, 0x170B1BEA, 0x1ADBEBE2, 0x1005F11A, 0x0DF2EEED, -0xED1318F9, 0x1CFB0314, 0xDD13150C, 0xE51E0CF5, 0xDF1118EB, 0x19ED0CEA, 0x11132407, 0xEAF9F2E8, -0x060DEBE6, 0xDFF50E1B, 0x170B071C, 0xE7102017, 0xEB1BEBF7, 0x06F1ECE5, 0x111304EA, 0x0B1FEF1A, -0xE7E8F2FB, 0xF305121D, 0xEC011815, 0x0C0D0BE2, 0xDE181915, 0xE9E615F9, 0xE9F4E9E6, 0xEAE814E7, -0x0CE51F1B, 0xE906E310, 0x1221E61A, 0x13DF1BEA, 0xECE8E918, 0x1BF0EE17, 0x0C0EE20C, 0x0F14E10E, -0xF9161ADC, 0xEBEF1D1F, 0x1809EFDF, 0xEE051F1A, 0x1FFE0E06, 0xF219F40B, 0xF01819EF, 0xF100F222, -0x19F31922, 0x1B06E7EF, 0xE7EAE9E7, 0x0F19F6DB, 0x15F5E00A, 0x10EB0FEE, 0x07DF11F4, 0xEC1ED9F1, -0x22EDD6EF, 0xD6FAE111, 0x151BE9E4, 0xFBEF19ED, 0x171BEEEC, 0xF40C17F5, 0x15E1EEEF, 0x17F81EF2, -0x1E19E4F6, 0xEEEE1A16, 0x19F10B0B, 0x11F7E613, 0x17EB1309, 0x12ECF012, 0x15131CD7, 0x08F00820, -0x1CF9FCF7, 0x13E21415, 0xF2F2E1F2, 0xE4191F14, 0x14E7F11D, 0x1B17F618, 0x18E8E517, 0xDDE4F317, -0x1419EAEC, 0xE81EFC18, 0x11132D17, 0xECE8E1EA, 0x08210B06, 0x101B0EDA, 0xF2EA0FF6, 0xE2E8F41B, -0xEB1D0E08, 0x141022F8, 0xE4E90FEA, 0xE2F5F2EE, 0xEFF5E8F2, 0x170E0617, 0xE12016E3, 0x1DEB1521, -0x21ED0617, 0xE2EF180E, 0x13F722EF, 0x1E21ED11, 0x1CE8E3E9, 0x07ED1917, 0x07F20815, 0xECEB1AEC, -0x1FF10E03, 0x0DEF0723, 0x0E16F0F5, 0x11E81FED, 0xEF12E31A, 0x1CE41E0D, 0x11E7E615, 0x1CFDE10D, -0xF1E0E523, 0xE61AF8E8, 0x170C0DDE, 0xF2F414EF, 0x0EE50611, 0xE8E91CF2, 0xE2ECF815, 0x1BF4E2FA, -0x0F12F70F, 0x1DE71314, 0x1111130D, 0x0F0D121C, 0xEF17F9CD, 0x1414E6E7, 0xE21DDAF2, 0x08E61E00, -0xF5EF1EE9, 0xFF110F0E, 0x19EF16E2, 0xE116E11D, 0x171810E7, 0x1214F10E, 0xE6010C19, 0x13EDF513, -0xFB100917, 0x1DE9E6EB, 0x09091A11, 0xDF21E4E4, 0xF8EFD8F2, 0x12110DE8, 0x19F8E508, 0xFEED16EE, -0xE9F6EAF2, 0x23FD13EC, 0xE1031A20, 0xED15110C, 0x0511EC17, 0xEFF927EE, 0x0418ECED, 0x15E7EEED, -0x19F810E7, 0xF2E6E008, 0xE2DFF912, 0x0FE815E9, 0x18131C13, 0x11F51706, 0xF718F326, 0x1118E3DE, -0x0213EC22, 0xE4E7EB21, 0xDE161EDA, 0x09091118, 0xFD17EE03, 0xDE140DF2, 0xF71419E9, 0xE9E306EB, -0xD91326F6, 0x1310DDE6, 0xF112F1EB, 0xE5F4FBF3, 0xEBE6E80A, 0xDD102314, 0xEB20D7E1, 0xEEEDEDF1, -0xEF101110, 0xE5141806, 0xE723F118, 0x16F1070D, 0x12F0F61B, 0xE3F416E4, 0x1FF6F0EF, 0x17D9EE0E, -0xE017F009, 0x161E17E9, 0x12F10EF0, 0x1D1019F5, 0xE1EBF817, 0xFFE1E71C, 0x1D14181C, 0xD90610E5, -0x0CE929EE, 0x15EFDB23, 0xE616DBED, 0xE3E6F6EF, 0x1816DCEC, 0x140FEBF2, 0xE71929EB, 0xF1E7EF0E, -0x191AF317, 0xEA0DF0E8, 0x17F207E6, 0x2016E7EC, 0x11E3180F, 0xDB130B0A, 0xE5E9FAF2, 0xEC200BED, -0xEAE9F015, 0xF81DF0E0, 0xE2E81EFE, 0xE4E5E521, 0x0A18EE10, 0xEF21F8F8, 0x19F8E80E, 0x000412E2, -0x1F1A1017, 0x2213150E, 0xF5EBEDED, 0x1313E813, 0x121AEA15, 0x12F0E317, 0x17F30C15, 0x1B1B191D, -0xE800F0F6, 0xEEECE9E0, 0x200F160E, 0xEC0AFE16, 0xEBFE09ED, 0xEFD0F6F3, 0x1BEAE718, 0x07E8E511, -0xF1E90BDA, 0x1DE92216, 0xF7F0DE08, 0xD8140619, 0x0FE7ECD9, 0xE1F6E50C, 0x1917E5FA, 0xEFE5F9F7, -0xE31C0BE9, 0xD50816EE, 0xF007EA21, 0x0E0DFEE1, 0x0DEA0D1A, 0x181425F9, 0xE1DAE611, 0xED0BDEF3, -0x15F518E5, 0x171F1DEB, 0x11E3E514, 0x0518E614, 0x0314F0ED, 0xD30FF1EE, 0x15F012F1, 0x0BDFD916, -0xED05EFF9, 0xF6D8E4EF, 0xF11D1E1E, 0x2016EF17, 0x14E818EB, 0x1417F2DA, 0xE418F8EA, 0xE918EB0B, -0x0B09EF15, 0xFE21FBE3, 0xEADAE017, 0x1C12E612, 0x1D03FEE5, 0x11D000EB, 0xFFDF0CF6, 0x1120F20E, -0x180BEC0E, 0xEF131EE8, 0xE71FE614, 0x1B1FE40C, 0xECEFEEEF, 0xE2F7F008, 0xF0110DF5, 0xEAF922E2, -0x17FBDEE7, 0xEA11EF04, 0xDBEEFE24, 0xF1E30CE5, 0x140AEDF2, 0xF4E7DBF1, 0xDEFC18EF, 0x1112EFF6, -0x0821E7E4, 0xE400EC06, 0x1BF3E2F2, 0xF0161D17, 0xE5F218E8, 0xF5E61B12, 0xE215F9F1, 0xEF1610F1, -0x08DCF0E9, 0x0EE324E3, 0xF6D2E8EE, 0x17F7F2ED, 0xDE1ADEE0, 0xEF14EA11, 0x0A301A15, 0x1518F31D, -0xF721170E, 0xE7FDDC1C, 0x0EEFF2E8, 0xFB28EAF5, 0xE5140E1B, 0x1C14E5DD, 0x15ED1CE6, 0xEF1612F4, -0xE8F00E1C, 0xEDF50F18, 0xEBDD1314, 0x1CF8EFE3, 0x0E16081A, 0x11ED0EF0, 0x09E82114, 0x14EDDF16, -0xD4F81018, 0xE0FCFF21, 0x06F30DD8, 0x0B15EE0A, 0x120DF01F, 0xEBF0F5E5, 0xEEE411F4, 0xFF19100B, -0xEE0D0FE6, 0xDEE71FE8, 0x0DEDE110, 0xE008ED23, 0xECF3EEE8, 0xF1F223EE, 0x121AEFFE, 0xF5F4E919, -0xE70BE3EC, 0xFB21F5E7, 0x100BEBF0, 0xEBDA19EB, 0x1819F5FE, 0xF4F6F411, 0xFD0CE9EA, 0x171E1CF1, -0x22160CF4, 0xE7001314, 0xF2E9ECDB, 0x1515130D, 0xF5ED17E6, 0x15E712EC, 0xE807F7E2, 0x201AED1D, -0xE2F816E3, 0xE8141413, 0x14DE1FF0, 0x18F1EFFA, 0x09EF16E9, 0xE30FE11A, 0xEF13EF20, 0xEE131A15, -0xE9DBE805, 0x14EA0FE2, 0xF8ED0E17, 0x1A14DEE6, 0x10EE14E4, 0xE9081526, 0xF8F01612, 0xDC0518F5, -0xF210F00F, 0xEE0E280A, 0xE8E218F1, 0x0EFA04E7, 0x1219E717, 0xF216F0EE, 0x2814E7EC, 0xF41DE81A, -0xE3EDF0E0, 0x13DFF6ED, 0xEEE9F71C, 0xDBEEEBF1, 0xDD13F8EE, 0xF115FDE8, 0x231314F3, 0xFE090613, -0xEE110E1A, 0x1A0FFBE4, 0xE31710ED, 0x1A1FED1E, 0x1DEF1AF0, 0xEDEA1E0C, 0x0CE6E9E3, 0x17E42213, -0x0BEC09E4, 0xDF1D01EA, 0xFB09F828, 0x03111A0A, 0x07E1E31B, 0xEFF3FB05, 0xE9F10E17, 0x12101AED, -0x1819EAF8, 0xF5EBDBE5, 0x0BE420E7, 0xEC07031A, 0x1509EAF1, 0x1AEDF211, 0x191702F6, 0xF918F315, -0x0E0A12ED, 0xF526160C, 0x15F5E812, 0xEC11EA10, 0x13E3E7DD, 0x0E23F110, 0xDC14E802, 0x14E20F18, -0x06DBE816, 0x241A1DE6, 0x11250AEE, 0x1117F61E, 0x0906E9F8, 0xEF1CF41B, 0x1DEC0A07, 0xED16F5F7, -0x0A1AE00F, 0x1E15ECEA, 0x15F20613, 0x1B151822, 0x111A17EA, 0x0C1EF0E4, 0x071CEB0B, 0xEBF5E6EF, -0xF9F816ED, 0x161010DB, 0x152413F8, 0xF80F07E3, 0x15EEF615, 0x0E16EDEC, 0x0C20DCEC, 0x0BE10AF6, -0xF1071EEB, 0x12E5F7F0, 0xEDF5EBED, 0x170FF725, 0xF3F01313, 0x07051CE5, 0xE309EFEF, 0xF1F0180B, -0xF9161519, 0x181CDAF5, 0xE10E12F0, 0x15F412EB, 0xF7141819, 0xEE1FE0E6, 0xD8F217DB, 0xECF4EB0E, -0x1DEF0FF4, 0xE40CEB05, 0xF0120DF1, 0x21EC191D, 0xF413E619, 0xE62519E2, 0x1AF00DEE, 0x09F2EFEC, -0xE8F90DF4, 0x25D6F626, 0xEFE800DA, 0x1BEBEDF1, 0xE812170F, 0xE9E9F102, 0x271BEC08, 0x11E7F71D, -0x15EAE61D, 0x120C08F4, 0xFD16E813, 0xF30A11E6, 0xE3F1E81D, 0x14F2FE04, 0x1B0A150D, 0xEBE8D8DD, -0xEF1E1ED7, 0x13100E1A, 0x09F11EE7, 0x11E81218, 0xFA24EFE8, 0xEB151EE1, 0xE516F2E9, 0x1DE41911, -0xF616E5F3, 0x14EBED19, 0xEB1B12E4, 0xE5191907, 0x22141016, 0xE9EDE60D, 0xFF15F114, 0x1715E1EF, -0x28020F10, 0x14ED15EA, 0xF618E30A, 0x27EBEAE7, 0x1DE815DC, 0x1816E81B, 0x1A130DF9, 0x2CF609F7, -0xE5EAE7F2, 0x0F08F401, 0x10ECE8E5, 0x0FECE7E3, 0x15E6F5F3, 0xE41522E2, 0xF3E823E2, 0x0811E5EA, -0xF91E2119, 0x120C1AFA, 0x1BEDED0B, 0x14E3ED15, 0xE31C12F6, 0xF306EEFC, 0x01ECDB17, 0x09E3F413, -0xDFF0E7E7, 0x17130BF0, 0xE518FB0C, 0xF21011EC, 0xE21BE1E4, 0x03F5E80B, 0xF0DCEE15, 0xEF1A0E1C, -0xFD171506, 0xEED10C09, 0x04E9E90D, 0x1CE614E7, 0xF718EFF2, 0x1E03D4EF, 0x06E8EEE7, 0xEB1D21EF, -0x1519E6EF, 0xF1F00E1E, 0xEAF3240C, 0xEE211D0D, 0x0FF3DDFE, 0x161318F4, 0xE8100DF2, 0xE41422EC, -0xEA0DE3E6, 0x1FF9DD1A, 0x1618E6F5, 0xE4DE00F5, 0xF0F809F0, 0x1E0C10E7, 0x180D0FE3, 0x19EE09EA, -0x1C10E2E8, 0xE81EEA12, 0x20DE0D10, 0xEAF01811, 0xDE0D15EA, 0x18F5EFF1, 0x0812EA0C, 0x211204EC, -0xE9110AE8, 0x21DF1114, 0x18E10D09, 0xFDF8F226, 0xE9E002DE, 0x2116EBE0, 0xF4F918ED, 0x0BECEEF8, -0xEDE81A06, 0x000EE519, 0x16F2FAE2, 0xD920E312, 0xE51EE713, 0x1423E50C, 0xEF1316FB, 0x20F3F5F2, -0x1BE3E8ED, 0xE6EAE6EB, 0xDD0B1905, 0xE810ECE9, 0xF71A1810, 0x100A0E10, 0xF114F914, 0x071FF20C, -0xEC19EDE7, 0x0AD6181D, 0xEC06E8F5, 0x191312F3, 0x121525F3, 0xE6EE2916, 0xF41A0F17, 0xF4E8EFEF, -0x1819E518, 0xE71FD4E6, 0x15171F19, 0xD80913E0, 0x1FF816E5, 0x0E1A16E5, 0x0CF1F21F, 0xF11513E1, -0x15FCE7E3, 0xF1DD0FE9, 0x08F018DF, 0x13D915E0, 0x13ED11E5, 0x050F10EA, 0x17F21D13, 0xF90FDEFC, -0x000B2316, 0xF5EFEB13, 0x09ECEA05, 0x0A18E3FD, 0x0812EE05, 0x0E12F7E7, 0xDA17DB0B, 0x13E6EB16, -0xF1E71CEC, 0xF111F316, 0x15E90DE8, 0xEA17E0E3, 0x21F20D09, 0x15F915F2, 0x210DF00D, 0xE5DCF0ED, -0xEDE9EE04, 0xEFF7FAE8, 0xF61A191B, 0xF81DEBEF, 0x0E23F7E0, 0xDCE60BF1, 0x19EF0F20, 0x1B0B120B, -0xF2130D0F, 0x160CD81C, 0xF3180CEB, 0xDF0AF2EC, 0x14EAD513, 0x20E7F4EF, 0x0CEE1A15, 0xDF17F2E2, -0x1F0CFAF1, 0xE81011E3, 0x1B290ADC, 0xFDE515E9, 0xE0E9EA0F, 0x0BED0CEE, 0xE2E11AF2, 0xED2015E7, -0x18E4EA0F, 0xF6F0F313, 0xD904F425, 0x1C0FF1EE, 0xE5F3140D, 0x29F6EB27, 0xEEFC1515, 0x04E3F907, -0xF11A05EC, 0xF6E7F9E4, 0xF5E60E13, 0x0DEE1518, 0x0D1418E2, 0x0A17EC22, 0x1A0F11EA, 0xEA17E6EE, -0xF22A191E, 0x2111F5DD, 0x29F216EF, 0x160519E9, 0x0F1A040F, 0x1A021D19, 0x1825EE0F, 0x171D0D0F, -0x0BFCF004, 0x02FF0BF7, 0xF9F1F209, 0xFFF5F008, 0x05F30C07, 0x03FCEE07, 0x11FCEE08, 0xF4F31514, -0x040B06F2, 0xE400F9F3, 0x13090B1A, 0xF2F4FFE7, 0xF1EE06F9, 0xFA0DFF0D, 0xF3ED09F6, 0xF40305F8, -0xF8FFF507, 0xF8FF1707, 0x0AFC030C, 0xF109F3F4, 0x0406FDF0, 0xEF04F50E, 0xF5FBF3FD, 0xF30704F4, -0xF0ECFC1C, 0xFCECF0F5, 0xF911160F, 0x020B0C0D, 0xF90C060B, 0x03FA08E7, 0x0311FF0D, 0xF405F4FA, -0x0DEBF7F2, 0x0EF6FAF2, 0x09F3ED0E, 0xFE08EFF2, 0x0F170008, 0x0DFF0FFC, 0x0BF0ED0E, 0x0D140E07, -0xF2F611F3, 0x11E9020B, 0xEE03F3F7, 0xFCFD00EF, 0xF518090B, 0xF11510EE, 0xF5FB07FF, 0xFEFC11F0, -0x100DF006, 0x0AF4F300, 0xED0A1200, 0xFEF7EDF5, 0xF7040101, 0x0FF2040E, 0xF01207F7, 0x0AF3FF10, -0xF60B0D00, 0x07F8EFED, 0x060D03FB, 0xFA08FCF6, 0xEEF6FA04, 0x0806FFF9, 0xFF0B0FF0, 0x08F3F1F8, -0xF0F5EFF3, 0xF1EE0D01, 0xFBFEF3F6, 0xF20D060B, 0xEFFE00EB, 0x080803EE, 0x0617120A, 0x1210050C, -0xF010FA07, 0x0908EF0D, 0x030908F2, 0x01160610, 0x120BF415, 0xF9F40FF1, 0x0FF00C02, 0x0B110D0B, -0x0CF9F10A, 0x0C06030D, 0xF20208F5, 0x0F07FAF1, 0xF0FAF50C, 0x08F8F7F0, 0x01EF0EEC, 0x0AEFE90C, -0xEFFCF714, 0x05F2FF13, 0xECF6F9E7, 0xFEEFFD07, 0xF6ED0F0D, 0x060FF407, 0x0803F600, 0x0105EE06, -0xF5F70D0B, 0x02EA110F, 0x070FF8F8, 0x0B040902, 0xF6F30AF0, 0x110C1AF9, 0xF61709F7, 0x0D0FF00E, -0x09F5EFF7, 0x0F13FAFD, 0x0C02F1F3, 0xFBF0F8F7, 0x0DF8F5EB, 0xF1FEF904, 0xFAF1030D, 0x161211F6, -0xFA0AF50B, 0xF316F60E, 0x100708EE, 0x0AF00A00, 0xFFF4F4EE, 0x0C0BFD18, 0xFCEDF7FE, 0xFB11080F, -0x0DF70B08, 0xF90AF309, 0xF9FD0F08, 0x10FEFA0E, 0xEE161508, 0x04FCFFFB, 0x0B1009FE, 0x0CF40D0D, -0xF800F1FC, 0x07080602, 0x1000F8F8, 0xF8F205FD, 0x0809F9F2, 0xF80C09FF, 0xF9F5F6F8, 0x05FE0EFE, -0xFCF6F8F1, 0x09000A0B, 0x07080DFC, 0x09FBEDF0, 0xEF0CF4FA, 0xF8F6100A, 0xF5F4F1F9, 0xFFFC0E0B, -0xEEF6F3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEF0810FC, 0xF311FAFD, 0x0DF201EC, 0xFFF40EF3, 0x1304ED12, -0xF4FCF304, 0x09EC1005, 0x09F80C09, 0x0C10FC0C, 0xF7F7FBFC, 0xF7F60808, 0x05F90308, 0xEC0A13F4, -0xF20BF707, 0x04FE03F5, 0x10020FFE, 0x02F413ED, 0x050AF5FA, 0xF90E00E4, 0xFAFBF3F5, 0x0908140B, -0xF00A0107, 0x13EFED0E, 0x04F5F8F5, 0xF104FF0F, 0xF7F0F6F5, 0x0DF7F704, 0xFF0CEB12, 0xFAF50C07, -0x05EFF5F6, 0x12FA07F6, 0x0AFDF8F9, 0xEE050803, 0x0A04FBED, 0xF61312F2, 0xF10FF7E9, 0xFBFD0307, -0x0AFEF5F7, 0x12FB12F3, 0xFA14F206, 0xFAF80EFB, 0xFAFDFAFC, 0xFAFC0DF6, 0xFD08F1EF, 0x0B0D0D14, -0xF80EF90F, 0x0F0D0903, 0xF609ECF6, 0xF9EFF5F9, 0x0FFBFC06, 0x050A0A08, 0x01F30C03, 0xF9F8EE0A, -0x0B02100A, 0xFDF3F607, 0x0EFF0D01, 0xF8EFF0FF, 0x11F511F7, 0x08F7F809, 0xEB00FE09, 0xF1FA08FF, -0xFA0114F6, 0xF0090F10, 0xF3FBF6EF, 0x1209FE0E, 0xF7FCF309, 0x04F5F8FD, 0xF00203F2, 0xF510FB05, -0x12F7080E, 0x08F10AFC, 0xEFF6F5FE, 0xFFFA0F08, 0x0714F612, 0xF30107F5, 0x06FD08F0, 0xFA0C08EE, -0x05FA02F9, 0xF40108FF, 0xF90DF1F5, 0x17FC0300, 0x09F2080A, 0x10100BF0, 0x12020B10, 0xF5F80AF7, -0xF902EBF0, 0x16E00312, 0xFEEA0600, 0xFFFAFA13, 0xF20206F9, 0x060BEF10, 0x15FAF005, 0xF603010A, -0xF50AF110, 0xF1F903F9, 0xE508F40A, 0x0F0FF704, 0xF00B0AFC, 0xF30DFA02, 0x0202F3F9, 0xF60DEDF1, -0x05FFFC04, 0xF402FFF8, 0xF1F9F807, 0xEF0E0508, 0xF8F6F80D, 0xF4F2FAF5, 0x031209EF, 0xF9FBF6F2, -0x000AF6F5, 0xF6000D12, 0xF5FD0C08, 0x04FAEF00, 0x1103110B, 0xF1F50BF1, 0x08FD1104, 0xF80B0AF1, -0x00160DF7, 0xFD05F3F8, 0x0D01F80B, 0x100502F3, 0xFC0309F6, 0xF41207F6, 0xF2100BFD, 0x040E04F7, -0xE9080908, 0x06030EEA, 0xF40DF805, 0x09EE0608, 0x0C03F4FB, 0x080CFBF1, 0x100416F5, 0x0407F402, -0xFDFBFDFD, 0x0BF4F806, 0xFC0B16FF, 0x08EBF3F5, 0xECF9F00B, 0xF8E9F300, 0x08F802F5, 0xF3EF10F4, -0xFEF409F5, 0x15F7FA13, 0x070DF707, 0x0E0617F9, 0x0206F4FA, 0xF2FAFD0B, 0x10EB0F06, 0x1713EBFF, -0x030A0BF3, 0xF7E30003, 0xECF50DEE, 0x14050506, 0x160AFC0A, 0x0EFD01F6, 0x02050BEB, 0x031615F4, -0xF2F3FC09, 0xFA140704, 0x0AF20F07, 0xF7F9FE04, 0xF10EEC06, 0x130D0BFC, 0xF6F3ED0F, 0xF20D100D, -0xF1F6F40C, 0x0E0BF1F2, 0x0C0FF513, 0xEBEE13FB, 0xF80EF409, 0xF608EC0A, 0xF9090DF1, 0xF602EF09, -0x14F7F6EF, 0xF401F9F0, 0x130B10FB, 0x0FF31101, 0xEC0912ED, 0x0D03F9F8, 0xF4FAF103, 0xFEF4F10A, -0xF60BE90A, 0xFFF0F7F1, 0xF801F2F0, 0x00150B1A, 0x09EE130F, 0x130DF7EA, 0x13FB0008, 0xF1F9F00E, -0x0501F5F0, 0x03F60BF8, 0x090BFE05, 0xEBF8FAF3, 0xEA12F90A, 0xF4FCF4F0, 0x0DF81312, 0x01130DF8, -0xF3060CF2, 0x00F10CF4, 0xE8F611F0, 0xF707FEF6, 0xF81013FC, 0xF0040AFD, 0xF60616FC, 0xFE1109ED, -0xED140DED, 0x0303F812, 0xFDF4F4F8, 0x0CF60B14, 0x0DF11811, 0x0BF4FBFA, 0xF2F906F9, 0x09F3F806, -0x030608FA, 0x0A14E20D, 0x0A08F5FA, 0xE7060DFB, 0x02FD050B, 0xF4F6FB07, 0x01F90BF7, 0x0CFA0FF3, -0x0B04FD01, 0x0F090604, 0x060E0F0A, 0xF6F1FF06, 0xFC0C0611, 0x01030C0D, 0xF612F9F6, 0x120FF002, -0xF0F0F9F0, 0x10FE0DFC, 0xEAFCF6E7, 0xF4F0FFFC, 0xEA080D01, 0x09F6020A, 0xF1EDF2F7, 0xF80609F8, -0xF8F7F80F, 0xF8F7FEFB, 0x0AEE03F4, 0xF60F0406, 0x1309EF03, 0x1215F7FC, 0x0EED07ED, 0x08F30DF5, -0x09E90D02, 0xF1FAFDF4, 0xFD0FFEF4, 0x0317F1F2, 0xF3111203, 0xF208FEFC, 0xF5FB0213, 0x15F20702, -0x0FF918ED, 0xF3F8FF0B, 0x0F0A0A0B, 0xEE0C0A13, 0x0A0AF506, 0x1A0401F6, 0xF0F6080F, 0xEC091201, -0xF9F90C02, 0xF10CF003, 0xF217F200, 0x0DF8FA11, 0x04F603F6, 0x03FB10FA, 0x0AF4090D, 0xF1FBF3EF, -0x0DF00505, 0xFA0B0E0E, 0xFD030811, 0xFEEDF80A, 0xF1F1F40B, 0x050D0514, 0x0DFC0A10, 0xFF0D01EB, -0x07F7010D, 0xF90D00F6, 0xFCEDF108, 0xFD10F30C, 0xF3F7FB06, 0xF009F8FF, 0xF808F8F5, 0xEF12F009, -0x0C0E14F8, 0x02010E06, 0xFF00F50D, 0xF9F1F309, 0x0507EEF0, 0xF8EFFDFB, 0x05041303, 0xFC13EEF6, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0xFB0E01EF, 0xFF0C0B02, 0x07090AFB, 0x0BFBF3F1, 0x0B090F0D, 0xF10409F2, -0xF80A0E0B, 0xECF60E09, 0x0610F2F9, 0xF4F9FBEF, 0x08ED0DF9, 0xFCF9FEFE, 0x0F0C12F8, 0xF9F317F4, -0x0BF80213, 0xFFFD1710, 0x0BF80FFB, 0xEEF6F2EE, 0x0106F506, 0xF3091206, 0x00F504F0, 0x0B0C0018, -0xFD02FAEF, 0x06ED0308, 0xF4F60215, 0x02F80BFC, 0xF20601ED, 0x06F7F5F3, 0x0111FAFC, 0xF2ECF2F8, -0xFB050C0D, 0x0314EA0A, 0x09F4FCF8, 0xF0F80013, 0xF6E90D0A, 0xF307F415, 0xFB04F4F8, 0xF006F3F1, -0xFAF9F808, 0x06F9F109, 0xED0A0A0C, 0xF3F6FC03, 0x0508120A, 0x0C0DF100, 0x02FF09FF, 0x00F80D01, -0x04E50410, 0xF616130C, 0x0300F4EC, 0x090EF506, 0xFA0E0C14, 0x0EF10111, 0xF2030F09, 0x03F3030E, -0x09EA0509, 0xFDFEF9FB, 0x06F4F702, 0x0C0D0BF3, 0xFFFBF906, 0xF7FBF512, 0x03110AF8, 0x0AF7F70D, -0x17F60108, 0xF811FA05, 0xEE040700, 0x03FEEF01, 0xF706EC0B, 0x060C0AFA, 0xEC0EF910, 0x0804F207, -0x09E902F7, 0xF7FDF610, 0x0C050C0B, 0xF8E7F609, 0xFB170A13, 0xF0080404, 0xE808F413, 0xF1F4EB07, -0xEBFC01F7, 0x0B040AE8, 0x00F1020E, 0xF0F207EC, 0x0EFFF211, 0xF3F815F4, 0xF9020B0B, 0x0EF71201, -0x0706FC0C, 0x06FDF6FA, 0xFBF7F80A, 0x08090EFD, 0x14FD05FF, 0xF403FE0A, 0xF5F8EF03, 0xFB0AF8F7, -0x0F00F409, 0x0AEF0B03, 0x0FFB0210, 0x11070710, 0xF1080B0B, 0xF20E08E8, 0xF00CF5EB, 0xF0F30C0E, -0xFCF0080D, 0x0900EE07, 0xFA01FCFE, 0xE712E70B, 0xF004FEF9, 0x0CF5090D, 0xF60EF606, 0xF8F4FAF8, -0xED061507, 0xEF110506, 0xF90FF20C, 0xF911F813, 0xFC12F3EF, 0xF7F9F1FC, 0x0E07EAE9, 0x0EF8F1F8, -0xF6070FEA, 0xF0FA0310, 0xF8FE1417, 0xF8F306F9, 0xFBFCF50E, 0xEC0D11F3, 0x0900F70A, 0xF80EFBF3, -0x0B08F8F6, 0xEFF00F0C, 0xF709F8FA, 0x0E16EB13, 0x0BF415FE, 0xF4F20F0B, 0xEC0C0AF3, 0x13F8FB02, -0x12F908FB, 0x0A090D12, 0xF110F0F5, 0xF40E021B, 0x0809F7F3, 0xEE000B0D, 0x0E0FF5F6, 0xF3F40BF6, -0x05150BE7, 0x0DF809FE, 0x12030809, 0xFF13FC08, 0x0BF6F912, 0x13F90AF4, 0xFE03F2F1, 0x04FB0CF7, -0x01FDE8F5, 0x0EF8F40D, 0xFE02F7ED, 0xE7EDF2FB, 0x04F9FF13, 0xF0F80A07, 0xF700F6F7, 0xF4080EF4, -0xF2F7F80F, 0x0DFDEFF0, 0x11EFF902, 0xF2FC0703, 0x0AFD10F1, 0x17F70D07, 0x08F5EFEB, 0xF10B11F9, -0xF610FFF8, 0x0C130B18, 0x080CFEF5, 0xFBF8F906, 0xF1080C08, 0xEAEEEE10, 0x0F11F6FD, 0x06F706F1, -0xED0BEA0D, 0xEEF30C02, 0xF8F40D0F, 0x020D0DEC, 0x0CF40605, 0x07020C12, 0xF40C0EF2, 0x060115F2, -0xF0E6F508, 0xF40DF9F0, 0x0F0A05F4, 0x0FF00B08, 0xEB08FEFC, 0xEE030AF1, 0x0DF9E806, 0xF2F7F5FD, -0x0A12EEF0, 0x09F3EFF8, 0xFE05F6F8, 0x1CEDF4F5, 0x060512FB, 0x08F90AF0, 0x000107F9, 0x14FFF9FA, -0x16F70B0B, 0xEEF2F704, 0x04F90BF1, 0x150302F3, 0xEBF8F8F3, 0xF6F90FEF, 0xFBF0F7FD, 0xF70D1000, -0xECF70C12, 0x03FDF3F0, 0xE4F31604, 0x02FFF600, 0xF00C0105, 0xEC0D0F02, 0xFAFAF707, 0x0208F501, -0xFFF809F5, 0xEEF70405, 0x050CFCF9, 0xF20BEBF7, 0xFA0E11F6, 0xF7F403F2, 0xF5F0F306, 0x00081A0F, -0x02F6EE09, 0x0F0D0B0F, 0x0AF7EDF6, 0xECFA0FEB, 0xF000FBFC, 0xF91103F4, 0xF0F30001, 0x08FCF8EE, -0x0CFEF30B, 0xFE040B02, 0xFC030FF3, 0x04F9F209, 0xF10E0705, 0x14F60B0C, 0x03ED1311, 0xED03EE13, -0xF9F8F70F, 0xFB010504, 0xEDF70C08, 0x061802FE, 0xED0801F9, 0x06FCFA16, 0x0EF8FCF3, 0x0EF00C0E, -0xF3F9170D, 0xFE010F05, 0xF31B0500, 0x07F50BF4, 0xEE09030A, 0xF401F400, 0x0C04090A, 0xFCF90F02, -0x0D10FD0C, 0xF00FEA09, 0xF3F50BF7, 0xFCFCF7EF, 0x06FB0A12, 0x0200EC01, 0x02020A0E, 0xF3FCFE0D, -0xFC0CF209, 0xFB06F2EE, 0xF90B0C10, 0xFDFCF40C, 0xFC06F80B, 0xEFF902F3, 0x0C110911, 0xF80AEFF3, -0x0900F30C, 0xF8160E0F, 0xEE0D130D, 0x0BF00209, 0x0AF509EF, 0xF7F614FA, 0xF513070A, 0x09E512FD, -0xF3050D0C, 0x0006020D, 0xFAED07FE, 0x07FE170B, 0x121300FF, 0x02F602FD, 0x0AF408FA, 0x06FAF7F1, -0x0807F71A, 0xFBF20C0B, 0xF3FD05F7, 0x06F4090F, 0xF1FEF307, 0x0805EBFA, 0x0810070D, 0xF6F31214, -0x02ED0607, 0x0D08010F, 0x09F60FF2, 0x0BF8F20C, 0x1BFCF6F4, 0xECFB070C, 0x13FAF3FD, 0xF8F7FCF4, -0x0C09F7F4, 0xF001E9F9, 0x11F1F305, 0xFAEC08FA, 0xF8F8F40F, 0xF6F70B0A, 0x07F012F4, 0xFDF5FEF3, -0x09070EF1, 0x09FFF7E9, 0xEAF60C0F, 0x04030106, 0xF5E70709, 0x0AF6F70C, 0xFA14FEF1, 0xF0E51903, -0xF4EF0B11, 0xF0F80CF3, 0x12ED0307, 0xF301F405, 0xF9F4F3F5, 0x0B0EF809, 0xF7EBF9F8, 0xF10BF406, -0xFBEEF2F6, 0xEC1111F2, 0x0716EEF6, 0x080910F0, 0xEE0D0010, 0x07ECF7F0, 0x09060005, 0x0DF5EB0B, -0x0212110C, 0xF3F704FA, 0xEA02020C, 0x050811F1, 0x01FA07F7, 0xF60E0D0D, 0xF711F60C, 0x0108F4F1, -0xF7F6FE01, 0x0F0FF7F9, 0xEFE7010A, 0x090902F6, 0x0FE809F8, 0xFDFE00F6, 0xEF0806F5, 0x10F80F0F, -0x0419F40B, 0xEF08EEFD, 0x0711F507, 0xF20901FB, 0x0BFA130A, 0xFA120CF9, 0xE809F2F2, 0xFAF8FE00, -0xF2FDFCF8, 0xF805F1FD, 0xF1F70912, 0x0903F80B, 0xF9EFF70B, 0x0D05F5F2, 0x0A08FF0E, 0x09F5EE00, -0x08F91314, 0x0AFEF60A, 0xE51005F0, 0x041EECFA, 0x06FDFF05, 0x0D11F1EF, 0xF4F80912, 0x0D090106, -0xFAF6F308, 0xFE14F8F1, 0x0D02EE03, 0xF0FDFAED, 0xF2F2E903, 0xE9040C0D, 0x0A00F8F8, 0xF4FA0909, -0xF4EFFA1B, 0xFC0D0D0B, 0xF2EE08F5, 0x000E0F12, 0xF0F50F11, 0x04FEF9F4, 0x0BF914EB, 0x170CFBF9, -0x03F30E06, 0x01F8F70F, 0x14F8EFFD, 0xF412F5F2, 0x0AF60C01, 0xF711090D, 0xF60DF90C, 0x09F0ECE8, -0xEC06140C, 0xFD090DFA, 0xEA01F7EF, 0x030AF8F6, 0xF3F5FCFD, 0xF4F3F500, 0xF3EDECF5, 0xF3130AF6, -0xF8EFFA0E, 0x0A0B0DF4, 0xF1F0F7F5, 0x0D0A09F4, 0x10EDEEF7, 0x0E0EEDFE, 0xF4F9F306, 0x05FCF8FF, -0x13FBF7F2, 0xFF07F6F7, 0x0AF2F8F6, 0x0DFA1EFF, 0xF6EE0B09, 0xF113030B, 0xFAF9F3F5, 0xFA0C080C, -0x0BF8F607, 0x09F902FB, 0xF50BFD08, 0xF7F515EF, 0x0BFA00FB, 0x01FAF009, 0xEA02FE05, 0x0CFBFC10, -0xFBF7F214, 0x1305F1ED, 0xFA01F216, 0xFDFBFFF4, 0xEE0B040C, 0xFAFB05FD, 0xFEF8F7F4, 0xF60802EF, -0xF301E603, 0x03EEFAF7, 0xF109EAF2, 0xEF0BFEF5, 0xFFF31115, 0xED09F309, 0x02FFEE0D, 0xF60D0FF9, -0x030A07FA, 0xF5F4060A, 0x140FFEF1, 0xF6FCEEFF, 0x07030006, 0xFBEF04F7, 0x0AF009FC, 0xF90A0FF9, -0xF2F702F8, 0xFFFBFB0E, 0x0907090B, 0x0B180F02, 0x0B0C0405, 0x12F80AF9, 0x09F400F0, 0xF010070A, -0xEBF105F1, 0x05F90C11, 0xE805F30B, 0x12F70BF3, 0xEF11EFFC, 0xEFF7FC0F, 0xE709EF10, 0xF50CFBFD, -0xF7F805F0, 0xF609FCF7, 0xEAF80F00, 0xFBF40B10, 0xF71106F5, 0xFA12FB01, 0x020BF30C, 0x0714FA04, -0x06010708, 0xF2110D0D, 0xEEF6F2F8, 0xF009F1E8, 0x07FD06F7, 0x14F8EF0C, 0xF00DF9F6, 0xF20BF50B, -0xF90C06F7, 0x06FB02F7, 0xF7F20A09, 0xFA051008, 0x0EFA0913, 0x05060D03, 0xFCF40CF6, 0x03E8FCFC, -0xF3F31411, 0xFCF40906, 0xFB0BF9F7, 0xFC02F80D, 0xF20408F2, 0xEE0EEF0B, 0xF0000EF3, 0xFBF6EDF1, -0xFAF50FEB, 0x06FC0C0B, 0xF009F80F, 0xF0F7F706, 0xF70507FC, 0x0AF00209, 0xFF0DF20F, 0xEA15FA06, -0x0816EDF3, 0x000EF9F5, 0xEFF7FA04, 0x0FF60814, 0xF1FEFA02, 0x0805F306, 0xF610FDEE, 0xF8061606, -0xFE0DFCEF, 0x07F8F613, 0x0C0809F9, 0x0DEBF0FB, 0xF00EF4F4, 0xF8E7F20A, 0xF3FAF20D, 0xF90D04EE, -0xF1F40E00, 0x09EFFFEC, 0xFE0B0EE7, 0xF7FA0F0E, 0xF00CFEF4, 0xFAEEF9FC, 0x161AF703, 0xF70F10EC, -0xF6F011FA, 0x10FDFB0B, 0xF60C03FE, 0x0AFF08F3, 0xF6F606F0, 0xF5F716F3, 0xFDFDEBF7, 0x0CF8EFF4, -0xE3EF0910, 0xF7F6FF12, 0x001402F1, 0x03100EF2, 0x1117EBFF, 0x17FA1008, 0x0DF9F80E, 0xFCF0F511, -0x1403EEFC, 0x0010F100, 0x110A0612, 0xF505FAEF, 0xF4F304F4, 0x061209EF, 0x090C150C, 0x04F41306, -0x0B0C0DED, 0xF0F6F110, 0xFC0F1008, 0xF3EF0E08, 0x0B0AECF8, 0x0CF8FA0C, 0xF7FB0EFF, 0x0FF50FFC, -0x0DF4EDF8, 0x02080C0B, 0xF510F2F2, 0x0208FDF1, 0x060B04F1, 0xF8F6E607, 0xF415EDFF, 0xE8FBEBEC, -0x0805F30F, 0x00F30F09, 0xFA0DF6EB, 0x0BEEF806, 0x0408F00B, 0xF4F5FB09, 0x090EF310, 0x1006FBF9, -0xF0F7F710, 0xFC070C0F, 0xFB12EAFA, 0x0BF007F1, 0x080100F1, 0xF700F709, 0x0A0D05F8, 0xEFF20D0C, -0xF209F8F8, 0xF207FDF3, 0x0DEFEFEE, 0xFD020114, 0x0AF5050A, 0x0D0415FA, 0x0C12ED0F, 0x14F01005, -0xF7F0EE06, 0x0F14F209, 0x080500F9, 0x08F5050E, 0x0DE7E901, 0x03FDF3FC, 0xF20403FD, 0xF7F2F60D, -0xECF00D09, 0xFB09FF0A, 0xF306F9F2, 0x0E03F20E, 0x0C09F305, 0x11F710F8, 0xF4F217E4, 0x0E09090A, -0x0A12F0F9, 0x06F312FE, 0xFDFBFDEE, 0xE9F0020D, 0x0DFB1005, 0x0200E90B, 0x0F0C02F5, 0xF8FF05F4, -0x0AF303FD, 0x0BF4100E, 0x14F2040F, 0x0EF9EF0B, 0x0AED0801, 0x05F5EE08, 0xFF0A0514, 0xF8F2F0FF, -0x0FFAF7F0, 0xE10E12F6, 0x13F1F4FA, 0xF3FC0B0B, 0xEFFEF4FD, 0xF9080708, 0x05FCF9F6, 0x040E06F4, -0x020DF5F6, 0x13F50B11, 0x1513F1F6, 0x05F707ED, 0xF7FB01F7, 0xF1EF06FA, 0x09FB1102, 0x06FC0706, -0xF7F80F14, 0x0EF3F002, 0x0AF8FE0A, 0x0BE8F5F9, 0xEEF609E9, 0x09E8EE02, 0x03090BFC, 0xF0F8F0F1, -0xF8081009, 0x0F0002FA, 0xFCF202FD, 0x0DF106EF, 0xF70408F5, 0x02140C15, 0xF6F6F5EF, 0xF1080905, -0xE902FDEC, 0xF3F4F6F6, 0xF904FCF2, 0xF906F5F3, 0xF7FB0A08, 0x08F4F0F1, 0x0EFDF6F1, 0x03F8F6F6, -0xFF0C110C, 0xF1FDF7F8, 0xF814F502, 0x12FD1108, 0x0DF7F313, 0xF506FA11, 0x07FEF9F2, 0xEAF20D09, -0xFCF40D0D, 0x06F1F709, 0xF7F21DFA, 0xFB00ED11, 0x0DFA0208, 0xF1FE1101, 0x0AF5F4F9, 0x060BF3F9, -0x080CFD06, 0xF30EF409, 0x12EB02EF, 0x0BEF0D09, 0x1512F0F0, 0x18010700, 0x05070F05, 0xF306FC08, -0x0001FD0E, 0x10FD0DF8, 0xF708F90A, 0x100D0D05, 0x04011414, 0x0AF90D0C, 0xF402F8EE, 0xFC11FAFF, -0xF500F605, 0xF0EAF8F4, 0x120F0407, 0x1103F9EE, 0xF9F9F5F7, 0x10060EF8, 0x0609F504, 0xF20E080F, -0x0EF3F109, 0xFB05F60E, 0x0E1C05FD, 0xF710FBEB, 0x16F2F90B, 0xF500FEF4, 0x0A13EEF7, 0x0EFF0CF6, -0xFFF903F8, 0xF30A0BF0, 0xF7FCF004, 0x1613F70B, 0xF90506F5, 0xEB09F008, 0x05F30CF3, 0x0310EEF3, -0xFD1002F4, 0x09070114, 0x040B0606, 0xE400F907, 0x13F40B1A, 0x06F4EBE7, 0xF1EE06F9, 0xFAF9130D, -0xF3ED090A, 0x08EF05F8, 0xF814F507, 0xF8131707, 0x1EFCEF0C, 0xF1090708, 0x04F211F0, 0xEFF0090E, -0x09FBF3FD, 0xF3F204F4, 0xF000FC1C, 0xFC00F009, 0xF9FD160F, 0x16F7F80D, 0x0DF8060B, 0x03FAF4FB, -0x03FDFF0D, 0xF4F1F40E, 0xF9EBF7F2, 0x0EF6FA06, 0x09F3EDFA, 0xFEF4EFF2, 0x0F0300F4, 0x0DEBFBFC, -0x1FF0010E, 0xF9140E07, 0xF2F6FD07, 0x11E9020B, 0xEE17070B, 0x10FD0003, 0x0904F5F7, 0x0515FCEE, -0x090F07FF, 0x12FC1104, 0x10F9F0F1, 0x0A080700, 0x010A1200, 0x120B01F5, 0xF7F0ED01, 0xFB06040E, -0xF0FEF30B, 0x0A0713FC, 0xF6F7F9EC, 0x07F803ED, 0xF2F9EF0F, 0xFAF4100A, 0x020AFA04, 0x0806130D, -0xFF0B0F04, 0x080705F8, 0x04F503F3, 0x05EEF9ED, 0xFBFEF30A, 0xF2F9F20B, 0x03FEECEB, 0x08F40302, -0x0617FE0A, 0xFE10050C, 0x0410FAF3, 0xF508EFF9, 0x030908F2, 0x010206FC, 0xFDF7F415, 0xF9080F05, -0xFBF00CEE, 0x0BFD0D0B, 0xF7F9F10A, 0xF80603F9, 0xF202F4F5, 0x0F07FA05, 0x04FA09F8, 0x08F80B04, -0xED030E00, 0x0A04FDF8, 0xEFFC0B14, 0x05F2FFFE, 0xECF60EFB, 0xFE04FD07, 0x0AEDFB0D, 0xF20FF407, -0xF4030A00, 0x15F1EEF2, 0xF50B0D0B, 0x02FE11FB, 0xF3FBF8F8, 0xF7F0F516, 0xF6070A04, 0xFD0C1A0D, -0xF603F50B, 0x0D0F04FA, 0xF5F5EFF7, 0xFB130FE9, 0x0C0205F3, 0xFB050CF7, 0xF9F809FF, 0xF1120DF0, -0x0E0503F8, 0x16FEFDF6, 0xFA0AF5F7, 0xF302F6F9, 0xFC07F4EE, 0x0A040A00, 0xFFF409EE, 0xF8F7FD18, -0xFC01F7EA, 0x0F11F40F, 0x0DF7F708, 0x0DF60809, 0x0DFD0F08, 0x1012FA0E, 0x021615F4, 0x04FCEBFB, -0xF7FC09FE, 0x0C080DF9, 0xF8EB05FC, 0x0708F2EE, 0xFC14F80C, 0x0C06F111, 0x0809F9F2, 0x0CF809FF, -0x0DF50AF8, 0x05EA0E12, 0xFCF6F805, 0xF5EC0A0B, 0xF2080D10, 0x09FBED04, 0xEFF7F40E, 0xF8F610F6, -0x09F4F1F9, 0xFFFC0E0B, 0x020AF3EC, 0xF4EA09FE, 0xF7EFF70D, 0xEFF410FC, 0x07FD0EFD, 0x0D060100, -0x13F4FAF3, 0xFFF001FE, 0x08FC07F0, 0x0900FC05, 0xF5F8F709, 0x0CFC100C, 0xF7F7FBFC, 0xF7F608F4, -0x05F90308, 0xECF6FF08, 0xF2F70B07, 0x04FE03F5, 0xFC02FBFE, 0x02F41301, 0xF1F6F50E, 0xF9FA00E4, -0x0EFB0709, 0xF50800F7, 0x040AEC07, 0x130301FA, 0x0409F809, 0xF104EA0F, 0xF7F00A09, 0xF80BF704, -0x13F800FE, 0xFAF50CF3, 0xF103090A, 0x12FAF30A, 0xF611F8F9, 0x02F1F403, 0x0A040FED, 0x0AFFFEF2, -0x05FBF7FD, 0x0FE903F3, 0xF6EA090B, 0x120FFE07, 0xFA1406F2, 0x0EF80EFB, 0x0EFDFAFC, 0x0EFC0D0A, -0x120805EF, 0xF70DF900, 0x0C0EE5FB, 0x0F0DF503, 0xF609000A, 0x0D03F5F9, 0x0FFB1006, 0x05F60A08, -0xED07F8EF, 0xF90CEE0A, 0x0B16100A, 0xFD07F607, 0x0EFF0D01, 0x0CEF04EB, 0x11F5FD0B, 0x080B0CF5, -0xFF14FEF5, 0xF1FAF413, 0xFA0100F6, 0xF0090FFC, 0xF3FB0AEF, 0xFE09FE0E, 0xF710F3F5, 0x04090C11, -0x04EEEFF2, 0x09FC0FF1, 0xFE0BF4F9, 0x08F10AFC, 0x030AF5FE, 0x13FA0FF4, 0x07000AFE, 0x071507F5, -0x06FD08F0, 0x0F0C08EE, 0x190E020D, 0x08EDF4EB, 0x0D0DF109, 0x0210EF00, 0xF506080A, 0x1010F7F0, -0xFE02F7FB, 0x09F8F6F7, 0xF902FF04, 0x16E003FE, 0x12EA1A00, 0x130E0FFF, 0x0702F2F9, 0xF10BEFFC, -0x010E04F1, 0xF6EF15F6, 0xF50A0510, 0x050DEF0D, 0xF908F4F6, 0x0F0F0BF0, 0x04F7F6FC, 0x07F9FAEE, -0x02EE07F9, 0xF6F90105, 0xF1FFFC04, 0x0802EB0C, 0xF10E0CF3, 0x030E0508, 0x0CF60CF9, 0x08F20EF5, -0xEFFE09EF, 0xF9FB0A06, 0x14F6F6F5, 0xF6140DFE, 0xF511F8F4, 0xF0FAEF00, 0x1103FC0B, 0xF1090B05, -0xF4FD11F0, 0xF80BF6F1, 0x14160D0B, 0x1105070C, 0x0DEDF80B, 0x1005EE07, 0xFCEFF5E2, 0x0812F3F6, -0xF2100BFD, 0x04FAF00B, 0xFD08F508, 0x06030EEA, 0xF4F90C05, 0xF5EE0608, 0x0CEEF40F, 0xF4F8FB06, -0xFCF01609, 0x0407F402, 0xFDFBFDFD, 0x0BF4F806, 0xFCF701EB, 0x08EB0709, 0xECF9040B, 0xF8E9F300, -0x1C0CEEF5, 0x0703FC08, 0xFEF40909, 0x150B0EFF, 0xF30D0B07, 0xFAF203F9, 0x11EC1EE9, 0x191AF4E5, -0xEFDF19D9, 0xFA220619, 0xFA131A14, 0x10FB0909, 0x0C131B0D, 0x140FEB0F, 0xF41AEEEF, 0xEE0A10E5, -0xE206F0E4, 0x13FBFFDE, 0x15132215, 0x1CF31EF8, 0x1512111A, 0x1F1E0114, 0xE8F20F29, 0xEDEF1112, -0xE30DE215, 0x0DED2213, 0x19EBE410, 0x1917DD1E, 0xF5E818EE, 0xDDDB16EE, 0x1418F6F5, 0xE414E31A, -0xEBE7E606, 0x10E50CE8, 0x011C1813, 0x0E15EB11, 0x22E81C1C, 0xEA1B0FE3, 0xE1E9F90D, 0x12FBF91F, -0xEAE312E5, 0x19100D1F, 0xF10F0516, 0xEF1EEA0B, 0xF2E612E4, 0xF2FAE823, 0x0AE4F5F2, 0xF2171BD9, -0x1817FEE9, 0xE9F209E6, 0x07D8EA03, 0x1716F0E5, 0x0DDC16ED, 0x09222113, 0x0126EDE2, 0x11F611E2, -0xF3F21FFE, 0xFBF00E1D, 0xE5E01B0F, 0xEF0CE6EE, 0x05E0EE0D, 0x0819F7F1, 0xEAF01EEA, 0xE811ED18, -0xE115FB16, 0x1DF8EAEB, 0x04FDEFE5, 0xE40EEFF7, 0x28EAF514, 0x181CF019, 0x0F09F711, 0x0E1A12FB, -0xE9EB06F0, 0xE6EBEEEC, 0xDB14151E, 0xEA18FC14, 0x13050C19, 0x06EFEF0B, 0x2217E9EE, 0xECDD19E8, -0xFC24151E, 0x1016EA0B, 0x08F8F1EB, 0xEBE9050B, 0xDDF6E815, 0x15E1F5DA, 0x10111C1F, 0x05E113E5, -0x1925EB1B, 0x19F3F1F6, 0x11061810, 0x1EF5F725, 0xDDEE06DE, 0xE51509F6, 0xE513F1E2, 0xE9EB24F3, -0xF1FE0BE2, 0xEC09F3EE, 0xEDEF0FE9, 0x1BEDF6F2, 0x19EEE311, 0x14EAE7F5, 0x22F0F1EB, 0xFAF412F8, -0xEB09EAE4, 0x0EEC1505, 0x0D0AEE01, 0x0916F5EE, 0x21EAF215, 0x2003DFE5, 0xEDE9E616, 0x01F2D11B, -0x0D13EC20, 0xF8E7100F, 0xF1F3FA07, 0x1414E5EF, 0x10E8F512, 0xDDF4FBF1, 0x1719E712, 0xFFEDF91D, -0xECF4E7EA, 0x0BEE1711, 0x1BEC0AEB, 0xEBF0E1E7, 0x101E15D6, 0x11F211F9, 0xE8F41721, 0x0FEE161B, -0xF118EA1B, 0xDD1C19E2, 0xEEDCE80F, 0x1AF1F516, 0x080B141B, 0x15DD1BEE, 0x100E14F1, 0xFFFB0427, -0x18181F22, 0xDEEBFC0A, 0x07170B14, 0xF819230C, 0xFA0FE5EF, 0xDFF1ECF6, 0x0CF313E7, 0x0D17FA05, -0x141117E8, 0x05FEE7EE, 0xF21DF516, 0xF509F1E8, 0x18291408, 0xF21110F3, 0x17E20AE5, 0x0BEEF9EF, -0xE82220ED, 0x23F8E4EA, 0x1203F2F1, 0xF0FB0CF7, 0xED12FC09, 0xFAF808F9, 0xFE16F701, 0xFC01F20F, -0xF00D13FF, 0xF00C0A07, 0x0BEC0AF7, 0x08F4FAF4, 0xF2F70C0F, 0xF912EF04, 0x11EFF902, 0xF2111BEF, -0xF611FCF1, 0x170B0D07, 0x0809EF00, 0x060B110D, 0xF6FCFFF8, 0x0C13F718, 0x080C12F5, 0xFBF8F9F2, -0xF1F40C08, 0xFE02EEFB, 0xFBFD0AFD, 0x060BF205, 0xED0BFEF9, 0x02070C16, 0xF8F4F9FB, 0x020DF801, -0x0CF4F2F1, 0xF3EE0C12, 0x08F80E06, 0xF2ED00F2, 0x04FA09F4, 0x080DF905, 0xFBF6F1F4, 0xFBF00BF4, -0xEBF41210, 0x02180A05, 0x0D0DE806, 0xF2F709FD, 0x0A120204, 0x09F304F8, 0xFE050AF8, 0x1C01080A, -0xF205120F, 0xF40DF604, 0xECEDF3F9, 0x14FF0D0E, 0x020B0B0B, 0xEE06F704, 0xF00DF705, 0x1503EE07, -0xEBE4F8F3, 0x0AF9FB03, 0x0FF0F711, 0x0BF9FC00, 0x000C0C12, 0x031108F0, 0xF8F30204, 0x02FFF600, -0xF0F80105, 0x00F90F16, 0xFA0EF707, 0xEE08F501, 0xFF0C09F5, 0xEEF7F0F1, 0xF1F710F9, 0xF2F7EB0B, -0xFA0E110A, 0xF7F40306, 0x0904F306, 0xEC081AFB, 0x02F6EE09, 0x0FF9F70F, 0xF6F701F6, 0xEC0E0FEB, -0x0414FB10, 0xF9FDEFF4, 0x04070015, 0xF4FC0CEE, 0x0C1208F7, 0xFEF00BEE, 0xE803FB07, 0xEFF9F209, -0x05FA0705, 0x00F6F7F8, 0x03EDFF11, 0x01EFEE13, 0x0DF8F7FB, 0xFB01F1F0, 0xEDF7F808, 0x06030212, -0x0108010D, 0x06FCFA02, 0x0EF8FC07, 0x0EF00CF9, 0x07F9170D, 0x12EDFB05, 0x0707F114, 0xF3090B09, -0xEE09030A, 0x0815F400, 0xF80409F6, 0xFC0DFBEE, 0xF910FDF8, 0xF00FEAF5, 0xF309F7F7, 0x1010F7EF, -0xF2FB0A12, 0x02000001, 0x02020AFA, 0xF310120D, 0xFCF8F209, 0xE7060602, 0x0DF7F810, 0x111008F8, -0x10F2F8F6, 0xEFF9EEF3, 0xF8FDF511, 0x0C0A04F3, 0x091407F8, 0xF8160EFB, 0x02F8FFF9, 0xF704EE09, -0x0AF5F503, 0xF7F6000E, 0xF513F30A, 0xF5E5FE11, 0x08050DF8, 0x0006EEF9, 0xFA02F3EA, 0x07EA030B, -0xFE13ECFF, 0x02F60211, 0xF6F4F4E6, 0xF20E0CF1, 0x0807F706, 0x0FF20C0B, 0xF3FDF00C, 0xF108F50F, -0x05FE07F3, 0x08F1EBFA, 0x08FC070D, 0x0A07FE14, 0x02ED06F3, 0x0D08ED0F, 0x09F60F06, 0xF70CF2F8, -0x1BFC0A08, 0x000F070C, 0x130E0711, 0xF8F710F4, 0x0CF50B08, 0xF0EDFD0D, 0x1105F3F1, 0x0E00080E, -0xF80C080F, 0xF6F7F70A, 0x07041208, 0x11F5FE08, 0xF507F9F1, 0x09FFF7FD, 0xFE0AF80F, 0x041715F1, -0xF5FBF3F5, 0x0AF6F7F8, 0x0E00FE05, 0x04E519EF, 0x0803F711, 0xF00C0CF3, 0xFEEDEF07, 0x071508F1, -0x0DF407F5, 0x0BFAF809, 0xF7EB0D0C, 0xF1F7F406, 0x0FEEF20A, 0x00FDFC06, 0xF302EEF6, 0xF4F51004, -0xEE0D14FB, 0x07EC0B04, 0x090614F1, 0xF909FFF7, 0x02FEFD0C, 0x070B04FA, 0xEA16EEF8, 0xF1081105, -0x01FA07F7, 0xF60E0D0D, 0x0BFCF6F8, 0x01F40805, 0xF70A1201, 0xFBFBF7F9, 0x04E716F6, 0x09F502F6, -0xFBE8090D, 0xFD12000A, 0x03F4F209, 0x100CFB0F, 0x0405F40B, 0x0308EE11, 0x07110907, 0xF20901FB, -0x0BFAFE0A, 0x0EFEF80D, 0xFCF5F2F2, 0xFAF8EAEC, 0xF211FC0C, 0xF8F1F111, 0x05F709FE, 0x0903F80B, -0xF9030B0B, 0xF919F5F2, 0xF608FFFA, 0x09F50300, 0xF4F91314, 0x0A120AF6, 0xE5FCF1F0, 0x041EECFA, -0xF2FDFFF1, 0x0DFD05EF, 0xF40C0912, 0xF9090106, 0x0EF6071D, 0xFE140DF1, 0xF9EE0203, 0x04110EED, -0x06F2E903, 0xFD04F8F9, 0x0A000C0D, 0x08FAF509, 0xF4EF0E1B, 0x10F9F9F7, 0x06EE0809, 0x140E0F12, -0x04F50FFD, 0xF0EA0D08, 0x0B0D00FF, 0x17F80F0D, 0x17070E06, 0x01F8F7FB, 0x14F80312, 0xF4FEF506, -0x0A0AF8ED, 0x0B1109F9, 0x0B0D0EF8, 0x09F0ECE8, 0x00F2140C, 0xFD090D0E, 0xEA16F703, 0x03F6F80A, -0xF30910FD, 0xF4F3F514, 0xF302ECF5, 0xF3FF0A0A, 0x0CEFFAFA, 0xF60B0D08, 0xF104F7F5, 0xF90AF5F4, -0xFC0102F7, 0xFAFA01FE, 0xF40DF3F2, 0x05FC0CFF, 0x13FBF706, 0xEBF30AF7, 0xF6F20CF6, 0xF90E1EEB, -0xF6EE0BF5, 0xF11303F7, 0xFA0D0709, 0xFAF8080C, 0x1FF80A07, 0xF5F9EE0F, 0x09F7FD08, 0x0B0A1503, -0xF7FA000F, 0x01FAF0F5, 0xEAEEFE05, 0xF8FBFC10, 0x100B0600, 0x13050501, 0xFA15F216, 0xFD0F13F4, -0x030B04F8, 0xFA0FF1FD, 0x12F80BF4, 0x0A080204, 0x0701FA03, 0x17EEFAF7 - -basegraph= -1 - -z_c= -176 - -n_cb= -11616 - -q_m= -2 - -n_filler= -8 - -e= -4640 - -rv_index= -3 - -code_block_mode= -1 - -iter_max= -20 - -expected_iter_count= -3 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE, RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE - -expected_status= -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v11835.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v11835.data deleted file mode 100644 index 84a04e11cc..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v11835.data +++ /dev/null @@ -1,49 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x817F7F81, 0x817F817F, 0x7F818181, 0x7F818181, 0x7F817F81, 0x7F7F8181, 0x817F7F7F, 0x81817F81, -0x7F7F6B7F, 0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x81817F7F, 0x7F818192, 0x7F81817F, 0x817F7F7F, -0x8181 - -output0 = -0x44FB08C0, 0x661CCC - -basegraph= -2 - -z_c= -10 - -n_cb= -500 - -q_m= -6 - -n_filler= -44 - -e= -66 - -rv_index= -0 - -code_block_mode= -1 - -iter_max= -20 - -expected_iter_count= -4 - -op_flags= -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE - -expected_status= -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v2342_drop.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v2342_drop.data deleted file mode 100644 index f30726e46a..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v2342_drop.data +++ /dev/null @@ -1,745 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x7F817F81, 0x817F7F81, 0x8181817F, 0x7F817F81, 0x7F818181, 0x7F81817F, 0x7F817F81, 0x817F8181, -0x817F8181, 0x817F8181, 0x7F818181, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x7F7F8181, -0x7F7F7F81, 0x7F7F817F, 0x7F81817F, 0x7F81817F, 0x7F818181, 0x8181817F, 0x8181817F, 0x7F7F817F, -0x7F7F8181, 0x8181817F, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x7F7F817F, 0x7F818181, 0x81817F7F, -0x7F7F7F7F, 0x7F7F817F, 0x7F7F8181, 0x81817F7F, 0x817F8181, 0x7F817F81, 0x7F7F817F, 0x7F7F7F81, -0x7F7F7F81, 0x817F8181, 0x817F7F7F, 0x817F7F81, 0x7F817F7F, 0x7F7F8181, 0x817F7F7F, 0x7F818181, -0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F81, 0x81818181, 0x7F818181, -0x817F8181, 0x7F818181, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F818181, 0x7F7F8181, -0x81817F81, 0x8181817F, 0x7F7F817F, 0x7F817F81, 0x81817F7F, 0x817F7F7F, 0x81817F81, 0x81818181, -0x7F7F8181, 0x81817F81, 0x81817F7F, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x7F81817F, 0x81817F7F, -0x7F817F7F, 0x81817F7F, 0x7F7F817F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, -0x7F817F7F, 0x81817F81, 0x81817F81, 0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x817F817F, 0x7F7F7F81, -0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x8181817F, 0x81817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F7F, -0x81817F7F, 0x7F7F7F81, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F81, 0x81817F81, -0x7F817F7F, 0x7F81817F, 0x81817F81, 0x817F817F, 0x7F7F7F81, 0x817F8181, 0x81818181, 0x81817F81, -0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x7F817F7F, 0x81818181, 0x81818181, 0x817F7F7F, 0x81817F81, -0x817F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F817F, 0x7F817F7F, 0x7F81817F, 0x7F7F817F, 0x7F817F7F, -0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x817F817F, 0x7F817F81, 0x817F7F81, 0x81818181, 0x8181817F, -0x81817F81, 0x7F817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F7F817F, 0x7F81817F, 0x817F8181, -0x817F7F81, 0x817F817F, 0x817F817F, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x81817F7F, 0x7F7F7F81, -0x8181817F, 0x817F7F81, 0x7F817F81, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, 0x817F7F81, 0x7F7F817F, -0x7F81817F, 0x7F81817F, 0x817F8181, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x7F817F7F, 0x7F7F817F, -0x81817F81, 0x81817F7F, 0x817F817F, 0x817F817F, 0x8181817F, 0x7F817F7F, 0x81817F7F, 0x7F818181, -0x817F8181, 0x81817F81, 0x8181817F, 0x7F7F7F81, 0x81817F81, 0x81817F7F, 0x8181817F, 0x817F8181, -0x8181817F, 0x8181817F, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F818181, 0x7F817F81, 0x81817F7F, -0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F7F, 0x817F7F7F, 0x81817F7F, 0x7F818181, 0x7F7F7F7F, -0x7F817F81, 0x7F7F8181, 0x817F817F, 0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x7F7F817F, 0x7F817F7F, -0x817F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F8181, 0x7F818181, 0x81817F81, -0x7F7F817F, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x817F817F, 0x7F7F8181, 0x7F817F81, -0x7F818181, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x81817F7F, 0x817F8181, 0x7F817F7F, 0x7F817F7F, -0x7F7F8181, 0x81818181, 0x817F8181, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, -0x8181817F, 0x8181817F, 0x8181817F, 0x817F817F, 0x7F817F7F, 0x7F818181, 0x7F817F81, 0x7F817F81, -0x7F7F8181, 0x817F817F, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x7F7F7F7F, -0x817F817F, 0x8181817F, 0x7F7F7F81, 0x817F817F, 0x81817F7F, 0x7F7F8181, 0x817F817F, 0x7F818181, -0x7F7F7F81, 0x81818181, 0x7F818181, 0x7F7F8181, 0x817F8181, 0x817F8181, 0x7F81817F, 0x81817F7F, -0x81818181, 0x7F7F7F81, 0x817F817F, 0x7F81817F, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, 0x817F7F81, -0x817F817F, 0x7F81817F, 0x81818181, 0x817F8181, 0x7F817F81, 0x81817F81, 0x7F7F817F, 0x817F7F7F, -0x817F8181, 0x8181817F, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x7F81817F, 0x7F818181, 0x81817F81, -0x8181817F, 0x7F7F8181, 0x817F7F81, 0x7F7F8181, 0x7F7F817F, 0x7F818181, 0x7F7F817F, 0x81818181, -0x81817F7F, 0x817F7F81, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F7F, 0x817F817F, -0x7F817F81, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, 0x7F7F7F7F, 0x81818181, 0x817F817F, 0x81817F7F, -0x81817F7F, 0x7F817F7F, 0x7F7F7F7F, 0x7F818181, 0x817F8181, 0x7F817F7F, 0x81818181, 0x81818181, -0x7F81817F, 0x81817F7F, 0x8181817F, 0x817F7F81, 0x817F817F, 0x81818181, 0x81817F7F, 0x817F7F81, -0x81818181, 0x8181817F, 0x81817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F8181, -0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x817F7F81, 0x81817F81, 0x7F7F8181, 0x817F8181, 0x81817F7F, -0x7F7F7F7F, 0x81818181, 0x817F8181, 0x817F7F81, 0x7F81817F, 0x7F818181, 0x7F7F817F, 0x817F8181, -0x817F817F, 0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F7F8181, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, -0x817F7F7F, 0x81817F7F, 0x7F7F817F, 0x7F817F81, 0x817F7F81, 0x817F8181, 0x817F7F81, 0x81817F81, -0x7F81817F, 0x7F818181, 0x81818181, 0x81817F7F, 0x8181817F, 0x81817F81, 0x7F7F817F, 0x817F7F7F, -0x817F8181, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x81817F81, 0x817F817F, 0x817F7F7F, 0x81817F81, -0x7F817F7F, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x8181817F, 0x817F7F81, 0x8181817F, 0x7F817F7F, -0x7F817F81, 0x817F817F, 0x8181817F, 0x81818181, 0x7F817F7F, 0x817F7F81, 0x7F817F7F, 0x81818181, -0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x7F817F81, 0x7F817F7F, 0x7F7F7F7F, -0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, -0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F7F7F81, 0x8181817F, -0x817F7F81, 0x817F8181, 0x7F7F817F, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x81817F7F, 0x81817F7F, -0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x817F817F, 0x817F7F7F, 0x7F818181, 0x7F81817F, -0x7F81817F, 0x7F818181, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F817F81, 0x817F817F, 0x7F81817F, -0x7F81817F, 0x7F7F817F, 0x7F7F7F7F, 0x81817F81, 0x81817F7F, 0x817F8181, 0x7F818181, 0x7F7F8181, -0x7F817F81, 0x7F818181, 0x817F817F, 0x7F817F81, 0x817F817F, 0x817F7F7F, 0x7F7F8181, 0x81817F81, -0x7F7F8181, 0x817F8181, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x81817F81, 0x7F818181, 0x7F7F817F, -0x817F8181, 0x817F7F7F, 0x81817F81, 0x7F7F7F7F, 0x7F818181, 0x7F817F7F, 0x7F817F7F, 0x7F817F81, -0x7F817F7F, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x7F7F8181, 0x817F8181, -0x817F8181, 0x7F7F7F81, 0x7F818181, 0x7F7F817F, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x81817F81, -0x817F8181, 0x7F81817F, 0x7F7F7F81, 0x817F8181, 0x7F81817F, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, -0x81817F81, 0x817F7F7F, 0x7F7F7F81, 0x817F8181, 0x7F7F8181, 0x81818181, 0x817F7F7F, 0x7F7F817F, -0x81817F81, 0x7F81817F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x817F7F81, -0x7F817F81, 0x7F7F817F, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x817F817F, 0x817F817F, -0x7F7F7F81, 0x7F7F8181, 0x817F7F81, 0x81818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, -0x7F817F7F, 0x81817F7F, 0x7F81817F, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, 0x817F817F, -0x7F817F7F, 0x8181817F, 0x817F8181, 0x81817F81, 0x81817F7F, 0x8181817F, 0x7F81817F, 0x7F7F7F7F, -0x7F817F81, 0x7F817F81, 0x7F817F81, 0x81817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F817F7F, 0x7F81817F, -0x7F7F8181, 0x7F81817F, 0x7F7F817F, 0x7F817F81, 0x817F8181, 0x7F7F8181, 0x81818181, 0x7F7F7F81, -0x7F7F8181, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x81817F7F, 0x7F7F817F, 0x817F817F, 0x81817F7F, -0x817F817F, 0x817F817F, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x7F81817F, 0x8181817F, 0x81817F81, -0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x81817F81, -0x81817F81, 0x7F817F81, 0x7F817F81, 0x817F7F7F, 0x81818181, 0x8181817F, 0x7F7F7F81, 0x817F7F81, -0x7F7F7F7F, 0x7F81817F, 0x817F7F81, 0x7F81817F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F8181, 0x81817F81, -0x817F7F7F, 0x7F817F81, 0x817F8181, 0x8181817F, 0x8181817F, 0x7F817F7F, 0x7F81817F, 0x817F817F, -0x7F818181, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F7F7F, -0x81817F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x817F817F, 0x81817F7F, 0x817F8181, 0x81817F7F, -0x81817F81, 0x817F8181, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x81818181, 0x817F7F7F, 0x7F817F7F, -0x7F817F81, 0x81817F7F, 0x7F818181, 0x7F817F7F, 0x81817F81, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, -0x7F81817F, 0x7F81817F, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F818181, 0x7F7F7F7F, -0x7F7F7F81, 0x81818181, 0x7F81817F, 0x7F7F7F7F, 0x8181817F, 0x7F818181, 0x817F7F81, 0x7F818181, -0x8181817F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x817F817F, -0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x817F8181, 0x7F7F817F, 0x7F817F81, 0x817F7F7F, 0x7F7F7F81, -0x817F7F81, 0x81817F81, 0x7F7F817F, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x817F8181, 0x7F7F817F, -0x817F7F7F, 0x81818181, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F81, 0x817F8181, 0x8181817F, 0x7F817F81, -0x81817F81, 0x7F7F7F81, 0x8181817F, 0x7F817F81, 0x7F7F8181, 0x817F7F81, 0x817F817F, 0x7F7F817F, -0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, -0x81817F7F, 0x7F817F81, 0x7F818181, 0x7F7F7F7F, 0x81817F7F, 0x817F8181, 0x817F8181, 0x81818181, -0x817F7F7F, 0x7F818181, 0x81817F7F, 0x817F7F7F, 0x8181817F, 0x7F818181, 0x81817F81, 0x817F7F81, -0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x81818181, 0x7F817F7F, 0x7F817F81, 0x81817F81, 0x81817F81, -0x817F817F, 0x81817F81, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x817F817F, 0x81817F7F, -0x817F8181, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x7F7F7F81, -0x817F7F81, 0x817F817F, 0x817F8181, 0x817F8181, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, -0x7F817F81, 0x7F81817F, 0x7F818181, 0x7F817F81, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F7F, -0x7F7F7F7F, 0x7F7F817F, 0x81818181, 0x817F817F, 0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x81817F81, -0x7F81817F, 0x81818181, 0x81817F7F, 0x817F7F7F, 0x81817F81, 0x7F818181, 0x817F8181, 0x81817F7F, -0x7F81817F, 0x7F7F817F, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, 0x817F8181, 0x817F7F81, 0x81817F81, -0x7F81817F, 0x7F7F7F81, 0x7F817F81, 0x7F817F7F, 0x81818181, 0x7F7F817F, 0x7F7F7F81, 0x7F818181, -0x7F817F81, 0x817F8181, 0x7F7F8181, 0x817F7F81, 0x7F7F8181, 0x81817F81, 0x81818181, 0x7F817F81, -0x81817F7F, 0x81818181, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F81817F, 0x817F8181, 0x7F7F8181, -0x817F8181, 0x817F7F7F, 0x7F818181, 0x81817F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x7F7F7F81, -0x7F817F81, 0x817F7F7F, 0x7F818181, 0x81817F7F, 0x81818181, 0x81817F7F, 0x817F7F81, 0x7F817F7F, -0x7F817F81, 0x7F7F8181, 0x7F817F7F, 0x817F7F7F, 0x7F7F8181, 0x817F7F7F, 0x817F7F7F, 0x7F818181, -0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x81818181, 0x8181817F, 0x7F7F817F, 0x7F817F81, 0x7F81817F, -0x7F818181, 0x81818181, 0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F8181, 0x7F81817F, 0x7F817F81, -0x7F7F8181, 0x7F7F7F7F, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x7F7F7F7F, 0x81818181, -0x7F7F8181, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x7F7F8181, 0x7F817F81, 0x7F7F817F, 0x7F817F7F, -0x817F8181, 0x817F8181, 0x81817F7F, 0x7F81817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F818181, 0x7F7F7F7F, -0x7F7F7F81, 0x817F7F7F, 0x817F7F81, 0x81817F7F, 0x8181817F, 0x81817F7F, 0x817F7F81, 0x8181817F, -0x7F7F7F7F, 0x7F7F817F, 0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, -0x81817F81, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x817F7F81, 0x7F818181, 0x817F7F81, 0x7F817F7F, -0x8181817F, 0x81818181, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, -0x817F7F7F, 0x81818181, 0x817F817F, 0x81818181, 0x7F817F7F, 0x817F8181, 0x7F7F7F81, 0x817F7F81, -0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, 0x8181817F, 0x817F7F7F, 0x7F7F7F7F, 0x81818181, -0x817F817F, 0x7F7F7F81, 0x7F817F81, 0x7F817F81, 0x7F7F817F, 0x817F817F, 0x817F8181, 0x81817F7F, -0x7F7F8181, 0x7F7F817F, 0x817F7F7F, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x81818181, 0x81817F7F, -0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F817F81, 0x81817F81, 0x81817F81, 0x7F7F8181, -0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x7F818181, 0x817F7F7F, 0x7F818181, -0x8181817F, 0x817F7F7F, 0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F81, -0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x81817F81, 0x81817F7F, -0x8181817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x81818181, 0x8181817F, 0x7F817F7F, 0x81818181, -0x7F818181, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F7F7F, -0x7F7F8181, 0x7F7F7F7F, 0x817F7F81, 0x817F817F, 0x817F7F7F, 0x7F817F81, 0x81817F81, 0x7F7F817F, -0x8181817F, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x7F7F7F7F, 0x817F7F7F, -0x7F81817F, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, 0x7F7F817F, -0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, -0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x81818181, 0x7F818181, 0x7F817F7F, 0x7F818181, 0x81817F81, -0x81818181, 0x7F7F7F7F, 0x81818181, 0x81818181, 0x7F81817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F7F81, -0x7F7F817F, 0x7F7F7F7F, 0x817F8181, 0x7F818181, 0x7F81817F, 0x7F81817F, 0x8181817F, 0x81817F81, -0x817F8181, 0x7F81817F, 0x7F81817F, 0x817F817F, 0x81818181, 0x7F81817F, 0x81818181, 0x81818181, -0x817F7F81, 0x7F817F7F, 0x7F7F817F, 0x8181817F, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F81, -0x7F7F7F7F, 0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x817F8181, -0x81818181, 0x7F7F7F7F, 0x817F7F81, 0x81817F81, 0x817F7F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, -0x81817F81, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x817F7F81, 0x81817F7F, 0x7F7F8181, 0x8181817F, -0x817F7F81, 0x7F81817F, 0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x817F7F81, 0x7F81817F, 0x817F7F81, -0x7F7F817F, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x8181817F, -0x81817F7F, 0x81817F7F, 0x81817F81, 0x817F817F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, -0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x7F817F7F, 0x81817F81, 0x81817F7F, 0x7F818181, 0x7F7F7F81, -0x7F817F7F, 0x7F7F817F, 0x81817F7F, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, -0x8181817F, 0x7F7F817F, 0x817F817F, 0x7F7F8181, 0x817F7F81, 0x7F7F817F, 0x81817F7F, 0x817F8181, -0x817F8181, 0x7F7F7F81, 0x8181817F, 0x817F817F, 0x81817F81, 0x817F8181, 0x7F7F817F, 0x817F7F81, -0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x817F8181, 0x8181817F, 0x81817F81, 0x7F817F81, -0x7F817F81, 0x81817F81, 0x7F817F81, 0x81818181, 0x81817F81, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F81, -0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x7F7F7F81, 0x81817F7F, 0x7F7F817F, 0x81817F7F, -0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x7F7F7F81, 0x7F817F81, -0x817F817F, 0x7F7F7F81, 0x817F7F81, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F7F, 0x8181817F, -0x81817F81, 0x7F81817F, 0x8181817F, 0x7F817F81, 0x81817F7F, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, -0x7F81817F, 0x81817F7F, 0x8181817F, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, 0x81817F7F, 0x81817F81, -0x7F818181, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, -0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x817F8181, 0x7F7F7F81, -0x7F818181, 0x8181817F, 0x817F7F7F, 0x817F7F81, 0x81817F7F, 0x7F817F7F, 0x8181817F, 0x7F817F7F, -0x8181817F, 0x7F7F7F7F, 0x817F817F, 0x7F7F817F, 0x7F81817F, 0x7F818181, 0x7F7F817F, 0x81818181, -0x817F7F81, 0x7F817F7F, 0x7F7F8181, 0x81818181, 0x81818181, 0x81817F7F, 0x7F818181, 0x7F7F817F, -0x7F7F7F81, 0x7F817F81, 0x7F7F8181, 0x7F7F8181, 0x7F817F81, 0x7F817F81, 0x81817F7F, 0x8181817F, -0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F7F817F, 0x7F817F81, 0x7F7F817F, -0x81817F7F, 0x817F7F81, 0x817F8181, 0x7F817F81, 0x7F7F817F, 0x817F8181, 0x7F818181, 0x7F7F817F, -0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x7F81817F, 0x7F7F7F81, -0x7F7F817F, 0x8181817F, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, 0x7F7F817F, 0x81817F7F, 0x81817F7F, -0x81817F7F, 0x7F7F7F81, 0x7F818181, 0x7F7F817F, 0x7F81817F, 0x7F818181, 0x817F7F81, 0x7F817F81, -0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x81818181, 0x7F817F81, 0x7F7F7F7F, 0x817F817F, 0x81818181, -0x7F7F817F, 0x7F7F7F81, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F818181, 0x817F8181, 0x7F817F7F, -0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, 0x7F7F817F, 0x7F81817F, -0x7F817F81, 0x7F818181, 0x817F7F81, 0x817F7F7F, 0x817F817F, 0x7F7F817F, 0x817F8181, 0x7F818181, -0x81817F7F, 0x7F818181, 0x7F7F7F81, 0x817F817F, 0x8181817F, 0x817F8181, 0x7F7F817F, 0x817F7F7F, -0x81817F7F, 0x817F7F7F, 0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x8181817F, 0x7F7F8181, 0x7F81817F, -0x7F7F8181, 0x81818181, 0x817F8181, 0x7F7F8181, 0x817F8181, 0x8181817F, 0x8181817F, 0x817F7F81, -0x7F7F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F7F, -0x7F818181, 0x817F7F81, 0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, -0x7F818181, 0x7F817F81, 0x7F817F7F, 0x817F817F, 0x817F7F81, 0x817F817F, 0x81817F81, 0x817F817F, -0x7F817F81, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x8181817F, 0x81817F81, 0x7F818181, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F81, 0x7F817F81, 0x7F817F7F, 0x817F817F, 0x81817F81, 0x817F7F7F, -0x7F7F7F7F, 0x8181817F, 0x81818181, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x7F817F7F, 0x7F7F7F7F, -0x7F818181, 0x7F7F7F81, 0x81818181, 0x7F7F817F, 0x81818181, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, -0x7F817F7F, 0x81817F81, 0x81817F81, 0x817F8181, 0x7F7F817F, 0x7F7F817F, 0x7F7F8181, 0x81818181, -0x7F7F7F81, 0x817F8181, 0x817F8181, 0x817F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, -0x81817F7F, 0x81817F81, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F7F7F7F, -0x817F7F7F, 0x7F817F7F, 0x7F817F81, 0x8181817F, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F7F7F, 0x817F8181, -0x7F817F7F, 0x7F817F7F, 0x7F817F7F, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x81818181, 0x7F818181, -0x817F7F7F, 0x8181817F, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F817F7F, 0x817F7F7F, 0x817F817F, -0x817F7F81, 0x817F8181, 0x7F818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F7F, 0x8181817F, 0x7F817F81, -0x817F817F, 0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x81817F81, 0x7F7F817F, 0x7F7F817F, 0x817F7F81, -0x817F817F, 0x7F7F817F, 0x7F817F81, 0x7F818181, 0x81818181, 0x81817F7F, 0x81817F81, 0x817F7F81, -0x81817F81, 0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, 0x7F817F81, 0x81818181, -0x7F81817F, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x7F817F81, 0x81818181, 0x8181817F, 0x817F7F81, -0x817F817F, 0x817F7F81, 0x81817F81, 0x7F817F81, 0x81817F7F, 0x7F7F7F7F, 0x8181817F, 0x7F7F817F, -0x817F7F7F, 0x7F7F8181, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x7F818181, 0x7F817F81, -0x8181817F, 0x817F8181, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x81817F7F, -0x817F8181, 0x7F7F8181, 0x7F818181, 0x817F7F7F, 0x81818181, 0x817F7F7F, 0x817F7F7F, 0x7F818181, -0x7F7F8181, 0x7F7F7F81, 0x81818181, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x81818181, 0x817F817F, -0x8181817F, 0x7F818181, 0x81817F81, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x7F7F7F81, 0x7F7F7F7F, -0x81817F81, 0x81817F81, 0x7F81817F, 0x7F818181, 0x817F817F, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, -0x817F7F7F, 0x817F8181, 0x81817F81, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x817F817F, 0x7F7F7F81, -0x81817F7F, 0x7F7F8181, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, 0x81818181, 0x817F7F7F, 0x7F7F7F7F, -0x8181817F, 0x817F7F7F, 0x7F817F81, 0x817F817F, 0x7F7F7F7F, 0x7F818181, 0x81817F7F, 0x817F7F81, -0x7F7F7F7F, 0x7F817F7F, 0x7F7F8181, 0x81817F7F, 0x817F817F, 0x7F7F817F, 0x8181817F, 0x817F8181, -0x81817F81, 0x7F818181, 0x7F818181, 0x7F7F8181, 0x7F7F817F, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, -0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F7F8181, 0x81817F7F, 0x7F81817F, -0x7F818181, 0x7F818181, 0x7F817F7F, 0x81817F81, 0x81817F81, 0x8181817F, 0x81817F7F, 0x7F7F7F81, -0x817F7F81, 0x7F7F7F81, 0x817F817F, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, -0x7F81817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, -0x817F8181, 0x7F817F7F, 0x81817F81, 0x7F7F7F7F, 0x7F7F817F, 0x7F817F7F, 0x817F817F, 0x8181817F, -0x81817F81, 0x7F7F7F81, 0x81818181, 0x7F7F7F7F, 0x81818181, 0x817F817F, 0x7F817F81, 0x7F7F7F81, -0x817F817F, 0x817F8181, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x7F7F817F, 0x817F7F81, 0x817F7F7F, -0x7F7F7F7F, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x81817F7F, -0x7F7F8181, 0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x8181817F, 0x817F817F, 0x81817F7F, 0x817F7F7F, -0x8181817F, 0x7F7F8181, 0x7F817F7F, 0x81818181, 0x7F817F81, 0x7F817F81, 0x7F817F7F, 0x817F7F81, -0x8181817F, 0x81817F7F, 0x7F818181, 0x817F8181, 0x81817F7F, 0x81818181, 0x81818181, 0x817F817F, -0x7F81817F, 0x81817F81, 0x7F817F7F, 0x81817F7F, 0x7F7F817F, 0x817F7F7F, 0x81818181, 0x7F818181, -0x7F818181, 0x7F7F8181, 0x7F7F817F, 0x8181817F, 0x817F7F7F, 0x7F818181, 0x7F7F7F7F, 0x817F7F81, -0x7F7F817F, 0x8181817F, 0x817F817F, 0x7F81817F, 0x817F7F7F, 0x817F7F81, 0x817F8181, 0x7F817F7F, -0x81817F81, 0x817F817F, 0x7F817F81, 0x7F7F7F81, 0x7F817F81, 0x7F818181, 0x7F7F8181, 0x7F817F81, -0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x817F817F, 0x817F8181, 0x817F7F81, 0x7F7F7F7F, 0x7F818181, -0x817F817F, 0x7F81817F, 0x8181817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, 0x817F817F, -0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F81, 0x8181817F, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x817F7F7F, -0x7F818181, 0x7F818181, 0x7F818181, 0x7F7F7F81, 0x81818181, 0x81818181, 0x817F7F7F, 0x7F81817F, -0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x7F817F7F, -0x7F817F81, 0x81818181, 0x81818181, 0x7F7F8181, 0x7F818181, 0x7F7F817F, 0x7F7F8181, 0x817F817F, -0x7F7F817F, 0x81817F81, 0x7F7F817F, 0x7F7F8181, 0x7F7F8181, 0x7F817F7F, 0x7F817F7F, 0x8181817F, -0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x7F818181, 0x7F818181, 0x7F7F7F81, 0x81817F7F, 0x817F8181, -0x7F7F8181, 0x7F81817F, 0x7F817F81, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x817F817F, 0x7F7F817F, -0x817F7F81, 0x81817F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F81817F, -0x817F7F81, 0x8181817F, 0x7F817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, 0x817F7F7F, -0x8181817F, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x817F8181, 0x817F817F, -0x81818181, 0x8181817F, 0x8181817F, 0x7F817F81, 0x817F7F7F, 0x7F81817F, 0x7F7F817F, 0x817F7F81, -0x817F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x7F818181, 0x817F8181, -0x817F7F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F817F7F, 0x7F817F81, 0x7F81817F, -0x7F817F81, 0x817F7F81, 0x7F81817F, 0x81817F81, 0x8181817F, 0x8181817F, 0x81817F81, 0x817F7F7F, -0x81817F81, 0x7F81817F, 0x7F817F7F, 0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x817F7F81, 0x81818181, -0x8181817F, 0x817F8181, 0x7F7F817F, 0x817F7F7F, 0x817F7F7F, 0x7F7F8181, 0x7F81817F, 0x817F7F7F, -0x81817F81, 0x7F81817F, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F817F7F, 0x81817F7F, 0x81817F81, -0x7F817F7F, 0x7F817F7F, 0x817F8181, 0x81817F81, 0x7F817F81, 0x8181817F, 0x817F7F7F, 0x7F817F81, -0x7F7F7F7F, 0x7F818181, 0x81818181, 0x7F7F817F, 0x7F817F81, 0x817F8181, 0x81818181, 0x7F7F817F, -0x81818181, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x7F7F817F, 0x81817F81, 0x7F817F81, 0x7F817F7F, -0x817F7F81, 0x817F8181, 0x817F817F, 0x81818181, 0x817F817F, 0x7F7F8181, 0x81818181, 0x7F817F7F, -0x8181817F, 0x7F818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F817F7F, 0x7F7F8181, 0x7F818181, 0x817F817F, -0x7F817F7F, 0x7F81817F, 0x817F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F8181, 0x81817F7F, 0x81817F81, -0x7F818181, 0x7F7F817F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x8181817F, 0x7F7F817F, 0x7F7F8181, -0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x7F7F8181, 0x7F7F7F7F, 0x7F817F7F, 0x8181817F, 0x81817F7F, -0x817F8181, 0x7F7F7F81, 0x8181817F, 0x8181817F, 0x817F817F, 0x817F7F81, 0x817F7F7F, 0x81818181, -0x817F7F81, 0x817F8181, 0x817F7F81, 0x8181817F, 0x7F817F81, 0x81818181, 0x7F81817F, 0x7F7F8181, -0x817F7F81, 0x81818181, 0x8181817F, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x7F818181, 0x81818181, -0x7F81817F, 0x7F817F81, 0x817F7F81, 0x81818181, 0x817F7F7F, 0x7F817F7F, 0x8181817F, 0x7F7F7F7F, -0x7F7F8181, 0x817F8181, 0x7F817F7F, 0x817F7F7F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, -0x8181817F, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x817F817F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, -0x7F818181, 0x817F817F, 0x7F817F7F, 0x7F7F817F, 0x7F818181, 0x81817F81, 0x7F7F8181, 0x81817F7F, -0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x7F81817F, 0x7F818181, 0x7F818181, 0x7F818181, 0x7F7F817F, -0x8181817F, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x817F7F81, 0x7F7F7F7F, 0x817F7F81, 0x81818181, -0x817F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F7F, 0x7F81817F, 0x7F7F7F81, 0x81818181, 0x817F8181, -0x817F7F81, 0x7F817F7F, 0x817F8181, 0x81818181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x7F7F8181, -0x7F7F817F, 0x8181817F, 0x7F817F81, 0x817F7F7F, 0x7F817F7F, 0x817F8181, 0x81818181, 0x817F7F81, -0x7F7F8181, 0x81817F7F, 0x7F7F8181, 0x8181817F, 0x81818181, 0x8181817F, 0x81817F81, 0x7F817F7F, -0x81817F81, 0x7F81817F, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x817F817F, 0x817F817F, 0x817F7F81, -0x8181817F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x81818181, 0x7F7F7F81, 0x7F7F817F, 0x817F8181, -0x817F817F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x817F8181, 0x7F817F7F, 0x8181817F, -0x817F7F81, 0x7F81817F, 0x817F8181, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x81817F81, 0x7F818181, -0x8181817F, 0x81818181, 0x7F7F817F, 0x7F7F8181, 0x81817F7F, 0x7F7F8181, 0x8181817F, 0x7F817F81, -0x7F817F7F, 0x81818181, 0x81817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F7F, 0x7F7F8181, 0x817F817F, -0x7F81817F, 0x817F817F, 0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x81817F81, 0x7F81817F, 0x817F817F, -0x817F7F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x817F817F, 0x81817F7F, 0x7F81817F, -0x7F7F7F81, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x81817F81, 0x817F7F7F, 0x817F7F81, 0x7F7F7F81, -0x7F818181, 0x7F7F7F7F, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F817F81, 0x817F7F7F, 0x8181817F, -0x7F7F8181, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x7F817F7F, 0x81817F81, 0x7F818181, -0x7F7F7F81, 0x8181817F, 0x81817F81, 0x7F81817F, 0x81818181, 0x7F81817F, 0x817F8181, 0x817F8181, -0x7F818181, 0x7F81817F, 0x817F8181, 0x81817F81, 0x7F818181, 0x81817F7F, 0x7F7F817F, 0x817F7F81, -0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x8181817F, -0x7F81817F, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x7F81817F, 0x81817F7F, -0x7F818181, 0x7F7F8181, 0x7F817F81, 0x7F817F81, 0x81818181, 0x817F8181, 0x7F7F7F7F, 0x817F817F, -0x7F817F81, 0x7F7F817F, 0x81817F7F, 0x7F7F7F81, 0x8181817F, 0x7F7F8181, 0x81818181, 0x7F817F81, -0x817F7F7F, 0x7F7F7F81, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x817F7F81, 0x817F817F, 0x7F818181, -0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x7F7F8181, 0x81817F81, 0x8181817F, 0x81818181, 0x7F7F7F81, -0x81817F81, 0x8181817F, 0x81817F7F, 0x817F817F, 0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x81817F81, -0x7F7F8181, 0x7F7F7F81, 0x8181817F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x8181817F, 0x7F818181, -0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F7F8181, 0x7F817F7F, 0x7F81817F, 0x7F7F8181, -0x817F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x7F7F817F, 0x81817F7F, 0x7F7F7F7F, -0x817F817F, 0x81817F81, 0x7F7F7F7F, 0x7F81817F, 0x81817F81, 0x817F7F7F, 0x7F818181, 0x7F7F8181, -0x7F81817F, 0x7F818181, 0x81817F81, 0x817F7F81, 0x7F7F7F7F, 0x7F817F81, 0x81817F81, 0x7F7F7F7F, -0x8181817F, 0x7F818181, 0x7F7F8181, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x8181817F, -0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x7F7F817F, 0x7F817F81, 0x7F81817F, 0x7F7F7F7F, 0x7F817F81, -0x7F7F7F81, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x817F7F7F, 0x7F7F817F, 0x81818181, 0x817F817F, -0x7F818181, 0x81817F81, 0x7F7F8181, 0x7F818181, 0x81818181, 0x81817F7F, 0x817F8181, 0x81817F81, -0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F817F7F, -0x817F7F81, 0x817F7F7F, 0x817F7F7F, 0x7F81817F, 0x7F7F7F7F, 0x817F8181, 0x817F7F81, 0x7F817F81, -0x817F817F, 0x7F7F7F7F, 0x817F8181, 0x81818181, 0x7F818181, 0x81817F7F, 0x7F7F7F7F, 0x8181817F, -0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F817F, -0x81818181, 0x8181817F, 0x7F7F817F, 0x817F7F81, 0x81818181, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, -0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x7F7F8181, 0x817F7F7F, -0x7F7F7F7F, 0x817F7F81, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x817F8181, 0x7F81817F, 0x81818181, -0x817F7F7F, 0x817F817F, 0x81817F81, 0x7F817F7F, 0x7F7F8181, 0x8181817F, 0x81818181, 0x7F81817F, -0x7F7F817F, 0x7F818181, 0x7F7F7F81, 0x81817F81, 0x8181817F, 0x7F7F817F, 0x8181817F, 0x81817F7F, -0x81818181, 0x81818181, 0x817F817F, 0x81817F81, 0x817F7F81, 0x81818181, 0x7F817F81, 0x81818181, -0x7F818181, 0x7F81817F, 0x7F7F7F81, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x817F8181, 0x817F8181, -0x7F817F81, 0x7F817F81, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, 0x7F817F81, 0x817F7F81, -0x817F8181, 0x7F817F81, 0x7F817F81, 0x7F7F817F, 0x7F81817F, 0x817F817F, 0x817F817F, 0x817F7F81, -0x81817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81818181, 0x7F817F7F, 0x7F817F81, 0x8181817F, 0x7F81817F, -0x8181817F, 0x7F7F7F81, 0x8181817F, 0x817F817F, 0x7F817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F817F, -0x7F81817F, 0x817F8181, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x81817F81, 0x7F817F81, -0x81817F81, 0x8181817F, 0x81817F81, 0x7F7F8181, 0x7F7F8181, 0x7F817F81, 0x7F817F7F, 0x7F7F8181, -0x7F81817F, 0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x7F817F7F, 0x7F818181, 0x817F7F81, 0x81817F7F, -0x8181817F, 0x7F818181, 0x81818181, 0x81817F7F, 0x81818181, 0x81817F7F, 0x817F8181, 0x7F81817F, -0x817F7F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F817F, 0x817F7F81, 0x81818181, 0x8181817F, 0x7F817F7F, -0x7F7F7F7F, 0x8181817F, 0x7F818181, 0x81817F81, 0x7F818181, 0x7F817F81, 0x7F818181, 0x817F817F, -0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x817F8181, 0x817F7F7F, 0x7F7F8181, -0x7F7F8181, 0x817F7F81, 0x7F818181, 0x7F81817F, 0x7F818181, 0x817F817F, 0x7F7F7F7F, 0x8181817F, -0x817F8181, 0x817F817F, 0x7F818181, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, -0x7F7F7F81, 0x817F8181, 0x817F817F, 0x817F817F, 0x7F7F7F81, 0x7F7F7F81, 0x817F8181, 0x7F7F817F, -0x7F818181, 0x81817F81, 0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x7F7F8181, 0x7F817F7F, 0x81817F7F, -0x7F7F8181, 0x7F817F81, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x81817F81, 0x817F817F, 0x8181817F, -0x817F817F, 0x7F7F7F7F, 0x7F817F7F, 0x7F817F7F, 0x81817F7F, 0x817F817F, 0x7F817F81, 0x7F7F8181, -0x817F817F, 0x81817F7F, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x81817F81, 0x7F7F7F81, 0x817F817F, -0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F818181, 0x7F7F8181, -0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x81817F7F, 0x8181817F, -0x7F817F7F, 0x81817F7F, 0x817F8181, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x7F81817F, -0x7F7F7F81, 0x7F7F817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x7F7F817F, 0x817F7F7F, 0x7F7F817F, -0x7F81817F, 0x817F817F, 0x81817F81, 0x7F818181, 0x7F81817F, 0x81818181, 0x7F817F7F, 0x7F7F7F81, -0x7F818181, 0x817F7F81, 0x7F817F81, 0x817F7F7F, 0x81818181, 0x817F817F, 0x817F8181, 0x81818181, -0x817F7F7F, 0x817F817F, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x81817F81, 0x8181817F, 0x817F7F7F, -0x817F7F7F, 0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x7F817F81, 0x7F818181, -0x7F817F81, 0x817F817F, 0x81817F7F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x7F818181, 0x7F7F7F81, -0x8181817F, 0x817F8181, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F817F, 0x817F7F81, 0x817F7F81, -0x81817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x7F81817F, 0x7F817F7F, 0x7F81817F, -0x7F817F81, 0x817F7F7F, 0x81818181, 0x7F818181, 0x7F817F81, 0x8181817F, 0x81817F7F, 0x817F817F, -0x8181817F, 0x817F7F81, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x81817F7F, 0x81817F7F, 0x7F818181, -0x7F817F81, 0x81817F7F, 0x817F8181, 0x7F7F7F81, 0x817F817F, 0x817F7F7F, 0x7F7F817F, 0x817F7F7F, -0x817F8181, 0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, 0x7F81817F, 0x8181817F, -0x817F7F81, 0x817F7F81, 0x7F7F8181, 0x817F7F81, 0x7F7F7F81, 0x7F81817F, 0x7F7F8181, 0x817F817F, -0x7F81817F, 0x81818181, 0x81818181, 0x81818181, 0x81818181, 0x7F818181, 0x7F818181, 0x81818181, -0x7F817F7F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F7F8181, 0x817F8181, 0x817F7F7F, -0x817F7F81, 0x8181817F, 0x7F7F7F81, 0x8181817F, 0x81817F81, 0x81817F7F, 0x7F7F7F7F, 0x7F818181, -0x817F7F7F, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x81818181, 0x8181817F, 0x7F7F7F81, 0x817F817F, -0x8181817F, 0x7F81817F, 0x7F818181, 0x7F7F7F81, 0x7F818181, 0x7F817F81, 0x817F817F, 0x81818181, -0x7F818181, 0x7F817F7F, 0x7F818181, 0x7F7F817F, 0x81818181, 0x81817F81, 0x8181817F, 0x7F7F7F81, -0x81817F7F, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, -0x7F817F81, 0x81818181, 0x81817F81, 0x7F7F7F7F, 0x817F817F, 0x7F7F817F, 0x7F81817F, 0x7F818181, -0x81818181, 0x8181817F, 0x8181817F, 0x7F817F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F817F, 0x7F7F8181, -0x81818181, 0x8181817F, 0x817F817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F817F, -0x7F818181, 0x7F7F8181, 0x7F818181, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F817F81, 0x817F7F81, -0x81818181, 0x81818181, 0x81817F81, 0x7F81817F, 0x817F8181, 0x817F8181, 0x7F817F81, 0x81818181, -0x817F817F, 0x81817F7F, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x817F7F7F, 0x8181817F, 0x817F7F81, -0x7F817F7F, 0x81817F7F, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x817F7F7F, -0x817F7F81, 0x817F817F, 0x8181817F, 0x81817F81, 0x8181817F, 0x81817F81, 0x817F7F81, 0x817F7F81, -0x7F818181, 0x81817F7F, 0x7F81817F, 0x81817F7F, 0x81818181, 0x7F7F8181, 0x817F7F81, 0x81817F81, -0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x7F7F817F, 0x7F818181, 0x7F818181, 0x7F818181, 0x7F817F81, -0x7F818181, 0x7F81817F, 0x7F7F8181, 0x81818181, 0x7F817F81, 0x7F818181, 0x817F7F7F, 0x7F7F817F, -0x81817F7F, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x817F7F81, 0x7F817F81, 0x7F7F8181, 0x7F817F7F, -0x817F817F, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, -0x7F817F81, 0x7F7F8181, 0x817F8181, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x7F81817F, 0x81817F81, -0x81817F7F, 0x81818181, 0x817F8181, 0x7F817F81, 0x7F818181, 0x7F817F81, 0x817F7F81, 0x7F817F81, -0x7F7F7F81, 0x7F817F7F, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, -0x7F818181, 0x7F7F8181, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x8181817F, 0x817F8181, 0x7F81817F, -0x7F81817F, 0x817F817F, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F818181, 0x7F818181, -0x817F817F, 0x7F7F7F7F, 0x81818181, 0x817F8181, 0x81817F7F, 0x81817F7F, 0x81817F7F, 0x81818181, -0x817F8181, 0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x817F8181, 0x7F81817F, 0x7F817F81, 0x81817F81, -0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, -0x81818181, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x7F818181, 0x7F7F7F7F, 0x7F81817F, 0x817F7F81, -0x7F7F7F81, 0x7F818181, 0x81817F81, 0x817F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F817F, 0x7F7F7F81, -0x817F7F81, 0x7F7F7F81, 0x7F7F8181, 0x7F817F81, 0x817F8181, 0x81818181, 0x7F818181, 0x817F7F7F, -0x8181817F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x81818181, -0x7F7F817F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, -0x817F7F81, 0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F7F, 0x817F817F, -0x7F7F8181, 0x7F7F8181, 0x81818181, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x7F7F7F81, -0x817F8181, 0x7F81817F, 0x817F8181, 0x7F7F817F, 0x81818181, 0x81818181, 0x7F7F7F81, 0x8181817F, -0x8181817F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F7F, 0x817F817F, 0x817F8181, 0x817F7F81, 0x81818181, -0x7F817F7F, 0x7F7F7F7F, 0x817F7F81, 0x817F817F, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x81817F81, -0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x817F817F, 0x7F7F8181, -0x7F7F8181, 0x817F7F81, 0x81817F7F, 0x817F8181, 0x817F817F, 0x7F817F7F, 0x7F81817F, 0x7F81817F, -0x7F817F81, 0x81817F7F, 0x7F818181, 0x7F818181, 0x817F8181, 0x7F7F7F7F, 0x817F817F, 0x7F7F817F, -0x7F7F8181, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, 0x817F8181, -0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F817F81, 0x81817F7F, 0x81817F81, 0x7F81817F, 0x7F81817F, -0x817F817F, 0x7F817F7F, 0x7F818181, 0x817F7F81, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, -0x81817F81, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x7F817F7F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, -0x7F817F7F, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, 0x81817F7F, 0x81818181, -0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F81, 0x817F817F, -0x7F818181, 0x81818181, 0x7F81817F, 0x8181817F, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F818181, -0x817F7F81, 0x7F7F8181, 0x7F7F817F, 0x817F8181, 0x81817F7F, 0x81817F7F, 0x7F7F817F, 0x7F817F81, -0x7F81817F, 0x81818181, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x81817F81, 0x7F7F7F81, 0x7F81817F, -0x81817F7F, 0x81818181, 0x8181817F, 0x817F7F7F, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x7F81817F, -0x81818181, 0x7F818181, 0x8181817F, 0x7F818181, 0x7F7F7F81, 0x817F8181, 0x7F818181, 0x817F8181, -0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x817F7F81, 0x7F817F7F, 0x81818181, 0x7F817F7F, -0x817F7F7F, 0x7F817F7F, 0x8181817F, 0x817F817F, 0x7F818181, 0x817F7F81, 0x817F8181, 0x7F817F7F, -0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x817F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F818181, 0x7F7F7F81, -0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, 0x81817F7F, 0x81817F7F, 0x817F8181, -0x81817F7F, 0x81818181, 0x817F7F7F, 0x81817F81, 0x81817F81, 0x8181817F, 0x7F818181, 0x81818181, -0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x817F7F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F81, -0x81817F7F, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x8181817F, 0x817F817F, 0x7F7F7F81, 0x81818181, -0x7F7F8181, 0x817F7F81, 0x81818181, 0x81817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F8181, -0x7F81817F, 0x7F7F7F81, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, -0x817F8181, 0x817F7F81, 0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x7F7F7F7F, 0x8181817F, 0x8181817F, -0x7F818181, 0x7F7F817F, 0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F81817F, -0x817F7F81, 0x7F7F8181, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x817F7F81, 0x817F817F, 0x7F817F7F, -0x817F817F, 0x81817F7F, 0x81817F81, 0x817F7F7F, 0x817F817F, 0x817F7F81, 0x7F81817F, 0x8181817F, -0x8181817F, 0x81817F81, 0x817F817F, 0x7F818181, 0x8181817F, 0x7F818181, 0x8181817F, 0x7F7F817F, -0x7F818181, 0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x817F7F7F, 0x7F7F817F, 0x7F7F8181, -0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x7F818181, 0x81817F7F, 0x7F817F7F, -0x7F818181, 0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x81817F81, 0x81817F7F, 0x817F817F, 0x7F7F817F, -0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x7F81817F, 0x7F7F817F, 0x817F8181, 0x7F7F8181, 0x81817F81, -0x7F817F81, 0x7F7F817F, 0x7F7F817F, 0x81817F81, 0x7F7F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, -0x817F7F7F, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x7F7F817F, 0x81817F81, -0x817F8181, 0x817F7F7F, 0x7F81817F, 0x7F817F81, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, -0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x7F817F81, 0x7F818181, -0x81817F81, 0x7F7F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, 0x81817F81, 0x7F7F7F81, 0x7F817F7F, -0x81818181, 0x81818181, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, -0x817F7F7F, 0x81817F81, 0x8181817F, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F81, -0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F7F817F, 0x81817F81, 0x817F8181, 0x7F818181, -0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x81818181, 0x7F7F7F81, -0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x7F817F81, 0x7F7F8181, 0x7F7F817F, 0x81817F7F, 0x7F7F8181, -0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F81, 0x81818181, 0x7F818181, 0x8181817F, 0x7F7F8181, -0x817F7F81, 0x817F8181, 0x81817F81, 0x7F7F8181, 0x7F817F81, 0x8181817F, 0x817F7F81, 0x7F7F8181, -0x81817F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F818181, -0x81818181, 0x7F81817F, 0x81817F7F, 0x817F817F, 0x7F817F7F, 0x817F817F, 0x81818181, 0x817F7F81, -0x817F7F81, 0x817F7F81, 0x7F7F8181, 0x7F81817F, 0x817F7F81, 0x7F7F8181, 0x81818181, 0x817F7F7F, -0x81818181, 0x7F7F817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F81, -0x7F7F7F81, 0x7F817F7F, 0x81817F7F, 0x81818181, 0x817F817F, 0x81818181, 0x81818181, 0x817F7F7F, -0x7F7F817F, 0x7F7F8181, 0x7F7F8181, 0x817F7F7F, 0x7F81817F, 0x7F7F8181, 0x7F7F8181, 0x81818181, -0x8181817F, 0x7F818181, 0x7F817F81, 0x817F817F, 0x8181817F, 0x817F8181, 0x81818181, 0x7F817F7F, -0x7F7F7F81, 0x7F817F7F, 0x7F7F7F81, 0x817F7F81, 0x817F8181, 0x81817F81, 0x81817F81, 0x7F7F7F81, -0x81817F7F, 0x817F8181, 0x7F817F7F, 0x7F81817F, 0x8181817F, 0x7F818181, 0x81818181, 0x7F7F8181, -0x817F7F7F, 0x817F7F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x7F81817F, 0x81817F7F, -0x81817F81, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F81817F, 0x817F7F7F, -0x7F7F7F81, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x7F7F8181, 0x81817F81, 0x7F7F7F81, -0x7F81817F, 0x7F7F817F, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F8181, -0x7F817F7F, 0x7F7F8181, 0x81818181, 0x81818181, 0x817F8181, 0x81818181, 0x817F8181, 0x7F7F7F81, -0x8181817F, 0x8181817F, 0x7F7F7F7F, 0x7F818181, 0x817F817F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, -0x7F7F7F81, 0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x81817F7F, 0x7F7F817F, 0x817F7F7F, 0x7F817F81, -0x8181817F, 0x81818181, 0x7F817F81, 0x817F7F81, 0x81818181, 0x81817F81, 0x81817F81, 0x7F81817F, -0x7F7F7F81, 0x817F8181, 0x817F7F81, 0x817F817F, 0x7F817F81, 0x817F7F7F, 0x8181817F, 0x8181817F, -0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F81, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, -0x7F817F7F, 0x817F7F81, 0x817F817F, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F7F7F81, 0x7F7F7F7F, -0x7F7F817F, 0x817F7F7F, 0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x81817F7F, -0x7F7F7F7F, 0x81818181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F81, 0x81817F7F, 0x817F7F81, -0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x817F817F, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, -0x7F7F7F81, 0x8181817F, 0x7F818181, 0x817F7F81, 0x7F818181, 0x817F8181, 0x7F817F7F, 0x81818181, -0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x817F817F, 0x7F7F7F81, 0x81817F7F, -0x7F7F817F, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x7F818181, -0x817F7F81, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F7F81, 0x7F818181, 0x7F7F7F81, -0x7F7F817F, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F7F817F, 0x81817F7F, 0x81817F7F, 0x7F817F7F, -0x7F7F7F81, 0x7F7F7F7F, 0x817F817F, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x817F7F81, 0x7F7F8181, -0x7F817F7F, 0x7F818181, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x81818181, 0x7F7F817F, 0x7F817F81, -0x817F817F, 0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x817F7F7F, 0x81818181, 0x7F81817F, -0x8181817F, 0x7F81817F, 0x7F7F8181, 0x817F817F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x817F7F81, -0x81817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, -0x7F81817F, 0x817F8181, 0x7F818181, 0x817F7F7F, 0x7F7F817F, 0x8181817F, 0x81818181, 0x7F7F7F7F, -0x81817F81, 0x8181817F, 0x7F7F7F81, 0x7F7F817F, 0x817F7F81, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, -0x817F817F, 0x817F817F, 0x7F7F8181, 0x817F7F81, 0x81817F81, 0x7F81817F, 0x7F7F7F7F, 0x7F7F7F7F, -0x7F7F7F7F, 0x81817F7F, 0x817F7F81, 0x817F7F7F, 0x81817F81, 0x817F7F7F, 0x7F817F81, 0x8181817F, -0x7F81817F, 0x817F7F81, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x7F818181, 0x8181817F, 0x81817F81, -0x7F7F817F, 0x81817F7F, 0x7F817F7F, 0x7F7F817F, 0x81817F7F, 0x7F818181, 0x8181817F, 0x81817F7F, -0x7F817F81, 0x7F818181, 0x7F81817F, 0x7F818181, 0x817F7F81, 0x7F817F81, 0x7F7F817F, 0x7F7F7F81, -0x7F817F7F, 0x7F7F8181, 0x8181817F, 0x81817F81, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x81817F81, -0x7F7F817F, 0x7F7F7F81, 0x81818181, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x7F81817F, 0x7F817F81, -0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x817F7F81, 0x7F817F81, 0x7F817F7F, 0x7F818181, 0x81818181, -0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x7F818181, 0x7F81817F, 0x7F7F817F, 0x7F7F8181, 0x7F7F817F, -0x7F7F8181, 0x817F817F, 0x8181817F, 0x81818181, 0x81818181, 0x7F817F7F, 0x81817F7F, 0x7F81817F, -0x81817F81, 0x7F817F7F, 0x7F818181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x8181817F, -0x81817F7F, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x81818181, -0x7F7F8181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x7F7F8181, -0x7F817F81, 0x81817F7F, 0x7F817F81, 0x817F7F7F, 0x7F817F7F, 0x7F817F81, 0x7F81817F, 0x7F7F7F81, -0x7F817F7F, 0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F818181, 0x8181817F, 0x81817F7F, 0x7F81817F, -0x7F817F81, 0x7F7F7F81, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x7F817F81, 0x817F817F, 0x8181817F, -0x7F7F8181, 0x7F818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F7F81, -0x817F8181, 0x7F7F817F, 0x7F817F81, 0x817F8181, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x7F818181, -0x7F7F7F7F, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, -0x81818181, 0x817F817F, 0x8181817F, 0x7F81817F, 0x817F817F, 0x817F817F, 0x7F7F817F, 0x7F817F81, -0x7F818181, 0x81817F7F, 0x81817F7F, 0x817F8181, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, -0x8181817F, 0x7F817F81, 0x7F7F8181, 0x7F817F81, 0x817F7F81, 0x7F818181, 0x817F7F81, 0x817F7F7F, -0x7F7F7F81, 0x8181817F, 0x817F8181, 0x7F818181, 0x81818181, 0x81818181, 0x817F7F7F, 0x7F7F817F, -0x7F817F81, 0x81818181, 0x817F7F81, 0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x81817F7F, 0x7F81817F, -0x7F7F7F81, 0x81817F7F, 0x81818181, 0x7F81817F, 0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x817F817F, -0x81818181, 0x7F7F8181, 0x7F7F8181, 0x7F7F7F7F, 0x81818181, 0x81817F81, 0x7F7F7F81, 0x7F81817F, -0x81817F7F, 0x7F818181, 0x817F8181, 0x817F8181, 0x817F8181, 0x7F81817F, 0x7F7F7F81, 0x7F7F8181, -0x817F8181, 0x81818181, 0x7F817F7F, 0x7F818181, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, 0x817F817F, -0x8181817F, 0x7F7F817F, 0x7F818181, 0x7F818181, 0x7F7F8181, 0x817F7F81, 0x7F7F8181, 0x7F817F7F, -0x817F7F81, 0x81817F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F817F, 0x7F7F817F, 0x81817F81, 0x7F817F7F, -0x7F7F817F, 0x7F7F817F, 0x7F817F7F, 0x81818181, 0x7F817F81, 0x81818181, 0x81818181, 0x7F818181, -0x817F7F7F, 0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x817F8181, -0x7F81817F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, -0x7F7F817F, 0x817F8181, 0x81817F7F, 0x81818181, 0x8181817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, -0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F817F, 0x7F7F7F7F, -0x81818181, 0x81818181, 0x81817F81, 0x817F817F, 0x8181817F, 0x817F7F7F, 0x7F7F7F7F, 0x817F817F, -0x8181817F, 0x7F7F7F7F, 0x7F7F7F81, 0x8181817F, 0x7F81817F, 0x817F817F, 0x817F817F, 0x817F817F, -0x7F817F81, 0x81817F7F, 0x7F81817F, 0x7F817F81, 0x7F817F7F, 0x81818181, 0x7F818181, 0x817F7F7F, -0x81817F7F, 0x817F7F7F, 0x817F7F81, 0x7F7F7F81, 0x7F81817F, 0x817F8181, 0x7F81817F, 0x7F81817F, -0x7F7F7F7F, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x81817F7F, 0x8181817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F81817F, 0x817F8181, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F81, -0x817F8181, 0x817F7F81, 0x7F7F8181, 0x7F81817F, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x81817F81, -0x7F7F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F817F, 0x8181817F, 0x7F817F81, 0x7F7F7F81, -0x7F7F7F81, 0x7F817F7F, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x81817F81, 0x7F817F7F, -0x7F817F81, 0x7F818181, 0x817F8181, 0x7F817F7F, 0x817F817F, 0x817F7F81, 0x81818181, 0x7F817F7F, -0x7F817F81, 0x7F818181, 0x7F7F7F7F, 0x81818181, 0x817F7F81, 0x817F8181, 0x817F8181, 0x7F7F7F7F, -0x817F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x7F7F7F81, 0x8181817F, -0x7F7F8181, 0x817F7F81, 0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x817F817F, 0x7F7F7F81, -0x81818181, 0x81817F7F, 0x8181817F, 0x81817F7F, 0x81817F7F, 0x81818181, 0x7F81817F, 0x817F817F, -0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x8181817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x817F8181, -0x7F817F7F, 0x7F817F7F, 0x81818181, 0x7F817F7F, 0x817F8181, 0x817F7F7F, 0x7F81817F, 0x7F7F817F, -0x7F7F7F7F, 0x81817F81, 0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x7F818181, 0x7F818181, 0x81818181, -0x817F8181, 0x81817F81, 0x7F7F817F, 0x817F7F81, 0x817F817F, 0x817F8181, 0x8181817F, 0x81818181, -0x817F8181, 0x817F7F81, 0x7F7F817F, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x7F817F81, 0x7F7F8181, -0x7F7F8181, 0x81818181, 0x817F7F7F, 0x81818181, 0x8181817F, 0x817F8181, 0x8181817F, 0x7F7F7F7F, -0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F8181, 0x817F7F7F, 0x817F817F, 0x81817F7F, 0x7F817F81, -0x7F7F817F, 0x7F817F81, 0x7F818181, 0x7F7F8181, 0x817F817F, 0x817F8181, 0x81818181, 0x7F818181, -0x81817F81, 0x7F817F81, 0x7F7F8181, 0x7F7F8181, 0x817F8181, 0x7F81817F, 0x7F818181, 0x81817F7F, -0x817F7F81, 0x81817F81, 0x817F8181, 0x7F817F81, 0x7F817F81, 0x81817F7F, 0x7F7F7F7F, 0x7F817F81, -0x7F7F8181, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x7F81817F, -0x7F7F7F7F, 0x81818181, 0x7F7F8181, 0x817F8181, 0x8181817F, 0x81817F81, 0x817F8181, 0x81818181, -0x81818181, 0x817F817F, 0x7F7F7F7F, 0x81818181, 0x817F8181, 0x817F8181, 0x7F81817F, 0x81817F7F, -0x7F7F817F, 0x7F817F7F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x7F817F7F, 0x7F7F8181, 0x817F7F81, -0x7F81817F, 0x817F8181, 0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x81817F81, 0x81817F81, 0x7F7F817F, -0x7F81817F, 0x817F817F, 0x7F817F81, 0x817F7F7F, 0x817F817F, 0x817F7F81, 0x7F818181, 0x7F817F7F, -0x7F818181, 0x817F7F7F, 0x817F817F, 0x7F7F817F, 0x7F818181, 0x7F7F817F, 0x7F818181, 0x7F817F7F, -0x817F8181, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, -0x7F7F7F81, 0x81818181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x8181817F, 0x817F7F7F, 0x7F817F7F, -0x81818181, 0x817F8181, 0x7F7F7F81, 0x817F8181, 0x8181817F, 0x7F817F81, 0x7F817F7F, 0x7F817F81, -0x81818181, 0x817F7F7F, 0x81818181, 0x7F7F8181, 0x817F817F, 0x7F7F817F, 0x81818181, 0x7F7F7F81, -0x7F7F817F, 0x7F818181, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x8181817F, 0x817F7F81, -0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, 0x817F817F, -0x7F817F7F, 0x8181817F, 0x7F7F8181, 0x817F817F, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F818181, -0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x8181817F, 0x81818181, -0x817F817F, 0x7F7F8181, 0x7F817F81, 0x81818181, 0x7F81817F, 0x817F817F, 0x81818181, 0x7F7F817F, -0x7F7F817F, 0x81817F81, 0x817F7F81, 0x8181817F, 0x8181817F, 0x817F7F7F, 0x7F818181, 0x7F81817F, -0x7F7F7F81, 0x817F8181, 0x7F7F8181, 0x7F817F81, 0x8181817F, 0x817F817F, 0x7F817F81, 0x81818181, -0x7F817F7F, 0x817F7F81, 0x7F818181, 0x7F7F8181, 0x7F817F81, 0x817F817F, 0x7F7F817F, 0x8181817F, -0x7F817F81, 0x817F8181, 0x7F7F8181, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, 0x817F817F, 0x81818181, -0x7F818181, 0x817F7F81, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F817F, -0x817F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x7F817F81, 0x817F817F, -0x81818181, 0x7F7F817F, 0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x81818181, 0x7F817F7F, 0x7F81817F, -0x7F81817F, 0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x7F81817F, 0x7F81817F, -0x7F7F8181, 0x81817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x817F817F, -0x7F7F817F, 0x81818181, 0x81818181, 0x7F817F81, 0x817F8181, 0x817F7F7F, 0x817F8181, 0x81818181, -0x817F7F7F, 0x817F7F81, 0x81817F81, 0x7F818181, 0x7F81817F, 0x817F7F81, 0x817F817F, 0x7F7F7F81, -0x7F817F81, 0x7F818181, 0x817F817F, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F817F, -0x7F817F81, 0x8181817F, 0x81818181, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F817F, -0x81818181, 0x7F817F81, 0x81818181, 0x817F817F, 0x7F817F7F, 0x81817F7F, 0x817F7F81, 0x817F817F, -0x7F817F7F, 0x81817F81, 0x7F7F8181, 0x81818181, 0x7F7F7F81, 0x81818181, 0x7F818181, 0x817F7F7F, -0x81817F81, 0x817F7F7F, 0x81818181, 0x8181817F, 0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x81818181, -0x81817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x817F7F81, 0x8181817F, 0x7F817F81, -0x7F7F7F7F, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, 0x817F8181, 0x817F8181, 0x81817F81, -0x7F7F7F81, 0x81817F81, 0x7F7F7F7F, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x7F7F7F7F, 0x7F817F7F, -0x7F7F7F81, 0x81817F81, 0x8181817F, 0x8181817F, 0x7F7F7F81, 0x8181817F, 0x7F7F8181, 0x81817F7F, -0x8181817F, 0x7F7F817F, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x81817F7F, 0x7F7F8181, -0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x7F817F7F, 0x7F817F81, 0x8181817F, -0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F817F7F, 0x81817F81, 0x81817F7F, 0x7F818181, 0x7F817F81, -0x81817F7F, 0x7F817F81, 0x817F817F, 0x81818181, 0x81817F81, 0x817F817F, 0x817F7F7F, 0x817F7F7F, -0x817F8181, 0x7F81817F, 0x81817F81, 0x81817F81, 0x7F817F7F, 0x817F8181, 0x817F7F81, 0x7F7F8181, -0x817F8181, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x8181817F, -0x817F8181, 0x7F817F7F, 0x817F817F, 0x817F8181, 0x81817F7F, 0x7F817F81, 0x817F8181, 0x7F81817F, -0x81818181, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x81817F7F, 0x7F817F7F, -0x7F7F817F, 0x7F7F8181, 0x817F817F, 0x7F7F817F, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, 0x8181817F, -0x817F817F, 0x7F7F7F81, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F81, -0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x81817F7F, 0x7F7F8181, 0x7F7F8181, 0x817F817F, 0x7F7F7F7F, -0x7F7F817F, 0x7F7F7F81, 0x7F818181, 0x7F817F7F, 0x7F7F817F, 0x81818181, 0x817F8181, 0x817F817F, -0x7F817F81, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F818181, 0x81818181, 0x7F817F7F, 0x7F817F7F, -0x7F81817F, 0x7F7F817F, 0x81818181, 0x817F817F, 0x817F7F7F, 0x7F7F7F81, 0x81818181, 0x7F81817F, -0x7F7F8181, 0x7F7F7F81, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x817F8181, -0x7F7F817F, 0x7F81817F, 0x81818181, 0x81817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F818181, -0x7F818181, 0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x817F8181, -0x817F7F81, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x81818181, 0x817F817F, 0x7F7F8181, -0x817F7F81, 0x8181817F, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x7F818181, 0x817F7F7F, 0x817F7F7F, -0x817F817F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x81818181, 0x817F8181, 0x7F7F817F, 0x7F81817F, -0x7F7F8181, 0x7F7F8181, 0x7F818181, 0x817F817F, 0x81818181, 0x81817F81, 0x81817F7F, 0x7F7F7F81, -0x7F818181, 0x81818181, 0x7F818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F7F7F7F, -0x817F7F7F, 0x7F7F817F, 0x7F817F81, 0x81818181, 0x7F7F7F81, 0x81818181, 0x817F817F, 0x8181817F, -0x817F8181, 0x817F7F81, 0x817F8181, 0x817F7F7F, 0x7F818181, 0x7F818181, 0x81817F7F, 0x81817F81, -0x7F7F8181, 0x7F818181, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F81, 0x7F7F8181, -0x817F8181, 0x8181817F, 0x81817F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x81818181, 0x7F7F8181, -0x81818181, 0x7F7F7F81, 0x7F818181, 0x7F7F8181, 0x817F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x817F7F81, -0x817F8181, 0x817F7F7F, 0x7F7F817F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x7F7F817F, 0x817F7F81, -0x81817F81, 0x81817F7F, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x7F7F817F, 0x817F817F, 0x7F81817F, -0x81817F7F, 0x817F817F, 0x7F81817F, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F818181, -0x7F7F7F7F, 0x817F7F81, 0x81817F81, 0x7F817F81, 0x81818181, 0x81817F7F, 0x7F817F81, 0x7F7F7F7F, -0x7F7F7F81, 0x81818181, 0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x81817F81, 0x7F818181, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x817F8181, 0x81818181, 0x7F817F81, -0x7F7F817F, 0x817F817F, 0x81817F7F, 0x817F7F7F, 0x81817F81, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, -0x81817F81, 0x81817F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, 0x817F8181, -0x81817F7F, 0x817F8181, 0x81818181, 0x817F817F, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x7F817F7F, -0x7F7F817F, 0x817F817F, 0x817F8181, 0x8181817F, 0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x81817F7F, -0x81817F7F, 0x7F7F7F81, 0x7F7F8181, 0x817F7F81, 0x7F7F7F81, 0x7F81817F, 0x81818181, 0x81818181, -0x8181817F, 0x817F7F7F, 0x81817F81, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x7F817F81, 0x81817F7F, -0x7F81817F, 0x817F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F7F, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F7F, -0x7F7F8181, 0x817F7F81, 0x7F7F7F7F, 0x817F7F81, 0x7F81817F, 0x817F7F81, 0x817F7F81, 0x81818181, -0x817F817F, 0x817F817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x7F7F7F81, -0x7F7F817F, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, 0x817F7F7F, 0x81817F7F, -0x81818181, 0x8181817F, 0x81817F81, 0x7F818181, 0x817F8181, 0x7F818181, 0x817F8181, 0x81818181, -0x7F7F7F81, 0x81817F7F, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x817F817F, -0x7F7F817F, 0x8181817F, 0x7F81817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x7F817F81, 0x81818181, -0x817F7F81, 0x81818181, 0x7F81817F, 0x81818181, 0x7F817F81, 0x7F7F7F81, 0x7F7F8181, 0x7F817F81, -0x7F817F81, 0x8181817F, 0x7F81817F, 0x817F817F, 0x817F817F, 0x81817F81, 0x817F817F, 0x81817F81, -0x7F7F8181, 0x81817F7F, 0x7F817F81, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, 0x817F817F, 0x817F7F81, -0x81817F7F, 0x817F7F7F, 0x7F7F8181, 0x817F7F81, 0x817F7F81, 0x7F818181, 0x8181817F, 0x7F7F7F81, -0x817F8181, 0x7F7F817F, 0x817F8181, 0x7F81817F, 0x7F81817F, 0x81817F7F, 0x7F7F7F7F, 0x817F7F7F, -0x8181817F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x81817F81, 0x81817F81, 0x81818181, 0x8181817F, -0x817F817F, 0x7F817F7F, 0x817F817F, 0x7F7F7F7F, 0x8181817F, 0x817F817F, 0x817F817F, 0x7F817F81, -0x8181817F, 0x8181817F, 0x7F7F8181, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x81818181, 0x7F817F81, -0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x817F7F7F, 0x7F81817F, 0x7F818181, 0x817F8181, 0x7F81817F, -0x7F817F7F, 0x8181817F, 0x817F8181, 0x817F817F, 0x817F817F, 0x81817F81, 0x8181817F, 0x7F817F81, -0x7F7F817F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x81817F81, -0x817F817F, 0x81817F81, 0x8181817F, 0x7F817F7F, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F817F81, -0x7F817F81, 0x817F8181, 0x7F7F8181, 0x7F7F817F, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F817F81, -0x817F8181, 0x81818181, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F818181, 0x817F8181, 0x817F8181, -0x817F8181, 0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F81817F, 0x81818181, 0x7F7F7F7F, -0x7F818181, 0x817F817F, 0x817F7F81, 0x817F7F81, 0x8181817F, 0x817F7F81, 0x81818181, 0x817F7F81, -0x81817F7F, 0x7F7F7F81, 0x7F817F7F, 0x7F7F8181, 0x7F7F8181, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, -0x7F7F7F7F, 0x7F81817F, 0x81817F81, 0x7F818181, 0x7F81817F, 0x817F817F, 0x7F7F7F81, 0x7F7F817F, -0x7F7F8181, 0x817F7F81, 0x817F7F7F, 0x7F817F7F, 0x7F81817F, 0x817F7F81, 0x8181817F, 0x81817F81, -0x8181817F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F7F, 0x81818181, 0x817F7F7F, 0x7F7F817F, 0x7F817F81, -0x81817F81, 0x7F7F7F7F, 0x7F818181, 0x7F818181, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x81818181, -0x81818181, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, 0x817F7F81, -0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F7F, 0x81818181, -0x81818181, 0x7F817F7F, 0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x7F81817F, 0x8181817F, 0x81818181, -0x7F817F7F, 0x81818181, 0x81818181, 0x81817F7F, 0x7F818181, 0x7F7F7F81, 0x81817F7F, 0x7F817F81, -0x817F8181, 0x7F817F81, 0x817F7F7F, 0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F817F, -0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, 0x81817F7F, -0x7F817F81, 0x7F81817F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x81817F81, 0x7F817F7F, 0x7F817F81, -0x81818181, 0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F7F81, -0x817F7F7F, 0x81817F7F, 0x7F7F817F, 0x817F8181, 0x7F817F7F, 0x81818181, 0x817F8181, 0x817F817F, -0x7F818181, 0x7F7F7F7F, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x7F817F7F, 0x7F7F7F81, 0x817F7F81, -0x817F7F81, 0x7F7F7F7F, 0x817F8181, 0x817F8181, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x817F7F81, -0x7F7F817F, 0x8181817F, 0x81818181, 0x817F817F, 0x7F7F7F81, 0x7F81817F, 0x7F817F81, 0x817F7F81, -0x7F818181, 0x7F7F7F81, 0x81817F81, 0x7F817F7F, 0x81818181, 0x817F7F7F, 0x7F817F81, 0x817F8181, -0x81817F81, 0x7F81817F, 0x7F7F8181, 0x81818181, 0x81817F7F, 0x8181817F, 0x7F81817F, 0x81817F7F, -0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x81818181, 0x817F817F, 0x817F7F81, -0x7F7F817F, 0x817F7F81, 0x7F7F817F, 0x8181817F, 0x8181817F, 0x8181817F, 0x7F817F7F, 0x817F8181, -0x81818181, 0x817F7F7F, 0x817F817F, 0x81818181, 0x7F81817F, 0x7F7F8181, 0x817F7F7F, 0x817F8181, -0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x7F7F7F7F, 0x81817F7F, 0x81818181, 0x7F7F817F, -0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x817F7F81, 0x817F7F7F, 0x7F81817F, -0x8181817F, 0x817F8181, 0x7F7F7F81, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F818181, -0x8181817F, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x7F818181, 0x8181817F, 0x7F7F817F, 0x81817F7F, -0x7F7F817F, 0x7F817F81, 0x817F8181, 0x817F7F7F, 0x817F817F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, -0x7F81817F, 0x817F7F81, 0x7F818181, 0x81817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x81818181, -0x81818181, 0x7F81817F, 0x817F7F81, 0x7F817F81, 0x817F817F, 0x817F817F, 0x817F8181, 0x81818181, -0x817F8181, 0x817F7F7F, 0x81817F7F, 0x81817F7F, 0x81817F81, 0x81818181, 0x7F7F8181, 0x81817F7F, -0x7F7F7F81, 0x7F81817F, 0x81817F81, 0x7F7F817F, 0x81817F7F, 0x81817F81, 0x81818181, 0x7F7F7F7F, -0x81817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x8181817F, 0x817F8181, 0x817F7F7F, 0x7F7F7F7F, -0x81817F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x817F7F81, 0x7F818181, 0x817F7F81, 0x81817F81, -0x7F7F8181, 0x7F7F817F, 0x81817F7F, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F818181, 0x7F7F817F, -0x7F7F7F81, 0x817F7F81, 0x7F817F7F, 0x7F818181, 0x8181817F, 0x7F7F8181, 0x81818181, 0x817F8181, -0x7F817F7F, 0x7F81817F, 0x81818181, 0x817F8181, 0x7F81817F, 0x817F7F81, 0x81818181, 0x7F817F81, -0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, 0x81818181, 0x817F8181, 0x7F7F7F7F, -0x817F7F7F, 0x81818181, 0x81818181, 0x81818181, 0x7F7F8181, 0x7F7F817F, 0x81817F81, 0x817F7F81, -0x7F81817F, 0x7F7F8181, 0x7F7F7F81, 0x7F817F7F, 0x81818181, 0x7F7F7F7F, 0x81817F7F, 0x7F7F7F7F, -0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x7F817F81, 0x817F817F, 0x7F817F81, 0x7F7F7F81, 0x7F817F7F, -0x817F8181, 0x7F7F8181, 0x7F7F817F, 0x7F817F81, 0x81817F81, 0x81817F81, 0x817F817F, 0x7F818181, -0x81818181, 0x817F817F, 0x817F7F81, 0x81818181, 0x817F7F7F, 0x7F7F8181, 0x7F817F81, 0x8181817F, -0x7F7F7F81, 0x7F817F81, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x7F818181, 0x7F818181, 0x817F7F81, -0x7F7F7F7F, 0x81818181, 0x7F817F7F, 0x8181817F, 0x81818181, 0x81817F7F, 0x81818181, 0x7F818181, -0x81817F81, 0x7F81817F, 0x7F817F7F, 0x7F817F81, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, -0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x7F81817F, 0x81818181, 0x7F7F7F81, -0x7F7F8181, 0x7F818181, 0x817F7F81, 0x7F818181, 0x817F817F, 0x7F817F81, 0x7F81817F, 0x7F817F7F, -0x7F817F7F, 0x81817F7F, 0x81817F81, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x7F817F7F, -0x817F817F, 0x7F7F8181, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, -0x7F7F817F, 0x7F817F81, 0x81817F7F, 0x81817F81, 0x7F81817F, 0x81818181, 0x7F817F7F, 0x8181817F, -0x817F8181, 0x7F7F7F81, 0x817F7F81, 0x817F817F, 0x817F8181, 0x7F818181, 0x7F81817F, 0x7F7F8181, -0x7F81817F, 0x7F81817F, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x8181817F, 0x7F818181, -0x7F7F817F, 0x81818181, 0x817F7F81, 0x7F817F81, 0x8181817F, 0x7F81817F, 0x817F8181, 0x7F7F8181, -0x81818181, 0x7F7F817F, 0x7F818181, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, -0x817F7F81, 0x7F81817F, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x7F7F817F, 0x7F818181, 0x7F817F81, -0x817F7F81, 0x7F818181, 0x81818181, 0x817F8181, 0x81817F7F, 0x7F817F81, 0x7F7F7F7F, 0x817F7F7F, -0x7F7F817F, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x7F818181, 0x7F81817F, 0x81818181, -0x7F818181, 0x817F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F8181, 0x81818181, 0x81817F81, 0x7F818181, -0x81817F81, 0x817F8181, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x817F817F, 0x7F817F7F, 0x7F7F8181, -0x817F7F81, 0x817F8181, 0x7F817F81, 0x7F818181, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x7F81817F, -0x7F818181, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, 0x817F7F7F, 0x8181817F, 0x81818181, 0x7F7F7F81, -0x7F817F81, 0x7F818181, 0x7F7F817F, 0x7F817F81, 0x7F7F7F81, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F81, -0x7F817F81, 0x7F818181, 0x7F817F81, 0x7F7F7F7F, 0x7F81817F, 0x8181817F, 0x817F7F7F, 0x7F7F8181, -0x81817F7F, 0x81817F7F, 0x7F818181, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x817F8181, 0x817F8181, -0x7F818181, 0x7F81817F, 0x8181817F, 0x7F7F817F, 0x81818181, 0x7F7F7F81, 0x81818181, 0x7F7F7F7F, -0x817F817F, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x7F818181, 0x817F7F81, 0x7F7F817F, 0x817F8181, -0x7F817F81, 0x817F8181, 0x8181817F, 0x81817F7F, 0x7F817F81, 0x7F7F8181, 0x7F7F8181, 0x7F818181, -0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x7F7F7F7F, 0x817F817F, 0x7F7F8181, -0x817F7F7F, 0x7F817F81, 0x81817F81, 0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x7F81817F, 0x7F817F81, -0x7F7F7F7F, 0x817F7F7F, 0x7F817F81, 0x817F817F, 0x81817F81, 0x81817F7F, 0x7F817F81, 0x7F7F7F81, -0x7F7F7F7F, 0x8181817F, 0x817F7F81, 0x7F81817F, 0x7F81817F, 0x81817F7F, 0x8181817F, 0x81817F7F, -0x7F817F81, 0x7F818181, 0x817F817F, 0x81817F81, 0x7F7F8181, 0x817F7F81 - -output0 = -0x02524C20, 0xB9B1FEA2, 0xC1BAB7E5, 0xEF5714CB, 0x7DE6A64D, 0xA05F9DC9, 0x0747D1E3, 0x3B20BC86, -0x6FCBDB0F, 0xF2FB7A23, 0x79D5E062, 0x5BF4E7C3, 0xD4A68A37, 0x07B4A6AD, 0x37E911F9, 0x7FE7B30A, -0xBBC284A2, 0xD38D6136, 0x25FAB76B, 0xBEBBF534, 0x9A88F9DB, 0xE37FD52D, 0x691DD493, 0xED2F738C, -0x89A96EA0, 0xD981246A, 0x17CC820E, 0x07E3B463, 0xC9FC2590, 0x7475A33C, 0xA5151BB4, 0x1F7E759E, -0x9554F964, 0xD0FA01F4, 0xD31774D2, 0xEB73A9F6, 0x8C9FBCB1, 0xF83010FB, 0x1909E09F, 0xC46023EB, -0x02AEDC62, 0xC6352CC7, 0x674BDC6D, 0xE17CD747, 0x4E25B0B3, 0x4BFF6B17, 0x12C9AAA3, 0xC2BC91CD, -0x44BE23A2, 0x8A72A157, 0x6E0DAD1F, 0x6CA69A09, 0xB55B582E, 0x01818B31, 0x5CA5CAB6, 0x1917AB24, -0x38F98BCD, 0x01917487, 0x05906FDD, 0x760AFCBA, 0x19671085, 0x64E3546E, 0xEC10F922, 0x3CF286CA, -0x68E273EA, 0xF1001325, 0x5DCB3B49, 0xE9547370, 0x65D26AE6, 0xF621256C, 0x25D6D99C, 0x7862EBA0, -0x43365DB0, 0x4DBF06C5, 0x92FCAA02, 0xB0FD58FA, 0x910E80A6, 0x93D24A67, 0x6E39B144, 0x3D46D6F6, -0xEDC55081, 0x33CD70C7, 0xC74B6E8E, 0x91AA27B9, 0x55B3542D, 0xEBF8046A, 0xB9ABDB94, 0x97FC38A8, -0xD5837B4D, 0x764B1809, 0xFBE2096A, 0xC23887AC, 0x2A45029B, 0xCBB7DF70, 0x674654E1, 0x0C6A06BD, -0xB3E8853E, 0x03FCC4CE, 0x26806F2E, 0x2CEB35B0, 0x10538B03, 0x94B059B8, 0xA95E7FFA, 0x48AD3D0A, -0xEB9091E1, 0x972E31EF, 0x5EBC6F8F, 0x947FF108, 0xCB3123FA, 0xFEE1D939, 0xF3DC5C49, 0xA92927AE, -0xF49BB8D0, 0xAA59F730, 0x4A66D1CD, 0x030E1ADF, 0x238D5B19, 0x96F861F1, 0x915424E4, 0x9127880C, -0x8E779839, 0x87375FCE, 0x61FB3D79, 0x96B1EE83, 0x47BF6667, 0x19E7D408, 0x7E91137F, 0x0E4AD8E8, -0xDABD2E45, 0x9B60873F, 0xD0294A65, 0x2A38A862, 0x59DD046D, 0x9832BB79, 0xA5870DB6, 0xB3F1CC48, -0x7E9A8132, 0xEEA2E4BC, 0xF23ED87B, 0x550E011F, 0x9620E0C0, 0xE7CF0834, 0xDEE69623, 0x6184D512, -0xD3D55728, 0xFA7711D4, 0x9C77B0F9, 0x8A26462B, 0xB3F5C8D5, 0x1123246D, 0x78F36272, 0x940EE0F9, -0x757BF240, 0x7EE2B6D0, 0xD40FD5A1, 0xAB4205CA, 0x96E6B758, 0xAC5F4294, 0xC9268C66, 0xB48DC535, -0x3CF6ED4C, 0xF187EFED, 0x7A09B08D, 0x8709EFCE, 0x267B2468, 0x0015D770, 0xDF1B90BF, 0xA03DAD85, -0x2633012E, 0xE5437125, 0x58B79AFF, 0xB929C532, 0x6D890DC9, 0x89A59AD2, 0x2BB99316, 0x41B5B0EB, -0x7304B295, 0xB37F6708, 0x2F84A68E, 0x3637D79A, 0xDD36687B, 0x904BF7B6, 0x6A2CF453, 0x733DED54, -0x5DF48BAA, 0xC3FCC99F, 0x8E3BE1DB, 0x61D9CF2D, 0xB7DC202B, 0xA959FF95, 0x860D0F14, 0x4008C478, -0xD9325A51, 0x27A29D4C, 0x308FE6D4, 0x7A1AA889, 0x5BD38393, 0xCBFA5D - -basegraph= -1 - -z_c= -320 - -n_cb= -21120 - -q_m= -4 - -n_filler= -688 - -e = -21592 - -rv_index = -0 - -code_block_mode = -1 - -iter_max = -20 - -expected_iter_count = -3 - -op_flags = -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v7813.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v7813.data deleted file mode 100644 index c656fd3e4a..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v7813.data +++ /dev/null @@ -1,48 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x7F817F81, 0x7F81817F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x817F8181, 0x817F7F7F, 0x7F817F81, -0x817F7F7F, 0x8181817F, 0x8181817F - -output0 = -0x8C4DEB9F, 0x52 - -basegraph= -2 - -z_c= -7 - -n_cb= -350 - -q_m= -2 - -n_filler= -30 - -e = -44 - -rv_index = -0 - -code_block_mode = -1 - -iter_max = -8 - -expected_iter_count = -6 - -op_flags = -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data deleted file mode 100644 index 6101f40239..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8480.data +++ /dev/null @@ -1,135 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x81817F81, 0x817F7F7F, 0x7F817F7F, 0x7F817F7F, 0x8181817F, 0x817F817F, 0x817F817F, 0x7F818181, -0x7F817F7F, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x81817F7F, 0x8181817F, 0x81818181, -0x817F8181, 0x7F7F7F81, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, -0x7F7F7F81, 0x817F8181, 0x7F818181, 0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x7F817F7F, 0x7F81817F, -0x7F818181, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x7F81817F, 0x817F7F81, 0x81817F81, 0x817F817F, -0x7F7F8181, 0x817F7F81, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x7F7F817F, -0x8181817F, 0x817F8181, 0x7F817F81, 0x817F8181, 0x8181817F, 0x817F8181, 0x7F817F81, 0x8181817F, -0x7F7F8181, 0x7F7F817F, 0x7F81817F, 0x81817F7F, 0x7F7F8181, 0x8181817F, 0x7F818181, 0x81817F81, -0x7F7F817F, 0x7F7F8181, 0x7F817F81, 0x7F81817F, 0x817F7F81, 0x81818181, 0x7F817F81, 0x7F7F7F7F, -0x7F817F7F, 0x81817F7F, 0x817F7F7F, 0x7F818181, 0x7F7F817F, 0x81817F81, 0x8181817F, 0x7F81817F, -0x8181817F, 0x817F8181, 0x7F817F7F, 0x817F817F, 0x81818181, 0x7F81817F, 0x817F817F, 0x81817F81, -0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x81818181, -0x81817F81, 0x817F7F7F, 0x817F7F81, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x817F817F, 0x7F7F817F, -0x81817F7F, 0x7F7F817F, 0x817F8181, 0x817F8181, 0x7F81817F, 0x817F817F, 0x817F7F7F, 0x81817F81, -0x81817F7F, 0x8181817F, 0x817F7F81, 0x81817F81, 0x7F7F817F, 0x7F7F8181, 0x7F7F817F, 0x81817F81, -0x81817F7F, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x8181817F, 0x81818181, 0x7F817F7F, 0x7F7F8181, -0x7F7F7F81, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x81818181, 0x8181817F, 0x7F81817F, 0x7F818181, -0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x817F7F7F, 0x7F81817F, 0x7F7F7F7F, -0x7F818181, 0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x7F7F8181, 0x7F7F8181, 0x8181817F, 0x7F7F817F, -0x7F81817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, 0x7F7F8181, 0x817F8181, 0x817F7F7F, -0x7F7F817F, 0x817F8181, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x81817F81, -0x7F7F817F, 0x8181817F, 0x817F817F, 0x7F7F7F7F, 0x7F818181, 0x7F7F817F, 0x7F818181, 0x817F7F81, -0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x81817F81, 0x7F817F81, 0x81818181, 0x7F7F8181, 0x817F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x81818181, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, 0x7F818181, 0x817F8181, 0x817F817F, 0x7F7F817F, -0x7E817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F71, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81818181 - -output0 = -0x66667859, 0x417B1254, 0xEC8A8CFE, 0xE7EFCD06, 0x43C5BDA2, 0x2EACD776, 0x6CD515AC, 0x6D6E04AC, -0xB9999F85, 0xD3643553, 0xD0C8DF8E, 0x235B434A, 0xD7AB7643, 0xA4D9C420, 0x372FA858, 0xF813CE10, -0xE0C238F6, 0x07853FD4, 0xE04E40F2, 0x0EE765A9, 0x6EEAFCBC, 0xA7059C68, 0xFBBC - -basegraph= -2 - -z_c= -72 - -n_cb= -3600 - -q_m= -2 - -n_filler= -176 - -e = -2760 - -rv_index = -0 - -code_block_mode = -1 - -iter_max = -8 - -expected_iter_count = -3 - -op_flags = -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8568.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8568.data deleted file mode 100644 index 0b95e4e0fa..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v8568.data +++ /dev/null @@ -1,255 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x7F7F7F7F, 0x7F7F7F7F, 0x8181817F, 0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x81818181, -0x7F818181, 0x817F817F, 0x81818181, 0x7F7F7F7F, 0x7F81817F, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, -0x7F817F7F, 0x817F8181, 0x7F818181, 0x817F817F, 0x8181817F, 0x7F7F8181, 0x8181817F, 0x817F7F7F, -0x7F7F817F, 0x7F7F817F, 0x81818181, 0x81817F81, 0x7F7F7F81, 0x7F81817F, 0x7F818181, 0x7F818181, -0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x7F818181, 0x7F81817F, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, -0x81817F81, 0x817F817F, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F817F7F, 0x817F817F, 0x7F7F7F81, -0x7F7F817F, 0x817F817F, 0x81818181, 0x7F81817F, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x7F7F8181, -0x7F818181, 0x7F81817F, 0x7F81817F, 0x81817F7F, 0x817F7F81, 0x7F818181, 0x7F817F81, 0x7F818181, -0x81817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, 0x817F8181, 0x7F817F7F, 0x7F7F7F81, -0x7F7F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, 0x817F7F81, 0x817F7F81, 0x81818181, -0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F8181, 0x817F8181, 0x7F81817F, -0x817F817F, 0x7F817F81, 0x7F7F8181, 0x7F817F81, 0x7F7F817F, 0x7F817F81, 0x81817F7F, 0x817F817F, -0x81818181, 0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F7F7F81, 0x817F8181, 0x817F8181, 0x7F81817F, -0x7F7F817F, 0x817F817F, 0x7F7F817F, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x7F817F81, -0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F8181, 0x7F7F7F7F, 0x817F8181, 0x7F7F8181, 0x81818181, -0x81818181, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F81817F, 0x817F7F81, -0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F817F7F, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, -0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x817F817F, 0x7F818181, 0x817F7F81, 0x817F817F, 0x8181817F, -0x817F7F81, 0x7F7F7F7F, 0x7F817F81, 0x81818181, 0x817F7F81, 0x81817F81, 0x817F7F81, 0x7F817F7F, -0x817F8181, 0x7F7F7F81, 0x7F817F81, 0x8181817F, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x7F818181, -0x7F7F7F81, 0x7F817F81, 0x81818181, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x817F817F, 0x7F818181, -0x817F817F, 0x81817F7F, 0x81817F81, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x81818181, 0x81818181, -0x8181817F, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x7F818181, -0x7F817F81, 0x7F817F7F, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F817F, 0x817F8181, -0x817F817F, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x81817F81, -0x7F7F7F81, 0x8181817F, 0x7F7F817F, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x81817F81, 0x7F7F7F81, -0x81818181, 0x7F7F8181, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x7F81817F, 0x817F7F81, -0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x817F7F81, 0x817F8181, 0x7F7F8181, 0x81818181, 0x817F817F, -0x817F7F7F, 0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x7F7F7F81, 0x7F818181, 0x7F7F817F, 0x81818181, -0x817F8181, 0x7F817F81, 0x7F7F7F81, 0x7F817F7F, 0x81817F81, 0x7F81817F, 0x817F7F7F, 0x7F7F8181, -0x817F7F7F, 0x7F7F817F, 0x7F818181, 0x817F7F81, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x81818181, -0x81817F7F, 0x7F7F7F7F, 0x81817F81, 0x7F817F81, 0x817F8181, 0x7F818181, 0x7F7F7F81, 0x81817F81, -0x7F818181, 0x7F817F7F, 0x8181817F, 0x8181817F, 0x7F81817F, 0x8181817F, 0x7F7F817F, 0x81817F81, -0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x817F7F7F, 0x81817F81, 0x81818181, 0x7F818181, 0x81818181, -0x7F81817F, 0x8181817F, 0x817F8181, 0x81818181, 0x81818181, 0x7F7F7F7F, 0x7F7F7F81, 0x817F817F, -0x7F7F7F7F, 0x817F7F7F, 0x817F8181, 0x7F817F7F, 0x817F8181, 0x81817F81, 0x817F817F, 0x817F817F, -0x817F7F7F, 0x7F817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F8181, 0x81818181, -0x8181817F, 0x81817F7F, 0x817F8181, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x7F81817F, -0x7F817F81, 0x81818181, 0x7F7F8181, 0x81818181, 0x7F7F817F, 0x81817F7F, 0x817F7F7F, 0x81818181, -0x7F818181, 0x817F7F81, 0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x817F7F7F, 0x817F817F, 0x7F7F8181, -0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x7F81817F, 0x81817F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F8181, -0x8181817F, 0x7F817F81, 0x7F818181, 0x7F7F817F, 0x7F818181, 0x7F7F817F, 0x81818181, 0x7F7F7F81, -0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, 0x81818181, -0x7F7F8181, 0x8181817F, 0x7F81817F, 0x81817F81, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F8181, -0x7F7F7F81, 0x7F817F81, 0x8181817F, 0x7F7F817F, 0x81817F81, 0x817F7F81, 0x81818181, 0x8181817F, -0x817F7F81, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x7F818181, 0x817F817F, 0x7F81817F, 0x817F8181, -0x8181817F, 0x81817F7F, 0x817F7F81, 0x81817F7F, 0x817F7F7F, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, -0x7F7F7F81, 0x7F7F8181, 0x7F7F8181, 0x7F817F7F, 0x8181817F, 0x817F8181, 0x817F817F, 0x81818181, -0x81817F7F, 0x817F7F81, 0x7F81817F, 0x81818181, 0x81818181, 0x7F817F7F, 0x7F81817F, 0x7F7F7F81, -0x7F7F7F81, 0x7F817F81, 0x7F818181, 0x817F7F7F, 0x7F7F817F, 0x8181817F, 0x7F817F81, 0x7F817F81, -0x7F817F81, 0x81818181, 0x817F8181, 0x7F817F81, 0x817F7F81, 0x7F7F8181, 0x7F7F817F, 0x8181817F, -0x81817F81, 0x81817F7F, 0x7F7F8181, 0x81817F81, 0x817F7F81, 0x817F8181, 0x7F818181, 0x817F7F7F, -0x817F817F, 0x817F8181, 0x7F7F817F, 0x8181817F, 0x7F817F7F, 0x81817F81, 0x7F817F81, 0x8181817F, -0x817F8181, 0x7F7F817F, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, -0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x817F7F7F, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x7F7F8181, -0x817F7F7F, 0x817F8181, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F818181, -0x7F817F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F81817F, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x81818181, -0x7F818181, 0x817F7F7F, 0x817F7F81, 0x81818181, 0x81817F81, 0x817F8181, 0x7F7F7F81, 0x7F81817F, -0x7F818181, 0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x81818181, 0x817F7F7F, -0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x817F817F, 0x7F817F7F, 0x81817F81, 0x7F81817F, -0x817F7F81, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F817F7F, 0x7F818181, -0x7F7F8181, 0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x817F817F, -0x817F7F7F, 0x7F818181, 0x81817F81, 0x817F817F, 0x81818181, 0x817F7F81, 0x817F7F7F, 0x7F7F817F, -0x7F7F8181, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x81817F7F, 0x8181817F, 0x817F8181, -0x817F817F, 0x81818181, 0x7F7F817F, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x817F7F7F, -0x817F817F, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x7F818181, 0x7F7F8181, 0x8181817F, 0x7F817F7F, -0x7F7F7F7F, 0x7F81817F, 0x7F817F81, 0x817F7F7F, 0x817F7F81, 0x8181817F, 0x81818181, 0x817F7F81, -0x7F81817F, 0x7F817F7F, 0x7F817F7F, 0x81818181, 0x81817F7F, 0x7F81817F, 0x81817F7F, 0x81818181, -0x7F7F7F81, 0x817F817F, 0x7F7F8181, 0x7F817F81, 0x817F817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F817F, -0x7F7F7F81, 0x7F818181, 0x7F817F81, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x817F8181, -0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x81817F7F, 0x81817F7F, 0x81817F81, 0x81817F81, 0x8181817F, -0x817F8181, 0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x7F81817F, 0x7F818181, 0x81817F81, -0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x81817F81, 0x7F7F8181, 0x7F818181, 0x817F817F, 0x7F7F7F81, -0x7F818181, 0x7F817F81, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x817F7F7F, 0x8181817F, 0x81817F7F, -0x7F818181, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, 0x8181817F, -0x7F818181, 0x7F7F7F81, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, -0x7F7F7F81, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x7F818181, 0x7F817F81, 0x7F7F7F7F, -0x7F818181, 0x7F7F7F7F, 0x81817F81, 0x7F818181, 0x817F8181, 0x81817F81, 0x817F7F81, 0x7F7F8181, -0x7F7F7F81, 0x817F817F, 0x7F817F81, 0x7F818181, 0x7F817F81, 0x81818181, 0x81817F81, 0x7F817F81, -0x7F7F7F81, 0x7F817F81, 0x81818181, 0x81817F81, 0x817F817F, 0x7F7F8181, 0x817F7F7F, 0x81817F81, -0x7F7F7F7F, 0x817F7F81, 0x817F817F, 0x7F817F7F, 0x7F81817F, 0x81817F81, 0x81818181, 0x7F81817F, -0x81817F81, 0x81817F81, 0x81817F7F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x817F7F81, 0x8181817F, -0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F817F7F, 0x7F817F81, -0x7F818181, 0x8181817F, 0x817F817F, 0x7F7F7F81, 0x81817F7F, 0x817F7F81, 0x8181817F, 0x7F818181, -0x7F7F8181, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x81818181, 0x817F8181, 0x81817F7F, -0x7F7F817F, 0x81817F7F, 0x7F818181, 0x7F817F81, 0x81817F7F, 0x81817F81, 0x817F8181, 0x8181817F, -0x81817F7F, 0x7F818181, 0x7F7F817F, 0x817F8181, 0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x7F7F817F, -0x817F8181, 0x8181817F, 0x7F7F8181, 0x7F817F7F, 0x8181817F, 0x7F817F7F, 0x817F7F81, 0x81817F7F, -0x8181817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x817F7F81, -0x81818181, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, 0x7F817F81, 0x817F7F81, 0x81817F81, 0x81817F7F, -0x7F81817F, 0x7F817F7F, 0x81817F81, 0x7F81817F, 0x7F81817F, 0x817F8181, 0x81818181, 0x7F817F81, -0x817F817F, 0x7F7F7F7F, 0x8181817F, 0x817F817F, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x7F818181, -0x7F7F8181, 0x7F817F7F, 0x817F817F, 0x8181817F, 0x81818181, 0x8181817F, 0x817F8181, 0x817F8181, -0x7F818181, 0x8181817F, 0x817F817F, 0x817F8181, 0x7F817F7F, 0x7F81817F, 0x7F817F81, 0x8181817F, -0x7F817F81, 0x7F81817F, 0x7F817F81, 0x817F7F7F, 0x81817F81, 0x81818181, 0x817F817F, 0x817F7F7F, -0x817F817F, 0x817F8181, 0x81817F7F, 0x7F817F7F, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x81817F7F, -0x817F817F, 0x81817F7F, 0x7F818181, 0x817F7F81, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x81818181, -0x817F8181, 0x81817F81, 0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x7F7F817F, 0x817F7F7F, 0x8181817F, -0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x7F81817F, 0x817F8181, 0x7F81817F, 0x81817F81, -0x7F817F7F, 0x81817F81, 0x8181817F, 0x8181817F, 0x81817F7F, 0x817F817F, 0x7F818181, 0x81817F7F, -0x817F7F7F, 0x8181817F, 0x7F817F7F, 0x7F81817F, 0x7F81817F, 0x817F7F7F, 0x81817F7F, 0x7F817F7F, -0x7F818181, 0x81817F81, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x81817F81, 0x7F7F8181, 0x817F7F7F, -0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, -0x817F817F, 0x7F7F817F, 0x7F81817F, 0x817F7F7F, 0x817F817F, 0x7F81817F, 0x81818181, 0x81817F7F, -0x81817F7F, 0x81817F7F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x81818181, 0x817F817F, -0x7F7F7F7F, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F817F81, 0x817F8181, -0x7F7F817F, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x817F7F81, 0x7F7F817F, 0x7F7F8181, -0x8181817F, 0x81817F7F, 0x7F817F7F, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x81818181, 0x81817F7F, -0x8181817F, 0x817F7F81, 0x8181817F, 0x7F7F7F81, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x7F7F7F7F, -0x7F7F7F7F, 0x7F818181, 0x81817F81, 0x81817F81, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x817F7F81, -0x7F7F7F81, 0x81817F7F, 0x8181817F, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x7F817F81, 0x817F8181, -0x7F7F8181, 0x8181817F, 0x7F818181, 0x817F8181, 0x81817F81, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, -0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F81, 0x817F7F81, 0x7F81817F, 0x81817F7F, 0x81818181, -0x81817F81, 0x8181817F, 0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x81817F81, -0x7F7F7F7F, 0x817F7F7F, 0x817F7F81, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x817F7F7F, -0x81818181, 0x817F817F, 0x817F7F81, 0x81817F81, 0x817F7F81, 0x817F8181, 0x7F81817F, 0x7F817F81, -0x7F7F7F7F, 0x8181817F, 0x7F818181, 0x7F7F817F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F817F, -0x7F817F7F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x817F817F, 0x81817F81, -0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, 0x7F817F7F, -0x7F7F7F81, 0x7F817F81, 0x817F817F, 0x7F7F817F, 0x7F81817F, 0x81818181, 0x817F8181, 0x7F7F8181, -0x7F817F7F, 0x7F817F81, 0x81817F81, 0x8181817F, 0x81818181, 0x7F81817F, 0x7F817F81, 0x7F7F817F, -0x817F7F81, 0x817F7F7F, 0x817F7F81, 0x817F7F81, 0x81818181, 0x817F7F7F, 0x8181817F, 0x817F7F81, -0x81817F7F, 0x7F7F8181, 0x81817F81, 0x7F818181, 0x7F817F7F, 0x817F7F7F, 0x7F81817F, 0x7F817F81, -0x7F817F81, 0x817F817F, 0x81818181, 0x8181817F, 0x817F817F, 0x7F7F8181, 0x7F817F7F, 0x7F818181, -0x7F7F817F, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x81817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, -0x7F7F817F, 0x817F7F81, 0x817F817F, 0x7F81817F, 0x817F817F, 0x81817F81, 0x81817F81, 0x7F7F7F7F, -0x81818181, 0x817F7F7F, 0x7F7F8181, 0x7F7F8181, 0x7F81817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, -0x81818181, 0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x817F7F7F, 0x817F7F81, 0x817F8181, -0x7F7F7F81, 0x7F817F7F, 0x7F81817F, 0x7F817F81, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F7F, -0x81818181, 0x7F7F7F7F, 0x7F7F8181, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x81817F81, 0x8181817F, -0x7F817F81, 0x81817F7F, 0x817F817F, 0x7F817F7F, 0x817F817F, 0x7F817F7F, 0x7F81817F, 0x7F7F7F7F, -0x817F7F81, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, -0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, 0x7F817F81, 0x7F817F81, 0x7F81817F, 0x817F7F7F, -0x7F818181, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x8181817F, 0x7F81817F, 0x7F81817F, -0x817F7F81, 0x81818181, 0x817F817F, 0x817F7F81, 0x817F8181, 0x81817F81, 0x81818181, 0x7F7F7F7F, -0x7F7F817F, 0x7F817F81, 0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F818181, -0x817F7F7F, 0x7F818181, 0x8181817F, 0x81818181, 0x81817F7F, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, -0x817F817F, 0x7F817F7F, 0x8181817F, 0x81817F81, 0x7F817F81, 0x7F7F8181, 0x81817F81, 0x817F8181, -0x7F7F7F7F, 0x817F8181, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x817F8181, 0x7F818181, 0x7F818181, -0x7F817F7F, 0x7F7F8181, 0x7F817F7F, 0x817F7F7F, 0x7F817F81, 0x81818181, 0x817F817F, 0x7F7F7F81, -0x81818181, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F8181, -0x817F8181, 0x81817F81, 0x81817F7F, 0x817F7F81, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x7F7F817F, -0x7F7F817F, 0x817F7F81, 0x817F7F81, 0x817F817F, 0x7F7F8181, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, -0x817F817F, 0x7F817F7F, 0x7F7F8181, 0x7F81817F, 0x7F7F8181, 0x8181817F, 0x817F8181, 0x81817F7F, -0x817F8181, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, -0x7F7F817F, 0x7F7F817F, 0x817F817F, 0x7F817F7F, 0x7F817F7F, 0x7F817F7F, 0x7F817F7F, 0x7F817F7F, -0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x81817F7F, 0x817F817F, 0x81818181, 0x81817F7F, 0x7F7F7F7F, -0x817F8181, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, 0x817F7F81, 0x81817F81, -0x7F7F817F, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F7F817F, 0x81818181, 0x8181817F, 0x7F7F7F7F, -0x7F817F81, 0x817F817F, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x7F817F81, 0x817F7F81, 0x817F817F, -0x7F7F7F7F, 0x8181817F, 0x81817F7F, 0x817F8181, 0x817F7F81, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, -0x7F817F81, 0x81817F81, 0x817F7F7F, 0x81818181, 0x81818181, 0x7F81817F, 0x817F817F, 0x7F818181, -0x7F7F7F7F, 0x7F81817F, 0x7F817F81, 0x817F8181, 0x817F7F7F, 0x7F818181, 0x81818181, 0x8181817F, -0x817F7F7F, 0x7F7F817F, 0x81817F81, 0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F817F81, 0x7F7F817F, -0x817F817F, 0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F81817F, -0x7F7F817F, 0x817F817F, 0x817F7F81, 0x7F7F817F, 0x817F7F7F, 0x81817F81, 0x81817F81, 0x7F7F7F81, -0x7F7F7F81, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x7F7F8181, 0x817F8181, 0x7F7F817F, 0x7F818181, -0x7F817F81, 0x81817F7F, 0x7F818181, 0x817F7F81, 0x7F81817F, 0x817F7F81, 0x7F818181, 0x81817F7F, -0x7F818181, 0x817F817F, 0x7F7F7F7F, 0x7F818181, 0x81817F81, 0x7F7F7F81, 0x81818181, 0x7F818181, -0x7F7F7F7F, 0x7F817F7F, 0x7F817F81, 0x81817F81, 0x817F7F81, 0x817F7F81, 0x817F7F7F, 0x81817F7F, -0x7F818181, 0x7F817F81, 0x7F7F817F, 0x81817F81, 0x7F817F81, 0x8181817F, 0x81817F7F, 0x7F7F7F7F, -0x7F7F817F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x81818181, -0x7F817F7F, 0x7F7F7F81, 0x8181817F, 0x7F7F7F7F, 0x7F7F7F81, 0x817F817F, 0x81817F81, 0x7F7F7F7F, -0x817F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F8181, 0x817F7F7F, 0x81818181, 0x7F7F8181, 0x7F7F7F81, -0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x7F7F817F, -0x81818181, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x81818181, 0x817F7F81, 0x7F817F81, 0x81818181, -0x7F817F7F, 0x817F7F81, 0x8181817F, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x817F7F81, -0x7F7F7F7F, 0x7F817F7F, 0x817F8181, 0x7F818181, 0x817F7F81, 0x817F817F, 0x8181817F, 0x7F817F7F, -0x7F7F7F7F, 0x7F7F817F, 0x7F817F7F, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x7F818181, 0x817F7F81, -0x7F817F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x7F7F817F, -0x7F7F817F, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x7F818181, 0x7F818181, 0x7F7F7F81, 0x817F817F, -0x8181817F, 0x817F7F7F, 0x81818181, 0x7F81817F, 0x81817F81, 0x7F81817F, 0x81818181, 0x817F7F81, -0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, 0x81818181, 0x7F7F817F, 0x8181817F, 0x8181817F, -0x7F817F81, 0x817F7F7F, 0x8181817F, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x7F7F7F81, 0x817F7F7F, -0x817F817F, 0x81818181, 0x7F817F7F, 0x817F8181, 0x8181817F, 0x81817F7F, 0x81817F81, 0x7F7F7F81, -0x7F817F7F, 0x7F818181, 0x8181817F, 0x7F7F817F, 0x7F817F81, 0x7F7F8181, 0x7F7F8181, 0x8181817F, -0x81817F7F, 0x7F81817F, 0x81817F7F, 0x7F7F7F81, 0x7F81817F, 0x7F817F7F, 0x81818181, 0x7F7F7F81, -0x7F81817F, 0x7F81817F, 0x7F7F817F, 0x7F818181, 0x7F7F7F81, 0x81818181, 0x7F818181, 0x7F81817F, -0x81817F81, 0x817F7F81, 0x817F7F81, 0x81817F81, 0x81818181, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F81, -0x817F817F, 0x7F7F7F7F, 0x81817F7F, 0x81817F7F, 0x8181817F, 0x7F818181, 0x81818181, 0x817F817F, -0x817F7F81, 0x7F7F8181, 0x81817F7F, 0x817F7F81, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F818181, -0x7F817F81, 0x817F7F7F, 0x7F7F8181, 0x81818181, 0x7F7F817F, 0x7F817F81, 0x817F7F7F, 0x817F7F7F, -0x7F817F81, 0x7F817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x81818181, 0x81818181, 0x7F818181, -0x817F7F81, 0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x7F7F7F7F, -0x7F817F7F, 0x81817F7F, 0x7F81817F, 0x817F8181, 0x817F8181, 0x81818181, 0x7F7F8181, 0x7F7F7F81, -0x817F7F7F, 0x7F7F7F81, 0x81818181, 0x81817F81, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x7F7F8181, -0x81818181, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x817F7F81, 0x817F7F7F, -0x817F817F, 0x7F817F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, 0x817F817F, 0x7F81817F, 0x7F817F81, -0x7F817F7F, 0x817F8181, 0x817F7F81, 0x7F81817F, 0x817F7F81, 0x817F7F81, 0x81818181, 0x7F818181, -0x81817F7F, 0x817F8181, 0x81817F81, 0x7F817F81, 0x81818181, 0x7F818181, 0x7F7F817F, 0x817F7F7F, -0x817F7F81, 0x817F7F81, 0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x81817F81, 0x817F817F, 0x7F7F8181, -0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F817F, 0x7F818181, 0x817F817F, 0x817F817F, 0x817F7F7F, -0x817F8181, 0x7F818181, 0x7F7F8181, 0x817F8181, 0x817F8181, 0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, -0x7F7F7F81, 0x7F7F7F7F, 0x81817F81, 0x81817F81, 0x81817F7F, 0x81818181, 0x817F817F, 0x7F7F7F7F, -0x7F818181, 0x7F818181, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x8181817F, -0x817F8181, 0x7F7F7F81, 0x7F7F817F, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F817F7F, -0x817F817F, 0x817F8181, 0x817F8181, 0x7F7F817F, 0x7F81817F, 0x817F8181, 0x817F817F, 0x81818181, -0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x7F818181, 0x7F7F817F, 0x8181817F, 0x7F817F81, -0x817F7F7F, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x7F7F8181, -0x7F7F7F81, 0x7F7F8181, 0x817F8181, 0x817F817F, 0x81817F7F, 0x7F817F7F, 0x81817F7F, 0x7F7F8181, -0x8181817F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, -0x7F817F81, 0x81817F7F, 0x817F817F, 0x7F7F817F, 0x7F817F81, 0x7F7F7F7F, 0x817F7F81, 0x8181817F, -0x81817F81, 0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, 0x8181817F, 0x81818181, -0x817F7F81, 0x7F818181, 0x81818181, 0x81818181, 0x817F817F, 0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, -0x7F7F8181, 0x7F81817F, 0x817F8181, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, 0x7F81817F, -0x7F7F8181, 0x7F817F7F, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F817F7F, -0x7F7F8181, 0x817F817F, 0x7F81817F, 0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x7F7F7F81, 0x7F7F7F81 - -output0 = -0xB6D49CE2, 0x3E96B93F, 0xF02009F6, 0x2DF3D30D, 0x3B06C160, 0x646C69CC, 0x54439F0F, 0xCE0D12C3, -0x66E8BFD5, 0xA9D22B0C, 0xA9E7343B, 0x2B6EEF01, 0x6B6966C0, 0xB98FE144, 0xC3BF7BAD, 0x1B40DF1C, -0x973B12DC, 0x46E25E90, 0xB324ACCA, 0x5F0ED2B9, 0xBB4F - -basegraph= -2 - -z_c= -72 - -n_cb= -3600 - -q_m= -2 - -n_filler= -64 - -e = -6624 - -rv_index = -0 - -code_block_mode = -1 - -iter_max = -20 - -expected_iter_count = -6 - -op_flags = -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v9503.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v9503.data deleted file mode 100644 index 7699ae3157..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_dec_v9503.data +++ /dev/null @@ -1,1215 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_DEC - -input0 = -0x81818181, 0x7F818181, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x7F7F817F, 0x7F81817F, 0x7F818181, -0x8181817F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F817F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x817F7F81, -0x7F7F8181, 0x817F7F7F, 0x7F7F7F81, 0x8181817F, 0x817F7F81, 0x7F7F8181, 0x7F818181, 0x7F7F817F, -0x817F817F, 0x7F818181, 0x8181817F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x817F817F, -0x7F818181, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, -0x7F7F8181, 0x7F817F7F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F81, 0x81817F7F, -0x7F817F81, 0x81817F81, 0x7F81817F, 0x817F7F7F, 0x7F7F817F, 0x7F817F7F, 0x817F817F, 0x81817F81, -0x7F817F81, 0x7F7F817F, 0x7F818181, 0x81817F7F, 0x7F7F817F, 0x7F7F817F, 0x8181817F, 0x7F817F81, -0x7F7F8181, 0x7F7F7F81, 0x81817F7F, 0x817F8181, 0x81817F81, 0x817F8181, 0x7F817F81, 0x7F7F8181, -0x81817F7F, 0x7F7F7F7F, 0x81818181, 0x817F817F, 0x817F7F81, 0x7F817F81, 0x81817F7F, 0x817F7F7F, -0x7F7F8181, 0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x81817F81, 0x7F817F7F, 0x81818181, 0x81817F7F, -0x817F7F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F8181, -0x81818181, 0x817F7F81, 0x817F7F81, 0x81818181, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F81817F, -0x81818181, 0x817F8181, 0x81818181, 0x81817F81, 0x7F7F817F, 0x7F81817F, 0x817F817F, 0x817F7F81, -0x817F7F81, 0x7F817F81, 0x817F7F81, 0x817F817F, 0x81817F7F, 0x817F7F7F, 0x7F81817F, 0x81818181, -0x817F8181, 0x817F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x8181817F, -0x81817F81, 0x8181817F, 0x7F81817F, 0x7F817F7F, 0x817F7F7F, 0x81818181, 0x81818181, 0x81817F81, -0x81817F7F, 0x7F81817F, 0x7F81817F, 0x7F7F8181, 0x817F7F81, 0x81818181, 0x81818181, 0x817F7F7F, -0x7F7F817F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x7F7F817F, 0x81817F7F, 0x7F7F817F, 0x81817F7F, -0x81817F7F, 0x7F81817F, 0x81818181, 0x7F7F817F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F7F8181, -0x81817F81, 0x7F7F817F, 0x817F7F81, 0x817F7F7F, 0x7F817F81, 0x81818181, 0x817F7F7F, 0x7F7F7F81, -0x817F7F81, 0x81818181, 0x817F8181, 0x8181817F, 0x7F81817F, 0x7F818181, 0x817F8181, 0x7F7F7F81, -0x817F7F81, 0x7F7F8181, 0x817F8181, 0x7F817F7F, 0x81817F7F, 0x7F817F7F, 0x7F7F7F81, 0x8181817F, -0x817F817F, 0x817F7F81, 0x81817F81, 0x817F817F, 0x7F818181, 0x81817F7F, 0x7F81817F, 0x7F7F8181, -0x7F817F7F, 0x81818181, 0x8181817F, 0x817F7F7F, 0x7F818181, 0x7F817F81, 0x7F817F7F, 0x817F8181, -0x817F7F7F, 0x7F817F81, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F817F7F, 0x817F817F, 0x7F817F7F, -0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, 0x7F818181, 0x817F817F, 0x7F7F8181, -0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, 0x81818181, 0x817F817F, 0x817F8181, 0x7F817F7F, -0x7F7F817F, 0x7F7F7F81, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F7F, -0x7F81817F, 0x7F81817F, 0x8181817F, 0x7F7F7F7F, 0x7F818181, 0x7F7F817F, 0x7F817F81, 0x81817F81, -0x7F7F817F, 0x7F81817F, 0x81818181, 0x7F7F8181, 0x7F818181, 0x81817F7F, 0x7F7F7F81, 0x7F817F81, -0x817F7F81, 0x817F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F7F, 0x817F7F81, 0x81818181, 0x7F7F7F7F, -0x7F7F7F81, 0x7F7F817F, 0x7F818181, 0x817F7F7F, 0x817F7F81, 0x81818181, 0x7F7F7F81, 0x7F817F7F, -0x7F81817F, 0x81817F81, 0x81817F7F, 0x81817F81, 0x817F8181, 0x817F817F, 0x817F817F, 0x817F7F7F, -0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x817F817F, -0x817F8181, 0x7F817F81, 0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x81817F81, 0x81818181, 0x817F7F7F, -0x7F81817F, 0x7F81817F, 0x81818181, 0x817F7F81, 0x817F8181, 0x7F81817F, 0x81817F81, 0x817F7F81, -0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x817F817F, -0x7F81817F, 0x7F81817F, 0x7F81817F, 0x817F817F, 0x7F817F7F, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, -0x817F7F7F, 0x7F81817F, 0x7F817F7F, 0x7F818181, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x7F817F7F, -0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x7F817F81, -0x81818181, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F81, 0x7F817F81, 0x81818181, 0x817F8181, 0x8181817F, -0x7F7F8181, 0x817F817F, 0x817F8181, 0x817F8181, 0x817F7F81, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, -0x817F7F81, 0x8181817F, 0x81817F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, -0x81817F7F, 0x7F7F8181, 0x7F7F817F, 0x7F817F81, 0x7F81817F, 0x817F7F81, 0x7F7F817F, 0x7F7F8181, -0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x817F817F, 0x81817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F7F, -0x81817F81, 0x7F817F7F, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x817F817F, 0x7F818181, 0x7F818181, -0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F817F81, 0x7F81817F, -0x817F817F, 0x81817F7F, 0x8181817F, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x7F7F7F81, 0x81817F7F, -0x7F7F7F7F, 0x8181817F, 0x817F8181, 0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F817F7F, -0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F81817F, 0x817F7F7F, 0x7F818181, 0x817F817F, 0x7F818181, -0x8181817F, 0x7F81817F, 0x81817F7F, 0x7F7F7F7F, 0x817F817F, 0x7F817F7F, 0x7F818181, 0x817F8181, -0x81817F7F, 0x7F817F81, 0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x817F817F, 0x817F8181, 0x817F7F81, -0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F8181, -0x817F8181, 0x7F7F817F, 0x81818181, 0x7F81817F, 0x7F818181, 0x81818181, 0x81817F81, 0x7F7F7F7F, -0x817F7F81, 0x81817F81, 0x8181817F, 0x7F7F817F, 0x817F8181, 0x8181817F, 0x7F817F81, 0x817F7F81, -0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x81817F7F, 0x7F817F7F, -0x817F7F81, 0x8181817F, 0x7F7F817F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, 0x7F817F81, 0x7F817F81, -0x7F7F7F81, 0x81817F7F, 0x8181817F, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F7F7F, 0x81818181, -0x8181817F, 0x817F817F, 0x81817F7F, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F818181, 0x8181817F, -0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x817F7F81, 0x7F7F817F, 0x7F817F81, 0x81817F7F, -0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x7F7F7F81, -0x7F818181, 0x7F7F8181, 0x817F8181, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F81, 0x81818181, 0x81818181, -0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x817F7F81, 0x817F817F, -0x7F7F817F, 0x7F81817F, 0x7F818181, 0x7F7F817F, 0x7F7F8181, 0x81817F81, 0x81817F81, 0x817F7F7F, -0x7F7F817F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x81817F7F, -0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x81818181, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x817F8181, -0x81817F7F, 0x7F7F8181, 0x7F7F7F81, 0x8181817F, 0x817F8181, 0x817F7F7F, 0x7F81817F, 0x817F7F81, -0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x7F7F817F, 0x7F7F7F81, 0x817F817F, -0x7F817F7F, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F7F, 0x7F817F7F, 0x81818181, 0x7F817F7F, -0x7F81817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x7F7F7F7F, 0x7F817F81, -0x81817F7F, 0x7F817F81, 0x817F7F81, 0x81817F7F, 0x81817F81, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, -0x8181817F, 0x817F817F, 0x7F817F7F, 0x81817F7F, 0x8181817F, 0x7F818181, 0x817F8181, 0x81817F7F, -0x7F818181, 0x81818181, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x7F818181, 0x81817F7F, 0x7F81817F, -0x81818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x8181817F, 0x7F817F81, 0x7F818181, 0x817F817F, -0x7F7F8181, 0x817F7F81, 0x81817F81, 0x817F817F, 0x81817F7F, 0x817F817F, 0x7F7F817F, 0x7F817F81, -0x7F817F81, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x7F81817F, 0x7F817F81, 0x7F7F7F7F, 0x817F7F7F, -0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x81818181, 0x817F7F81, 0x81817F81, 0x7F81817F, 0x81818181, -0x817F8181, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x8181817F, 0x7F7F8181, 0x7F818181, 0x81817F81, -0x81818181, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x81818181, 0x81817F81, 0x817F7F7F, -0x7F81817F, 0x7F7F7F7F, 0x817F7F81, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x817F7F81, 0x7F7F8181, -0x7F7F817F, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, 0x817F7F7F, 0x81818181, 0x7F817F81, 0x817F7F81, -0x817F8181, 0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F81817F, 0x817F817F, 0x817F7F7F, -0x817F7F81, 0x8181817F, 0x817F817F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F817F, 0x817F817F, 0x81818181, -0x7F7F817F, 0x817F7F81, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F7F8181, 0x7F81817F, 0x817F817F, -0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, -0x7F81817F, 0x81817F7F, 0x817F7F7F, 0x7F818181, 0x7F7F7F81, 0x81818181, 0x817F7F81, 0x7F818181, -0x7F7F7F81, 0x7F81817F, 0x817F817F, 0x7F81817F, 0x81817F81, 0x7F817F7F, 0x81818181, 0x817F7F7F, -0x7F7F7F7F, 0x7F817F7F, 0x81818181, 0x81817F81, 0x7F7F8181, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, -0x817F817F, 0x817F8181, 0x7F81817F, 0x7F7F7F7F, 0x7F818181, 0x7F7F8181, 0x817F8181, 0x7F817F81, -0x8181817F, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x7F818181, 0x817F8181, -0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, -0x7F817F81, 0x81817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F81817F, 0x81817F81, 0x7F817F81, 0x817F8181, -0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x81817F81, 0x81817F81, 0x7F817F81, 0x7F7F7F7F, 0x81817F7F, -0x817F817F, 0x7F7F8181, 0x81817F7F, 0x817F817F, 0x817F817F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, -0x7F7F817F, 0x7F81817F, 0x7F7F7F81, 0x7F81817F, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x7F818181, -0x7F7F8181, 0x7F81817F, 0x7F818181, 0x7F7F7F7F, 0x817F8181, 0x817F7F81, 0x81818181, 0x817F8181, -0x817F8181, 0x7F817F7F, 0x7F81817F, 0x81818181, 0x817F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x817F7F81, -0x8181817F, 0x7F818181, 0x7F7F7F81, 0x817F817F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x8181817F, -0x817F7F7F, 0x81817F7F, 0x7F81817F, 0x81817F7F, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x7F7F817F, -0x81818181, 0x81818181, 0x7F818181, 0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x81817F81, -0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, -0x81818181, 0x81817F7F, 0x7F818181, 0x817F8181, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x7F7F7F7F, -0x8181817F, 0x817F7F7F, 0x81817F7F, 0x7F817F81, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x7F818181, -0x7F818181, 0x7F818181, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x7F7F8181, 0x7F818181, -0x8181817F, 0x817F8181, 0x81818181, 0x7F7F8181, 0x81817F7F, 0x7F7F7F81, 0x7F818181, 0x817F817F, -0x7F818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x7F817F7F, 0x7F7F817F, 0x8181817F, -0x81818181, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x817F7F7F, -0x817F7F81, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x817F817F, 0x7F7F8181, 0x81817F81, -0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x7F818181, 0x7F7F8181, 0x81817F81, 0x7F818181, 0x7F817F81, -0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, 0x81817F81, 0x7F817F81, -0x7F81817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, -0x8181817F, 0x817F7F7F, 0x81817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F817F81, 0x817F817F, -0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x817F817F, 0x7F7F817F, 0x81817F81, 0x8181817F, 0x7F817F7F, -0x7F7F7F81, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x817F817F, -0x7F81817F, 0x817F7F7F, 0x817F8181, 0x817F8181, 0x8181817F, 0x7F7F817F, 0x7F7F8181, 0x81818181, -0x817F7F7F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F7F, 0x817F8181, -0x817F8181, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F7F7F81, -0x7F7F7F81, 0x817F8181, 0x8181817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F81, 0x81817F81, 0x8181817F, -0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x7F7F817F, 0x817F8181, -0x817F7F7F, 0x8181817F, 0x7F81817F, 0x7F7F7F81, 0x81817F81, 0x81818181, 0x81817F7F, 0x7F7F8181, -0x8181817F, 0x8181817F, 0x817F817F, 0x8181817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x81818181, -0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F81817F, 0x817F7F81, 0x81817F81, 0x7F818181, -0x7F7F817F, 0x7F7F8181, 0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, -0x817F817F, 0x7F81817F, 0x7F81817F, 0x81817F81, 0x7F817F7F, 0x7F7F817F, 0x81818181, 0x81817F7F, -0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x7F7F7F81, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, -0x7F7F7F81, 0x8181817F, 0x7F7F7F81, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x7F818181, -0x81817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x817F817F, 0x81817F7F, 0x81817F7F, 0x7F81817F, -0x817F7F81, 0x8181817F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F81, 0x8181817F, 0x7F818181, 0x81818181, -0x7F7F8181, 0x8181817F, 0x7F7F8181, 0x817F7F7F, 0x7F817F81, 0x817F7F81, 0x817F8181, 0x81817F81, -0x817F817F, 0x7F817F81, 0x7F817F7F, 0x81817F7F, 0x81818181, 0x8181817F, 0x7F7F817F, 0x7F818181, -0x8181817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, 0x7F81817F, -0x7F7F8181, 0x8181817F, 0x81817F81, 0x7F818181, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x7F817F7F, -0x817F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x7F7F7F7F, -0x817F8181, 0x7F7F817F, 0x817F8181, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x81817F7F, 0x8181817F, -0x81818181, 0x7F7F8181, 0x7F7F7F81, 0x7F81817F, 0x817F8181, 0x817F817F, 0x817F817F, 0x817F8181, -0x7F817F7F, 0x817F7F7F, 0x7F817F81, 0x7F81817F, 0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F81817F, -0x7F817F7F, 0x7F817F81, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x817F7F81, 0x7F81817F, 0x817F8181, -0x7F817F7F, 0x817F817F, 0x7F7F8181, 0x817F7F81, 0x81818181, 0x7F7F7F7F, 0x7F81817F, 0x7F81817F, -0x817F8181, 0x7F818181, 0x7F7F8181, 0x817F7F81, 0x81817F7F, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, -0x81817F7F, 0x7F81817F, 0x817F7F7F, 0x817F8181, 0x7F7F8181, 0x7F817F81, 0x81818181, 0x8181817F, -0x7F7F7F81, 0x81817F81, 0x7F817F81, 0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x7F817F81, 0x81818181, -0x817F7F81, 0x7F817F7F, 0x8181817F, 0x8181817F, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, -0x817F8181, 0x8181817F, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x817F817F, 0x817F7F7F, -0x7F7F817F, 0x7F817F81, 0x8181817F, 0x81817F81, 0x817F8181, 0x7F818181, 0x7F817F7F, 0x817F817F, -0x817F7F7F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, 0x817F8181, 0x817F8181, 0x7F818181, -0x7F7F7F81, 0x817F8181, 0x817F817F, 0x817F817F, 0x7F7F7F81, 0x81817F7F, 0x817F7F81, 0x7F81817F, -0x7F7F8181, 0x8181817F, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x7F81817F, 0x817F7F81, 0x7F7F8181, -0x817F8181, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, 0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x81817F81, -0x7F817F7F, 0x817F7F7F, 0x817F8181, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, 0x817F7F81, -0x817F8181, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x817F817F, 0x7F7F7F7F, 0x7F817F81, -0x7F818181, 0x817F8181, 0x81817F81, 0x7F7F8181, 0x7F7F817F, 0x81818181, 0x7F7F8181, 0x817F8181, -0x8181817F, 0x817F817F, 0x81817F7F, 0x7F817F7F, 0x817F7F81, 0x81818181, 0x81817F81, 0x7F7F7F81, -0x817F817F, 0x817F817F, 0x817F7F81, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F81817F, 0x7F7F817F, -0x7F817F81, 0x817F7F7F, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x817F7F81, 0x7F818181, 0x817F8181, -0x817F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x81818181, -0x817F7F7F, 0x81817F81, 0x7F818181, 0x81817F81, 0x7F817F81, 0x817F7F81, 0x7F817F7F, 0x817F7F81, -0x7F7F8181, 0x7F7F7F7F, 0x81817F81, 0x7F817F7F, 0x7F7F817F, 0x7F7F817F, 0x817F7F81, 0x7F817F7F, -0x7F7F817F, 0x817F817F, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x7F7F7F81, 0x7F817F7F, 0x7F7F8181, -0x7F7F7F81, 0x7F818181, 0x7F818181, 0x817F7F81, 0x7F817F81, 0x817F7F7F, 0x7F7F817F, 0x7F817F81, -0x81817F7F, 0x7F7F8181, 0x7F7F8181, 0x7F7F8181, 0x81817F7F, 0x7F817F7F, 0x7F7F7F81, 0x7F818181, -0x8181817F, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x817F817F, 0x7F7F7F81, 0x81817F81, -0x7F817F7F, 0x7F7F817F, 0x7F7F7F81, 0x81817F81, 0x817F7F81, 0x7F7F8181, 0x8181817F, 0x817F817F, -0x81817F81, 0x7F818181, 0x817F7F7F, 0x817F7F81, 0x7F817F81, 0x817F7F7F, 0x7F7F7F81, 0x7F817F81, -0x7F81817F, 0x817F817F, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x7F818181, 0x817F7F81, 0x7F7F8181, -0x81818181, 0x817F8181, 0x7F7F7F81, 0x7F81817F, 0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x8181817F, -0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x81818181, 0x81817F81, 0x7F7F7F81, -0x81818181, 0x81817F81, 0x81818181, 0x7F817F7F, 0x7F7F817F, 0x81818181, 0x7F81817F, 0x7F7F7F7F, -0x817F7F81, 0x7F7F817F, 0x7F7F8181, 0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F817F81, 0x7F817F81, -0x81818181, 0x817F817F, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F8181, 0x7F7F7F7F, 0x81817F81, -0x817F7F7F, 0x817F7F81, 0x7F7F8181, 0x81817F81, 0x7F7F8181, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, -0x817F817F, 0x81818181, 0x7F818181, 0x817F7F7F, 0x7F818181, 0x7F817F81, 0x817F817F, 0x7F81817F, -0x7F818181, 0x81818181, 0x7F7F7F81, 0x817F8181, 0x81817F7F, 0x81817F81, 0x817F8181, 0x81817F7F, -0x7F7F7F7F, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F7F, -0x7F817F81, 0x81817F7F, 0x7F7F8181, 0x817F7F7F, 0x817F8181, 0x8181817F, 0x81817F81, 0x7F818181, -0x7F7F817F, 0x817F7F81, 0x7F7F7F81, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, -0x81817F7F, 0x7F7F7F7F, 0x7F818181, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x81817F81, 0x817F817F, -0x817F7F7F, 0x817F7F81, 0x81818181, 0x7F81817F, 0x7F81817F, 0x817F7F81, 0x7F7F8181, 0x7F817F7F, -0x7F817F7F, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x81818181, 0x817F7F7F, 0x817F7F7F, 0x7F7F8181, -0x817F817F, 0x817F7F81, 0x817F7F81, 0x81818181, 0x8181817F, 0x7F818181, 0x7F7F7F7F, 0x7F81817F, -0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x7F818181, 0x7F81817F, 0x8181817F, 0x7F7F7F81, -0x81817F81, 0x81817F81, 0x7F7F8181, 0x81818181, 0x7F7F817F, 0x7F81817F, 0x81817F7F, 0x817F8181, -0x7F7F7F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F818181, 0x817F817F, -0x817F817F, 0x81817F7F, 0x7F7F8181, 0x81818181, 0x8181817F, 0x7F817F81, 0x7F7F7F81, 0x7F818181, -0x817F817F, 0x817F8181, 0x7F7F8181, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x817F7F7F, 0x7F818181, -0x81817F81, 0x81818181, 0x7F7F817F, 0x81817F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, 0x7F818181, -0x7F817F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x81818181, 0x81817F7F, 0x817F8181, 0x7F818181, 0x81818181, -0x81817F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F7F7F, 0x817F817F, 0x7F7F8181, -0x7F818181, 0x8181817F, 0x7F818181, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x817F7F7F, -0x7F7F817F, 0x817F7F7F, 0x7F7F817F, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x7F817F81, 0x81817F81, -0x7F7F817F, 0x7F81817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, -0x7F7F8181, 0x81818181, 0x817F7F81, 0x7F7F7F7F, 0x7F818181, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F817F, -0x817F7F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, -0x7F7F7F7F, 0x81818181, 0x817F817F, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F817F81, 0x81818181, -0x7F81817F, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x7F7F8181, 0x817F8181, -0x817F8181, 0x7F7F817F, 0x7F7F7F81, 0x7F817F81, 0x7F7F817F, 0x81817F7F, 0x8181817F, 0x7F7F7F7F, -0x81817F81, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x7F7F817F, -0x81818181, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, 0x817F8181, 0x7F7F7F81, -0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x817F8181, 0x817F8181, 0x81818181, 0x81818181, 0x7F7F8181, -0x817F7F81, 0x7F818181, 0x7F7F8181, 0x7F7F7F7F, 0x817F8181, 0x81817F81, 0x7F817F81, 0x7F817F7F, -0x7F7F8181, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x7F7F817F, -0x81817F7F, 0x7F818181, 0x7F818181, 0x8181817F, 0x81818181, 0x7F818181, 0x817F8181, 0x7F7F7F81, -0x7F817F81, 0x817F817F, 0x81817F81, 0x7F7F817F, 0x7F818181, 0x7F81817F, 0x81817F81, 0x817F7F7F, -0x7F7F8181, 0x817F8181, 0x817F7F81, 0x817F817F, 0x7F7F8181, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, -0x7F81817F, 0x81818181, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F7F8181, 0x7F7F8181, -0x817F7F81, 0x7F7F7F81, 0x817F817F, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x8181817F, 0x7F7F7F7F, -0x7F81817F, 0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x817F8181, 0x7F817F7F, 0x817F817F, 0x8181817F, -0x7F7F817F, 0x7F81817F, 0x81818181, 0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x7F7F7F81, 0x817F817F, -0x7F817F81, 0x817F7F81, 0x7F818181, 0x7F817F81, 0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, -0x817F8181, 0x7F7F817F, 0x817F817F, 0x8181817F, 0x817F8181, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, -0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x7F7F817F, 0x7F7F8181, -0x817F8181, 0x81818181, 0x81818181, 0x7F817F81, 0x817F7F81, 0x817F7F7F, 0x7F7F817F, 0x7F818181, -0x7F817F7F, 0x8181817F, 0x7F7F7F81, 0x7F818181, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F7F7F7F, -0x817F8181, 0x7F81817F, 0x7F817F81, 0x817F817F, 0x8181817F, 0x7F817F81, 0x81818181, 0x81818181, -0x7F817F7F, 0x81817F7F, 0x817F8181, 0x8181817F, 0x7F81817F, 0x7F818181, 0x817F7F7F, 0x8181817F, -0x7F7F8181, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, 0x7F7F7F7F, 0x8181817F, 0x7F7F7F7F, -0x7F817F81, 0x7F817F81, 0x817F8181, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, -0x817F817F, 0x817F8181, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, 0x817F817F, 0x817F7F7F, 0x7F7F8181, -0x7F7F7F7F, 0x7F818181, 0x81817F7F, 0x7F817F81, 0x817F817F, 0x81818181, 0x817F7F7F, 0x7F7F7F7F, -0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x8181817F, 0x81817F7F, 0x817F7F7F, 0x7F7F817F, -0x7F7F8181, 0x817F7F81, 0x817F7F7F, 0x7F817F81, 0x81818181, 0x7F817F81, 0x817F8181, 0x7F7F7F7F, -0x7F7F7F81, 0x7F7F8181, 0x7F817F7F, 0x7F81817F, 0x7F81817F, 0x81818181, 0x81817F81, 0x8181817F, -0x7F7F7F81, 0x817F7F81, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x81817F81, -0x817F7F81, 0x7F81817F, 0x817F817F, 0x8181817F, 0x7F7F817F, 0x817F817F, 0x7F817F81, 0x817F7F81, -0x81817F7F, 0x7F818181, 0x7F817F7F, 0x81818181, 0x7F818181, 0x7F7F7F7F, 0x7F81817F, 0x817F817F, -0x81818181, 0x7F817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F817F, 0x817F817F, 0x81817F81, 0x8181817F, -0x7F7F8181, 0x8181817F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x81818181, 0x7F81817F, -0x7F817F81, 0x817F8181, 0x81818181, 0x817F8181, 0x7F817F81, 0x81817F81, 0x817F7F81, 0x7F7F817F, -0x7F7F7F81, 0x8181817F, 0x817F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x817F8181, 0x817F7F7F, 0x7F818181, -0x817F817F, 0x8181817F, 0x817F7F81, 0x7F817F7F, 0x817F817F, 0x7F817F81, 0x7F7F8181, 0x7F817F7F, -0x7F817F81, 0x7F7F817F, 0x81818181, 0x817F7F81, 0x81818181, 0x7F817F81, 0x7F7F7F81, 0x8181817F, -0x81818181, 0x7F817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F817F, 0x817F7F7F, -0x817F8181, 0x8181817F, 0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F817F, -0x7F7F817F, 0x817F817F, 0x7F818181, 0x817F8181, 0x7F818181, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, -0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, -0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x81818181, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x81817F81, -0x817F8181, 0x817F817F, 0x81817F7F, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x81818181, -0x7F818181, 0x7F7F8181, 0x7F81817F, 0x7F817F81, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x817F7F81, -0x81817F81, 0x7F817F7F, 0x81818181, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, 0x817F7F81, 0x81817F81, -0x81817F81, 0x7F817F81, 0x817F8181, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x7F817F81, 0x7F818181, -0x7F81817F, 0x7F818181, 0x7F7F7F7F, 0x81817F7F, 0x7F817F7F, 0x7F7F817F, 0x7F818181, 0x8181817F, -0x817F8181, 0x7F818181, 0x7F81817F, 0x817F8181, 0x7F81817F, 0x7F7F7F7F, 0x7F818181, 0x817F817F, -0x81818181, 0x817F7F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F817F, 0x7F81817F, 0x81817F7F, -0x7F7F7F81, 0x7F817F7F, 0x81817F81, 0x8181817F, 0x817F817F, 0x817F7F81, 0x81818181, 0x817F8181, -0x7F818181, 0x7F7F817F, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x7F7F7F7F, 0x81818181, 0x817F7F7F, -0x817F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F8181, 0x7F818181, 0x7F817F81, 0x7F81817F, 0x7F81817F, -0x7F81817F, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x81818181, 0x8181817F, -0x7F818181, 0x7F7F8181, 0x7F818181, 0x7F7F8181, 0x7F817F7F, 0x7F7F817F, 0x817F817F, 0x7F7F8181, -0x817F7F7F, 0x7F7F7F81, 0x81817F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x81817F81, -0x7F817F81, 0x81817F81, 0x7F817F81, 0x81817F7F, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, -0x7F81817F, 0x7F817F7F, 0x81818181, 0x7F7F817F, 0x817F817F, 0x81818181, 0x7F7F817F, 0x7F81817F, -0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x7F7F8181, 0x81817F7F, -0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F7F7F, 0x81818181, 0x7F818181, -0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, 0x8181817F, 0x817F8181, 0x81818181, 0x7F818181, 0x7F817F7F, -0x7F7F7F81, 0x81818181, 0x81817F7F, 0x81817F7F, 0x7F7F8181, 0x81818181, 0x81817F7F, 0x7F817F81, -0x817F8181, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x817F817F, 0x7F817F7F, 0x817F7F7F, 0x817F817F, -0x8181817F, 0x8181817F, 0x817F7F81, 0x81817F81, 0x7F81817F, 0x817F7F81, 0x817F7F81, 0x81818181, -0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F7F7F7F, -0x81817F7F, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x7F7F817F, 0x8181817F, 0x81817F81, 0x81818181, -0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F81817F, 0x81817F81, 0x7F7F7F81, 0x7F817F7F, -0x7F817F81, 0x7F7F8181, 0x7F817F81, 0x8181817F, 0x817F7F7F, 0x817F817F, 0x7F7F7F7F, 0x817F817F, -0x7F817F7F, 0x7F817F7F, 0x7F817F81, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x81817F7F, -0x7F817F81, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x7F7F7F7F, 0x817F817F, 0x8181817F, 0x817F8181, -0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x817F7F7F, 0x81817F81, 0x81817F7F, 0x817F8181, -0x81818181, 0x81817F7F, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x81817F81, 0x7F817F7F, 0x817F7F7F, -0x817F7F7F, 0x817F817F, 0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F7F7F81, -0x817F817F, 0x7F81817F, 0x817F7F81, 0x8181817F, 0x817F7F81, 0x817F8181, 0x81818181, 0x7F7F7F7F, -0x817F7F81, 0x7F817F81, 0x817F817F, 0x817F7F7F, 0x81817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, -0x817F8181, 0x81817F7F, 0x7F81817F, 0x81817F81, 0x81818181, 0x81817F81, 0x7F7F8181, 0x81818181, -0x81818181, 0x817F7F81, 0x81818181, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x8181817F, 0x817F8181, -0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, -0x7F817F7F, 0x8181817F, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x817F7F81, 0x7F7F7F81, 0x817F817F, -0x7F81817F, 0x817F7F81, 0x817F817F, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x81818181, 0x817F8181, -0x7F7F817F, 0x81817F7F, 0x817F8181, 0x817F817F, 0x817F8181, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F7F, -0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, 0x81817F81, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F81, -0x817F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F817F81, 0x817F8181, 0x7F818181, 0x817F817F, 0x7F7F7F7F, -0x817F7F7F, 0x81818181, 0x81817F7F, 0x7F818181, 0x817F817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, -0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x7F817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, -0x8181817F, 0x81818181, 0x7F81817F, 0x7F7F7F7F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x7F7F8181, -0x7F7F7F7F, 0x817F817F, 0x8181817F, 0x7F818181, 0x817F7F81, 0x817F8181, 0x7F7F8181, 0x817F8181, -0x7F7F7F7F, 0x7F818181, 0x817F817F, 0x817F7F7F, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, -0x7F7F817F, 0x817F817F, 0x8181817F, 0x817F817F, 0x7F7F817F, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, -0x817F817F, 0x8181817F, 0x817F7F7F, 0x817F817F, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x7F7F7F81, -0x817F817F, 0x81817F7F, 0x7F81817F, 0x81818181, 0x81817F7F, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, -0x8181817F, 0x7F817F7F, 0x8181817F, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, -0x817F7F81, 0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x817F8181, 0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, -0x817F817F, 0x7F7F8181, 0x81818181, 0x7F817F7F, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x7F817F7F, -0x817F8181, 0x7F817F7F, 0x7F817F81, 0x7F817F81, 0x7F817F7F, 0x7F81817F, 0x8181817F, 0x817F817F, -0x81817F7F, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, 0x7F7F8181, -0x817F817F, 0x817F7F81, 0x8181817F, 0x7F818181, 0x8181817F, 0x7F81817F, 0x81817F81, 0x7F817F81, -0x7F817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x7F817F7F, -0x81817F7F, 0x817F8181, 0x817F8181, 0x81818181, 0x81818181, 0x817F7F81, 0x817F817F, 0x7F818181, -0x7F818181, 0x7F81817F, 0x81817F81, 0x81817F81, 0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x81818181, -0x7F817F7F, 0x81817F81, 0x7F817F7F, 0x7F817F81, 0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F7F817F, -0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F818181, 0x7F7F7F81, -0x817F8181, 0x817F817F, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x81817F81, 0x7F7F8181, 0x817F8181, -0x817F817F, 0x817F7F7F, 0x7F7F817F, 0x8181817F, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x81818181, -0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F817F7F, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x81817F7F, -0x7F817F7F, 0x7F817F81, 0x81817F81, 0x817F7F7F, 0x7F7F817F, 0x81818181, 0x817F7F7F, 0x7F7F8181, -0x7F7F817F, 0x817F817F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F7F8181, -0x81817F7F, 0x7F817F81, 0x81817F81, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x7F817F7F, 0x81817F7F, -0x81818181, 0x817F8181, 0x817F8181, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x81818181, -0x7F81817F, 0x817F7F7F, 0x81818181, 0x7F818181, 0x81818181, 0x81817F7F, 0x7F817F81, 0x7F817F81, -0x7F817F81, 0x7F7F7F81, 0x81817F81, 0x81817F7F, 0x817F8181, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, -0x7F7F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F81, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x7F817F7F, -0x81817F81, 0x7F7F817F, 0x7F7F817F, 0x7F817F81, 0x7F7F8181, 0x81818181, 0x7F817F81, 0x817F8181, -0x81817F81, 0x7F7F817F, 0x81818181, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x817F8181, 0x81818181, -0x81817F7F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x817F817F, 0x7F818181, 0x7F7F817F, 0x7F81817F, -0x817F817F, 0x7F7F8181, 0x7F817F81, 0x817F7F7F, 0x7F7F817F, 0x81817F81, 0x7F7F8181, 0x7F818181, -0x817F817F, 0x7F817F81, 0x7F81817F, 0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x8181817F, 0x817F817F, -0x7F817F7F, 0x7F7F8181, 0x7F818181, 0x81817F7F, 0x81817F7F, 0x8181817F, 0x817F8181, 0x817F817F, -0x7F7F8181, 0x817F8181, 0x81818181, 0x7F818181, 0x81818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F817F, -0x817F7F7F, 0x7F7F8181, 0x7F817F81, 0x81817F81, 0x8181817F, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, -0x817F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F7F, 0x81818181, 0x817F7F81, 0x81817F7F, 0x7F7F817F, -0x7F7F8181, 0x7F817F81, 0x81817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, -0x8181817F, 0x7F818181, 0x7F817F7F, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, -0x817F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x8181817F, 0x81818181, 0x81817F81, -0x7F818181, 0x7F7F8181, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, 0x81818181, 0x7F81817F, 0x8181817F, -0x7F817F81, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x81817F81, 0x817F817F, 0x7F7F7F81, 0x81817F81, -0x7F7F8181, 0x7F817F7F, 0x81817F81, 0x817F8181, 0x7F817F81, 0x81817F7F, 0x7F7F8181, 0x7F818181, -0x7F81817F, 0x7F7F7F81, 0x817F7F7F, 0x817F8181, 0x81817F81, 0x7F817F7F, 0x7F7F7F7F, 0x7F817F7F, -0x7F81817F, 0x7F7F8181, 0x7F7F7F81, 0x7F817F81, 0x817F7F7F, 0x81818181, 0x7F7F8181, 0x7F7F8181, -0x7F7F817F, 0x7F818181, 0x7F817F81, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, 0x817F7F81, -0x7F818181, 0x7F817F81, 0x7F817F7F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, 0x8181817F, -0x7F7F7F81, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x7F817F7F, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F7F, -0x817F817F, 0x7F81817F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x81818181, 0x81817F81, 0x817F817F, -0x7F7F7F81, 0x7F7F7F81, 0x81817F7F, 0x817F7F7F, 0x81817F7F, 0x81817F81, 0x817F817F, 0x7F817F81, -0x7F7F7F7F, 0x7F81817F, 0x7F81817F, 0x7F7F7F81, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x7F7F8181, -0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x7F818181, 0x7F817F7F, -0x81817F81, 0x817F7F81, 0x7F81817F, 0x81817F81, 0x8181817F, 0x8181817F, 0x81817F7F, 0x81817F81, -0x817F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x8181817F, 0x817F8181, 0x7F7F7F7F, 0x7F81817F, 0x7F81817F, -0x817F7F7F, 0x7F7F817F, 0x7F817F7F, 0x7F7F817F, 0x81817F7F, 0x81818181, 0x817F7F7F, 0x81817F7F, -0x8181817F, 0x817F8181, 0x81818181, 0x7F818181, 0x7F7F817F, 0x817F817F, 0x817F7F7F, 0x7F7F817F, -0x817F817F, 0x81817F81, 0x817F7F81, 0x7F818181, 0x7F7F8181, 0x8181817F, 0x817F817F, 0x7F7F8181, -0x7F7F7F7F, 0x81818181, 0x817F8181, 0x81817F7F, 0x817F817F, 0x81818181, 0x81817F81, 0x817F7F81, -0x7F7F8181, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x8181817F, 0x817F817F, 0x7F7F7F7F, -0x7F7F8181, 0x7F817F81, 0x81818181, 0x7F818181, 0x7F81817F, 0x7F817F81, 0x7F7F7F81, 0x817F8181, -0x8181817F, 0x7F7F8181, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x7F817F7F, 0x81817F7F, 0x81818181, -0x7F818181, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x7F7F8181, 0x817F7F7F, -0x7F817F81, 0x81818181, 0x81818181, 0x7F817F7F, 0x7F7F8181, 0x817F7F81, 0x817F817F, 0x7F7F817F, -0x81818181, 0x81817F7F, 0x817F7F81, 0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x81818181, -0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x817F817F, 0x817F7F7F, 0x81817F81, -0x817F7F81, 0x7F81817F, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x81817F81, 0x817F7F7F, 0x7F818181, -0x81817F81, 0x817F7F81, 0x8181817F, 0x7F7F817F, 0x7F818181, 0x817F7F81, 0x817F7F81, 0x81817F7F, -0x7F7F7F7F, 0x81818181, 0x817F7F7F, 0x7F817F81, 0x817F8181, 0x817F817F, 0x8181817F, 0x817F7F7F, -0x817F8181, 0x817F8181, 0x81818181, 0x7F7F817F, 0x8181817F, 0x81817F7F, 0x7F7F8181, 0x817F7F81, -0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x8181817F, 0x817F7F81, -0x81818181, 0x817F7F81, 0x817F817F, 0x7F7F7F81, 0x7F817F7F, 0x81818181, 0x7F7F8181, 0x8181817F, -0x817F8181, 0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x7F7F817F, 0x7F7F8181, 0x7F817F81, -0x7F7F8181, 0x8181817F, 0x81817F7F, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x7F7F7F7F, 0x81818181, -0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, -0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x817F8181, 0x817F7F81, 0x817F817F, 0x7F7F817F, 0x81817F7F, -0x817F7F7F, 0x7F817F81, 0x817F7F7F, 0x7F818181, 0x81818181, 0x817F7F7F, 0x817F7F81, 0x81817F7F, -0x7F81817F, 0x7F817F7F, 0x7F7F8181, 0x7F818181, 0x817F8181, 0x817F8181, 0x817F8181, 0x7F7F8181, -0x7F81817F, 0x7F817F7F, 0x7F817F81, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x81817F81, 0x7F7F817F, -0x7F81817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, 0x817F7F81, 0x817F8181, 0x7F7F817F, -0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x817F7F81, 0x81817F7F, 0x7F817F81, 0x8181817F, -0x7F818181, 0x7F7F7F7F, 0x81817F7F, 0x8181817F, 0x81817F81, 0x7F81817F, 0x8181817F, 0x7F817F81, -0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x817F7F7F, 0x81817F81, -0x81818181, 0x8181817F, 0x817F817F, 0x7F818181, 0x7F81817F, 0x81817F81, 0x7F7F817F, 0x817F817F, -0x817F7F7F, 0x817F7F7F, 0x817F817F, 0x8181817F, 0x7F818181, 0x8181817F, 0x817F8181, 0x7F817F7F, -0x7F7F8181, 0x817F8181, 0x7F81817F, 0x81817F81, 0x817F817F, 0x7F818181, 0x81818181, 0x817F7F81, -0x7F81817F, 0x8181817F, 0x81817F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F817F, 0x817F8181, 0x81817F7F, -0x7F817F7F, 0x817F7F7F, 0x817F7F7F, 0x7F81817F, 0x7F81817F, 0x81818181, 0x7F7F7F7F, 0x817F817F, -0x7F7F817F, 0x7F818181, 0x7F7F7F81, 0x817F8181, 0x817F8181, 0x817F817F, 0x7F817F7F, 0x817F7F7F, -0x8181817F, 0x7F818181, 0x81818181, 0x817F817F, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x7F7F8181, -0x81817F81, 0x817F7F7F, 0x7F7F817F, 0x817F817F, 0x81817F81, 0x7F81817F, 0x817F7F81, 0x7F81817F, -0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F7F, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x817F817F, -0x8181817F, 0x7F817F81, 0x7F7F817F, 0x7F7F8181, 0x817F7F81, 0x7F817F81, 0x81817F81, 0x817F8181, -0x7F7F7F7F, 0x817F817F, 0x7F817F81, 0x81817F7F, 0x817F7F81, 0x7F7F817F, 0x7F7F817F, 0x817F8181, -0x81817F81, 0x7F7F817F, 0x81818181, 0x817F7F81, 0x817F8181, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, -0x81818181, 0x817F7F81, 0x817F817F, 0x7F81817F, 0x81817F7F, 0x81818181, 0x817F7F7F, 0x817F7F7F, -0x81817F81, 0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, 0x7F818181, 0x7F7F7F7F, -0x817F7F81, 0x817F7F81, 0x7F817F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F7F81, 0x81817F81, 0x81818181, -0x7F817F81, 0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x817F817F, 0x817F8181, 0x7F817F81, 0x7F7F7F7F, -0x7F7F7F81, 0x7F817F81, 0x7F7F7F7F, 0x81818181, 0x7F7F8181, 0x817F817F, 0x7F818181, 0x817F7F81, -0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F81, 0x81818181, 0x7F81817F, 0x81817F81, 0x7F817F81, 0x81818181, -0x817F817F, 0x7F818181, 0x7F7F817F, 0x7F7F7F81, 0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x81817F81, -0x7F7F7F81, 0x7F817F81, 0x7F7F817F, 0x817F817F, 0x817F8181, 0x817F8181, 0x817F7F7F, 0x8181817F, -0x7F81817F, 0x7F7F817F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x81818181, 0x81817F81, -0x817F7F7F, 0x81818181, 0x81818181, 0x7F81817F, 0x7F818181, 0x7F817F7F, 0x817F817F, 0x7F7F8181, -0x7F7F817F, 0x7F7F7F81, 0x817F817F, 0x81818181, 0x81818181, 0x817F7F81, 0x7F818181, 0x7F7F8181, -0x7F817F81, 0x7F817F7F, 0x81818181, 0x81817F81, 0x7F81817F, 0x7F7F8181, 0x7F817F81, 0x7F817F7F, -0x7F7F7F7F, 0x81818181, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x7F817F81, -0x7F7F7F7F, 0x81818181, 0x7F7F8181, 0x81817F81, 0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x8181817F, -0x7F7F7F81, 0x817F8181, 0x8181817F, 0x7F81817F, 0x817F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F818181, -0x7F7F817F, 0x81817F7F, 0x7F7F7F81, 0x8181817F, 0x7F817F7F, 0x817F817F, 0x7F7F817F, 0x7F817F81, -0x817F7F7F, 0x7F817F81, 0x7F7F8181, 0x7F7F817F, 0x81818181, 0x7F817F7F, 0x81817F81, 0x81817F81, -0x7F818181, 0x7F818181, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x817F7F81, 0x81818181, 0x817F817F, -0x81817F81, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F817F81, 0x7F81817F, 0x817F7F81, 0x817F8181, -0x7F7F8181, 0x817F7F81, 0x7F7F817F, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x7F818181, 0x7F7F7F81, -0x7F818181, 0x817F817F, 0x7F818181, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x81817F7F, 0x7F818181, -0x7F817F81, 0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x7F7F817F, 0x7F817F81, 0x7F7F817F, 0x7F817F81, -0x7F7F7F81, 0x7F817F7F, 0x81817F7F, 0x817F7F7F, 0x7F81817F, 0x7F81817F, 0x7F7F817F, 0x7F817F7F, -0x7F817F81, 0x81817F81, 0x7F7F7F81, 0x817F817F, 0x7F817F81, 0x81818181, 0x817F8181, 0x7F817F81, -0x7F7F8181, 0x81817F81, 0x817F7F7F, 0x81817F81, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x7F7F8181, -0x7F818181, 0x7F818181, 0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F7F817F, 0x7F817F7F, 0x817F7F7F, -0x81818181, 0x7F817F7F, 0x81817F81, 0x7F81817F, 0x7F7F8181, 0x817F7F81, 0x817F8181, 0x7F7F8181, -0x7F818181, 0x7F817F81, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x81817F7F, 0x7F818181, 0x817F7F7F, -0x81818181, 0x817F7F81, 0x81818181, 0x7F817F7F, 0x817F7F7F, 0x81817F7F, 0x8181817F, 0x81817F81, -0x817F7F81, 0x81818181, 0x81817F81, 0x7F7F8181, 0x81818181, 0x7F7F8181, 0x7F7F8181, 0x81818181, -0x7F7F7F81, 0x8181817F, 0x81818181, 0x81817F7F, 0x7F7F7F81, 0x81818181, 0x81817F7F, 0x817F8181, -0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F817F81, 0x81817F81, 0x8181817F, 0x817F7F7F, -0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x7F7F817F, 0x81817F7F, 0x81818181, 0x7F817F7F, 0x817F8181, -0x817F8181, 0x7F7F8181, 0x81817F81, 0x81817F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, -0x7F7F817F, 0x81817F81, 0x81817F81, 0x7F817F81, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x81818181, -0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F7F8181, 0x7F818181, 0x7F7F817F, 0x7F817F81, -0x817F7F81, 0x7F817F7F, 0x81817F81, 0x817F817F, 0x817F817F, 0x7F817F81, 0x7F81817F, 0x81818181, -0x7F7F7F81, 0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x81817F7F, -0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x81817F7F, 0x817F817F, 0x7F7F817F, -0x8181817F, 0x7F817F81, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x8181817F, -0x817F817F, 0x7F81817F, 0x7F817F7F, 0x7F7F7F81, 0x817F817F, 0x81817F7F, 0x7F818181, 0x7F7F7F81, -0x7F7F7F81, 0x7F818181, 0x817F817F, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x7F7F7F81, -0x7F817F81, 0x7F818181, 0x817F817F, 0x7F81817F, 0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x81818181, -0x7F7F7F81, 0x7F817F7F, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F81817F, 0x8181817F, 0x7F81817F, -0x817F8181, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x7F7F8181, -0x817F817F, 0x8181817F, 0x817F8181, 0x7F817F7F, 0x7F817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F7F8181, -0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x817F817F, 0x7F817F81, 0x8181817F, 0x7F7F817F, 0x7F7F7F7F, -0x817F817F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x817F817F, -0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x8181817F, 0x7F817F7F, 0x7F818181, 0x7F817F7F, 0x7F817F81, -0x817F7F81, 0x817F817F, 0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, -0x7F7F7F7F, 0x817F7F81, 0x81817F7F, 0x7F817F81, 0x7F7F8181, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, -0x81818181, 0x8181817F, 0x7F817F7F, 0x81818181, 0x81818181, 0x81817F7F, 0x817F8181, 0x817F7F7F, -0x7F817F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x8181817F, 0x8181817F, 0x7F818181, -0x8181817F, 0x7F818181, 0x817F8181, 0x817F7F81, 0x817F8181, 0x81818181, 0x81817F7F, 0x7F7F8181, -0x81818181, 0x81817F81, 0x7F7F7F7F, 0x8181817F, 0x7F81817F, 0x7F7F7F81, 0x7F817F7F, 0x81818181, -0x81817F81, 0x817F8181, 0x7F7F7F7F, 0x8181817F, 0x7F818181, 0x817F8181, 0x817F8181, 0x81817F81, -0x817F817F, 0x81817F81, 0x7F81817F, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, -0x817F817F, 0x817F817F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F817F, 0x81817F81, 0x81817F7F, 0x7F817F7F, -0x7F817F7F, 0x8181817F, 0x7F7F7F7F, 0x817F8181, 0x7F81817F, 0x7F817F7F, 0x8181817F, 0x81817F7F, -0x817F817F, 0x81818181, 0x817F8181, 0x8181817F, 0x7F7F817F, 0x8181817F, 0x7F7F7F7F, 0x7F7F8181, -0x8181817F, 0x7F817F81, 0x817F8181, 0x81817F7F, 0x817F7F7F, 0x81817F81, 0x817F817F, 0x817F7F7F, -0x7F7F817F, 0x7F7F817F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x7F7F7F81, -0x81818181, 0x7F818181, 0x8181817F, 0x7F817F81, 0x817F8181, 0x8181817F, 0x7F817F81, 0x81817F7F, -0x81817F7F, 0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F7F7F, 0x817F817F, -0x7F7F7F81, 0x8181817F, 0x7F7F8181, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, 0x817F7F81, -0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x81818181, 0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x8181817F, -0x7F81817F, 0x817F817F, 0x7F81817F, 0x8181817F, 0x7F7F7F81, 0x8181817F, 0x817F7F81, 0x81817F7F, -0x7F7F817F, 0x7F7F8181, 0x817F8181, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x817F7F7F, 0x7F7F7F7F, -0x817F7F81, 0x7F817F81, 0x817F817F, 0x81817F7F, 0x81818181, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, -0x7F81817F, 0x7F7F8181, 0x8181817F, 0x8181817F, 0x8181817F, 0x81817F81, 0x81818181, 0x817F7F7F, -0x81818181, 0x7F817F81, 0x817F8181, 0x7F818181, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x817F7F7F, -0x817F7F7F, 0x81818181, 0x7F81817F, 0x817F817F, 0x81818181, 0x7F7F817F, 0x8181817F, 0x7F7F817F, -0x7F818181, 0x817F817F, 0x7F7F8181, 0x817F7F7F, 0x81818181, 0x81817F81, 0x7F81817F, 0x817F817F, -0x81817F81, 0x7F81817F, 0x7F7F8181, 0x7F81817F, 0x817F817F, 0x7F7F8181, 0x81818181, 0x817F817F, -0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x817F817F, 0x7F817F7F, 0x817F7F7F, 0x8181817F, -0x81817F7F, 0x7F7F817F, 0x7F81817F, 0x7F7F817F, 0x81818181, 0x81817F81, 0x7F7F7F81, 0x817F817F, -0x7F7F7F7F, 0x7F81817F, 0x7F7F7F7F, 0x81818181, 0x81818181, 0x817F8181, 0x81817F81, 0x7F7F7F81, -0x81818181, 0x81818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, 0x7F7F817F, 0x817F8181, -0x7F7F7F81, 0x817F8181, 0x7F7F817F, 0x81817F7F, 0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, -0x81817F81, 0x8181817F, 0x7F7F817F, 0x7F7F817F, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F8181, -0x7F81817F, 0x81817F81, 0x81818181, 0x7F81817F, 0x7F818181, 0x7F7F8181, 0x81817F7F, 0x817F7F7F, -0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x817F817F, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x7F7F7F81, -0x8181817F, 0x81817F7F, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, 0x7F818181, 0x7F817F81, 0x817F7F81, -0x81818181, 0x7F7F8181, 0x7F7F8181, 0x8181817F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F8181, 0x7F7F817F, -0x81818181, 0x7F7F817F, 0x81818181, 0x81818181, 0x7F817F81, 0x817F7F7F, 0x81817F7F, 0x81817F81, -0x81817F81, 0x817F8181, 0x7F81817F, 0x81817F81, 0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x81817F7F, -0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x817F817F, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, -0x817F8181, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x817F7F81, 0x7F7F8181, -0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x7F7F817F, 0x7F818181, 0x7F817F81, 0x817F817F, 0x817F7F7F, -0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x7F7F8181, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F7F, 0x817F817F, -0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x817F7F7F, 0x81817F7F, 0x81818181, -0x81817F7F, 0x81818181, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, 0x81818181, -0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x817F8181, 0x7F7F817F, 0x81817F81, -0x817F817F, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x81818181, 0x817F8181, 0x81817F7F, -0x7F7F8181, 0x7F7F7F7F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x7F7F7F7F, 0x81817F7F, 0x81817F7F, -0x817F7F81, 0x817F8181, 0x81817F81, 0x8181817F, 0x7F7F8181, 0x7F818181, 0x7F7F817F, 0x8181817F, -0x81817F7F, 0x7F7F8181, 0x817F817F, 0x817F8181, 0x7F817F81, 0x81817F81, 0x817F7F7F, 0x7F7F8181, -0x81817F81, 0x817F817F, 0x8181817F, 0x7F818181, 0x7F7F7F81, 0x817F7F81, 0x8181817F, 0x7F7F817F, -0x7F81817F, 0x817F8181, 0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F8181, -0x817F8181, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F81, 0x81818181, -0x817F7F7F, 0x81817F81, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F7F7F, 0x81817F7F, -0x81817F81, 0x81817F7F, 0x7F817F81, 0x8181817F, 0x7F81817F, 0x81817F7F, 0x7F7F7F81, 0x81817F7F, -0x7F7F7F7F, 0x7F7F817F, 0x817F7F81, 0x817F817F, 0x7F7F817F, 0x81817F7F, 0x7F817F81, 0x817F817F, -0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F81817F, 0x7F7F7F7F, 0x7F818181, -0x817F817F, 0x7F7F8181, 0x81818181, 0x817F817F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x81817F81, -0x81818181, 0x81817F7F, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x8181817F, -0x7F817F81, 0x7F817F81, 0x7F818181, 0x817F7F81, 0x7F818181, 0x7F7F7F81, 0x7F7F7F81, 0x817F8181, -0x817F7F81, 0x7F81817F, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x8181817F, 0x7F817F81, 0x81817F81, -0x7F81817F, 0x81817F7F, 0x81817F81, 0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x7F7F817F, 0x81817F7F, -0x7F818181, 0x81817F81, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x81818181, 0x7F81817F, 0x81818181, -0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x817F7F7F, 0x81818181, 0x817F7F81, -0x7F7F8181, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x817F7F81, 0x817F7F81, 0x817F7F81, 0x817F817F, -0x817F817F, 0x7F817F81, 0x81818181, 0x817F817F, 0x7F818181, 0x81818181, 0x81817F81, 0x81818181, -0x7F7F7F7F, 0x7F817F7F, 0x7F817F81, 0x817F817F, 0x817F7F81, 0x7F817F81, 0x81818181, 0x7F7F7F81, -0x817F7F7F, 0x7F7F7F81, 0x817F817F, 0x7F817F7F, 0x7F818181, 0x7F7F7F81, 0x817F8181, 0x81818181, -0x81817F7F, 0x7F7F7F7F, 0x817F817F, 0x817F7F81, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, 0x7F818181, -0x81818181, 0x7F7F7F81, 0x7F817F81, 0x8181817F, 0x7F817F7F, 0x7F817F81, 0x7F7F7F81, 0x81817F81, -0x7F817F7F, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F7F7F, 0x817F8181, 0x817F8181, -0x7F7F8181, 0x7F817F7F, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x8181817F, 0x8181817F, 0x7F7F817F, -0x817F817F, 0x7F81817F, 0x81818181, 0x817F817F, 0x7F7F817F, 0x7F817F81, 0x7F7F7F81, 0x7F818181, -0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x7F7F817F, 0x7F817F81, 0x817F7F81, 0x7F81817F, 0x7F81817F, -0x7F817F81, 0x7F818181, 0x8181817F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x7F817F7F, 0x7F818181, -0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x817F817F, 0x81817F81, 0x81818181, 0x7F7F8181, -0x81817F7F, 0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x817F817F, 0x7F7F7F7F, 0x817F8181, 0x7F7F8181, -0x817F8181, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x81817F81, 0x81818181, 0x8181817F, -0x817F8181, 0x7F818181, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, -0x7F7F817F, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, 0x8181817F, 0x817F8181, 0x817F817F, 0x7F817F81, -0x81817F81, 0x81818181, 0x8181817F, 0x7F7F817F, 0x81817F81, 0x817F8181, 0x7F7F817F, 0x7F7F7F7F, -0x817F7F81, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, -0x7F7F817F, 0x81817F7F, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x81817F81, 0x817F8181, 0x81817F81, -0x7F81817F, 0x7F7F8181, 0x7F81817F, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, 0x817F817F, 0x817F817F, -0x7F817F7F, 0x7F7F7F7F, 0x817F817F, 0x81817F7F, 0x817F8181, 0x7F81817F, 0x7F817F81, 0x7F81817F, -0x7F817F7F, 0x7F817F81, 0x81817F81, 0x81817F7F, 0x81817F81, 0x817F817F, 0x7F81817F, 0x7F817F81, -0x81817F7F, 0x817F817F, 0x817F7F81, 0x817F817F, 0x817F7F7F, 0x7F817F7F, 0x81817F7F, 0x7F7F817F, -0x7F817F7F, 0x81818181, 0x817F8181, 0x817F7F81, 0x7F7F817F, 0x817F7F7F, 0x817F7F81, 0x7F818181, -0x7F7F7F81, 0x817F817F, 0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x817F8181, -0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x7F7F7F7F, 0x8181817F, 0x817F8181, 0x7F817F81, 0x7F817F7F, -0x817F7F7F, 0x817F7F7F, 0x7F818181, 0x7F7F8181, 0x81818181, 0x81817F81, 0x7F81817F, 0x81818181, -0x7F7F7F81, 0x817F7F7F, 0x81817F81, 0x7F818181, 0x7F817F81, 0x7F7F817F, 0x8181817F, 0x8181817F, -0x7F7F7F81, 0x7F81817F, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x817F8181, 0x7F7F8181, 0x7F818181, -0x81817F81, 0x7F817F81, 0x817F7F81, 0x7F81817F, 0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x817F7F7F, -0x7F7F7F81, 0x7F7F817F, 0x7F7F817F, 0x81817F81, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, -0x7F7F817F, 0x81818181, 0x7F7F7F81, 0x8181817F, 0x81817F81, 0x817F7F81, 0x7F7F817F, 0x7F7F7F7F, -0x7F817F81, 0x817F7F81, 0x81818181, 0x817F7F81, 0x81818181, 0x817F7F81, 0x81817F7F, 0x817F7F81, -0x7F7F8181, 0x81817F81, 0x7F817F81, 0x7F817F81, 0x7F818181, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F7F, -0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F817F7F, 0x81817F7F, -0x7F817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x7F7F7F7F, 0x81818181, 0x81818181, -0x7F7F7F81, 0x817F8181, 0x817F817F, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x7F7F7F81, -0x7F7F7F81, 0x81817F7F, 0x817F8181, 0x817F817F, 0x817F817F, 0x7F818181, 0x817F817F, 0x7F818181, -0x7F7F817F, 0x7F818181, 0x7F7F8181, 0x81817F81, 0x817F7F7F, 0x817F7F7F, 0x8181817F, 0x81817F81, -0x8181817F, 0x81818181, 0x81817F7F, 0x81817F81, 0x8181817F, 0x81817F7F, 0x817F7F81, 0x817F7F81, -0x7F817F81, 0x817F7F81, 0x81818181, 0x8181817F, 0x7F817F81, 0x7F817F81, 0x81818181, 0x81818181, -0x81817F81, 0x8181817F, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x81817F81, 0x81817F81, 0x7F7F7F81, -0x817F817F, 0x7F7F8181, 0x7F818181, 0x7F7F817F, 0x8181817F, 0x7F817F81, 0x7F818181, 0x7F81817F, -0x7F7F8181, 0x7F817F7F, 0x7F817F7F, 0x81818181, 0x817F8181, 0x7F817F81, 0x81818181, 0x81818181, -0x817F8181, 0x8181817F, 0x7F7F7F81, 0x81817F81, 0x817F8181, 0x7F7F7F7F, 0x7F7F817F, 0x8181817F, -0x81818181, 0x7F81817F, 0x7F817F81, 0x7F7F8181, 0x7F7F7F81, 0x81817F81, 0x817F8181, 0x7F81817F, -0x7F818181, 0x817F8181, 0x81817F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x817F8181, 0x7F817F81, -0x7F817F81, 0x81818181, 0x817F817F, 0x7F7F8181, 0x8181817F, 0x81817F7F, 0x817F7F81, 0x817F817F, -0x7F81817F, 0x817F817F, 0x81817F81, 0x817F7F7F, 0x817F7F81, 0x7F81817F, 0x81818181, 0x7F7F7F81, -0x7F7F817F, 0x7F818181, 0x7F7F8181, 0x817F7F81, 0x817F817F, 0x81817F81, 0x81817F7F, 0x817F7F81, -0x81817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F7F, 0x81818181, 0x7F7F7F81, 0x7F817F81, 0x817F8181, -0x7F7F817F, 0x817F8181, 0x7F817F7F, 0x81818181, 0x81817F81, 0x7F7F7F81, 0x8181817F, 0x7F81817F, -0x81817F7F, 0x81817F7F, 0x817F8181, 0x817F8181, 0x817F7F7F, 0x7F817F7F, 0x81818181, 0x81817F7F, -0x817F7F81, 0x817F8181, 0x7F817F81, 0x7F7F817F, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, -0x817F817F, 0x7F818181, 0x81817F81, 0x81817F7F, 0x817F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F7F81, -0x7F81817F, 0x7F81817F, 0x7F7F817F, 0x81817F7F, 0x81818181, 0x817F7F7F, 0x7F7F817F, 0x817F8181, -0x8181817F, 0x817F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x7F817F81, -0x81818181, 0x7F817F81, 0x7F817F81, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x817F7F7F, 0x7F7F817F, -0x7F817F7F, 0x817F817F, 0x81818181, 0x817F817F, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, 0x7F7F8181, -0x7F7F7F81, 0x7F7F7F7F, 0x7F81817F, 0x817F8181, 0x7F818181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F8181, -0x7F818181, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, 0x7F7F7F7F, 0x817F7F81, 0x817F817F, -0x7F818181, 0x817F817F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x81817F7F, -0x7F817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F8181, 0x817F7F7F, -0x8181817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x817F8181, 0x817F7F7F, 0x81818181, 0x7F817F81, -0x81817F81, 0x81818181, 0x817F7F81, 0x7F817F7F, 0x7F818181, 0x7F817F81, 0x7F817F81, 0x817F7F7F, -0x817F7F81, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, 0x7F818181, 0x7F81817F, 0x7F817F7F, 0x7F817F81, -0x7F7F8181, 0x81818181, 0x7F7F8181, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F7F, 0x7F81817F, 0x81817F7F, -0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F817F81, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x7F7F8181, -0x81818181, 0x81817F81, 0x7F7F7F81, 0x7F817F81, 0x8181817F, 0x7F7F817F, 0x817F8181, 0x81818181, -0x817F7F81, 0x8181817F, 0x7F818181, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x81818181, 0x7F7F7F7F, -0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x81817F7F, 0x81818181, 0x7F7F8181, 0x7F817F7F, 0x7F81817F, -0x7F7F8181, 0x817F817F, 0x81818181, 0x81818181, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x817F817F, -0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x7F817F7F, 0x7F817F81, 0x81818181, 0x7F818181, 0x7F81817F, -0x7F7F817F, 0x81817F81, 0x7F817F7F, 0x817F817F, 0x7F818181, 0x81817F7F, 0x817F817F, 0x7F818181, -0x7F7F7F7F, 0x7F7F7F81, 0x817F817F, 0x7F818181, 0x817F817F, 0x7F81817F, 0x8181817F, 0x7F81817F, -0x81817F81, 0x7F818181, 0x7F818181, 0x81818181, 0x81818181, 0x817F817F, 0x8181817F, 0x7F7F7F7F, -0x817F7F81, 0x7F817F81, 0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F81817F, 0x81817F81, 0x817F8181, -0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F7F81, 0x817F817F, 0x817F7F81, 0x7F7F7F7F, -0x817F817F, 0x817F817F, 0x7F7F8181, 0x7F818181, 0x7F7F7F7F, 0x7F817F7F, 0x7F817F81, 0x7F7F7F7F, -0x81818181, 0x7F7F817F, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x7F817F7F, 0x7F817F81, 0x81818181, -0x7F817F81, 0x817F817F, 0x7F817F81, 0x817F817F, 0x7F7F817F, 0x817F8181, 0x7F7F7F81, 0x7F7F7F7F, -0x817F7F81, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x8181817F, 0x81817F81, 0x81817F81, -0x7F7F817F, 0x7F81817F, 0x817F8181, 0x7F818181, 0x817F817F, 0x81817F81, 0x8181817F, 0x8181817F, -0x817F817F, 0x81818181, 0x817F817F, 0x81817F81, 0x7F817F81, 0x817F7F7F, 0x7F818181, 0x817F8181, -0x81818181, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x7F817F81, 0x81817F7F, 0x817F8181, -0x817F817F, 0x81817F7F, 0x7F818181, 0x817F7F81, 0x817F7F81, 0x81818181, 0x7F81817F, 0x817F8181, -0x81818181, 0x817F817F, 0x7F7F817F, 0x817F7F7F, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x7F7F7F81, -0x7F817F7F, 0x817F7F81, 0x81818181, 0x81817F81, 0x8181817F, 0x7F7F817F, 0x7F81817F, 0x817F817F, -0x7F81817F, 0x817F7F81, 0x817F8181, 0x7F7F8181, 0x81817F7F, 0x7F817F81, 0x81818181, 0x817F8181, -0x7F818181, 0x817F8181, 0x817F8181, 0x817F8181, 0x7F817F81, 0x7F818181, 0x817F7F7F, 0x81817F81, -0x7F7F8181, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x81817F7F, -0x8181817F, 0x7F7F8181, 0x7F7F7F81, 0x817F8181, 0x7F7F8181, 0x7F7F8181, 0x7F7F7F81, 0x8181817F, -0x817F7F81, 0x7F7F817F, 0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x81817F7F, 0x817F8181, 0x7F7F8181, -0x817F8181, 0x7F7F8181, 0x7F817F81, 0x7F81817F, 0x81817F7F, 0x817F817F, 0x8181817F, 0x7F81817F, -0x817F7F7F, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x817F7F81, -0x8181817F, 0x817F7F7F, 0x7F7F817F, 0x7F7F817F, 0x81818181, 0x7F817F81, 0x7F81817F, 0x7F817F7F, -0x7F7F7F7F, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x817F8181, 0x81817F7F, 0x7F7F7F81, 0x81817F7F, -0x7F817F7F, 0x7F7F817F, 0x817F7F81, 0x81817F7F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x7F7F7F81, -0x7F7F7F7F, 0x7F7F817F, 0x81817F7F, 0x7F818181, 0x7F7F817F, 0x817F7F81, 0x7F7F7F81, 0x7F817F81, -0x8181817F, 0x817F817F, 0x817F8181, 0x81818181, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x7F7F7F81, -0x7F7F7F81, 0x7F7F7F7F, 0x81817F7F, 0x7F817F81, 0x817F817F, 0x7F7F7F81, 0x7F817F7F, 0x7F7F7F7F, -0x7F7F817F, 0x7F818181, 0x7F7F817F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x7F817F81, -0x7F7F7F7F, 0x7F81817F, 0x817F8181, 0x817F7F81, 0x7F7F8181, 0x7F818181, 0x817F7F7F, 0x7F7F7F81, -0x7F7F817F, 0x7F817F81, 0x81818181, 0x7F817F7F, 0x817F7F7F, 0x8181817F, 0x81817F81, 0x7F7F817F, -0x7F7F817F, 0x817F7F7F, 0x817F7F81, 0x81817F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, -0x7F7F8181, 0x7F7F7F7F, 0x81817F7F, 0x7F817F7F, 0x7F817F81, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, -0x81818181, 0x817F8181, 0x8181817F, 0x817F8181, 0x7F7F8181, 0x817F7F7F, 0x81818181, 0x817F8181, -0x817F8181, 0x7F817F7F, 0x7F7F8181, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x817F817F, 0x81817F81, -0x81817F7F, 0x8181817F, 0x7F818181, 0x817F8181, 0x7F7F8181, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F81, -0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F7F81, 0x7F7F817F, 0x817F8181, 0x817F8181, 0x7F7F817F, -0x7F817F7F, 0x7F7F8181, 0x81818181, 0x81818181, 0x7F81817F, 0x817F8181, 0x817F7F81, 0x7F817F81, -0x7F81817F, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x817F817F, 0x7F818181, 0x8181817F, 0x7F7F8181, -0x817F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, 0x7F81817F, -0x81817F7F, 0x81817F7F, 0x7F81817F, 0x7F817F81, 0x817F8181, 0x817F817F, 0x81817F81, 0x81817F7F, -0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x7F7F817F, 0x81818181, 0x817F7F7F, 0x817F817F, 0x817F8181, -0x817F8181, 0x817F7F81, 0x7F817F81, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x817F8181, 0x81817F81, -0x7F7F7F7F, 0x817F8181, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x81818181, 0x7F817F7F, 0x817F7F7F, -0x817F7F7F, 0x81817F81, 0x81818181, 0x81818181, 0x81818181, 0x81818181, 0x817F817F, 0x7F7F7F7F, -0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x817F8181, 0x8181817F, 0x7F818181, 0x817F7F7F, 0x81817F81, -0x81818181, 0x7F818181, 0x817F8181, 0x7F817F7F, 0x817F7F7F, 0x7F818181, 0x7F7F817F, 0x7F7F7F81, -0x7F818181, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F7F817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, -0x81818181, 0x7F817F81, 0x81818181, 0x7F7F7F81, 0x817F7F7F, 0x817F7F7F, 0x81818181, 0x817F7F7F, -0x817F8181, 0x81818181, 0x8181817F, 0x7F817F7F, 0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x7F7F8181, -0x7F7F817F, 0x7F7F7F7F, 0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x81818181, 0x7F7F817F, 0x81817F81, -0x81818181, 0x817F8181, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F8181, 0x81818181, 0x7F817F81, 0x8181817F, -0x817F7F7F, 0x81817F81, 0x7F817F81, 0x81818181, 0x7F817F81, 0x81818181, 0x8181817F, 0x7F817F7F, -0x8181817F, 0x7F818181, 0x8181817F, 0x81818181, 0x81817F81, 0x7F818181, 0x7F817F7F, 0x8181817F, -0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x81818181, 0x7F7F817F, 0x7F818181, 0x817F817F, -0x817F7F81, 0x7F81817F, 0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F7F, -0x81818181, 0x7F81817F, 0x817F7F81, 0x7F7F8181, 0x817F817F, 0x81818181, 0x81817F7F, 0x7F817F7F, -0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x7F7F8181, 0x7F818181, 0x7F818181, 0x817F7F81, 0x8181817F, -0x817F817F, 0x7F7F8181, 0x81818181, 0x7F81817F, 0x7F818181, 0x7F81817F, 0x817F8181, 0x817F817F, -0x7F7F7F7F, 0x81818181, 0x7F7F817F, 0x817F7F81, 0x7F817F81, 0x7F817F7F, 0x8181817F, 0x7F818181, -0x817F817F, 0x817F7F7F, 0x81817F7F, 0x7F7F817F, 0x7F81817F, 0x7F818181, 0x7F81817F, 0x7F81817F, -0x7F7F817F, 0x81817F7F, 0x7F81817F, 0x7F817F81, 0x8181817F, 0x7F818181, 0x81817F81, 0x817F7F7F, -0x7F81817F, 0x7F818181, 0x7F818181, 0x7F7F817F, 0x81818181, 0x81817F81, 0x817F7F7F, 0x7F817F81, -0x817F7F7F, 0x81817F81, 0x7F7F7F81, 0x8181817F, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, 0x817F8181, -0x817F7F81, 0x7F818181, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x7F817F81, 0x817F8181, 0x817F817F, -0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x8181817F, 0x7F818181, 0x81817F81, 0x7F7F817F, 0x817F7F7F, -0x7F81817F, 0x81817F81, 0x817F7F81, 0x7F7F7F7F, 0x7F7F817F, 0x81817F81, 0x817F7F81, 0x817F8181, -0x81818181, 0x7F81817F, 0x7F817F81, 0x7F817F7F, 0x81817F81, 0x817F817F, 0x7F817F81, 0x7F818181, -0x7F818181, 0x8181817F, 0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x7F818181, -0x8181817F, 0x7F818181, 0x7F7F8181, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x7F7F7F7F, 0x7F81817F, -0x81817F7F, 0x7F817F7F, 0x7F7F7F7F, 0x8181817F, 0x7F7F7F81, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, -0x7F817F7F, 0x817F817F, 0x7F817F7F, 0x81817F81, 0x7F818181, 0x7F7F8181, 0x7F818181, 0x817F817F, -0x7F817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x81817F81, 0x7F817F81, 0x817F7F7F, -0x8181817F, 0x7F7F7F81, 0x7F817F81, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x7F817F7F, 0x7F7F8181, -0x7F817F81, 0x817F7F7F, 0x7F81817F, 0x7F817F7F, 0x817F7F7F, 0x81817F7F, 0x8181817F, 0x7F817F81, -0x81817F7F, 0x817F7F7F, 0x817F8181, 0x7F818181, 0x81817F81, 0x7F7F817F, 0x7F81817F, 0x7F7F7F81, -0x8181817F, 0x7F818181, 0x7F7F817F, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x7F81817F, 0x7F818181, -0x7F7F7F7F, 0x817F817F, 0x81817F7F, 0x81817F81, 0x817F817F, 0x7F7F8181, 0x7F818181, 0x7F81817F, -0x7F818181, 0x7F7F8181, 0x817F817F, 0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x7F7F7F81, 0x7F818181, -0x7F7F8181, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x817F8181, 0x817F8181, 0x81817F81, 0x7F81817F, -0x7F7F8181, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x7F7F8181, 0x817F817F, 0x7F7F7F81, 0x817F8181, -0x81817F81, 0x7F818181, 0x7F817F81, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, 0x7F7F817F, 0x7F7F7F7F, -0x817F7F7F, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x81818181, 0x7F81817F, 0x7F7F7F81, -0x817F8181, 0x817F7F7F, 0x817F817F, 0x7F7F817F, 0x81817F7F, 0x7F817F81, 0x817F8181, 0x7F817F81, -0x7F817F81, 0x7F7F8181, 0x7F81817F, 0x7F7F817F, 0x817F8181, 0x7F817F7F, 0x7F7F817F, 0x817F7F7F, -0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x7F818181, 0x817F7F7F, 0x817F817F, 0x7F817F81, 0x817F8181, -0x817F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x817F817F, 0x817F8181, 0x8181817F, -0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x81817F81, 0x817F8181, -0x7F7F7F81, 0x8181817F, 0x8181817F, 0x81818181, 0x7F7F8181, 0x817F7F81, 0x7F817F7F, 0x817F8181, -0x7F817F81, 0x7F818181, 0x81818181, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F817F7F, 0x7F7F817F, -0x7F7F7F81, 0x7F818181, 0x8181817F, 0x8181817F, 0x81818181, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F81, -0x817F817F, 0x7F817F81, 0x7F818181, 0x8181817F, 0x81817F81, 0x817F7F81, 0x81817F81, 0x7F7F817F, -0x817F8181, 0x7F81817F, 0x7F817F7F, 0x7F817F81, 0x817F817F, 0x81817F7F, 0x7F818181, 0x817F817F, -0x7F7F7F81, 0x817F817F, 0x8181817F, 0x7F7F817F, 0x7F7F7F81, 0x7F817F81, 0x7F818181, 0x817F817F, -0x817F817F, 0x81817F7F, 0x7F817F7F, 0x817F817F, 0x817F8181, 0x817F8181, 0x817F8181, 0x81818181, -0x817F7F81, 0x817F7F7F, 0x81817F7F, 0x81818181, 0x817F7F81, 0x817F8181, 0x8181817F, 0x8181817F, -0x81817F7F, 0x81817F7F, 0x81817F7F, 0x7F7F7F7F, 0x817F7F81, 0x81818181, 0x817F8181, 0x7F7F7F81, -0x817F817F, 0x7F817F7F, 0x7F7F817F, 0x817F7F7F, 0x81817F81, 0x81817F81, 0x7F7F817F, 0x7F817F7F, -0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x81817F81, 0x7F81817F, 0x7F818181, 0x7F817F7F, 0x81818181, -0x81817F81, 0x81817F81, 0x7F7F817F, 0x81817F7F, 0x7F817F7F, 0x7F7F8181, 0x81818181, 0x8181817F, -0x7F81817F, 0x81817F7F, 0x7F7F7F81, 0x7F81817F, 0x817F8181, 0x81817F81, 0x81818181, 0x817F7F7F, -0x7F818181, 0x7F817F7F, 0x7F817F7F, 0x817F817F, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x81817F81, -0x817F7F7F, 0x8181817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x8181817F, -0x81817F81, 0x81817F7F, 0x7F7F7F7F, 0x81817F7F, 0x817F7F7F, 0x81818181, 0x817F7F7F, 0x817F817F, -0x8181817F, 0x7F817F7F, 0x817F7F81, 0x8181817F, 0x817F8181, 0x7F817F81, 0x8181817F, 0x81818181, -0x7F7F7F81, 0x817F8181, 0x7F817F7F, 0x81818181, 0x7F818181, 0x81817F81, 0x817F7F7F, 0x817F8181, -0x7F818181, 0x7F818181, 0x7F818181, 0x817F817F, 0x7F7F7F81, 0x817F8181, 0x817F7F7F, 0x8181817F, -0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F817F81, 0x81818181, 0x817F7F7F, 0x817F8181, 0x81818181, -0x7F817F7F, 0x7F817F81, 0x817F7F81, 0x81818181, 0x7F7F8181, 0x7F817F7F, 0x7F817F7F, 0x817F8181, -0x7F7F817F, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x8181817F, 0x817F7F81, 0x81818181, 0x7F817F7F, -0x817F817F, 0x817F8181, 0x817F817F, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F7F8181, 0x7F817F7F, -0x81817F7F, 0x817F817F, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x7F7F8181, 0x81817F81, 0x817F817F, -0x7F7F7F81, 0x81817F81, 0x817F7F7F, 0x81817F7F, 0x7F7F7F81, 0x817F7F81, 0x7F81817F, 0x81817F7F, -0x7F817F81, 0x7F818181, 0x81817F7F, 0x7F817F7F, 0x81817F81, 0x8181817F, 0x817F817F, 0x7F7F817F, -0x817F817F, 0x7F7F7F81, 0x817F7F81, 0x817F7F81, 0x7F817F81, 0x81818181, 0x81817F7F, 0x81818181, -0x817F817F, 0x7F817F7F, 0x81817F7F, 0x7F818181, 0x81818181, 0x7F818181, 0x81817F7F, 0x81817F81, -0x81817F7F, 0x7F818181, 0x817F8181, 0x7F7F7F81, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, -0x81817F81, 0x817F8181, 0x81817F81, 0x7F7F7F7F, 0x7F818181, 0x8181817F, 0x817F817F, 0x7F7F7F7F, -0x81817F81, 0x7F7F817F, 0x817F7F81, 0x8181817F, 0x7F7F7F81, 0x81818181, 0x7F7F8181, 0x7F817F7F, -0x81817F81, 0x8181817F, 0x7F817F81, 0x7F817F81, 0x817F7F7F, 0x81818181, 0x7F7F7F81, 0x7F7F8181, -0x817F817F, 0x81817F7F, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x817F8181, 0x7F817F7F, -0x7F81817F, 0x817F817F, 0x7F7F817F, 0x817F8181, 0x7F81817F, 0x7F817F81, 0x7F7F817F, 0x7F818181, -0x817F817F, 0x817F7F7F, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x81817F81, 0x7F81817F, 0x7F817F7F, -0x7F81817F, 0x7F7F8181, 0x8181817F, 0x81818181, 0x817F817F, 0x7F7F817F, 0x817F7F7F, 0x81818181, -0x7F817F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F818181, 0x81818181, -0x81817F81, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x7F817F81, 0x7F7F7F7F, 0x81817F81, 0x8181817F, -0x7F7F8181, 0x8181817F, 0x817F817F, 0x7F7F8181, 0x81817F7F, 0x7F817F7F, 0x7F818181, 0x817F7F7F, -0x7F817F81, 0x7F817F7F, 0x7F818181, 0x8181817F, 0x7F7F7F7F, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, -0x817F8181, 0x7F81817F, 0x7F818181, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x81817F81, 0x7F7F7F7F, -0x7F7F8181, 0x817F7F7F, 0x8181817F, 0x7F7F7F81, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, -0x8181817F, 0x7F81817F, 0x7F7F817F, 0x817F7F7F, 0x817F7F7F, 0x817F8181, 0x7F7F8181, 0x7F7F817F, -0x81817F7F, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x817F8181, 0x81817F81, 0x817F7F7F, 0x81817F7F, -0x817F7F81, 0x7F7F7F81, 0x7F818181, 0x817F817F, 0x817F7F81, 0x817F7F7F, 0x817F817F, 0x7F817F7F, -0x81817F81, 0x7F7F817F, 0x7F817F81, 0x81818181, 0x817F8181, 0x817F7F7F, 0x81818181, 0x7F7F817F, -0x8181817F, 0x7F7F7F7F, 0x7F818181, 0x817F7F81, 0x81817F7F, 0x81818181, 0x7F817F81, 0x817F7F81, -0x817F8181, 0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F81817F, 0x8181817F, -0x817F817F, 0x7F817F81, 0x7F817F81, 0x81817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F7F8181, 0x7F7F8181, -0x7F818181, 0x817F817F, 0x7F7F817F, 0x7F817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x7F818181, -0x81817F7F, 0x817F7F81, 0x81817F81, 0x81817F81, 0x81817F81, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, -0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x817F7F81, 0x7F7F7F81, 0x7F817F81, 0x817F817F, 0x81818181, -0x7F7F7F81, 0x817F7F7F, 0x7F817F81, 0x7F7F7F81, 0x81818181, 0x817F8181, 0x81817F7F, 0x8181817F, -0x81817F81, 0x817F8181, 0x817F8181, 0x817F817F, 0x7F7F7F81, 0x817F7F7F, 0x817F7F81, 0x7F818181, -0x817F8181, 0x817F7F7F, 0x817F7F7F, 0x81817F81, 0x7F81817F, 0x817F7F81, 0x7F7F817F, 0x8181817F, -0x81818181, 0x7F7F7F81, 0x81818181, 0x81817F81, 0x817F7F81, 0x7F817F7F, 0x81818181, 0x81817F81, -0x7F7F7F81, 0x817F8181, 0x7F7F7F81, 0x817F7F81, 0x7F817F81, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, -0x7F817F7F, 0x817F7F81, 0x817F817F, 0x81817F81, 0x7F7F7F7F, 0x81817F81, 0x7F7F7F7F, 0x817F8181, -0x7F817F7F, 0x7F7F7F81, 0x817F7F7F, 0x817F7F81, 0x7F818181, 0x817F7F7F, 0x7F818181, 0x817F817F, -0x81817F7F, 0x8181817F, 0x7F81817F, 0x7F81817F, 0x81817F7F, 0x817F817F, 0x8181817F, 0x817F8181, -0x7F7F7F7F, 0x7F818181, 0x817F817F, 0x817F8181, 0x817F817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, -0x7F7F7F81, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x7F817F81, 0x81818181, 0x8181817F, 0x7F817F7F, -0x7F7F8181, 0x817F8181, 0x81817F7F, 0x81818181, 0x7F818181, 0x817F817F, 0x7F818181, 0x81817F81, -0x817F7F81, 0x7F7F8181, 0x7F817F7F, 0x817F7F81, 0x81817F81, 0x81817F81, 0x81817F81, 0x7F7F8181, -0x817F8181, 0x81817F7F, 0x7F817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, -0x7F81817F, 0x81817F7F, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x7F7F817F, 0x817F7F7F, 0x7F7F8181, -0x81818181, 0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F817F7F, 0x817F7F7F, 0x7F7F817F, 0x7F81817F, -0x81817F7F, 0x817F7F7F, 0x8181817F, 0x817F817F, 0x81817F7F, 0x81817F7F, 0x817F8181, 0x81817F7F, -0x7F7F7F81, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x81818181, 0x817F817F, -0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x81817F81, 0x81817F7F, 0x817F8181, 0x817F817F, 0x817F8181, -0x817F7F7F, 0x8181817F, 0x81817F81, 0x817F8181, 0x7F7F817F, 0x7F81817F, 0x7F817F7F, 0x7F817F7F, -0x81818181, 0x817F7F81, 0x817F8181, 0x7F7F817F, 0x817F817F, 0x7F7F7F81, 0x81818181, 0x817F7F7F, -0x7F817F81, 0x7F817F7F, 0x817F817F, 0x7F7F7F81, 0x7F7F8181, 0x81817F81, 0x7F818181, 0x817F817F, -0x7F818181, 0x817F7F7F, 0x81818181, 0x817F7F7F, 0x81818181, 0x817F817F, 0x7F7F7F7F, 0x8181817F, -0x7F7F817F, 0x7F81817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x817F7F81, 0x817F8181, -0x7F81817F, 0x81817F81, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, 0x7F7F8181, 0x817F7F81, 0x817F817F, -0x7F817F7F, 0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x81817F81, 0x81817F81, 0x817F7F81, 0x817F8181, -0x81817F7F, 0x817F7F81, 0x817F7F7F, 0x7F81817F, 0x81817F7F, 0x817F8181, 0x7F817F7F, 0x7F7F7F7F, -0x7F817F81, 0x817F8181, 0x817F8181, 0x7F7F7F81, 0x7F817F7F, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F7F, -0x817F8181, 0x817F8181, 0x81818181, 0x81817F7F, 0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F817F81, -0x8181817F, 0x81817F81, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x7F81817F, 0x817F7F81, 0x81817F7F, -0x81818181, 0x7F817F81, 0x81818181, 0x81817F7F, 0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x817F7F81, -0x7F7F817F, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x81818181, 0x7F7F7F81, 0x8181817F, 0x7F818181, -0x817F8181, 0x7F817F81, 0x7F81817F, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x81817F81, 0x8181817F, -0x7F7F7F7F, 0x7F7F817F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x7F7F7F81, 0x7F7F817F, -0x7F7F817F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F8181, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, 0x81818181, -0x7F7F7F7F, 0x81817F81, 0x7F7F8181, 0x7F7F817F, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x7F7F7F7F, -0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x7F817F7F, 0x817F8181, 0x8181817F, 0x7F81817F, 0x7F7F7F81, -0x817F8181, 0x7F7F7F81, 0x81817F81, 0x7F817F7F, 0x817F8181, 0x7F7F8181, 0x81817F81, 0x8181817F, -0x817F817F, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x7F817F7F, 0x817F7F7F, 0x817F7F81, 0x7F817F81, -0x81817F81, 0x817F7F81, 0x7F7F7F7F, 0x817F8181, 0x8181817F, 0x817F7F7F, 0x7F818181, 0x7F818181, -0x7F7F8181, 0x7F81817F, 0x817F8181, 0x7F817F81, 0x7F817F81, 0x817F8181, 0x817F817F, 0x7F7F817F, -0x7F7F8181, 0x81818181, 0x817F7F7F, 0x7F818181, 0x81818181, 0x8181817F, 0x81818181, 0x7F81817F, -0x7F7F7F81, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, 0x817F7F7F, 0x7F818181, 0x7F81817F, 0x81818181, -0x7F7F7F7F, 0x817F8181, 0x7F7F8181, 0x7F817F81, 0x817F817F, 0x7F818181, 0x817F8181, 0x7F818181, -0x817F7F81, 0x81817F7F, 0x817F8181, 0x7F818181, 0x7F7F817F, 0x7F7F7F7F, 0x7F818181, 0x7F817F81, -0x7F818181, 0x8181817F, 0x7F81817F, 0x7F7F7F7F, 0x7F817F7F, 0x817F8181, 0x817F7F81, 0x7F81817F, -0x7F817F7F, 0x817F7F81, 0x817F817F, 0x7F818181, 0x817F817F, 0x8181817F, 0x7F81817F, 0x81817F81, -0x8181817F, 0x8181817F, 0x7F81817F, 0x7F81817F, 0x7F7F8181, 0x7F7F8181, 0x81818181, 0x81818181, -0x817F7F81, 0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x7F7F7F81, 0x8181817F, 0x7F7F7F7F, 0x817F8181, -0x7F817F7F, 0x7F7F817F, 0x81817F81, 0x7F818181, 0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F817F7F, -0x81818181, 0x7F7F7F81, 0x81817F81, 0x81817F7F, 0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, -0x817F7F81, 0x7F818181, 0x7F7F7F7F, 0x81818181, 0x7F817F7F, 0x7F81817F, 0x7F817F81, 0x81817F81, -0x7F7F8181, 0x7F817F81, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x817F7F7F, 0x817F817F, 0x817F8181, -0x817F7F7F, 0x81817F7F, 0x7F81817F, 0x7F81817F, 0x817F7F7F, 0x81818181, 0x817F817F, 0x7F7F7F7F, -0x8181817F, 0x817F817F, 0x7F818181, 0x7F818181, 0x817F7F7F, 0x7F81817F, 0x817F817F, 0x81818181, -0x8181817F, 0x7F7F817F, 0x7F818181, 0x817F7F81, 0x81817F7F, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, -0x7F818181, 0x7F7F7F81, 0x81817F81, 0x81817F81, 0x7F81817F, 0x817F817F, 0x7F7F7F81, 0x7F7F7F81, -0x7F817F81, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F7F817F, 0x817F7F81, 0x817F7F7F, 0x7F7F7F7F, -0x7F817F81, 0x81817F81, 0x81817F7F, 0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x81817F7F, 0x817F7F81, -0x7F81817F, 0x817F7F7F, 0x7F7F817F, 0x7F817F81, 0x8181817F, 0x81818181, 0x7F81817F, 0x7F7F8181, -0x817F817F, 0x7F817F7F, 0x817F8181, 0x817F7F7F, 0x7F7F7F81, 0x817F817F, 0x81817F81, 0x7F81817F, -0x7F817F81, 0x7F7F817F, 0x7F817F7F, 0x817F7F81, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x817F7F81, -0x81817F7F, 0x81817F7F, 0x8181817F, 0x7F818181, 0x7F7F8181, 0x7F817F81, 0x7F817F7F, 0x7F7F817F, -0x81818181, 0x7F817F7F, 0x81818181, 0x81817F7F, 0x7F817F7F, 0x7F81817F, 0x7F7F8181, 0x817F8181, -0x8181817F, 0x7F7F7F81, 0x817F817F, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F81, 0x8181817F, 0x7F7F7F81, -0x7F817F81, 0x81817F7F, 0x7F7F7F7F, 0x81817F81, 0x7F817F81, 0x817F7F81, 0x7F7F7F7F, 0x81817F81, -0x7F7F817F, 0x7F7F817F, 0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x7F7F8181, 0x81817F7F, 0x7F81817F, -0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x817F7F7F, 0x817F7F81, 0x817F7F81, 0x817F8181, 0x81818181, -0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x7F81817F, 0x7F7F7F7F, 0x81817F81, 0x81817F81, 0x7F81817F, -0x817F7F81, 0x7F817F81, 0x817F8181, 0x7F7F817F, 0x7F818181, 0x7F818181, 0x81817F7F, 0x817F7F81, -0x7F7F817F, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x8181817F, 0x817F7F81, 0x7F7F817F, 0x7F817F81, -0x81817F81, 0x81818181, 0x817F7F7F, 0x817F817F, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x81817F81, -0x7F7F8181, 0x817F7F81, 0x817F817F, 0x817F8181, 0x817F8181, 0x81817F7F, 0x817F7F81, 0x7F817F7F, -0x81817F81, 0x7F81817F, 0x7F817F81, 0x817F8181, 0x7F7F817F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, -0x81817F7F, 0x817F8181, 0x7F818181, 0x81818181, 0x817F7F81, 0x7F81817F, 0x81818181, 0x7F817F81, -0x817F8181, 0x817F7F7F, 0x7F817F7F, 0x7F817F81, 0x7F7F8181, 0x7F817F7F, 0x7F7F7F7F, 0x817F8181, -0x7F81817F, 0x7F7F7F81, 0x7F817F7F, 0x7F818181, 0x7F817F7F, 0x7F81817F, 0x7F7F817F, 0x7F7F7F81, -0x81817F7F, 0x8181817F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x81818181, -0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x7F817F7F, 0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x81817F81, -0x81817F81, 0x7F81817F, 0x7F818181, 0x7F818181, 0x81818181, 0x81817F81, 0x7F7F8181, 0x7F81817F, -0x817F8181, 0x817F7F81, 0x7F817F81, 0x7F7F7F7F, 0x81817F7F, 0x7F7F817F, 0x81817F7F, 0x7F7F7F7F, -0x7F7F817F, 0x81818181, 0x81818181, 0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x817F7F7F, 0x7F817F7F, -0x817F8181, 0x81818181, 0x7F81817F, 0x817F7F7F, 0x7F818181, 0x81818181, 0x8181817F, 0x7F818181, -0x7F817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x817F8181, 0x7F7F7F81, 0x817F817F, 0x81818181, 0x81817F7F, -0x817F8181, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x81818181, -0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x817F817F, 0x7F7F7F7F, 0x817F8181, -0x7F818181, 0x817F8181, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x8181817F, 0x7F7F7F81, 0x7F817F81, -0x817F817F, 0x81818181, 0x817F8181, 0x81817F7F, 0x817F7F81, 0x7F817F81, 0x81817F7F, 0x7F81817F, -0x7F7F817F, 0x81817F7F, 0x81817F81, 0x7F81817F, 0x7F817F81, 0x8181817F, 0x7F7F7F81, 0x81817F81, -0x81817F81, 0x817F817F, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x81817F7F, 0x7F7F817F, 0x7F7F817F, -0x817F817F, 0x8181817F, 0x7F81817F, 0x81817F7F, 0x7F818181, 0x817F7F81, 0x7F7F817F, 0x817F7F81, -0x7F7F7F81, 0x7F7F817F, 0x817F7F81, 0x7F7F7F81, 0x8181817F, 0x81818181, 0x7F7F817F, 0x7F7F8181, -0x817F7F81, 0x817F7F7F, 0x81818181, 0x7F7F817F, 0x817F817F, 0x81817F81, 0x7F817F7F, 0x7F817F81, -0x7F7F8181, 0x7F817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F81, 0x817F8181, 0x81817F81, 0x81817F81, -0x81818181, 0x817F817F, 0x7F7F8181, 0x817F817F, 0x8181817F, 0x81817F7F, 0x81817F7F, 0x7F7F7F81, -0x7F817F7F, 0x7F81817F, 0x7F817F81, 0x81817F81, 0x81817F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, -0x7F7F7F81, 0x7F817F81, 0x817F7F7F, 0x7F7F7F81, 0x81818181, 0x81818181, 0x7F7F7F7F, 0x817F7F81, -0x7F7F7F7F, 0x817F8181, 0x817F7F7F, 0x7F7F7F81, 0x817F8181, 0x7F818181, 0x817F7F81, 0x81817F7F, -0x7F817F81, 0x7F7F8181, 0x8181817F, 0x7F7F8181, 0x8181817F, 0x817F817F, 0x81817F81, 0x7F817F81, -0x7F818181, 0x7F81817F, 0x81818181, 0x81817F81, 0x7F817F81, 0x81818181, 0x7F7F7F7F, 0x7F81817F, -0x7F7F7F81, 0x7F817F7F, 0x8181817F, 0x81818181, 0x81817F81, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, -0x81817F7F, 0x7F7F817F, 0x81817F7F, 0x7F817F7F, 0x7F7F7F7F, 0x817F8181, 0x817F7F7F, 0x817F817F, -0x817F7F7F, 0x7F818181, 0x7F817F81, 0x81817F81, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F7F, -0x81818181, 0x81817F7F, 0x817F8181, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, -0x817F7F81, 0x7F81817F, 0x81817F81, 0x81817F81, 0x81817F81, 0x8181817F, 0x7F81817F, 0x817F817F, -0x81817F81, 0x7F7F7F81, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x81817F81, 0x81817F81, -0x7F7F817F, 0x7F7F817F, 0x81817F7F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F817F, -0x81817F81, 0x7F81817F, 0x81818181, 0x817F7F81, 0x7F817F7F, 0x81818181, 0x8181817F, 0x7F818181, -0x7F817F7F, 0x8181817F, 0x7F817F7F, 0x7F7F7F81, 0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x7F81817F, -0x817F7F7F, 0x81817F81, 0x81817F81, 0x7F818181, 0x7F818181, 0x7F7F7F7F, 0x7F818181, 0x7F7F8181, -0x7F81817F, 0x817F817F, 0x7F817F7F, 0x7F7F7F81, 0x81817F81, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, -0x8181817F, 0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F8181, 0x7F817F7F, 0x817F817F, 0x81818181, -0x817F7F7F, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x7F817F81, 0x817F8181, 0x81817F7F, 0x7F7F817F, -0x7F817F81, 0x8181817F, 0x817F817F, 0x8181817F, 0x7F817F7F, 0x7F7F7F7F, 0x81817F7F, 0x81817F81, -0x81817F7F, 0x81818181, 0x7F81817F, 0x7F81817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F8181, 0x81817F7F, -0x7F818181, 0x81817F81, 0x817F8181, 0x817F7F7F, 0x817F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F81, -0x81818181, 0x81817F7F, 0x81817F81, 0x7F7F8181, 0x817F8181, 0x817F817F, 0x7F818181, 0x81817F81, -0x81818181, 0x81818181, 0x7F7F8181, 0x7F817F7F, 0x817F7F81, 0x817F8181, 0x7F7F817F, 0x81817F7F, -0x7F817F81, 0x7F818181, 0x817F7F81, 0x7F7F8181, 0x81817F7F, 0x8181817F, 0x817F7F81, 0x81817F7F, -0x7F7F7F81, 0x7F7F817F, 0x81817F7F, 0x817F7F81, 0x7F817F7F, 0x8181817F, 0x817F7F81, 0x817F7F81, -0x817F7F7F, 0x81818181, 0x7F817F81, 0x817F7F7F, 0x817F817F, 0x817F7F81, 0x81817F7F, 0x7F81817F, -0x81817F81, 0x817F8181, 0x817F817F, 0x81817F7F, 0x81818181, 0x81818181, 0x817F8181, 0x817F817F, -0x7F7F817F, 0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x8181817F, 0x7F7F7F7F, 0x81817F7F, 0x7F7F7F81, -0x81817F7F, 0x7F817F7F, 0x7F817F7F, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x81817F7F, 0x817F8181, -0x7F817F7F, 0x817F7F81, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, 0x8181817F, -0x817F7F81, 0x81818181, 0x817F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F818181, 0x7F7F817F, 0x7F817F7F, -0x81818181, 0x81817F7F, 0x7F7F8181, 0x817F817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F81, -0x7F7F7F81, 0x817F8181, 0x817F8181, 0x81818181, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, 0x7F817F81, -0x7F7F7F7F, 0x7F7F817F, 0x817F817F, 0x7F818181, 0x81817F7F, 0x817F7F81, 0x817F817F, 0x81817F7F, -0x7F7F8181, 0x81818181, 0x7F7F7F7F, 0x817F8181, 0x7F81817F, 0x817F7F81, 0x7F818181, 0x81818181, -0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F7F81, 0x8181817F, 0x81817F7F, 0x81818181, 0x817F7F81, -0x7F81817F, 0x817F817F, 0x8181817F, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x7F818181, 0x817F7F81, -0x7F817F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x817F817F, 0x7F818181, -0x7F817F7F, 0x7F7F8181, 0x7F81817F, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x817F7F7F, 0x8181817F, -0x7F817F81, 0x7F818181, 0x7F81817F, 0x7F817F7F, 0x817F8181, 0x7F7F7F7F, 0x7F817F7F, 0x817F817F, -0x817F7F81, 0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F7F8181, 0x7F7F8181, 0x7F818181, 0x7F7F817F, -0x8181817F, 0x8181817F, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, -0x817F7F7F, 0x7F7F8181, 0x817F7F81, 0x817F7F7F, 0x81818181, 0x81818181, 0x81818181, 0x7F7F7F81, -0x7F7F7F7F, 0x7F81817F, 0x7F81817F, 0x8181817F, 0x7F817F81, 0x7F818181, 0x817F8181, 0x8181817F, -0x7F7F7F7F, 0x7F818181, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x8181817F, -0x7F7F817F, 0x81817F81, 0x81818181, 0x7F81817F, 0x81817F81, 0x7F7F8181, 0x81817F7F, 0x7F7F7F81, -0x81818181, 0x817F8181, 0x81818181, 0x817F7F81, 0x81818181, 0x81818181, 0x817F8181, 0x817F8181, -0x7F7F7F81, 0x817F7F7F, 0x7F818181, 0x81817F7F, 0x81817F81, 0x817F8181, 0x817F8181, 0x817F7F7F, -0x7F7F7F7F, 0x81817F81, 0x81817F7F, 0x7F817F81, 0x81817F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F817F, -0x7F817F7F, 0x7F7F7F7F, 0x7F817F81, 0x817F817F, 0x817F8181, 0x817F8181, 0x7F7F817F, 0x7F7F7F81, -0x7F818181, 0x81817F7F, 0x817F8181, 0x817F7F7F, 0x7F81817F, 0x7F7F817F, 0x817F8181, 0x7F7F7F7F, -0x7F818181, 0x7F7F8181, 0x7F81817F, 0x817F7F7F, 0x81818181, 0x817F8181, 0x817F8181, 0x81817F81, -0x817F7F81, 0x7F817F81, 0x8181817F, 0x7F818181, 0x7F817F81, 0x7F7F7F81, 0x8181817F, 0x7F818181, -0x81818181, 0x817F8181, 0x7F817F81, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x81818181, 0x7F7F7F81, -0x7F81817F, 0x7F7F7F81, 0x817F817F, 0x81817F7F, 0x817F817F, 0x7F81817F, 0x81817F81, 0x817F817F, -0x81817F7F, 0x817F8181, 0x817F7F81, 0x81817F7F, 0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x7F7F8181, -0x7F818181, 0x817F7F81, 0x7F7F7F7F, 0x817F8181, 0x81818181, 0x817F817F, 0x81818181, 0x7F7F7F7F, -0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F7F7F, 0x7F818181, 0x81818181, 0x817F7F81, -0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x81817F81, 0x7F818181, 0x7F7F8181, 0x7F818181, 0x81817F7F, -0x7F817F81, 0x8181817F, 0x7F7F7F7F, 0x817F7F81, 0x817F7F81, 0x7F7F817F, 0x817F817F, 0x7F818181, -0x817F7F81, 0x7F817F81, 0x817F8181, 0x81817F7F, 0x7F817F81, 0x817F7F81, 0x81817F81, 0x7F817F7F, -0x81817F7F, 0x81818181, 0x817F7F81, 0x81818181, 0x81817F81, 0x817F7F7F, 0x81817F81, 0x7F81817F, -0x7F7F8181, 0x817F7F81, 0x817F817F, 0x817F8181, 0x7F81817F, 0x7F7F7F81, 0x7F817F81, 0x7F81817F, -0x8181817F, 0x7F7F817F, 0x817F817F, 0x81817F81, 0x81818181, 0x7F7F8181, 0x7F7F8181, 0x7F817F81, -0x8181817F, 0x81818181, 0x817F817F, 0x81818181, 0x7F7F8181, 0x817F7F7F, 0x7F7F817F, 0x7F7F8181, -0x7F7F7F7F, 0x817F7F81, 0x817F817F, 0x8181817F, 0x7F7F817F, 0x7F818181, 0x817F7F7F, 0x817F7F7F, -0x7F818181, 0x81817F81, 0x7F818181, 0x7F7F7F7F, 0x81817F81, 0x7F81817F, 0x81817F7F, 0x817F7F7F, -0x7F7F8181, 0x7F7F817F, 0x7F817F81, 0x817F817F, 0x817F8181, 0x7F817F81, 0x7F7F7F81, 0x7F7F8181, -0x81817F7F, 0x817F7F7F, 0x817F8181, 0x7F81817F, 0x7F817F81, 0x81817F81, 0x81818181, 0x817F817F, -0x7F7F8181, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x7F817F81, 0x7F7F817F, 0x817F7F7F, 0x7F817F7F, -0x81817F81, 0x7F818181, 0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x817F7F81, 0x7F81817F, -0x817F7F81, 0x7F81817F, 0x817F7F81, 0x7F818181, 0x81817F81, 0x81817F7F, 0x817F7F81, 0x7F817F81, -0x7F81817F, 0x817F7F81, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F8181, -0x7F7F7F7F, 0x81817F7F, 0x817F817F, 0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x7F817F81, -0x7F817F7F, 0x7F81817F, 0x7F7F817F, 0x7F7F8181, 0x7F7F817F, 0x8181817F, 0x7F81817F, 0x7F7F7F81, -0x7F81817F, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F7F81, 0x817F8181, 0x817F7F81, 0x7F818181, -0x7F7F7F7F, 0x81817F81, 0x7F7F817F, 0x81818181, 0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x7F7F8181, -0x81818181, 0x817F8181, 0x81817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F81817F, 0x81817F7F, 0x817F7F7F, -0x817F817F, 0x7F7F817F, 0x81817F81, 0x7F817F7F, 0x81817F7F, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, -0x81818181, 0x7F7F817F, 0x81818181, 0x7F7F8181, 0x7F7F7F81, 0x7F7F7F81, 0x81818181, 0x7F818181, -0x7F817F7F, 0x817F8181, 0x81817F81, 0x7F818181, 0x817F7F7F, 0x81818181, 0x817F7F81, 0x7F7F817F, -0x7F817F81, 0x81817F7F, 0x817F817F, 0x817F817F, 0x81817F7F, 0x81817F81, 0x7F7F8181, 0x7F7F7F7F, -0x817F7F81, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, 0x7F818181, 0x7F818181, -0x817F8181, 0x7F817F7F, 0x81817F7F, 0x81817F81, 0x817F7F81, 0x81817F81, 0x7F818181, 0x7F7F8181, -0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, 0x7F7F7F7F, 0x817F8181, 0x817F8181, -0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x817F7F81, 0x8181817F, 0x81818181, -0x7F7F8181, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, 0x817F817F, 0x7F817F81, 0x7F817F81, 0x7F817F7F, -0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x81818181, 0x81818181, 0x817F7F7F, 0x817F8181, 0x7F7F8181, -0x81817F81, 0x7F7F817F, 0x8181817F, 0x7F7F817F, 0x81818181, 0x7F81817F, 0x817F817F, 0x817F817F, -0x7F7F817F, 0x7F81817F, 0x7F7F817F, 0x7F817F81, 0x8181817F, 0x81817F7F, 0x81818181, 0x7F81817F, -0x7F818181, 0x7F817F7F, 0x7F817F81, 0x8181817F, 0x81817F81, 0x8181817F, 0x817F7F81, 0x7F817F7F, -0x817F8181, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x817F8181, 0x7F817F81, 0x7F7F8181, 0x7F818181, -0x7F7F7F81, 0x7F818181, 0x8181817F, 0x81817F7F, 0x7F818181, 0x7F817F81, 0x817F7F81, 0x7F7F7F7F, -0x7F818181, 0x7F7F7F81, 0x81818181, 0x7F818181, 0x817F7F81, 0x7F7F7F81, 0x8181817F, 0x7F7F8181, -0x7F818181, 0x817F8181, 0x7F818181, 0x8181817F, 0x81817F7F, 0x817F8181, 0x81818181, 0x7F7F8181, -0x817F7F81, 0x81818181, 0x817F817F, 0x7F81817F, 0x8181817F, 0x817F817F, 0x7F7F817F, 0x7F7F7F7F, -0x8181817F, 0x7F81817F, 0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, 0x7F7F7F81, 0x817F7F81, -0x817F8181, 0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x7F817F7F, -0x817F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x7F817F81, 0x7F7F8181, 0x817F817F, 0x7F817F7F, -0x81818181, 0x7F7F7F81, 0x7F817F81, 0x7F7F8181, 0x8181817F, 0x817F7F7F, 0x7F817F81, 0x81818181, -0x81818181, 0x7F7F817F, 0x7F81817F, 0x817F817F, 0x817F7F7F, 0x81818181, 0x817F8181, 0x7F7F8181, -0x81818181, 0x817F7F81, 0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F7F, -0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x817F817F, 0x7F81817F, 0x81817F81, 0x817F8181, 0x7F7F817F, -0x8181817F, 0x817F7F81, 0x81817F81, 0x8181817F, 0x7F818181, 0x817F8181, 0x81818181, 0x7F817F81, -0x817F8181, 0x81817F81, 0x7F81817F, 0x7F818181, 0x7F7F7F7F, 0x7F7F8181, 0x81817F81, 0x7F7F8181, -0x8181817F, 0x817F7F81, 0x81817F81, 0x7F7F7F81, 0x7F7F7F81, 0x817F8181, 0x81818181, 0x7F81817F, -0x7F7F8181, 0x817F8181, 0x817F7F7F, 0x81818181, 0x7F7F7F7F, 0x8181817F, 0x7F7F817F, 0x7F7F7F7F, -0x7F7F7F81, 0x7F81817F, 0x7F817F81, 0x7F7F8181, 0x7F7F7F7F, 0x817F7F7F, 0x7F817F7F, 0x817F8181, -0x7F7F7F81, 0x7F817F81, 0x817F8181, 0x817F817F, 0x817F817F, 0x7F817F7F, 0x8181817F, 0x817F7F81, -0x81817F81, 0x7F817F81, 0x7F7F817F, 0x7F817F7F, 0x8181817F, 0x7F817F81, 0x7F7F817F, 0x81818181, -0x7F81817F, 0x7F7F8181, 0x81817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F81, 0x817F8181, 0x817F817F, -0x817F817F, 0x7F817F7F, 0x7F7F8181, 0x7F817F7F, 0x8181817F, 0x7F7F8181, 0x81818181, 0x7F817F81, -0x7F7F7F81, 0x81817F7F, 0x817F817F, 0x81818181, 0x7F817F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, -0x7F7F8181, 0x81817F7F, 0x7F81817F, 0x81817F81, 0x7F7F8181, 0x817F8181, 0x817F817F, 0x817F7F7F, -0x7F7F817F, 0x817F8181, 0x81817F81, 0x7F7F8181, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x7F817F7F, -0x7F7F7F7F, 0x7F81817F, 0x7F7F7F81, 0x81817F81, 0x7F7F7F81, 0x7F817F7F, 0x817F817F, 0x81817F7F, -0x7F81817F, 0x81818181, 0x81817F81, 0x81817F7F, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F81, 0x817F7F81, -0x817F7F7F, 0x7F7F8181, 0x817F7F81, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F81817F, 0x7F818181, -0x7F7F817F, 0x81818181, 0x7F7F7F7F, 0x8181817F, 0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x817F817F, -0x7F7F8181, 0x7F7F8181, 0x81818181, 0x7F7F817F, 0x81817F7F, 0x7F817F81, 0x7F817F81, 0x81817F81, -0x817F7F7F, 0x7F7F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x817F8181, 0x817F7F81, 0x817F7F7F, 0x7F817F7F, -0x81817F81, 0x817F817F, 0x817F8181, 0x7F7F7F7F, 0x81818181, 0x7F7F817F, 0x7F7F817F, 0x7F7F817F, -0x817F8181, 0x817F8181, 0x81817F81, 0x7F7F8181, 0x8181817F, 0x817F8181, 0x7F7F7F7F, 0x817F8181, -0x7F81817F, 0x7F7F7F81, 0x817F817F, 0x817F7F81, 0x7F817F7F, 0x7F817F81, 0x817F7F7F, 0x817F817F, -0x7F7F8181, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F817F81, 0x817F7F81, -0x8181817F, 0x81818181, 0x7F818181, 0x817F7F7F, 0x817F7F81, 0x817F817F, 0x7F81817F, 0x8181817F, -0x817F817F, 0x7F818181, 0x7F7F7F81, 0x8181817F, 0x7F817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F7F, -0x7F7F817F, 0x7F7F8181, 0x7F817F81, 0x7F7F7F7F, 0x81817F81, 0x817F817F, 0x7F817F81, 0x7F7F817F, -0x817F7F81, 0x817F817F, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F8181, 0x7F817F7F, 0x81818181, -0x817F817F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x8181817F, 0x7F817F7F, -0x7F7F817F, 0x7F7F8181, 0x8181817F, 0x7F817F81, 0x81817F81, 0x7F7F7F81, 0x817F817F, 0x817F7F81, -0x7F7F7F81, 0x7F7F7F81, 0x7F817F7F, 0x817F7F81, 0x7F817F81, 0x817F8181, 0x81817F81, 0x81817F7F, -0x8181817F, 0x81817F7F, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x817F7F7F, 0x8181817F, 0x81817F81, -0x7F818181, 0x81817F81, 0x7F7F8181, 0x7F81817F, 0x7F7F7F7F, 0x7F818181, 0x7F81817F, 0x817F8181, -0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x81817F81, 0x81818181, 0x8181817F, -0x7F818181, 0x7F7F7F7F, 0x817F817F, 0x7F81817F, 0x817F817F, 0x817F8181, 0x7F81817F, 0x7F7F817F, -0x817F7F81, 0x7F818181, 0x8181817F, 0x7F81817F, 0x8181817F, 0x81817F7F, 0x81817F81, 0x7F7F8181, -0x817F817F, 0x7F7F8181, 0x7F818181, 0x817F8181, 0x7F7F7F81, 0x81817F7F, 0x817F7F81, 0x7F817F81, -0x7F817F7F, 0x7F817F81, 0x81817F7F, 0x81817F7F, 0x817F817F, 0x81817F81, 0x7F7F8181, 0x7F818181, -0x7F81817F, 0x7F7F8181, 0x7F7F817F, 0x817F8181, 0x817F7F7F, 0x7F817F81, 0x817F7F7F, 0x817F817F, -0x81817F7F, 0x81817F7F, 0x7F81817F, 0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F8181, 0x7F818181, -0x7F817F81, 0x817F7F81, 0x81818181, 0x7F818181, 0x8181817F, 0x7F7F8181, 0x81817F81, 0x7F817F81, -0x8181817F, 0x817F817F, 0x817F8181, 0x7F7F7F81, 0x81817F81, 0x7F817F7F, 0x7F7F7F7F, 0x81818181, -0x7F81817F, 0x7F81817F, 0x817F817F, 0x7F818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F818181, 0x7F7F7F7F, -0x7F817F7F, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, 0x81817F81, 0x7F7F7F7F, 0x817F7F81, 0x817F8181, -0x7F7F817F, 0x7F817F7F, 0x81817F7F, 0x7F7F8181, 0x81818181, 0x81817F81, 0x817F817F, 0x7F7F8181, -0x817F8181, 0x817F817F, 0x7F818181, 0x81818181, 0x81817F7F, 0x81818181, 0x7F7F7F81, 0x7F7F8181, -0x817F817F, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x8181817F, 0x7F7F8181, 0x7F7F817F, 0x7F818181, -0x8181817F, 0x817F7F81, 0x7F818181, 0x7F7F8181, 0x7F7F7F7F, 0x817F817F, 0x7F817F7F, 0x817F7F81, -0x7F7F7F7F, 0x7F7F7F81, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x7F81817F, 0x7F817F81, 0x7F817F7F, -0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, -0x817F7F7F, 0x7F818181, 0x817F817F, 0x8181817F, 0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x817F817F, -0x7F7F7F81, 0x81818181, 0x81817F81, 0x7F7F8181, 0x81817F7F, 0x7F7F7F81, 0x7F7F817F, 0x7F81817F, -0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x81817F81, 0x7F7F817F, 0x81817F81, 0x817F7F81, 0x7F81817F, -0x817F817F, 0x81818181, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x8181817F, 0x81817F81, 0x7F818181, -0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, 0x81817F7F, 0x817F7F81, 0x817F817F, 0x7F7F817F, 0x7F818181, -0x7F817F81, 0x7F7F7F81, 0x7F817F81, 0x7F81817F, 0x817F817F, 0x7F81817F, 0x7F817F7F, 0x81817F81, -0x7F7F8181, 0x81817F7F, 0x7F7F7F7F, 0x81817F81, 0x7F7F8181, 0x817F817F, 0x7F7F817F, 0x81817F81, -0x7F7F7F81, 0x81817F81, 0x81817F81, 0x8181817F, 0x8181817F, 0x81817F81, 0x7F7F817F, 0x817F7F81, -0x7F7F8181, 0x7F7F8181, 0x7F817F81, 0x7F81817F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F7F81, -0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x817F8181, 0x7F7F7F81, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F7F, -0x81817F7F, 0x7F817F81, 0x7F81817F, 0x7F818181, 0x8181817F, 0x7F817F7F, 0x817F7F81, 0x817F8181, -0x81818181, 0x817F8181, 0x7F7F7F7F, 0x7F7F7F7F, 0x81817F7F, 0x7F81817F, 0x7F818181, 0x7F81817F, -0x7F7F7F7F, 0x81817F81, 0x81818181, 0x7F7F7F81, 0x7F81817F, 0x7F7F7F81, 0x8181817F, 0x7F817F81, -0x7F817F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, 0x817F817F, 0x7F7F8181, 0x817F7F7F, 0x7F7F8181, -0x7F817F81, 0x7F7F817F, 0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x7F7F817F, 0x817F7F7F, 0x8181817F, -0x7F7F7F7F, 0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F817F81, 0x8181817F, 0x81817F81, 0x7F7F8181, -0x8181817F, 0x7F7F817F, 0x81817F81, 0x81818181, 0x817F817F, 0x7F817F81, 0x7F7F817F, 0x7F817F7F, -0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x817F8181, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x7F81817F, -0x7F7F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x81818181, 0x7F817F7F, 0x8181817F, 0x7F817F7F, -0x81818181, 0x7F7F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x7F817F81, 0x817F7F81, 0x7F817F81, 0x7F7F817F, -0x817F7F7F, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F7F, 0x81817F81, 0x81817F81, -0x817F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F81817F, 0x817F7F7F, 0x817F817F, 0x817F817F, 0x7F7F8181, -0x7F7F7F7F, 0x7F818181, 0x7F7F8181, 0x7F7F8181, 0x817F7F7F, 0x7F818181, 0x8181817F, 0x7F7F8181, -0x817F817F, 0x81817F81, 0x81817F81, 0x81817F81, 0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, -0x817F7F81, 0x81818181, 0x8181817F, 0x817F8181, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, 0x817F8181, -0x81817F81, 0x7F81817F, 0x7F7F817F, 0x81817F81, 0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x817F817F, -0x81818181, 0x81817F81, 0x81818181, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F8181, -0x81817F81, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, 0x817F7F7F, 0x81817F7F, 0x81817F81, 0x817F7F81, -0x81818181, 0x7F81817F, 0x7F817F7F, 0x7F81817F, 0x817F8181, 0x7F7F8181, 0x7F818181, 0x817F7F81, -0x7F7F8181, 0x817F817F, 0x817F7F81, 0x817F817F, 0x81817F81, 0x817F7F81, 0x7F817F7F, 0x817F817F, -0x7F81817F, 0x81818181, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x817F8181, -0x7F817F81, 0x7F7F7F81, 0x817F7F81, 0x81817F7F, 0x817F7F81, 0x7F7F8181, 0x817F8181, 0x81817F7F, -0x7F818181, 0x817F8181, 0x817F817F, 0x7F7F8181, 0x8181817F, 0x8181817F, 0x817F7F7F, 0x7F7F8181, -0x8181817F, 0x817F8181, 0x817F7F81, 0x7F817F81, 0x7F818181, 0x7F81817F, 0x81818181, 0x817F7F7F, -0x7F7F7F7F, 0x81818181, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, 0x7F7F7F7F, 0x7F7F7F7F, -0x81818181, 0x7F7F7F81, 0x81817F81, 0x817F8181, 0x7F817F7F, 0x81817F81, 0x8181817F, 0x7F7F7F81, -0x7F818181, 0x7F7F817F, 0x7F7F7F81, 0x81817F7F, 0x81817F7F, 0x7F818181, 0x81818181, 0x817F8181, -0x7F817F7F, 0x7F818181, 0x7F81817F, 0x7F7F7F7F, 0x817F8181, 0x817F8181, 0x81817F81, 0x817F817F, -0x7F7F817F, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F817F, 0x817F8181, 0x817F7F81, 0x817F7F7F, 0x7F7F8181, -0x7F7F7F7F, 0x817F817F, 0x81817F7F, 0x7F7F817F, 0x81818181, 0x7F7F8181, 0x7F817F7F, 0x7F817F81, -0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x7F818181, 0x7F818181, 0x81817F7F, 0x8181817F, 0x817F7F81, -0x8181817F, 0x817F7F81, 0x7F7F817F, 0x7F817F81, 0x817F7F81, 0x81817F81, 0x81817F81, 0x817F817F, -0x817F7F7F, 0x7F818181, 0x7F817F7F, 0x8181817F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F817F, 0x7F81817F, -0x8181817F, 0x7F817F81, 0x7F7F817F, 0x817F8181, 0x817F817F, 0x7F818181, 0x817F7F7F, 0x7F7F8181, -0x7F7F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F7F817F, 0x817F8181, 0x7F817F81, 0x8181817F, -0x7F818181, 0x817F7F81, 0x7F7F7F7F, 0x8181817F, 0x817F7F81, 0x7F817F81, 0x81817F7F, 0x817F7F7F, -0x81818181, 0x81818181, 0x7F817F81, 0x7F81817F, 0x7F7F8181, 0x81817F7F, 0x7F7F8181, 0x7F817F81, -0x7F7F7F7F, 0x8181817F, 0x817F817F, 0x7F7F8181, 0x817F817F, 0x817F7F7F, 0x7F7F7F81, 0x81817F81, -0x817F7F7F, 0x817F8181, 0x7F818181, 0x817F7F7F, 0x7F7F7F7F, 0x81818181, 0x7F818181, 0x7F7F7F81, -0x7F7F7F7F, 0x817F817F, 0x7F7F8181, 0x81818181, 0x817F817F, 0x817F7F81, 0x817F7F7F, 0x817F8181, -0x7F817F81, 0x7F818181, 0x7F7F817F, 0x7F81817F, 0x81818181, 0x817F7F81, 0x81817F7F, 0x7F7F7F81, -0x7F7F817F, 0x7F818181, 0x817F8181, 0x817F7F81, 0x7F817F7F, 0x7F7F817F, 0x7F81817F, 0x81817F7F, -0x7F818181, 0x7F7F7F81, 0x81817F7F, 0x81818181, 0x81817F7F, 0x817F8181, 0x81817F7F, 0x817F7F7F, -0x7F7F817F, 0x7F7F8181, 0x81818181, 0x7F81817F, 0x7F7F7F7F, 0x7F817F81, 0x81817F7F, 0x817F7F7F, -0x8181817F, 0x817F7F7F, 0x7F817F7F, 0x817F817F, 0x817F8181, 0x7F818181, 0x81817F7F, 0x7F7F8181, -0x817F7F81, 0x8181817F, 0x817F8181, 0x7F817F81, 0x7F7F817F, 0x7F7F817F, 0x7F7F7F7F, 0x7F81817F, -0x7F7F7F81, 0x7F81817F, 0x81818181, 0x7F817F7F, 0x817F8181, 0x81817F81, 0x7F818181, 0x7F817F81, -0x7F817F81, 0x817F7F7F, 0x7F817F81, 0x7F7F8181, 0x817F817F, 0x817F8181, 0x8181817F, 0x81817F81, -0x817F817F, 0x7F7F817F, 0x81817F7F, 0x7F817F81, 0x817F817F, 0x817F8181, 0x7F7F7F81, 0x817F8181, -0x7F7F7F7F, 0x81817F7F, 0x7F817F81, 0x7F7F7F7F, 0x8181817F, 0x7F81817F, 0x817F7F7F, 0x81817F7F, -0x817F7F81, 0x817F7F7F, 0x7F7F817F, 0x7F7F7F7F, 0x8181817F, 0x8181817F, 0x817F817F, 0x817F7F7F, -0x817F7F81, 0x817F7F7F, 0x8181817F, 0x7F7F7F81, 0x7F817F7F, 0x7F817F81, 0x817F817F, 0x7F81817F, -0x81818181, 0x7F817F81, 0x7F817F81, 0x817F7F81, 0x7F7F817F, 0x7F81817F, 0x7F7F8181, 0x7F817F7F, -0x817F817F, 0x81818181, 0x7F7F8181, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F7F, 0x7F7F7F81, 0x7F817F7F, -0x7F817F7F, 0x7F7F817F, 0x7F817F7F, 0x817F8181, 0x7F81817F, 0x7F81817F, 0x7F7F7F7F, 0x817F8181, -0x81817F7F, 0x7F7F817F, 0x7F817F81, 0x817F817F, 0x817F8181, 0x817F8181, 0x7F817F81, 0x7F818181, -0x7F7F7F7F, 0x7F81817F, 0x7F818181, 0x817F8181, 0x817F7F81, 0x7F81817F, 0x817F817F, 0x7F817F81, -0x7F817F7F, 0x7F81817F, 0x817F817F, 0x81817F7F, 0x7F7F7F7F, 0x817F817F, 0x7F817F7F, 0x7F7F8181, -0x81817F81, 0x7F7F7F7F, 0x81818181, 0x817F817F, 0x81818181, 0x7F817F7F, 0x81817F81, 0x7F7F7F7F, -0x81818181, 0x7F81817F, 0x81818181, 0x7F7F7F7F, 0x7F7F8181, 0x817F7F7F, 0x7F817F7F, 0x817F7F7F, -0x817F8181, 0x7F818181, 0x81818181, 0x817F7F7F, 0x81817F7F, 0x817F7F81, 0x7F81817F, 0x7F7F8181, -0x81818181, 0x7F818181, 0x7F818181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x817F8181, 0x7F818181, -0x81817F7F, 0x7F7F7F81, 0x817F7F7F, 0x817F817F, 0x7F7F8181, 0x817F8181, 0x81817F81, 0x817F817F, -0x7F817F81, 0x7F7F8181, 0x817F817F, 0x7F81817F, 0x7F818181, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, -0x7F81817F, 0x81817F7F, 0x81818181, 0x7F818181, 0x7F817F7F, 0x7F7F817F, 0x817F7F7F, 0x81817F81, -0x7F817F7F, 0x7F81817F, 0x817F7F7F, 0x7F7F817F, 0x7F81817F, 0x817F8181, 0x81818181, 0x81817F7F, -0x817F8181, 0x7F817F7F, 0x7F817F7F, 0x8181817F, 0x81817F81, 0x7F7F7F81, 0x81817F81, 0x7F7F7F81, -0x7F817F7F, 0x7F7F7F7F, 0x81818181, 0x7F81817F, 0x8181817F, 0x7F81817F, 0x817F7F7F, 0x817F817F, -0x817F7F81, 0x7F818181, 0x817F817F, 0x7F7F7F81, 0x7F7F817F, 0x817F7F81, 0x81817F7F, 0x81818181, -0x817F817F, 0x7F7F8181, 0x817F7F81, 0x8181817F, 0x81817F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F817F, -0x817F8181, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F7F81, 0x7F81817F, 0x7F7F817F, -0x7F7F7F81, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F81, 0x81817F7F, 0x7F817F7F, 0x8181817F, 0x7F7F8181, -0x81817F81, 0x817F8181, 0x7F7F7F81, 0x81818181, 0x817F7F81, 0x8181817F, 0x817F8181, 0x81817F7F, -0x817F7F7F, 0x7F818181, 0x81817F81, 0x7F81817F, 0x7F7F7F81, 0x8181817F, 0x7F7F817F, 0x8181817F, -0x8181817F, 0x7F817F7F, 0x7F817F7F, 0x8181817F, 0x817F7F7F, 0x817F7F81, 0x7F817F7F, 0x7F818181, -0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x817F817F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F7F, 0x817F817F, -0x7F7F7F81, 0x7F7F817F, 0x7F817F81, 0x7F81817F, 0x7F817F81, 0x7F817F81, 0x7F7F7F7F, 0x7F818181, -0x817F817F, 0x817F7F7F, 0x817F8181, 0x7F818181, 0x7F7F7F81, 0x817F7F7F, 0x7F81817F, 0x817F8181, -0x817F7F81, 0x7F7F7F81, 0x8181817F, 0x817F817F, 0x8181817F, 0x817F7F7F, 0x7F81817F, 0x81817F7F, -0x7F7F817F, 0x817F8181, 0x7F7F7F81, 0x81817F81, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, -0x7F7F8181, 0x817F817F, 0x7F7F7F81, 0x7F818181, 0x81818181, 0x7F7F7F81, 0x7F817F7F, 0x817F8181, -0x817F817F, 0x7F7F8181, 0x7F817F7F, 0x7F7F7F81, 0x7F7F817F, 0x8181817F, 0x7F817F81, 0x7F81817F, -0x7F817F81, 0x7F818181, 0x81818181, 0x8181817F, 0x7F7F7F81, 0x817F7F7F, 0x81818181, 0x7F7F8181, -0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x817F8181, 0x7F818181, 0x7F7F817F, 0x817F7F7F, 0x7F7F7F7F, -0x817F7F81, 0x817F7F7F, 0x817F817F, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x817F7F81, 0x7F81817F, -0x817F7F81, 0x7F817F7F, 0x7F817F7F, 0x7F7F817F, 0x817F817F, 0x817F7F81, 0x7F7F7F81, 0x81818181, -0x81817F81, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x8181817F, -0x81817F7F, 0x7F81817F, 0x7F7F817F, 0x817F7F81, 0x7F81817F, 0x817F8181, 0x7F7F7F81, 0x7F817F81, -0x7F7F7F81, 0x81817F81, 0x7F818181, 0x81817F7F, 0x817F817F, 0x817F7F81, 0x7F7F817F, 0x8181817F, -0x817F817F, 0x817F817F, 0x817F817F, 0x7F817F7F, 0x81818181, 0x7F7F8181, 0x7F817F81, 0x7F7F8181, -0x81817F81, 0x8181817F, 0x7F7F7F7F, 0x7F817F7F, 0x817F7F81, 0x817F8181, 0x7F7F7F7F, 0x7F7F8181, -0x7F7F817F, 0x7F818181, 0x7F817F81, 0x81817F7F, 0x817F817F, 0x7F817F7F, 0x817F7F7F, 0x81817F81, -0x7F817F81, 0x817F7F7F, 0x7F81817F, 0x7F7F7F7F, 0x7F7F7F7F, 0x7F817F81, 0x81817F7F, 0x81817F81, -0x7F817F7F, 0x7F7F7F7F, 0x7F818181, 0x7F817F7F, 0x81817F81, 0x7F7F817F, 0x817F7F7F, 0x817F8181, -0x7F817F7F, 0x81817F7F, 0x817F8181, 0x817F817F, 0x817F8181, 0x7F7F8181, 0x7F817F7F, 0x81817F7F, -0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x7F817F81, -0x7F81817F, 0x81817F81, 0x81817F81, 0x7F7F7F81, 0x81817F7F, 0x7F7F8181, 0x817F7F81, 0x81817F81, -0x7F817F7F, 0x7F7F817F, 0x81817F7F, 0x7F7F7F81, 0x817F817F, 0x7F7F7F7F, 0x7F81817F, 0x7F7F8181, -0x817F817F, 0x817F8181, 0x7F7F7F81, 0x81817F7F, 0x817F8181, 0x7F7F8181, 0x7F7F817F, 0x817F7F7F, -0x7F817F81, 0x817F817F, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x81817F7F, 0x7F817F7F, 0x7F817F7F, -0x81817F7F, 0x7F818181, 0x817F8181, 0x7F7F7F7F, 0x8181817F, 0x7F817F81, 0x8181817F, 0x81817F81, -0x8181817F, 0x7F817F7F, 0x817F817F, 0x817F7F81, 0x81818181, 0x7F817F81, 0x7F81817F, 0x7F817F81, -0x817F7F81, 0x7F817F7F, 0x7F81817F, 0x817F8181, 0x817F817F, 0x7F7F7F7F, 0x81817F7F, 0x7F818181, -0x817F7F81, 0x7F7F8181, 0x817F8181, 0x8181817F, 0x81818181, 0x7F818181, 0x7F7F7F7F, 0x7F7F817F, -0x7F818181, 0x81818181, 0x817F7F7F, 0x7F818181, 0x7F7F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F818181, -0x817F817F, 0x7F817F7F, 0x8181817F, 0x7F7F8181, 0x7F817F81, 0x817F7F7F, 0x8181817F, 0x81817F81, -0x7F81817F, 0x7F817F81, 0x81817F81, 0x81817F81, 0x81818181, 0x81818181, 0x81817F7F, 0x7F817F81, -0x7F7F7F81, 0x817F817F, 0x81817F7F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x7F81817F, -0x8181817F, 0x81817F81, 0x7F81817F, 0x81817F81, 0x81817F7F, 0x817F7F7F, 0x8181817F, 0x7F7F817F, -0x81818181, 0x7F81817F, 0x81817F7F, 0x7F7F7F7F, 0x817F8181, 0x81817F7F, 0x817F7F7F, 0x817F7F7F, -0x7F817F7F, 0x7F7F7F81, 0x7F818181, 0x817F817F, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, 0x7F7F817F, -0x817F7F7F, 0x817F8181, 0x7F817F7F, 0x7F81817F, 0x7F7F817F, 0x81817F7F, 0x81817F81, 0x7F81817F, -0x7F7F817F, 0x7F7F7F7F, 0x7F81817F, 0x817F817F, 0x7F7F7F7F, 0x8181817F, 0x7F7F8181, 0x7F7F8181, -0x817F7F81, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x817F7F7F, 0x7F81817F, 0x817F7F81, 0x817F7F7F, -0x81817F7F, 0x7F7F817F, 0x817F817F, 0x7F81817F, 0x7F81817F, 0x817F8181, 0x7F7F817F, 0x81817F81, -0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F8181, 0x817F817F, 0x81817F7F, 0x7F7F8181, 0x817F7F81, -0x7F7F7F81, 0x817F7F7F, 0x81817F81, 0x817F7F81, 0x81817F81, 0x81817F81, 0x7F7F7F7F, 0x7F7F8181, -0x817F7F7F, 0x81818181, 0x7F818181, 0x7F7F817F, 0x817F8181, 0x7F7F7F81, 0x7F818181, 0x7F7F7F81, -0x7F7F7F81, 0x7F817F81, 0x7F7F817F, 0x7F7F7F7F, 0x8181817F, 0x81817F7F, 0x8181817F, 0x817F817F, -0x7F817F7F, 0x817F8181, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x81818181, 0x7F81817F, 0x7F7F7F81, -0x817F7F81, 0x7F818181, 0x7F81817F, 0x7F7F817F, 0x817F7F81, 0x7F817F7F, 0x817F7F81, 0x7F817F81, -0x81817F7F, 0x817F7F81, 0x7F7F7F7F, 0x7F7F8181, 0x7F7F8181, 0x81818181, 0x81818181, 0x7F817F7F, -0x7F817F81, 0x7F818181, 0x7F7F817F, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, 0x81818181, 0x7F81817F, -0x81817F7F, 0x7F81817F, 0x7F7F7F81, 0x7F81817F, 0x81817F7F, 0x7F81817F, 0x7F817F7F, 0x817F7F81, -0x81818181, 0x81817F81, 0x817F8181, 0x8181817F, 0x817F817F, 0x81817F81, 0x7F81817F, 0x7F817F81, -0x817F817F, 0x7F81817F, 0x81817F81, 0x7F817F7F, 0x7F7F817F, 0x7F7F817F, 0x817F817F, 0x7F7F7F7F, -0x7F817F7F, 0x7F7F7F81, 0x7F7F8181, 0x7F7F7F7F, 0x7F817F81, 0x7F818181, 0x81817F7F, 0x817F817F, -0x7F81817F, 0x81817F7F, 0x7F818181, 0x81817F7F, 0x817F7F7F, 0x7F817F7F, 0x7F7F7F81, 0x7F7F8181, -0x7F81817F, 0x817F8181, 0x81818181, 0x7F818181, 0x7F817F81, 0x7F817F7F, 0x7F818181, 0x7F7F7F7F, -0x7F7F817F, 0x817F7F81, 0x81817F81, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x817F7F81, 0x7F818181, -0x7F7F817F, 0x817F817F, 0x7F7F8181, 0x81818181, 0x817F8181, 0x817F7F7F, 0x7F817F7F, 0x7F818181, -0x7F7F7F7F, 0x81817F81, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x817F7F81, 0x817F817F, 0x7F7F817F, -0x817F817F, 0x7F7F817F, 0x817F817F, 0x81817F7F, 0x7F817F7F, 0x817F7F81, 0x7F7F817F, 0x7F818181, -0x7F817F7F, 0x7F818181, 0x7F7F7F7F, 0x81818181, 0x8181817F, 0x81817F7F, 0x7F7F7F81, 0x81817F7F, -0x7F817F7F, 0x8181817F, 0x817F8181, 0x7F7F7F7F, 0x817F7F81, 0x7F817F81, 0x7F817F7F, 0x8181817F, -0x817F7F7F, 0x81818181, 0x817F7F81, 0x7F817F7F, 0x817F817F, 0x817F7F7F, 0x8181817F, 0x7F7F7F7F, -0x7F817F81, 0x7F7F8181, 0x817F7F7F, 0x817F7F81, 0x7F818181, 0x7F817F7F, 0x7F7F8181, 0x7F7F817F, -0x817F7F81, 0x81817F81, 0x7F7F7F7F, 0x7F817F81, 0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x81817F81, -0x81818181, 0x817F817F, 0x817F7F81, 0x817F8181, 0x8181817F, 0x7F818181, 0x817F7F81, 0x7F7F817F, -0x7F7F817F, 0x8181817F, 0x817F7F7F, 0x7F7F7F81, 0x81817F81, 0x7F81817F, 0x7F817F7F, 0x7F7F7F81, -0x81817F7F, 0x7F7F817F, 0x7F817F7F, 0x7F7F817F, 0x7F818181, 0x81817F7F, 0x7F7F8181, 0x7F7F817F, -0x7F817F7F, 0x7F7F7F81, 0x8181817F, 0x7F7F7F7F, 0x7F817F7F, 0x7F817F7F, 0x81818181, 0x817F7F81, -0x817F7F7F, 0x817F7F7F, 0x817F7F81, 0x817F817F, 0x7F7F817F, 0x7F7F7F81, 0x81817F7F, 0x817F8181, -0x817F7F81, 0x817F817F, 0x817F7F7F, 0x817F7F7F, 0x7F817F81, 0x7F7F817F, 0x817F8181, 0x817F817F, -0x81817F81, 0x817F8181, 0x7F818181, 0x817F7F7F, 0x81817F7F, 0x7F818181, 0x7F817F81, 0x7F7F7F7F, -0x817F7F7F, 0x81818181, 0x7F7F817F, 0x7F7F817F, 0x7F81817F, 0x817F7F7F, 0x817F8181, 0x8181817F, -0x7F7F7F7F, 0x7F817F7F, 0x8181817F, 0x817F817F, 0x7F817F7F, 0x81818181, 0x7F7F817F, 0x7F7F7F7F, -0x7F818181, 0x81818181, 0x7F7F7F81, 0x81817F81, 0x81817F81, 0x7F81817F, 0x817F817F, 0x7F817F81, -0x81817F7F, 0x817F817F, 0x81817F81, 0x8181817F, 0x817F817F, 0x817F817F, 0x817F817F, 0x817F817F, -0x81817F7F, 0x81818181, 0x7F81817F, 0x7F817F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F817F, 0x817F7F81, -0x7F818181, 0x817F7F81, 0x81817F7F, 0x817F817F, 0x81817F7F, 0x8181817F, 0x817F7F81, 0x7F7F7F81, -0x81817F81, 0x7F7F7F81, 0x81818181, 0x817F7F7F, 0x81817F7F, 0x7F817F7F, 0x7F818181, 0x81817F7F, -0x7F817F7F, 0x7F7F7F81, 0x81817F7F, 0x7F7F8181, 0x817F8181, 0x7F7F7F81, 0x7F7F817F, 0x7F7F7F81, -0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x7F818181, 0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x817F7F7F, -0x817F817F, 0x81817F7F, 0x7F817F81, 0x7F817F81, 0x81817F81, 0x7F7F7F81, 0x7F817F81, 0x81817F81, -0x7F7F8181, 0x7F818181, 0x7F7F8181, 0x81817F7F, 0x81818181, 0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, -0x7F81817F, 0x7F817F7F, 0x817F7F7F, 0x7F817F81, 0x7F817F7F, 0x817F7F81, 0x81817F81, 0x7F7F817F, -0x7F817F7F, 0x8181817F, 0x7F7F817F, 0x81818181, 0x81817F7F, 0x7F7F817F, 0x7F7F7F81, 0x817F7F81, -0x7F81817F, 0x7F7F8181, 0x7F818181, 0x7F817F81, 0x817F8181, 0x7F818181, 0x817F817F, 0x81818181, -0x7F7F7F81, 0x7F81817F, 0x7F817F7F, 0x81818181, 0x817F8181, 0x7F817F7F, 0x7F818181, 0x7F81817F, -0x817F8181, 0x7F7F8181, 0x7F7F8181, 0x8181817F, 0x7F7F7F81, 0x7F7F7F81, 0x817F7F81, 0x817F7F81, -0x81817F7F, 0x7F817F7F, 0x817F7F7F, 0x7F7F817F, 0x817F7F7F, 0x7F817F81, 0x7F7F7F7F, 0x817F817F, -0x81817F81, 0x7F7F8181, 0x7F81817F, 0x8181817F, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x817F7F7F, -0x7F818181, 0x81818181, 0x817F7F81, 0x7F818181, 0x7F817F81, 0x7F7F817F, 0x7F818181, 0x81818181, -0x8181817F, 0x817F7F81, 0x817F8181, 0x817F8181, 0x7F817F81, 0x7F817F81, 0x7F7F817F, 0x7F7F7F81, -0x81818181, 0x81817F7F, 0x81817F7F, 0x81817F81, 0x7F81817F, 0x81817F7F, 0x81817F7F, 0x81817F7F, -0x81817F81, 0x7F7F817F, 0x817F817F, 0x8181817F, 0x7F81817F, 0x81817F81, 0x7F817F81, 0x817F817F, -0x817F7F81, 0x81818181, 0x7F817F81, 0x81817F81, 0x817F817F, 0x81817F7F, 0x7F817F81, 0x7F817F7F, -0x7F7F7F7F, 0x7F817F81, 0x81817F7F, 0x7F7F817F, 0x7F7F8181, 0x7F7F7F81, 0x8181817F, 0x81818181, -0x81817F7F, 0x7F817F7F, 0x81817F81, 0x817F7F7F, 0x8181817F, 0x81817F7F, 0x7F817F81, 0x81817F81, -0x7F7F8181, 0x7F7F8181, 0x81817F81, 0x7F81817F, 0x817F8181, 0x81818181, 0x81818181, 0x817F7F7F, -0x817F8181, 0x7F817F81, 0x7F817F7F, 0x7F818181, 0x81818181, 0x7F7F7F7F, 0x7F7F8181, 0x817F817F, -0x7F7F8181, 0x817F8181, 0x7F7F7F81, 0x7F817F7F, 0x7F81817F, 0x8181817F, 0x7F7F817F, 0x7F817F7F, -0x81817F7F, 0x817F817F, 0x7F7F7F81, 0x817F8181, 0x7F81817F, 0x7F7F817F, 0x81818181, 0x7F81817F, -0x7F817F81, 0x7F7F7F7F, 0x7F7F7F81, 0x7F7F7F81, 0x7F817F81, 0x81817F81, 0x81817F81, 0x7F7F817F, -0x7F7F7F81, 0x817F817F, 0x81817F81, 0x8181817F, 0x7F817F81, 0x8181817F, 0x817F7F81, 0x81817F81, -0x7F7F817F, 0x817F7F7F, 0x81817F7F, 0x81817F7F, 0x7F7F8181, 0x7F7F7F7F, 0x7F81817F, 0x8181817F, -0x81817F7F, 0x81817F7F, 0x7F817F7F, 0x817F8181, 0x7F81817F, 0x817F7F7F, 0x7F817F7F, 0x7F817F7F, -0x817F7F81, 0x7F7F7F7F, 0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x7F818181, 0x817F8181, 0x81817F7F, -0x7F81817F, 0x7F817F81, 0x7F81817F, 0x81818181, 0x7F817F81, 0x817F817F, 0x7F817F81, 0x7F817F81, -0x7F7F8181, 0x817F8181, 0x817F8181, 0x7F7F7F81, 0x7F818181, 0x7F7F8181, 0x81817F7F, 0x8181817F, -0x7F7F817F, 0x7F7F7F7F, 0x7F7F7F81, 0x817F7F7F, 0x7F7F7F81, 0x7F818181, 0x817F817F, 0x817F7F7F, -0x817F7F7F, 0x7F7F8181, 0x81817F7F, 0x7F7F7F7F, 0x817F7F81, 0x7F7F7F7F, 0x8181817F, 0x81817F7F, -0x7F81817F, 0x7F817F7F, 0x817F7F81, 0x7F818181, 0x81817F7F, 0x7F817F81, 0x81817F81, 0x81817F7F, -0x817F8181, 0x7F7F817F, 0x7F817F7F, 0x7F7F7F7F, 0x7F7F817F, 0x7F817F7F, 0x7F817F7F, 0x7F7F817F, -0x817F7F7F, 0x7F81817F, 0x7F818181, 0x7F817F7F, 0x7F7F7F81, 0x7F817F81, 0x817F8181, 0x7F7F7F81, -0x7F818181, 0x7F817F81, 0x817F8181, 0x7F818181, 0x817F817F, 0x7F817F7F, 0x817F7F81, 0x8181817F, -0x817F817F, 0x7F7F7F7F, 0x7F817F7F, 0x81818181, 0x7F817F81, 0x7F817F7F, 0x81817F81, 0x7F7F7F81, -0x7F7F8181, 0x81817F81, 0x7F817F7F, 0x817F7F7F, 0x81817F81, 0x7F817F7F, 0x81817F81, 0x81818181, -0x7F817F81, 0x7F7F7F7F, 0x817F817F, 0x8181817F, 0x7F7F817F, 0x817F8181, 0x817F8181, 0x81817F81, -0x7F7F7F7F, 0x817F8181, 0x817F7F81, 0x7F817F81, 0x817F8181, 0x81817F7F, 0x7F7F7F7F, 0x7F817F7F, -0x7F7F7F7F, 0x7F7F7F7F, 0x817F7F7F, 0x81818181, 0x81817F7F, 0x817F7F7F, 0x7F7F7F81, 0x7F7F8181, -0x7F7F7F81, 0x7F7F8181, 0x8181817F, 0x7F7F817F, 0x817F7F81, 0x7F817F7F, 0x817F7F7F, 0x817F7F7F, -0x7F7F817F, 0x7F81817F, 0x817F817F, 0x7F7F817F, 0x817F817F, 0x7F7F7F7F, 0x81817F81, 0x817F7F81, -0x8181817F, 0x81817F81, 0x817F7F7F, 0x7F818181, 0x817F7F81, 0x7F7F8181, 0x7F7F817F, 0x7F81817F, -0x7F817F81, 0x7F81817F, 0x81818181, 0x817F7F81, 0x7F818181, 0x81818181, 0x81817F7F, 0x7F817F81, -0x7F818181, 0x7F7F7F81, 0x7F817F81, 0x81817F81, 0x817F8181, 0x817F817F, 0x8181817F, 0x7F7F8181, -0x81818181, 0x817F817F, 0x7F818181, 0x817F817F, 0x7F7F817F, 0x817F7F81, 0x817F8181, 0x7F7F7F81, -0x7F7F7F7F, 0x7F817F81, 0x81817F81, 0x81817F7F, 0x7F817F7F, 0x81818181, 0x817F7F7F, 0x7F818181, -0x817F8181, 0x7F7F7F81, 0x817F7F81, 0x81817F81, 0x7F7F7F81, 0x8181817F, 0x817F7F7F, 0x7F7F7F81, -0x7F81817F, 0x7F818181, 0x817F7F81, 0x7F81817F, 0x817F8181, 0x817F8181, 0x7F81817F, 0x817F8181, -0x7F7F7F81, 0x81818181, 0x7F7F817F, 0x81817F81, 0x81817F81, 0x817F8181, 0x7F7F8181, 0x817F7F81, -0x817F8181, 0x817F7F81, 0x7F7F8181, 0x7F7F8181, 0x7F818181, 0x81817F81, 0x7F7F8181, 0x7F818181, -0x7F7F817F, 0x7F81817F, 0x817F7F7F, 0x81817F7F, 0x7F7F7F81, 0x7F7F7F81, 0x7F7F7F7F, 0x817F8181, -0x7F817F7F, 0x7F7F7F7F - -output0 = -0x88CCED56, 0x1C072C76, 0xD4D23B69, 0x78C979BF, 0x60764BE3, 0x4470E86B, 0x20A46F84, 0xA0211B5C, -0xE1952001, 0xB77912DE, 0x52E8BA16, 0xE5BE8445, 0x95093ACF, 0xA8BE03D2, 0x49DBB5AB, 0xC3946403, -0x4DD44236, 0xC2833E65, 0x7288C53B, 0xD64FB75E, 0x7438C1EC, 0x71070BEC, 0xA40F8094, 0xABF43E46, -0x564487F5, 0x8435AC89, 0x2D98A4C3, 0x07CD13F4, 0xB44CEEA6, 0x2E00DD83, 0x12EF45EB, 0x01A047B8, -0xBC563FD5, 0xCA5C1136, 0x7AB9F2C8, 0xD62C59A9, 0x913DF674, 0xC900322A, 0xCF54042E, 0x6CAADB1E, -0x8077B98C, 0xBCB51468, 0x58339E5E, 0x1D176854, 0xF9E2D74A, 0x2994B28A, 0xD0E46263, 0xCD8A0FDB, -0x0119B915, 0x1E5433C9, 0xEA298A7D, 0x9EB4FC8D, 0xEF93B537, 0x6D441397, 0x6A4C8DB3, 0xB8E4AFE9, -0x1520BC1C, 0x8669961B, 0x5D484802, 0xC2793340, 0xB5FE7945, 0x43AC7CE2, 0xB74B70C1, 0xFCF56F87, -0x3E146A49, 0x0391D092, 0x672D2427, 0xDC91BB53, 0xEB24AC1F, 0xCE0D8E63, 0xF12F7ED8, 0xB3192024, -0x0697AE9C, 0x3415F178, 0xD8410FFC, 0xE34734DE, 0x6C6E6BF1, 0xDCD211C3, 0xBF6B0B87, 0xA1624F47, -0x3524BC4D, 0x4B4A1891, 0x8691223C, 0x12EB2DA4, 0x0B51F616, 0x31276F0E, 0x86CB4D17, 0x15CA0F9B, -0xEB989F98, 0x1141D335, 0x442C699F, 0x82E9758B, 0x267E6D4D, 0x71BAC54A, 0x2FBCBD52, 0xA0966795, -0xEB08B437, 0x1A9899A0, 0x26484B82, 0x3AEE43A8, 0xC409BE45, 0xCF8C6EC9, 0x098DE63F, 0xC3BEA60B, -0xCB7A5B6A, 0xCBF2A44B, 0x31E9FA4C, 0x34FD7E88, 0xA3C5AF89, 0xF13C8E2B, 0xC01C79FA, 0x622B9FD8, -0x692D4C4F, 0x712BC24C, 0x16FBD6C3, 0x7B1BBC38, 0x63F1E328, 0x6F4B - -basegraph= -2 - -z_c= -384 - -n_cb= -19200 - -q_m= -2 - -n_filler= -56 - -e = -36936 - -rv_index = -0 - -code_block_mode = -1 - -iter_max = -20 - -expected_iter_count = -3 - -op_flags = -RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE, RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK, RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v11835.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v11835.data deleted file mode 100644 index e27ff6eccb..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v11835.data +++ /dev/null @@ -1,41 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0x44FB08C0, 0x661CCC - -output0 = -0x1BACEE95, 0x613ECD04, 0xC0 - -basegraph= -2 - -z_c= -10 - -n_cb= -500 - -q_m= -6 - -n_filler= -44 - -e= -66 - -rv_index= -0 - -code_block_mode= -1 - -op_flags= -RTE_BBDEV_LDPC_RATE_MATCH - -expected_status= -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v2342.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v2342.data deleted file mode 100644 index 619b29be55..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v2342.data +++ /dev/null @@ -1,151 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -# Origin : FEC5g_DL_1/2342 - -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0x02524C20, 0xB9B1FEA2, 0xC1BAB7E5, 0xEF5714CB, 0x7DE6A64D, 0xA05F9DC9, 0x0747D1E3, 0x3B20BC86, -0x6FCBDB0F, 0xF2FB7A23, 0x79D5E062, 0x5BF4E7C3, 0xD4A68A37, 0x07B4A6AD, 0x37E911F9, 0x7FE7B30A, -0xBBC284A2, 0xD38D6136, 0x25FAB76B, 0xBEBBF534, 0x9A88F9DB, 0xE37FD52D, 0x691DD493, 0xED2F738C, -0x89A96EA0, 0xD981246A, 0x17CC820E, 0x07E3B463, 0xC9FC2590, 0x7475A33C, 0xA5151BB4, 0x1F7E759E, -0x9554F964, 0xD0FA01F4, 0xD31774D2, 0xEB73A9F6, 0x8C9FBCB1, 0xF83010FB, 0x1909E09F, 0xC46023EB, -0x02AEDC62, 0xC6352CC7, 0x674BDC6D, 0xE17CD747, 0x4E25B0B3, 0x4BFF6B17, 0x12C9AAA3, 0xC2BC91CD, -0x44BE23A2, 0x8A72A157, 0x6E0DAD1F, 0x6CA69A09, 0xB55B582E, 0x01818B31, 0x5CA5CAB6, 0x1917AB24, -0x38F98BCD, 0x01917487, 0x05906FDD, 0x760AFCBA, 0x19671085, 0x64E3546E, 0xEC10F922, 0x3CF286CA, -0x68E273EA, 0xF1001325, 0x5DCB3B49, 0xE9547370, 0x65D26AE6, 0xF621256C, 0x25D6D99C, 0x7862EBA0, -0x43365DB0, 0x4DBF06C5, 0x92FCAA02, 0xB0FD58FA, 0x910E80A6, 0x93D24A67, 0x6E39B144, 0x3D46D6F6, -0xEDC55081, 0x33CD70C7, 0xC74B6E8E, 0x91AA27B9, 0x55B3542D, 0xEBF8046A, 0xB9ABDB94, 0x97FC38A8, -0xD5837B4D, 0x764B1809, 0xFBE2096A, 0xC23887AC, 0x2A45029B, 0xCBB7DF70, 0x674654E1, 0x0C6A06BD, -0xB3E8853E, 0x03FCC4CE, 0x26806F2E, 0x2CEB35B0, 0x10538B03, 0x94B059B8, 0xA95E7FFA, 0x48AD3D0A, -0xEB9091E1, 0x972E31EF, 0x5EBC6F8F, 0x947FF108, 0xCB3123FA, 0xFEE1D939, 0xF3DC5C49, 0xA92927AE, -0xF49BB8D0, 0xAA59F730, 0x4A66D1CD, 0x030E1ADF, 0x238D5B19, 0x96F861F1, 0x915424E4, 0x9127880C, -0x8E779839, 0x87375FCE, 0x61FB3D79, 0x96B1EE83, 0x47BF6667, 0x19E7D408, 0x7E91137F, 0x0E4AD8E8, -0xDABD2E45, 0x9B60873F, 0xD0294A65, 0x2A38A862, 0x59DD046D, 0x9832BB79, 0xA5870DB6, 0xB3F1CC48, -0x7E9A8132, 0xEEA2E4BC, 0xF23ED87B, 0x550E011F, 0x9620E0C0, 0xE7CF0834, 0xDEE69623, 0x6184D512, -0xD3D55728, 0xFA7711D4, 0x9C77B0F9, 0x8A26462B, 0xB3F5C8D5, 0x1123246D, 0x78F36272, 0x940EE0F9, -0x757BF240, 0x7EE2B6D0, 0xD40FD5A1, 0xAB4205CA, 0x96E6B758, 0xAC5F4294, 0xC9268C66, 0xB48DC535, -0x3CF6ED4C, 0xF187EFED, 0x7A09B08D, 0x8709EFCE, 0x267B2468, 0x0015D770, 0xDF1B90BF, 0xA03DAD85, -0x2633012E, 0xE5437125, 0x58B79AFF, 0xB929C532, 0x6D890DC9, 0x89A59AD2, 0x2BB99316, 0x41B5B0EB, -0x7304B295, 0xB37F6708, 0x2F84A68E, 0x3637D79A, 0xDD36687B, 0x904BF7B6, 0x6A2CF453, 0x733DED54, -0x5DF48BAA, 0xC3FCC99F, 0x8E3BE1DB, 0x61D9CF2D, 0xB7DC202B, 0xA959FF95, 0x860D0F14, 0x4008C478, -0xD9325A51, 0x27A29D4C, 0x308FE6D4, 0x7A1AA889, 0x5BD38393, 0xCBFA5D - -output0 = -0xADE67AA9, 0x1CB4EBDD, 0x74E76684, 0xE3941FC7, 0x48DAC304, 0x1E2C198D, 0xFE88B908, 0xEC21A3DE, -0xBF314AB7, 0x634E3DCB, 0x0DA84E23, 0x58B1B22B, 0x02B837A0, 0x8B04BF38, 0xFB8DB526, 0x1BFF82E9, -0x4226C4D0, 0xF7A9950E, 0x6DA4D0B2, 0x38E15395, 0x94C1A379, 0x243ED666, 0x3E7255B3, 0x7DB378DB, -0xA3CE1377, 0xE0137291, 0x42DB50AC, 0xEB2D0A13, 0xCA55944A, 0x223DF8E0, 0xB800D1CF, 0xAA2E7577, -0x50153EC5, 0x5E3C8557, 0x63DDEC8F, 0x49A256F8, 0x41ABFD56, 0xEB76A4D7, 0x4F4E9C7C, 0x3508DA39, -0x530F9DA0, 0xFFD20E32, 0x395F7963, 0x1C48B3F7, 0xD3BC29C7, 0x4D6ED90F, 0xC1C9EF58, 0x9B9D4A13, -0x417BF36E, 0x1BB5FDD8, 0x72793F28, 0x2F297FA5, 0x204AA988, 0x28317636, 0x87878EC8, 0x33024F9D, -0xE651388E, 0x560ACA6E, 0xEC3D0B64, 0xCB515AAE, 0xE42B9ECD, 0x2AE2B0D1, 0xCD659A28, 0x8BD5E4D8, -0x0D618DD6, 0x14CF8DB1, 0xE9F82BB6, 0x558C50A4, 0xA9809F8C, 0x15646823, 0x6037DB27, 0x26A0ABAA, -0xF8DC4AC6, 0x533494C9, 0x7BF60155, 0x7BB16D05, 0x89F7A1BA, 0xCB069606, 0x6572D71A, 0x001917EB, -0xD353913B, 0x128F78BD, 0x83BCE2A3, 0xE0065266, 0x9E7E608F, 0x25889472, 0x184ADD42, 0xD42B429B, -0x7A8D861F, 0x54C97AB8, 0xB8B04229, 0xDF3DE03A, 0xB97E311E, 0xBB2A1FF8, 0x53AC8D5B, 0x1825B5DC, -0x9843DD95, 0x0214EAA6, 0x3B1CF504, 0xD3BE316F, 0x9B1D3C64, 0x8EF4A268, 0xFACBC9AD, 0xDCC6033F, -0xF801E3D1, 0x92F3E3A1, 0x1EC121AC, 0xA6747F20, 0x6ACC34EF, 0x0F641DC0, 0x42CAB9C3, 0xE04036DD, -0x97739381, 0x9843A304, 0x929E9AB7, 0x600E057F, 0x892D5F1F, 0x0F718281, 0xD345AA58, 0xF39215C4, -0xBCAB0B51, 0x1EBEA1B0, 0x68885471, 0xB39AD728, 0x2FF70470, 0x80D01FE5, 0xB41A95C0, 0x01DB8079, -0xA4C9F364, 0x41860F1A, 0xEBE24F2B, 0x086BFFF0, 0x7B66DE40, 0xFFF665D6, 0x18324792, 0x1D253106, -0xC41B9BF0, 0xC79347BA, 0x6949A396, 0x279E7A4A, 0x4029B533, 0xE8B382E2, 0x89783E24, 0x3D945C74, -0x49BD75D8, 0xBAD731A0, 0x48B4AFAB, 0x4383B903, 0x8A6966A6, 0x170B9958, 0x58307AB6, 0x3B627463, -0x0B981BEA, 0xD8E9A038, 0x723219E7, 0x4F6E5470, 0xE4F3CF92, 0x37AACC8A, 0xA4E46500, 0xE44DDA39, -0x68690180, 0x33143C47, 0x9A6EE438, 0x5FA00F23, 0xD2CEE248, 0x46090D1A, 0xDE5491AE, 0x417D853E, -0xC607B731, 0x79D7DCCF, 0x13200C03, 0x07CAB5E9, 0xB59525EA, 0xE47B66A5, 0xB125AAAB, 0x20CCFE07, -0x82F1F4E8, 0xCF44BD2B, 0xC462D58D, 0x60A6A73B, 0x0D0CA712, 0xFE342922, 0x15123217, 0x7A02E89D, -0x49B44659, 0xB9F3AE54, 0xAFC472BC, 0x79AF1A6D, 0x7430BA59, 0xEA13F81C, 0x33592D7D, 0x1EF1E1DC, -0xF51FF0C8, 0x80F7B07E, 0xC1536EBB, 0x586CB41D, 0x10AF823C, 0x390EA571, 0x7D54C302, 0xA049ECBE, -0x368C3981, 0x38B72BEE, 0x833C5F98, 0x2E18D066, 0x5742B0D2, 0xA8F5F0B8, 0x9144935D, 0x7392A908, -0x3175DBC0, 0x29AA2F7C, 0xF53FED73, 0xFE41236B, 0x091E47EC, 0xD2195647, 0xCAAEA8B5, 0x0ED9750E, -0xF5027456, 0xF1838780, 0x16FFE8EE, 0xA21568C6, 0xC5E4FCAF, 0x27C24C4B, 0x3DE89E8E, 0x5464ADC6, -0x865C8493, 0x41032697, 0xD5F82075, 0x49167AF7, 0xED1AA45C, 0xA6B20018, 0xB1776BA9, 0x9F2129B6, -0x611C417D, 0x3B72E8B6, 0x1AA7DB22, 0xF4ADF40E, 0xA24B8EFB, 0xF25C5F9D, 0xE52C047E, 0x3B8C9A26, -0x4C0760E4, 0x73027C0E, 0x1F5977D8, 0x6CAF979D, 0xEF39719F, 0x70129F6A, 0x0CC821CD, 0x9853AE70, -0xC3EB24E5, 0xE4EED628, 0x9F904579, 0xFD680398, 0x2C84DF92, 0xF92DA147, 0xB2F7C7C3, 0x59052EB6, -0x4DF89375, 0x275D0C58, 0xBE32DA96, 0x7A3C4C7F, 0xC5C2B02F, 0x651B2665, 0x36E5DC9B, 0x98B1F08B, -0x175A5AE0, 0xBEC258CA, 0xDDF6B687, 0x49E3DBE6, 0x07C1C780, 0x63E3B861, 0x05FDAAEC, 0xFA7C38A4, -0x5EE93618, 0xF8B78C2B, 0xBB5035B7, 0x7E297AC8, 0x6CC27636, 0x30D44C50, 0xECB1065B, 0xB00AB96E, -0x87B3C67E, 0x0AA61403, 0xF514C18B, 0xDBF3CEEB, 0x62ACA4C1, 0x9A0D1691, 0x07E3DF50, 0xC42070E8, -0x98F349F7, 0xC1556162, 0x6F7D7109, 0xF6C7B215, 0x73748B4E, 0xAF9F5BFF, 0xDD1B8AE6, 0xA9C710AA, -0x5965A4DA, 0x762A0F38, 0xD42C7578, 0xBA69C66D, 0x2CCABCB7, 0x932E7065, 0xD6F3F37E, 0x729F1412, -0xE5EAEB07, 0x1C2D7291, 0x07E5E6C9, 0xCA16EED5, 0xD488558D, 0x235C11EB, 0x579B8BCA, 0xAC352250, -0x858BD553, 0xECCBE50A, 0x370421F0, 0xA66CD423, 0x1424CB84, 0x286FBE65, 0xDFF5A1E9, 0x71ABB615, -0xAE331217, 0xE8E333A5, 0x99044B7D, 0x26264E30, 0x35A7FEA1, 0x3E933B79, 0x4151D8A3, 0x672D78D6, -0xC586C999, 0xEFFEFF6F, 0xD1EC082A, 0x0EB38797, 0x85F77710, 0x5FEAE876, 0x78FBE4E2, 0x6284663A, -0x6E54B0AF, 0x5C107AF7, 0x24005DF7, 0xA994E2EC, 0xAFDDB6FF, 0x79019A53, 0xE1B8A123, 0x997B7B95, -0x9BFC63E3, 0xEAEEB40C, 0x14AECFE6, 0xC29A3F38, 0x21833356, 0x6B65DAAC, 0x9AEADA3F, 0x16582D82, -0xD6E7B8EC, 0xEE67A365, 0x3F33FD50, 0xABD603DC, 0x0DA08D72, 0x69E01AFD, 0x4862B58E, 0xE1DFCA98, -0x5FE11079, 0x40992E48, 0x0589689B, 0xE836FACC, 0x87FFD4D6, 0x9F5DF070, 0x6BC69520, 0x5CF6F087, -0x66523DC9, 0x54D0EEA3, 0xDD820FC2, 0x663BFA8E, 0x2561E952, 0xA82EDAB8, 0x3FC1092B, 0x8591A2C1, -0x0E9E67EF, 0x4A334D9C, 0x867BB16F, 0xB6A1713F, 0xED8D7EFE, 0xF2926C44, 0xD2E97512, 0xE8301103, -0x3DD30957, 0xEFB71B3F, 0x4AE801D5, 0x8F75F730, 0x0C34FBC9, 0x7A60C668, 0x77908ED9, 0x963C0DE4, -0x5279E29C, 0x6759B153, 0x747E5E7B, 0x4C510BE5, 0x32BE2132, 0x54B361E0, 0xCB4D9616, 0x3C404BA4, -0x4BA0E910, 0x05F06AD1, 0xAE3FBC5C, 0x82CB03B4, 0xF0EC45FF, 0x9888791B, 0xDE4B9813, 0xF83B4090, -0x3CC4BA28, 0x7CFE8854, 0x9CA7BC9D, 0x0E41843E, 0xF92535F6, 0xF19CC699, 0x0821CBF4, 0xF15F3F82, -0xCF6CC14C, 0xF27DA57E, 0xB8DB8982, 0xFC7E263D, 0x63C36111, 0x61587ABA, 0xB87CB18D, 0x2C806A64, -0xD8DFFF2C, 0xC8540E77, 0x1A340B85, 0xB6FBA97F, 0x77A1958D, 0x419648E8, 0x80A65729, 0xC3EC1141, -0x3909010F, 0x84F8C534, 0x2FEDE987, 0x83851AC8, 0xAE88B841, 0xE8284692, 0x3243F04B, 0x9C845E80, -0x4A7FC52E, 0xF6B1035A, 0x59E1C576, 0x21620CB8, 0xF047E16D, 0x079284B7, 0x00B6C955, 0xA7B19103, -0x7B9EB069, 0x733E2443, 0x489A6EAE, 0x7BB17B2C, 0x6AB4F848, 0xEFA299A2, 0xC464BE42, 0x36F27FC5, -0xE70CEAB2, 0x6FCB4031, 0x9C0A14C0, 0x682AA1A3, 0x36E7032C, 0x57BA22A8, 0x085288CE, 0xDE62ADD4, -0xC0138A07, 0x4A5576F5, 0xC0F33DE3, 0x919ECA7A, 0x14FFDE87, 0x362897AF, 0xD542F683, 0x86FBC0FC, -0x8CD6DD3E, 0x25832EDF, 0xC2C9EE74, 0xB244A89B, 0xFEAF2F44, 0x1D631217, 0x80BA2267, 0x097D3F4D, -0x406264AC, 0x0571B5FF, 0x55658770, 0xE12F6AA3, 0x666D9831, 0x37E17306, 0x88D926AB, 0xBB0CC6D9, -0xA857A201, 0xB24E5A82, 0xF259D2AE, 0xD09D0FAE, 0x87363A50, 0x583F1CC9, 0x653F73F3, 0x0D04970B, -0x64D1F222, 0xEF7E0E0B, 0x7F5D49DB, 0xAC4549D9, 0x707D1FCF, 0x3A151C06, 0xFE5DEC4A, 0xE3D6CCBA, -0x0AA3DA9B, 0x4665CBC5, 0xDF7BCD0F, 0x63DD0FF5, 0xC9C2A642, 0xB40B516D, 0xE259A165, 0xE2E454E1, -0x0A384EDD, 0x1287018F, 0x2A7A8DFD, 0xF854FCF1, 0x79CAA64E, 0x351AC522, 0xEE65C527, 0x7F160E51, -0xF465AF5C, 0xE671974B, 0xAF75CA8D, 0x47A5EC29, 0x5F93C8AD, 0x6420D4E9, 0xA5CA4610, 0x265F0BF4, -0x6622036C, 0xB542C8CB, 0xDFD1FA4F, 0x5869BE19, 0x14605EAE, 0xA438FEA7, 0x9523F5FA, 0xE18FCF2B, -0x5F11F7B1, 0x7A790EBA, 0xDBDD0005, 0x024E0D8B, 0xC387778B, 0x3C0F1274, 0xA722512C, 0xEAB3C2F3, -0x11B55F3A, 0x9C2DBBD6, 0xA76C80DC, 0xD63A5DD2, 0x320F7AF2, 0xA707544C, 0x889A3C58, 0x50CCA3B0, -0xD54FE248, 0x22EF12A3, 0xF618F564, 0x1D9266C8, 0x4E08FB46, 0x6D1D41EB, 0x5CFF2094, 0x116ECB97, -0x46FD4058, 0x38FBE5CC, 0xE008E8EF, 0x578FAF14, 0x3BEED1D9, 0x8C89B4CE, 0xFC0C33D7, 0x0913ECF8, -0x498D47D1, 0x5644A9B3, 0x6EA66735, 0xA0F3BA09, 0x948B258F, 0xFA8DE3BE, 0x2FB03145, 0x8D0B61B3, -0x42D6F53D, 0x031FD745, 0xFF86C938, 0xA32BB471, 0x50208969, 0x9F6909C9, 0x680C6D55, 0x13054044, -0xDFDEBEF7, 0x35600E83, 0xAFB26C47, 0xCAA86F9F, 0x5B5B65A7, 0x599DA0C3, 0x789EC931, 0x0163D6D4, -0xF7BBA271, 0x5A755052, 0xFA27CE77, 0xD66ED111, 0x7A5BD527, 0x1B26B948, 0xAA11725B, 0x4A6AC4AD, -0xDD8EA8DF, 0xF0C618D3, 0xF97999E5, 0x00C42C38, 0x8465BE06, 0x7B6912C9, 0x4AF1F070, 0x4F93EEB0, -0x19A400FC, 0x0F8A6744, 0x7FD642F2, 0x3AE8F32F, 0x84501DDA, 0xB39068C6, 0x2A5BE1A6, 0x08E231F0, -0xD52F4D13, 0x89326BE0, 0x3981DD90, 0xA986F547, 0xADF1B2E8, 0x6337CFB6, 0x595FCBC0, 0x2D774749, -0x1D6C5FF1, 0xF403CE90, 0x16792051, 0xCE248A7D, 0x43E76774, 0xA85ED14A, 0xCFBDEB69, 0xDF559AF6, -0xC3BF33D1, 0xF03BB486, 0x107D04B0, 0x9B9E9432, 0xE4873EC4, 0xFD7C2E89, 0xFA69FD26, 0xD04F8825, -0xB9C4FF1F, 0x30F0826C, 0x825A8A34, 0x5EBB4ADC, 0xA71C9FF5, 0xE90ECF8A, 0xFEF3270F, 0x25612AB6, -0xF8560C1F, 0x625A9ECE, 0x12B9B123, 0xA281D55C, 0x276F3B4A, 0x6CDE95D8, 0x7EE9F866, 0xDC769A4F, -0xC590E1F4, 0xEA845796, 0x013AFD9E, 0x6F8E1A4D, 0xBEDF18E1, 0x2CC567BD, 0x56CBAE9D, 0xF81716E8, -0x88834AAE, 0x1C67A0AE, 0xDDB4EB33, 0xF0F874E6, 0x4DE9C550, 0xCEAC73AD, 0x5C800FD8, 0x6A31B61A, -0xA8B3A501, 0x73639607, 0xC95BAE - -basegraph= -1 - -z_c= -320 - -n_cb= -21120 - -q_m= -4 - -n_filler= -688 - -e = -21592 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v7813.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v7813.data deleted file mode 100644 index 6e1acf5a44..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v7813.data +++ /dev/null @@ -1,43 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -# Origin : FEC5g_DL_1/7813 - -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0x8C4DEB9F, 0x52 - -output0 = -0x1A6D0FA6, 0x7017 - -basegraph= -2 - -z_c= -7 - -n_cb= -350 - -q_m= -2 - -n_filler= -30 - -e = -44 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v8568.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v8568.data deleted file mode 100644 index e9bacd1b83..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v8568.data +++ /dev/null @@ -1,70 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -# Origin : FEC5g_DL_1/8568 - -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0xB6D49CE2, 0x3E96B93F, 0xF02009F6, 0x2DF3D30D, 0x3B06C160, 0x646C69CC, 0x54439F0F, 0xCE0D12C3, -0x66E8BFD5, 0xA9D22B0C, 0xA9E7343B, 0x2B6EEF01, 0x6B6966C0, 0xB98FE144, 0xC3BF7BAD, 0x1B40DF1C, -0x973B12DC, 0x46E25E90, 0xB324ACCA, 0x5F0ED2B9, 0xBB4F - -output0 = -0x8F1A7C00, 0x836CF0E5, 0x717CE52D, 0xEE86FB44, 0x21621E25, 0x58425AB5, 0xECA0F645, 0xAE9E63E6, -0x287D84BC, 0x9F19A401, 0xD68C4CA3, 0x354ACA5A, 0xD68D7FF8, 0xFAA84645, 0xCF0DBC28, 0x693C50F0, -0x9A3CD23C, 0x57E97520, 0x929BAF90, 0x8E2BA7D8, 0x5EF0FB8A, 0xFFE7B153, 0x9E164074, 0x4D06F0A2, -0x6BC68E5B, 0xB8274587, 0x69641DFC, 0xF5DC89A0, 0x4F8E741C, 0x1CB682DA, 0xEF36E914, 0x8BDEBA30, -0x4B6777E2, 0xEFBFD14C, 0x85F0DF67, 0x55DBD201, 0xCF29A01A, 0x862BD273, 0x1F43CFAF, 0x5CB128E9, -0x9C322654, 0xF8E4E47A, 0x0FCD1806, 0x0C7B6BC7, 0xF7B9748A, 0x6DE5D592, 0x0D119373, 0x5F7DC28C, -0x68F26F39, 0xAA47E18A, 0x479CDAAF, 0xE19DCBB3, 0xA72B475D, 0x2E781ED4, 0x4CBB910A, 0x5E5A5A1D, -0x2F668621, 0x86BD9FE1, 0xF1DC12E5, 0xB652E2C1, 0x2E0AC199, 0x059E43C4, 0x14F9B51E, 0x7DA378C5, -0x214E4D5F, 0x72ECE751, 0xF997A106, 0x3F362F62, 0x045DCA85, 0xAD27A58E, 0xB73B4390, 0xEB76C5D2, -0x58CE8B78, 0x73A1D1EA, 0x9705C8E4, 0x224703E8, 0xA0DE7885, 0x9CDBBEE0, 0xBAAFAE85, 0x1B5CFB8A, -0xF66B5209, 0x979335BB, 0x2AA6C7E2, 0x7E3958E7, 0xD39F8BC0, 0xD73BEA43, 0x24C74D3E, 0x9372C2D7, -0x49804670, 0xB3A983FC, 0xFA6DB662, 0x4E657550, 0xDDF757C2, 0xA7265DE7, 0x51BFA1A6, 0x63E1325D, -0x1FDBE953, 0x17348EDB, 0x6B6DC5C0, 0xE335772B, 0x32612617, 0xC13B63EB, 0x8C40891A, 0xF3566154, -0xF5345933, 0xAD9AB800, 0x4CF92B41, 0xF3B32673, 0x80577879, 0x19F8BB0E, 0xAD677483, 0x21B2EDC7, -0x3F96C8E2, 0x7B9211B7, 0x11909101, 0x6A9D9BF5, 0xC4A0E407, 0x5B013820, 0xD2102C31, 0xDC6F548A, -0xA4F6B72A, 0x79F19991, 0x6A21BE3C, 0x2E5CF7A5, 0xDCBB384B, 0xB05B5649, 0x1D61CCF1, 0x9DC122F3, -0x00CA6A82, 0xB7CECDF0, 0x605252A3, 0x0500B498, 0x61AA1618, 0x669788EF, 0xF0DB599F, 0x3ED04C4A, -0x17387F1E, 0xBDAC7B52, 0xEE7D1E0D, 0x58AF212C, 0x0CB064F8, 0x646239DB, 0x88CF9549, 0xD3C7C652, -0xB82109DB, 0x22225244, 0x305F8384, 0x9B4166D5, 0x704FA445, 0x956A0CA5, 0x89963D07, 0x5EF61FAB, -0xF71EAD06, 0xA47FB814, 0x86581A5C, 0xB81B9445, 0x4ECD608E, 0xE369E9A3, 0xFEB80EE5, 0x1399AB02, -0x30A74BEA, 0xCF08B948, 0xB0857028, 0xC81F8CD8, 0x64E13623, 0xAFF927F5, 0x592D7629, 0x7295DE02, -0xE98E2F04, 0x7407C828, 0x85EE9A47, 0xF9B6F671, 0x77F40DF0, 0x81CE7DA1, 0xB8732D5F, 0xC7AC742E, -0xF8623836, 0xE68F4E66, 0x18F29BB9, 0xF57E3350, 0x0E14399C, 0x114ACFA1, 0xFECFBDAA, 0xB0894694, -0xC8DF6D23, 0x7C71FB18, 0x91F00CF2, 0x6A45BC52, 0xFE99962D, 0x41FEBA3D, 0x5C1BB499, 0x51E50591, -0x04D9CDDE, 0x503FBB80, 0x2788B4EE, 0x82A545D8, 0x5F6DD45D, 0x7AE48BE2, 0x4C653419, 0x3C32D58C, -0x48788C71, 0x97A054A3, 0x7FC443B4, 0x805DFF9E, 0xA607D2C6, 0x02DA82C2, 0x884664C5 - -basegraph= -2 - -z_c= -72 - -n_cb= -3600 - -q_m= -2 - -n_filler= -64 - -e = -6624 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v9503.data b/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v9503.data deleted file mode 100644 index 7fc8c95437..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/ldpc_enc_v9503.data +++ /dev/null @@ -1,197 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2019 Intel Corporation - -# Origin : FEC5g_DL_1/9503 - -op_type = -RTE_BBDEV_OP_LDPC_ENC - -input0 = -0x88CCED56, 0x1C072C76, 0xD4D23B69, 0x78C979BF, 0x60764BE3, 0x4470E86B, 0x20A46F84, 0xA0211B5C, 0xE1952001, 0xB77912DE, 0x52E8BA16, -0xE5BE8445, 0x95093ACF, 0xA8BE03D2, 0x49DBB5AB, 0xC3946403, 0x4DD44236, 0xC2833E65, 0x7288C53B, 0xD64FB75E, 0x7438C1EC, 0x71070BEC, -0xA40F8094, 0xABF43E46, 0x564487F5, 0x8435AC89, 0x2D98A4C3, 0x07CD13F4, 0xB44CEEA6, 0x2E00DD83, 0x12EF45EB, 0x01A047B8, 0xBC563FD5, -0xCA5C1136, 0x7AB9F2C8, 0xD62C59A9, 0x913DF674, 0xC900322A, 0xCF54042E, 0x6CAADB1E, 0x8077B98C, 0xBCB51468, 0x58339E5E, 0x1D176854, -0xF9E2D74A, 0x2994B28A, 0xD0E46263, 0xCD8A0FDB, 0x0119B915, 0x1E5433C9, 0xEA298A7D, 0x9EB4FC8D, 0xEF93B537, 0x6D441397, 0x6A4C8DB3, -0xB8E4AFE9, 0x1520BC1C, 0x8669961B, 0x5D484802, 0xC2793340, 0xB5FE7945, 0x43AC7CE2, 0xB74B70C1, 0xFCF56F87, 0x3E146A49, 0x0391D092, -0x672D2427, 0xDC91BB53, 0xEB24AC1F, 0xCE0D8E63, 0xF12F7ED8, 0xB3192024, 0x0697AE9C, 0x3415F178, 0xD8410FFC, 0xE34734DE, 0x6C6E6BF1, -0xDCD211C3, 0xBF6B0B87, 0xA1624F47, 0x3524BC4D, 0x4B4A1891, 0x8691223C, 0x12EB2DA4, 0x0B51F616, 0x31276F0E, 0x86CB4D17, 0x15CA0F9B, -0xEB989F98, 0x1141D335, 0x442C699F, 0x82E9758B, 0x267E6D4D, 0x71BAC54A, 0x2FBCBD52, 0xA0966795, 0xEB08B437, 0x1A9899A0, 0x26484B82, -0x3AEE43A8, 0xC409BE45, 0xCF8C6EC9, 0x098DE63F, 0xC3BEA60B, 0xCB7A5B6A, 0xCBF2A44B, 0x31E9FA4C, 0x34FD7E88, 0xA3C5AF89, 0xF13C8E2B, -0xC01C79FA, 0x622B9FD8, 0x692D4C4F, 0x712BC24C, 0x16FBD6C3, 0x7B1BBC38, 0x63F1E328, 0x6F4B - -output0 = -0x6ED462FE, 0x29726470, 0xE49C87C1, 0x6594725E, 0x64C81AE1, 0xA30C91C2, 0x5B4261AB, 0x7A44E3A4, - 0xACBD3DC8, 0x319AF530, 0xF3B21EC1, 0xAC180011, 0x26319FF9, 0x5946FBFD, 0x6F31959A, 0x571501D9, - 0xFB1F62B7, 0xF19F6C36, 0x43436C4A, 0x8CA5F436, 0x18AF91B4, 0xD86ED79F, 0x8732D29C, 0x6CE3B559, - 0x2DEA712F, 0x52C2E21A, 0x5C4E884C, 0xD2F50500, 0x2140E848, 0xABE47066, 0x8AE3FC46, 0xF0298999, - 0x829FE184, 0x51D53B6B, 0x7546D03C, 0xF1CB22DA, 0xB9D6F966, 0x85660A1F, 0xC1296566, 0xB2122E16, - 0x2AA38C25, 0xD7AF18FC, 0x489BDDC5, 0x93183097, 0x4C694A3C, 0x40B325F8, 0xEE05DAB2, 0xA6E0C990, - 0x839A7753, 0x0251D207, 0x5E1EC6B5, 0xED523076, 0xD985E23A, 0x8CA88259, 0xB0EFF6D4, 0xA9D7749B, - 0x32CA6F0E, 0xAAA84E97, 0x0F137B83, 0xE73C3175, 0xA3940FDA, 0xD878B121, 0xFFC8D2EC, 0x95CB65AC, - 0xB1CBE446, 0x73520449, 0x7D929F16, 0x69D1873C, 0x85640C01, 0xF2228024, 0x0A5E0461, 0x58B0933A, - 0xD37E2375, 0x36CEECEF, 0xE57A48F8, 0x4A35B5C9, 0x016A16A0, 0x6F9BCF30, 0xEB7C3BD0, 0xB1AF27FE, - 0x9C389360, 0xA91F2142, 0x51E618D3, 0x5F045697, 0x654C6A49, 0x2E38E30C, 0x9E8F1E63, 0xF1B25686, - 0xA0CDFB02, 0xDAEC605D, 0xED910B79, 0xA8E1A341, 0xAD6BD0A3, 0x03BABB0D, 0x4059355C, 0x5ECB8646, - 0xFDD9E0C6, 0x69106FD2, 0x47BF857E, 0x740F6313, 0xAB15E1FF, 0x94B21225, 0x600FEDF3, 0x1EF83A71, - 0xCE6956EE, 0xE538FC7D, 0x47520BE0, 0xA1A20CF2, 0xCB452B91, 0xEACB9E3C, 0xBA242A34, 0x13C81868, - 0xA58AB271, 0x724B350D, 0x95131286, 0xCF74DD61, 0x1D0CF41B, 0x38D046D2, 0xB709708D, 0x4D479AA8, - 0x3CBF6817, 0xDF115777, 0xBE69B850, 0x071A2B4C, 0xF3246B56, 0x2881CBA0, 0xAE158E87, 0x36538CB0, - 0xEF879197, 0xDBA9C1C7, 0x4EF7235A, 0x56120670, 0xC22DBEC7, 0x7071A05C, 0x376ADBD4, 0x5DD586FC, - 0xA638A621, 0x6D49A92A, 0x66F0C925, 0x023FC9DE, 0xF7CA1D36, 0xAF19A18B, 0x2A787792, 0x518938D7, - 0x25DE7B4A, 0xDEBD9010, 0x9683558D, 0x9C5694C7, 0x8B2558D0, 0x790CD121, 0x0A35C0D8, 0xCD4FBCED, - 0xB89F3275, 0x64A49655, 0xED7992A1, 0xAFB0A4D0, 0x29A9EB1B, 0x9244B2C0, 0x2CD88F45, 0x4AA1E98E, - 0x8E32CC3C, 0x8BE5DC7B, 0x759C8B24, 0x8AA119BE, 0x9CFEA065, 0x071F86FD, 0xB83F8181, 0x604FF2FB, - 0xAACDC394, 0x0BCC72F5, 0xE9C0CB19, 0x56EAE15F, 0xD33B8DEF, 0x01A1B007, 0xBED7C1A3, 0x18788E49, - 0xB565EA30, 0xC269F619, 0x1CF1B024, 0x067E9F59, 0x78E61AB4, 0x3D46CFBB, 0xE58E910B, 0x8E7ACF53, - 0x1EB9C15D, 0x4E3C43BF, 0xEF3D8F20, 0x5CC0A030, 0xE10AE4E7, 0xABE24941, 0x9A0C4046, 0x24E090CF, - 0x3248C414, 0xAF76560F, 0xCD1B106C, 0x70438AD4, 0x3463D8B0, 0xD85860FE, 0xFCDF0D57, 0xA2DBC09E, - 0x44C728C1, 0xD8FEE73E, 0xB1E6B4A5, 0xD0CC95CD, 0xCCEF186F, 0x70AC5D98, 0x57D21267, 0x8543F446, - 0x15C8EAA9, 0x0DD357D4, 0x4CE9C090, 0x4E91FADF, 0xE0658E27, 0xFF7AA5D6, 0x176ED723, 0x70D009CB, - 0x416ADBAA, 0x1C45865D, 0x105F3A0E, 0x14730450, 0xD0FA1AC9, 0xB76F268C, 0x7B075289, 0xA9455796, - 0x65E02F3E, 0xB74521F2, 0xF6CAA6C7, 0x94ABFDAD, 0x1E6D1087, 0xC25A9257, 0x87FAF9A4, 0x5184A0FA, - 0x240023D7, 0x7AE0ED45, 0x06E0A838, 0xBB018F31, 0x0FA836D5, 0x09CF6AEC, 0x9BC4F2B2, 0xAE92D5BA, - 0xE724036E, 0xE5606DDE, 0x631448F9, 0xFD59B782, 0xF17052E4, 0x66EA4C50, 0xF72C1768, 0x5C24ECEC, - 0x6B01B118, 0x89F8A3AB, 0x465FF462, 0xC3896A00, 0xFEC06004, 0xE2DFC70C, 0x3ACF338F, 0x1552E9D0, - 0x9F699B77, 0x60AC6D29, 0xBF47FD38, 0x826B0CA8, 0x0515A7AC, 0x1380A222, 0x7D054EA0, 0x3D1BCEC0, - 0x21AB6CF3, 0xA889E915, 0xF09D9756, 0x08BA519A, 0xCFFB6BD3, 0x7D5EF4F9, 0x34A0E942, 0x8569A327, - 0xFDDC5269, 0x60D8D543, 0x88B34B88, 0x50DEAA10, 0xD0563E1F, 0x80CD122B, 0xDC11607F, 0xCD9D7E05, - 0xC0F3510E, 0x414A7545, 0xB8211557, 0x103E6F53, 0x08A47672, 0x04D9C391, 0x3281F25C, 0x7526AAD2, - 0x3C89B43B, 0xBA767E59, 0xA2788EAC, 0x5EF9DF3D, 0x8F72BBE6, 0xC4B52A2B, 0xE81A80E9, 0xCD6B24D5, - 0x4F934751, 0xA3FCC2B5, 0x1C4FB12A, 0x7C363E45, 0x237CB63A, 0x1F26D6FD, 0xAAF3FE61, 0x48D3B3A8, - 0xA2A77A81, 0xADCF4AB4, 0xDF94F9B4, 0x465EA838, 0xCE4BA15C, 0x75826F5A, 0xD537E32C, 0x85F8FECD, - 0xD07CAB1C, 0x34F91310, 0xC40B36CA, 0xCCE0297E, 0xFB276610, 0x67DF82EC, 0x8BB58FAA, 0xCEA3BDC2, - 0x02B21D68, 0xCC1F8A6C, 0xF902AF4E, 0x271828EA, 0x9028298A, 0xB5BF0156, 0x5A3B3188, 0x6CCB6806, - 0xE2F3A4A2, 0x3B776BB9, 0x66D01790, 0x133F2414, 0x1445FE7D, 0x5CC79E5B, 0xB95FD30F, 0x50971FC5, - 0x8D6AFECA, 0x3FB2427C, 0xC1A980EC, 0x54C9F2AF, 0x0F509DF3, 0x1B950AA4, 0x1E5B1596, 0x93E974B9, - 0x71D51A0F, 0xC973F4DD, 0x79BF62A6, 0xC72F58F9, 0xCAD478D6, 0x0F7C36C7, 0x05D08481, 0x43958D67, - 0x93F11E1A, 0xDCDDCE62, 0xB457AC62, 0xD4A98268, 0xA793471A, 0x7AB637E0, 0x1B9BA86C, 0x456B5EF7, - 0xD2E75711, 0xF95E6BCD, 0xD3043467, 0x056F1621, 0x21D58D4E, 0x0C9EF57E, 0x96B645B1, 0xF5A80340, - 0xBD9A4C7A, 0x4D94A305, 0x59D0F9B4, 0x113F56F9, 0xE0A948B5, 0xBF982299, 0xA05D1EA1, 0xE9C50F8A, - 0xAF6B8F04, 0x6B05485E, 0x17DD458A, 0xFB819464, 0x5CE2F61F, 0xECF95F48, 0xA26CFBA2, 0x6A0FD00F, - 0xA7A2CB0F, 0xFE10768D, 0x4A258743, 0xBBF2C41A, 0xF519DBEE, 0x9DA676B6, 0xE89449C9, 0x3E13EBE5, - 0x4A4A42A5, 0x42663182, 0xDAAF85AB, 0xCC671BCB, 0x217491EE, 0xDCC9B6F2, 0xE1A3A7EA, 0x7B13F2F9, - 0xCFFCBC9F, 0x3D8FF387, 0x71ABA888, 0x2D3FE4C1, 0x081AB3DC, 0xBF21BA4B, 0x4ACE0F00, 0x6F5AB592, - 0xD328F08C, 0x542388E9, 0xE7A4157A, 0xE8532856, 0xE8DC528E, 0x3F2356AE, 0x76867882, 0xEC11E6D0, - 0x0C2DD257, 0x40A7C558, 0x354F885C, 0x2A2E0757, 0x6C0A6D95, 0xE0C23A09, 0xD1F32FF7, 0x7E27842E, - 0x3CDFD97E, 0x2F6807FB, 0xDBED07BD, 0xA039645B, 0x324B0955, 0x73620D27, 0x0C47D75F, 0x511BD37A, - 0xE80C4C44, 0xA3D77AFE, 0x058B503D, 0x391AC187, 0xD7425F0B, 0x93876765, 0x10CADF4C, 0xC4F3539A, - 0xF17B776C, 0x017BDEFA, 0x74F4651F, 0x65FBC1E5, 0xF55CC6B6, 0x1752401A, 0x85FB6434, 0xB8FD0F06, - 0x4D0D80FF, 0x0DD8438D, 0x1C5844B7, 0x31ECF66B, 0xF8A8B528, 0xA9BE0373, 0xC401C7FC, 0x3BA1FFF4, - 0x63946BBD, 0x82514893, 0x9CE303D6, 0x51EA2484, 0x054CACA2, 0x3F812B32, 0x0F3C603F, 0x4B3D86B6, - 0xD33F5950, 0x3340BFC0, 0x47CEB79D, 0x1CAB5D3C, 0x74897EB5, 0x1C320D6D, 0x8F0480D2, 0x1384331B, - 0x8363A7B3, 0xA5439504, 0x0E06AA80, 0x4BBFF55C, 0x470094F3, 0x8DE8E9AA, 0xABA72796, 0x4333B263, - 0x6FEF04EB, 0xF921C722, 0x9599B4C8, 0xBFEFF55A, 0xF89AA502, 0xDFE85218, 0x0EE15930, 0x8B2AA7F8, - 0xDDB03823, 0x7427A3C2, 0x8E4AF556, 0x66A9640E, 0x2EA271AE, 0xFC5BB50C, 0xDC50B432, 0xF78BB3D6, - 0xA06156DE, 0x5A7D7A40, 0x40BD74BF, 0x882CC19B, 0xDB2B6143, 0x5532686C, 0xA6D65320, 0x6AB5B32A, - 0x34129535, 0x9E41D92F, 0x3D86A085, 0xA27DE0C1, 0x6FFBEC11, 0x77A4BE81, 0xCE1DF886, 0x318E96BA, - 0x82C84B84, 0x40B9874F, 0x39F9F9A9, 0x21E0AACB, 0x237FC858, 0xFF700E2D, 0xA840518D, 0x5E5ED583, - 0x7B11CB4E, 0x99733B7F, 0xFFAAF7A9, 0xB8CB13B7, 0xE67AE45C, 0xFFDA2FC2, 0x47D08BD7, 0xD68BACF6, - 0xDAAE30ED, 0x95735CAF, 0xF896B165, 0x395BC94E, 0xADF803B0, 0x76B82F4D, 0xF312DD33, 0x0DD0A49D, - 0x0852B35E, 0x4DF14366, 0xBA01C779, 0x1415A8FA, 0xDC10F525, 0x1CE06D80, 0x953089E6, 0x933C3EE5, - 0xC18B1022, 0xFAD11D71, 0xA1EA92BF, 0x2AE61798, 0x63D0C0CF, 0x1CF8CA34, 0xDF748AFB, 0xF0FDE897, - 0x26FC4399, 0xE563FFC5, 0xE6AFE218, 0x5EE3254B, 0x76565E08, 0x70F5EFBE, 0xBD66AC9A, 0x90853CB1, - 0xA002CE55, 0xAFE263F4, 0x804DA5A5, 0xBB971F95, 0x775BDE46, 0xEDA15B5F, 0x3D5A2CFE, 0x6D9FE953, - 0xE84541F5, 0x6574FB29, 0xFD3ADC69, 0x1BAEDDED, 0xE3F810C2, 0x87CC8D7C, 0xDC23F894, 0x7635A6DC, - 0x294E131B, 0x62FA4471, 0x83D3870E, 0xF82B9324, 0x8A493E04, 0xA8FCDF75, 0x20583A80, 0x5A94424E, - 0x18CED906, 0xB417F24A, 0x47089341, 0x62A432C0, 0xFDC17DFD, 0x5B89C6D2, 0xC8C8ED37, 0xD44D38B1, - 0x9A6DFF2C, 0x7C5ECB65, 0x76814C50, 0xB3D56A33, 0x5DF124F8, 0xDB92A5D9, 0x210F2E0D, 0x50FFFF1B, - 0x1B7ECD90, 0x481ED2FE, 0x094DA8E8, 0xF111F8FA, 0xAC7872DF, 0x4B8FE240, 0xA7CF01FD, 0x72AFAF1B, - 0x27BE7F7E, 0xE5F42B34, 0x02807296, 0x325F9CF6, 0x97EE1C92, 0xD5E6F65C, 0x7EA2490F, 0x666E3451, - 0xB17E6A43, 0x1AFBE46E, 0x8D2B871B, 0xD52A1A9E, 0x41EBA711, 0x9D4B906B, 0xAEB5A2F6, 0x7EC530E7, - 0x063FC87E, 0x48830732, 0xE5EC2B25, 0xA17B0F26, 0x2C63A878, 0x7A1362A1, 0x68B4DE31, 0x6EC14B7E, - 0xE65C3B05, 0x8EB452EC, 0xB6DD94CA, 0x8DC592C5, 0x402EA8BE, 0x689F131B, 0xDA3A54D1, 0x41D264AC, - 0xAD150ECF, 0xD7750790, 0xBD46E2A0, 0x2DC97F87, 0x2476F6AE, 0x28F4778E, 0xB4B9E75A, 0xE5532AD6, - 0xE58A7485, 0xDFDD2553, 0x779D3F91, 0xD89F3033, 0x42BB4152, 0x2F6EFB01, 0xF72C43BB, 0xF1DB8663, - 0x5BA625E2, 0x17180017, 0x151F03B3, 0x7FDA9772, 0x1DEB2F8D, 0x178DE5EE, 0xDFF10ACA, 0x2DC29F2A, - 0xF2797346, 0xC298535D, 0xB56C1D35, 0x6389138B, 0x54B732AE, 0x3FAF9958, 0x3BFE3E52, 0xA311D83E, - 0x50E7B0BD, 0xC28F97B4, 0x8C1FAAB7, 0xD22BD453, 0x4E6A4D65, 0x626B6251, 0x1F547F6C, 0xEF8105A0, - 0xB7A062B6, 0xE1325CC7, 0x8207E7A2, 0xB0A9E0D6, 0x097B78C1, 0xC41D4176, 0x13DB573C, 0x5291E598, - 0xF4D1AFB4, 0xA93FE970, 0x673042D8, 0xCC98A35A, 0xCEBD4AE5, 0x47B8BB39, 0x5F8A294E, 0x37FDA881, - 0x9E81D5BD, 0x47691BD1, 0xFB92FBF8, 0x24AA898D, 0x0D0B5B29, 0xE5E11928, 0x7D356637, 0xC4525D0E, - 0x72AFE781, 0xEBE53FCD, 0xBCBB299C, 0xC40B26D3, 0x1C049A63, 0x4621C7F8, 0xD3337531, 0xF5CCAE80, - 0x5D3D0BB7, 0x2246BD17, 0xF158D4F9, 0xE5CB58A2, 0x07F5F1E1, 0x9D420346, 0x952C186B, 0x9DBB2227, - 0x203D1639, 0xC022D8AD, 0x7A91F3DD, 0x9326CB7B, 0x2971F3FA, 0x7EF8C14B, 0xB7B468DA, 0x840A9104, - 0x6F811C48, 0xC0DAC40B, 0x68D75281, 0xB7DCB2D8, 0x9A216C54, 0xEE710DB9, 0x54ADDAC6, 0xF6F71ECF, - 0x6F1E0D83, 0xDE5ECA0D, 0xEA40DE93, 0x962D60E7, 0x6B575E29, 0xFFCC6677, 0x0D879692, 0x728CBE24, - 0x9011B3F8, 0xAB260F9E, 0x5D71E2CA, 0x501F6613, 0x5F16EE75, 0x0D33E974, 0x8865BBE8, 0x10495EA6, - 0x393032AB, 0x6C7F4A61, 0xB685D152, 0x29D429A4, 0x24CA7E33, 0xCD26F3F2, 0x78D85078, 0x0BA90BA3, - 0x360CB744, 0xDF999168, 0xB60B3644, 0x39EED49A, 0x4A794E4A, 0x3B6715BF, 0x92D35DC9, 0xF640ADB6, - 0xFA96EF3D, 0x0DC22AD1, 0x48262E68, 0x6F620F37, 0x6B29E242, 0xC6FBEEB6, 0x3034A0D9, 0x122EF44F, - 0x7EEF61DF, 0xF3854D20, 0x0F84C1DB, 0x0DE504BF, 0x8AE763ED, 0x369AD35F, 0x8BA7B643, 0x44933BB5, - 0x49E96357, 0x4C7F9884, 0x2A5BF491, 0xBB8DCDC2, 0x3873C5F5, 0x0DB1AB26, 0x09FF188A, 0x93DE180D, - 0xBA757CAC, 0x06AFFBE6, 0x12B37F82, 0x150D3234, 0xC2C0AB1E, 0xC8B4D8F3, 0x65B7BB96, 0xBBF951B8, - 0xC4A03C44, 0x7E2FF9B6, 0x86592827, 0xECE0BE1B, 0x0DB32865, 0x5FC2CD73, 0x34AD2D16, 0x3B2057A7, - 0xC32C663F, 0xA85CD1EB, 0xEBD5BCF3, 0x439DC2FF, 0x93379CAE, 0x99273984, 0x3659A11F, 0xD5FF53BD, - 0x38704C43, 0x3D782532, 0xD7306729, 0x420E909F, 0x4840C5F3, 0xDA80DF8D, 0x53395E04, 0xEF690DCF, - 0xF9738931, 0xE91F7065, 0x5EB901A8, 0x176C6A2C, 0x25D062AE, 0xE4CCCB95, 0x93C87277, 0xF8FF911C, - 0xD7AE6706, 0xE704A40E, 0x38BCF64B, 0xDDFFF9FD, 0xD1BDE381, 0xA4313A0B, 0x48DDA520, 0xD064D1E3, - 0xDBFD61EC, 0x7EA87E9A, 0xF894AAFD, 0xB5565368, 0x2C34933D, 0xF0F50DE9, 0xF91EB25C, 0xE3EC3B8E, - 0x5E9409A7, 0xB2A9D39A, 0xB6B19F3F, 0xA6685DC9, 0xCAFC5B74, 0x4CC15F7F, 0x114E5709, 0x31B6E0EB, - 0x8CDAA5C4, 0xF5ABD631, 0x12A4A9C0, 0x969011BE, 0x9AB39E96, 0x0D406569, 0x8AE25103, 0x68474C26, - 0x9E8D006F, 0x9C8E4F0B, 0x314630FD, 0x2F30B254, 0xFE88FCF4, 0x941FBE2D, 0xC03B55A3, 0xEE474898, - 0xEC9B3BD2, 0xDDE00C4B, 0x7F192B54, 0xA25A0DC1, 0xDCF18F59, 0x55F674B4, 0xF6734A46, 0x92B7A7E2, - 0xCEDA18D8, 0x90EA738E, 0x7C98FEE8, 0xFC3DE7ED, 0x4075569F, 0x8989B676, 0x326B34DA, 0x52AC749C, - 0xAF71ACF8, 0xDC1F65F4, 0x408459F9, 0xD46B650F, 0xFAEDB779, 0xBC0C6EDB, 0xF68DB879, 0x40071FCD, - 0x2D01AC86, 0x7952D58A, 0x4F7A42BA, 0xD5C9306C, 0xFA7CC252, 0x48285F83, 0x51CD6BC3, 0x8212BC4D, - 0x53828B06, 0x8986B36F, 0x6E00951C, 0x6505074F, 0xAB3AF4CC, 0x12D92810, 0x44F4D0B5, 0x0D7DBCDD, - 0x152A5968, 0xA92C4ECA, 0x6795E17F, 0xD02C875E, 0xA4B5A04C, 0x2F0C4295, 0x72678451, 0x59B87A4C, - 0xB3AD2988, 0x7B717173, 0x6D0EC6EB, 0xF73B4FC7, 0x645D56E0, 0xBC73769E, 0x9A83ED5C, 0xCE5B332A, - 0x151A4D6C, 0xDEB26C33, 0xBA7CFEA9, 0x0FB2D875, 0xE0045E66, 0x9DB0072A, 0x5CFB3C42, 0x8C3FEFD5, - 0x4E7CB65C, 0x2905EC79, 0xA2F6C308, 0x296A6794, 0xB589571E, 0x4638BC8F, 0x964B8B40, 0xBE27615F, - 0x4E95C30C, 0x2B56A6A8, 0x4BC50BC3, 0x497BB78B, 0x8860A6CC, 0x80830DB7, 0x9D726E3A, 0xE63600FD, - 0x7A68F80B, 0x1C5CCCA0, 0x1784B6A4, 0xBCA7EF08, 0x425ABF74, 0x3663AD11, 0x72F2AEC0, 0xA4A940F0, - 0xBBC08817, 0x5C158691, 0x7C1ECC0E, 0x1818BB5B, 0x0DE17D9F, 0x350D4BB6, 0xAC21F0FB, 0xB913C7B0, - 0xE9DC26F6, 0x25B995C5, 0x0D2E9E6F, 0xD39C93A8, 0x1C775CED, 0xF1E69A7D, 0x0025310F, 0x782BBDF8, - 0xFD3E83E4, 0xB5DD602E, 0x1CD9044C, 0x2AFC3405, 0x79E32E1E, 0xB59B4A79, 0x4609271E, 0x1C5E4D7A, - 0xA74D0009, 0x319A07E9, 0xCAC3A6FF, 0x8B515C07, 0xE80FE11D, 0x1D59CF05, 0x38F946AE, 0x6324D94E, - 0x313D3FE8, 0x310AF64C, 0x3CDE2571, 0x0644DA97, 0xEADBF286, 0x7B5DACA1, 0x8D5D3A54, 0x1376A003, - 0x51774091, 0x562A7891, 0xC246A9FA, 0x82C1C05F, 0x0D662D24, 0xAEDDA534, 0x5A96ED06, 0x2C055326, - 0xB0F2F5B0, 0x21C1F0F6, 0x6C39F1DE, 0xDE48E8FE, 0xB5CD1538, 0xC4E356AC, 0x1B24FE63, 0xF36D1426, - 0xB8B827D2, 0x1576F620, 0x3F49589E, 0xC438975C, 0x64880EDA, 0x7C322884, 0xD3978FBD, 0x4787B61E, - 0x2E192772, 0x0584B589, 0x0EAAA684, 0x6D81DE51, 0x63717598, 0x08A48B4D, 0x2DF88EC5, 0xA647285C, - 0xFC81F7AE, 0x10E48D34, 0x963F5C91, 0x8F592492, 0xC79010B8, 0x8A6D4936, 0x4759E38B, 0xACFC5255, - 0x0C9D02B7, 0x1B52A34E, 0x3B0A60A1, 0x1DB4E220, 0x23DCD523, 0xEA42AD41, 0x9B3CB86B, 0x6C503824, - 0x41DC835D, 0x22A311A5, 0x7B7AD03E, 0x6AFA5972, 0x3E506D92, 0x04FED79C, 0xCE801EEF, 0x7BA17C52, - 0x3AFFBB6A, 0x96A23185, 0x74316B7B, 0x11D330F6, 0x8484E528, 0xB643261D, 0xCC076540, 0x9116E092, - 0x4B6D5634, 0xC9532DCB, 0x0CBBB981, 0xE8D8E41F, 0x7573408A, 0x684F202D, 0x9A92649E, 0xF2CF0C39, - 0xF6C540AE, 0x29368636, 0x6A5BD7FB, 0x5044B256, 0x35AEC028, 0x8C12E363, 0xE0A2FE6D, 0x9E8EB149, - 0x2ED1CF45, 0x54A9880B, 0x4E295354, 0x83730F2E, 0x279AD027, 0x7051921F, 0xC4E219AC, 0x8B540A9B, - 0x947E9DF5, 0x28B61847, 0xC4E32434, 0xF9227028, 0x3D489511, 0xD5A41195, 0xA03EE1BD, 0xD761441F, - 0x402F7502, 0x5AB68BEF, 0x5555B735, 0x5918623F, 0x983735E9, 0xE332F1B8, 0x48D83C28, 0x81318EE2, - 0xABB8AA53, 0x01F0C3CE, 0xB4291A62, 0x89344F27, 0x5FDEEA6C, 0xE6D22F86, 0x9988C7DC, 0x051A1432, - 0xE11867BC, 0xEFA49EEF, 0x48AADD79, 0x33633BF3, 0xA56B57B4, 0xA253AB9F, 0x7FC8340A, 0xAB73B132, - 0xF1DFB6CC, 0xC5F02EDA, 0x426782CD, 0xF6648D35, 0xB4AB88A0, 0x9BA7B785, 0x67C03341, 0x22612D33, - 0xD32ED490, 0xAAA56F6A, 0x37ECD8CD, 0x518E8140, 0x7390301C, 0xB33A9E62, 0x244220D4, 0xD88AE216, - 0x9752DEEA, 0xB8A22F50, 0xBFB221CB, 0xDB4D57A0, 0x02D39A0D, 0x8C311F00, 0x1192748C, 0xB9505446, - 0x469C1E7B, 0x3AEFF9A6, 0x7CD5ABE8, 0xD849E5F5, 0x1E2FB30A, 0x18879BD8, 0x6DDD966E, 0xC9BD4B8F, - 0xCEEBCCD9, 0x0D881346, 0x20 - -basegraph= -2 - -z_c= -384 - -n_cb= -19200 - -q_m= -2 - -n_filler= -56 - -e = -36936 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_LDPC_RATE_MATCH, RTE_BBDEV_LDPC_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k40_r0_e17280_sbd_negllr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k40_r0_e17280_sbd_negllr.data deleted file mode 100644 index d98210ff6f..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k40_r0_e17280_sbd_negllr.data +++ /dev/null @@ -1,57 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_DEC - -input0 = -0x7f007f00, 0x7f817f00, 0x767f8100, 0x817f8100, 0x81008100, 0x7f818100, 0x81817f00, 0x7f818100, -0x86007f00, 0x7f818100, 0x887f8100, 0x81815200, 0x81008100, 0x817f7f00, 0x7f7f8100, 0x9e817f00, -0x7f7f0000, 0xb97f0000, 0xa7810000, 0x7f7f4a7f, 0x7f810000, 0x7f7f7f7f, 0x81720000, 0x40658181, -0x84810000, 0x817f0000, 0x81810000, 0x7f818181, 0x7f810000, 0x81815a81, 0x817f0000, 0x7a867f7b, -0x817f0000, 0x6b7f0000, 0x7f810000, 0x81818181, 0x817f0000, 0x7f7f817f, 0x7f7f0000, 0xab7f4f7f, -0x817f0000, 0x817f6c00, 0x81810000, 0x817f8181, 0x7f810000, 0x81816981, 0x7f7f0000, 0x007f8181 - -hard_output0 = -0xa7d6732e, 0x61 - -soft_output0 = -0x7f7f7f7f, 0x81817f7f, 0x7f817f81, 0x817f7f81, 0x81817f81, 0x81817f81, 0x8181817f, 0x7f81817f, -0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x817f8181, 0x81818181, 0x817f7f7f, 0x7f818181, 0x817f817f, -0x81818181, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, -0x81817f7f, 0x81817f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f8181, 0x81817f81, 0x817f7f7f, -0x7f7f8181 - -e = -17280 - -k = -40 - -rv_index = -1 - -iter_max = -8 - -iter_min = -4 - -expected_iter_count = -8 - -ext_scale = -15 - -num_maps = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_SOFT_OUTPUT, RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, -RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN, RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data deleted file mode 100644 index 3472c992fd..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data +++ /dev/null @@ -1,643 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_DEC - -input0 = -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xCE000000, 0x2F00F6D9, 0xCC1AF942, 0x22F8F4E1, 0xBED8FAFF, 0x43DC19B5, 0x35E91CC0, 0x5B070D30, -0xF9DACDFD, 0x170121DA, 0x012AEF53, 0x39E7D90E, 0xD5FBEFDD, 0xCCF0FDC8, 0xD62B0D54, 0xEAE601BE, -0xE5001328, 0x0CF00DC7, 0x3EE0E4B8, 0xC2D8EB00, 0xBE1EEBF7, 0xCDF5E7E4, 0x4FDFF4FA, 0xF402DA2A, -0xFEFEE32B, 0xD62CDA55, 0x17DE0106, 0xF92411B5, 0x301B2142, 0xE50C09E3, 0x51030EDB, 0x48DB2A4C, -0x03E420BC, 0x1AE1DCF8, 0xB6EE0D3A, 0xC2FADF22, 0xBF211508, 0x3228E8AF, 0xE0170BEE, 0x26F8091F, -0xDBFA02D2, 0xC810FE19, 0xE4DE1005, 0x18FF0D29, 0xE723F04B, 0xFDF2F1E7, 0xCF05DBD3, 0x0412F616, -0x00DC234C, 0x1501EDD7, 0xD9EB4FED, 0x1C03BC2B, 0xE2FDF6D4, 0xE9EC10C4, 0x2426034D, 0xEDE33B45, -0x05DC2304, 0xEDE81411, 0x11E416BD, 0x03D1DAA8, 0x04F72431, 0x30F15718, 0xF3F33534, 0xED043AD3, -0x1CE8BC11, 0xEDE1EBF7, 0x242C0454, 0x0118D740, 0x07F3D01B, 0x0205D623, 0x15233E05, 0xF2EBE5ED, -0xED2D3BAC, 0xEBF83CD1, 0xFCF9D421, 0x0B0934E0, 0x0A09E1E0, 0x1AEB0EC4, 0xF8FEDF26, 0xFCE8D53F, -0x20E10846, 0xE327F5B1, 0x18E340F5, 0xF71ED0BB, 0x0EF5CBE3, 0xF4F11C36, 0x141BC343, 0xF4E7E5F1, -0x30205809, 0x10EAC713, 0x22DBB603, 0x250AFC1E, 0xE4F3BB1A, 0x2316FA12, 0xDEE105F7, 0x12FDC7D4, -0xFC212507, 0xDB290300, 0x1500ED00, 0x1EABBA27, 0xF14ECA2D, 0xF2D93625, 0x23F20502, 0xF0B9C8E6, -0xEAD83EE1, 0x0C331CFF, 0x23D205F5, 0x0EC61906, 0xF128C9EF, 0xEF3CC800, 0x0B9DCDED, 0xF3C2CC3C, -0x23EB04E9, 0x0B51CD13, 0xEADEC3D7, 0x222D06FB, 0xF0331904, 0x16C93F0C, 0xDAE5FE0F, 0x1F14B80C, -0x001B28ED, 0x3F3B67F3, 0xEEEDE9EC, 0x1CE94514, 0x1D4145EF, 0xD8BA5019, 0xFC06D41E, 0x17BDC0DF, -0x16D712E4, 0xE8041001, 0xEC2AEDDB, 0x11BE3803, 0xEBD2ECE5, 0xEF5A17F9, 0x2BFF52CD, 0xE958C126, -0xEE1A1531, 0x0EBF1BF2, 0x18BC401A, 0x2AC2521C, 0xEE4817EA, 0x07482E20, 0x141314E0, 0xF41DCD15, -0xDB10B40C, 0xC23700E9, 0x4221EB10, 0x4BE7E607, 0xEEF9DC0E, 0x62AC16DF, 0xE2E1C5D3, 0x27E4F70A, -0x3213020D, 0x4ABE0A14, 0xACC1DE1B, 0xD636D416, 0xDFAF020E, 0xCE230828, 0x2615F6FB, 0xEA1002EE, -0xD1351117, 0xB71C07F3, 0x03C9DF0C, 0x2B52DB0F, 0xD9AB02D7, 0xD20702D3, 0x48EEFB21, 0x3AE5E116, -0xE728EE0E, 0x33C50F00, 0x363EF5EC, 0xD4FBF217, 0xB00FFDDE, 0x2333281A, 0x3624040C, 0x02DB0E04, -0x3FDE27FD, 0x173716FB, 0xF20BEFF1, 0x3EF0191E, 0xB6B01719, 0x1BC7DD27, 0xE80AF3EE, 0x20BE101E, -0xF42EF8E6, 0x40531BF9, 0x4646172B, 0x44DA1E1D, 0xC7F5E503, 0xF3E8F0E4, 0xA4E2E5EF, 0x42B935F6, -0xEB1D1A1E, 0xE500ED0B, 0x2909F2CF, 0xCE0E0037, 0xD1320AA6, 0xEB01F9D9, 0x45E7ECC0, 0x4CFEE3D7, -0x0EE024B8, 0xD3F31B1A, 0xE846056E, 0xF522EFFB, 0x5F1AE443, 0xCAF93620, 0x2CE9F23E, 0xDDE604F2, -0x3BDDFC04, 0xC8EBEE13, 0xC11FF0F6, 0x18EBE9EC, 0xFAEEF1C7, 0xB6EFDDEA, 0xF8E123F7, 0x4EF4E1CC, -0x430C271C, 0x3BE01CB8, 0xABE813EF, 0xCAEED439, 0xC1FAF3D1, 0x4E2F1656, 0x11E4DB0C, 0xDAF816DF, -0x44E3FE0C, 0x2B1D1C0B, 0x3300FD28, 0xC320F4F9, 0x2A1DEB0A, 0xEA2502B4, 0x41061322, 0xC81518C2, -0x1F2510FD, 0xD1E1F7F7, 0xBD1906F1, 0xF3C9E55F, 0xB3D91A4F, 0x0D0D26CC, 0xBD071B20, 0x41141BC4, -0x2A1B19F2, 0x4902FDD5, 0xD6F9DE2E, 0x19190341, 0x09E80F11, 0x31FC1E2C, 0xEC1DF8F4, 0xCC0B14E2, -0x51DFF3B7, 0x1AF028C8, 0x0F0E0E37, 0x2B041A25, 0x1A03FD25, 0xC5030FD5, 0xBCFAED22, 0x9A1F1CB9, -0xCCE8C2F0, 0xEF1BF4BD, 0x21EC163C, 0xBAED07C6, 0x03F7E3D0, 0xC503DB2A, 0xC20C13E4, 0xD4F8EA30, -0x391B0544, 0x59F3EECB, 0xAD0A311D, 0xFE0C2C33, 0x250CDBE4, 0xC5E80341, 0x3B0914CE, 0xC0F2ED36, -0xC204182B, 0x3B0C16E5, 0xFFFF1429, 0xC316D8C3, 0xE408EB1F, 0x3713F4C4, 0xE4F2F01A, 0x0A280C01, -0xEC0FE318, 0xCB16153E, 0x5C04F2D4, 0x281F35F8, 0xE4D80051, 0x4E0A0CE3, 0xB107DB21, 0xD1DED9FB, -0x380AFACE, 0x50CC105C, 0xD9D80100, 0xF40ECCE6, 0xDADC03B4, 0x0AE5E243, 0x0C22E4FA, 0x08CD1F5A, -0xE2D1F7A9, 0x12CE39A5, 0xFFDDD7FB, 0x032C2BAC, 0xF1D9E700, 0x14003B28, 0xFC08D420, 0x08093131, -0xFEFFD7D7, 0xBB219348, 0x07DC2E4C, 0xDF0DB8CB, 0x22EB06EC, 0x0BE034F8, 0xF10FC819, 0x1623EEFA, -0x0D1DE6BA, 0xDA1AB142, 0x1C16F4EE, 0x27F500E2, 0x1137C85E, 0x1C0BF434, 0xF004C924, 0x02EBD9ED, -0x1BF943D2, 0xE7F80F30, 0xEFFE39D9, 0x2CFA5323, 0x04242DFB, 0xF420E347, 0x15F43C33, 0xE9F41134, -0x20EBB8C2, 0x0205D523, 0xECE03DB8, 0x10F3E935, 0x180BC11E, 0x12E2C7BA, 0xE70B4233, 0xEED8EAB0, -0x110E3936, 0xFEE327F5, 0x12E60017, 0xFE4026F3, 0xED26C518, 0xE5E9F2FF, 0x200C08EE, 0xEF1439E4, -0xE92010ED, 0xE1B80908, 0x18584021, 0x24FBFC31, 0x00AE2823, 0x040CDC2A, 0xDE34FBE5, 0x1439C30D, -0x0DB7E6EF, 0xE6090F21, 0xECAF3C20, 0x10DFE8D8, 0x0CC0CCF9, 0x15061318, 0x043723DD, 0xEA3A3DF0, -0xEC18C413, 0xFE2BD611, 0xE3BC45FE, 0x16FCC11D, 0x120E39DC, 0xEC00141B, 0x13F03B27, 0x24D2FC18, -0x0917E1FB, 0x113BEAEE, 0xE9FE11EE, 0x2C505427, 0x0D0B3529, 0x15E73E1E, 0x0FD91AF1, 0xDFF8B6FF, -0xF413CCE1, 0x1EEFB9EA, 0xDCD04C17, 0xCEC25AF8, 0x1AB2BE17, 0xD8BEAFDA, 0xE6CEBD19, 0xFCC42CF6, -0xDE19FA15, 0x250203F2, 0xA90042DB, 0x242A2F1A, 0x004D0401, 0x0B4C2825, 0xACB61DDD, 0x07422CDE, -0xCDFEDFE7, 0xAFF8F527, 0x35052820, 0x0B34F2DD, 0xD648E2F3, 0x3DDF02E0, 0xFE42EBF8, 0xC1F6251A, -0xBA0DE9E2, 0x442FE2E5, 0xD014E308, 0x2DB409EC, 0x50F8FADC, 0x264BD8E0, 0x2E0FFEDC, 0x1E2D051A, -0x0FD20AFB, 0xCE1CE7FA, 0x35CDF6F4, 0xFC49F3F4, 0x642FDCDF, 0x3625C507, 0xDF140FFC, 0xDB21F913, -0xC7D5FDF9, 0xCEE112FE, 0xD1D4F7F8, 0x5D410704, 0xD914CC19, 0xCCF800EC, 0xE3E00C1F, 0xCD05F408, -0xC952F4DD, 0x444EF02A, 0x1E15E526, 0xD73909ED, 0xFA1900EF, 0xFFB6210F, 0x06EB27DE, 0x0B5BDF13, -0x1B4F1D33, 0xCDF5F4D9, 0x00F40C1D, 0xC6031CDC, 0xF91C13F4, 0x061321C6, 0xBFDD2206, 0xEE13193C, -0xFF1C17BB, 0xA91E27F5, 0x25ECD13C, 0x0CF90321, 0xBA1FE5B8, 0x50151F3D, 0xE935285D, 0x330A10CE, -0x3EE6F542, 0xE80AEA1E, 0x45251103, 0xC014E3EC, 0x2D2C1854, 0x9F0E0536, 0x2E14C7C3, 0xECE50642, -0xE6E214F7, 0x1021F208, 0xBCDC19FB, 0x4B281BFF, 0x0CDFDEB7, 0x21E91CEE, 0xC22FF856, 0xA2F3EAE4, -0x5810CB18, 0xE416D03E, 0x25E3F40C, 0xF4180340, 0xFE0EE4C9, 0x433C2763, 0x38F11BE7, 0xE5FC11D4, -0x1E11F4C6, 0x491D0ABB, 0xC0E72140, 0xB226E84F, 0x122E26AB, 0xEAF116E7, 0xD5E4EE0B, 0xF4FB0323, -0xDCE61D42, 0x05F1FCE7, 0x0DDCDDB4, 0xF9E42000, 0x181610EE, 0xE1F246CA, 0xEDEDC53B, 0x14DEC5B6, -0x1E02F629, 0xDEE749F0, 0x1C02BDD7, 0x1EF3F5CB, 0x11E8C640, 0xFA272301, 0xF3FC352C, 0xFDD52553, -0x09191FF1, 0xDB11FEE9, 0xF7EB1FEE, 0xFFF9292E, 0x0A2032B8, 0x0C1BCDBC, 0xDDFFFBD9, 0x1BEABDEF, -0x19F84130, 0xECE5ECF3, 0x271302EB, 0xE7EB423D, 0x1E2146B7, 0x14E13CF7, 0x16FE112B, 0xEB211308, -0xDAD802B0, 0x0017D811, 0xFE26D901, 0x0D0ACBE2, 0xF2ED1A3B, 0xFBDED206, 0x18F0F1C8, 0xD1EFA9C6, -0xE5E1BDF7, 0x1514C314, 0xF9FCD1D3, 0x02EB2BED, 0x0EEB1BC2, 0x2427B5FF, 0x0B2233FA, 0xFE0FDBE8, -0xF7DDCE04, 0x03F42BE3, 0x0525D202, 0xF9B20021, 0xEF0FE926, 0xF505E318, 0xF7DF1F23, 0xEADF12F8, -0xF12C3807, 0xDF01FA04, 0x1D23F426, 0xF1231A05, 0x20F549FB, 0xE0F0F9E3, 0xDB67B418, 0xC6E5623F, -0x212AF90D, 0xE6C7BD02, 0x24CA4C11, 0xE249F6F1, 0xE8383F21, 0xFC212310, 0xF7561F07, 0x25C4032E, -0x070EDE14, 0x1437151A, 0xE93C4010, 0xF10CE615, 0xDB0D4D1C, 0xFAF6221B, 0xF5F3E21E, 0xE2470B1B, -0xE71BC01F, 0x07B0220C, 0xF311CAD8, 0xFF052816, 0x1DC20BDC, 0xE7BB40EB, 0xF5DEE21E, 0x013527FB, -0x0FF519F2, 0x1AE9BDE4, 0x2B0F53F0, 0x13C6C5E8, 0xF12636ED, 0x10BD38FE, 0xDD0606E4, 0xDA5C4FDE, -0x1329C5CC, 0x0DC8CA00, 0xD33956F0, 0x0700D711, 0x31B1DE02, 0x210C09D9, 0x0C2EF81B, 0xF5FFE406, -0x27C1E2DA, 0xCB1801E8, 0x38C70EF0, 0x0D1EF0EF, 0x142E1C0B, 0x0B00EB06, 0x5D441DD8, 0x1E4035E5, -0xFD3C0AE8, 0x3732DCEC, 0xC8B5F00A, 0xB9BF1023, 0x0AF22018, 0xC6DDE21A, 0x18EF1306, 0x1AC8F1E9, -0x1F020EF0, 0xEA0209DB, 0x41CFEEDA, 0x21E31AF8, 0x4BBD070A, 0xEECFDD1A, 0xD4DB15F8, 0x430FFC02, -0x15361A18, 0xCF17ECF1, 0xE42009EF, 0xC21CF4F8, 0x3DDFEAF3, 0x3E0916F9, 0xF028151F, 0x03CA1700, -0x983B26F1, 0xDE2AC112, 0x209FF9FD, 0x1935F7C6, 0xED18F1F3, 0xBFD0EA0F, 0xC5071908, 0x1F4E13DE, -0x17F00926, 0xF80DEE19, 0x4DF01FE6, 0xB7D2DB18, 0x0AF5E0F9, 0x4043E21D, 0x4AD517E5, 0xB0CFDE03, -0xFB22D90A, 0xDF5023F9, 0xDABDF828, 0x1911011A, 0xBDF30FE8, 0xCEAA1A1A, 0xB0D2F62D, 0x3AAC28F9, -0x42D6ED2D, 0xA83D1B02, 0x1831D1EA, 0xF11D10F7, 0x1D201AF5, 0x394F0C07, 0xB327F0D9, 0x3254DA01, -0xEBF40AD5, 0x26A413E4, 0x5113FECC, 0xD4F32915, 0xDDB3FD1A, 0xC0D2FB25, 0x02DEE7FB, 0xC33DDB05, -0x01021615, 0x0B1D27DA, 0xCBC2E2F6, 0x193CF3E9, 0x27E2F1EC, 0x5A1BFF0A, 0xE8CF320D, 0xBD4DF0F8, -0x0F291A26, 0x1817E7FF, 0xEFCB10F0, 0xD40CE9F3, 0x0606041B, 0xFABC2322, 0xE0E9DEE5, 0x1BD80710, -0xC015F301, 0x4718E8EE, 0x69D81E11, 0x19F6BF00, 0xF60F1E00, 0x3002E225, 0x29EA08C1, 0xF4EA00EF, -0x3910E5E7, 0xDB0B12E4, 0x2A3E0265, 0x3BE8FE11, 0xBBEFEEE9, 0x151BE2BE, 0x1E2314FB, 0x4C2DF754, -0xD5F823E0, 0x10200247, 0x01DB194D, 0x1B17D93F, 0x5806F42E, 0xFA19D040, 0x040BDF1D, 0xFCCB25A4, -0x39D9DC00, 0x2C0EEFE7, 0x20F3FDCB, 0xC2E70841, 0x3EEFEAE9, 0x32EDEAC5, 0xAC1BF70D, 0x0C15D4C3, -0x4CE7E5BF, 0x26F024E9, 0x061AFE0D, 0xDE13DEC5, 0x09DE0706, 0xFC0C1FE5, 0xD41CDC0B, 0xCC1DFBBB, -0xC6020CDB, 0xCD16133E, 0x3FF30CCC, 0x0B2D16AB, 0x3800E3D9, 0x3AFCF0DC, 0xE4FFED27, 0xFCF9F3E0, -0x05FF24D9, 0xE1F9DE2F, 0x391908F2, 0xC8F211CB, 0xEAEF003D, 0xDC1C040D, 0x25F74ECF, 0xE41F0CBA, -0xDF1708EE, 0xE016F83F, 0x1D124515, 0xF325344D, 0xE114F63C, 0x261FFEB9, 0x02F02739, 0xF12018F8, -0xD9124F3A, 0x1E1A45F3, 0x1504142C, 0xDDF506E3, 0xEAEAC113, 0xDE1AFB42, 0xF113C93B, 0x1721C207, -0xE3D4BB54, 0x070A2FCE, 0x0C0AE41D, 0xF90D3035, 0xE6DCF2B4, 0xFB15D4C3, 0xFE2425FC, 0x03002B28, -0xE50AF433, 0x07EC2FC4, 0x07E921EF, 0xFE09DAE1, 0xE21EF6B9, 0xF3E6360D, 0x17EE3F39, 0xE7FA0E22, -0xF5151DED, 0x1EF945DE, 0x0D1236EB, 0x0AFD32D6, 0x0928CFFF, 0xDCDAFD02, 0xFB272D00, 0xCE025B25, -0xEA0D3ECB, 0xE3E2BBF5, 0x06D32354, 0xF4DDCCB6, 0xE4002245, 0x213AB706, 0xECCCC3ED, 0x3CED9C0B, -0x15D23C14, 0x0BE7E3F9, 0x1FE70A0E, 0xF30D350F, 0x1928F01B, 0xD50AAE01, 0x120AC6E1, 0x0ED4C91E, -0xFFF7D804, 0x0D0CCA1F, 0x0433DBE4, 0xEA0DEFF5, 0x36FB5E1C, 0xEB11ECDC, 0x23C0FB17, 0xEBC63C17, -0x272800EF, 0xFC34D4FF, 0x0AB8E2F5, 0x01FB2AE0, 0x090630DD, 0xFE0AD522, 0x1B10BD1D, 0xDF520719, -0xF12436D5, 0x1D20BAFC, 0xE442BCF8, 0x05E0DDE6, 0x183FF1F8, 0xF816E118, 0xE3C9F4EE, 0xF2F51AF0, -0xFE5126E4, 0x1E31F7D7, 0xF9362F09, 0x15E43CF2, 0x0D3EE50C, 0xF74931EA, 0x23EEB621, 0x02B9DAE9, -0xDFE5B71F, 0xFD46D50D, 0x103E181F, 0xDF580717, 0x00C3EC31, 0x0CF714EC, 0x4ACCE41E, 0xF2E0DEF4, -0xB0431A08, 0xBD38D8E6, 0xEED6E510, 0x41B8EA02, 0xEC36E61F, 0xBEE9EBF3, 0xBE28E712, 0xF6051BFF, -0x2FE5E222, 0x2ADCFAF2, 0x3834FF04, 0x2AD1100D, 0xF4C502F8, 0x4DE7E414, 0x07A5DA10, 0xD1A92133, -0xB6ACFAD2, 0xCF51222C, 0xCD1BF8D7, 0x3F16F50E, 0xEEF4EA12, 0xA52F161D, 0xC4B3CE07, 0xB622EDDC, -0xDE2ADE06, 0x4FC8FB02, 0x6EDED9F1, 0xFC19B9F9, 0xD5B4DDF1, 0xDFC30423, 0xDFFBF9EA, 0x012C07DD, -0x12AF2805, 0x1A2EEAD6, 0xF8A1F207, 0xC0BA21CA, 0xFFDCE9E3, 0x36BFDA03, 0x05DD0E19, 0xF905DDFB, -0x32AEDF23, 0xFDFB09D5, 0x45D5DA23, 0x4B3E1CFD, 0x0905DDEA, 0xDFE2DE00, 0xB1FB07DD, 0x33EA2813, -0x02ECF5C3, 0xED0CD91B, 0x0D1BEABD, 0x4A17E5C0, 0xF707DFDF, 0xEE191F41, 0x19EC15C5, 0x4112F1EB, -0xD4F01AE9, 0xBF21FC06, 0x19DCE605, 0x2F0C10E4, 0x181FF947, 0xC00AEF1E, 0xF72EE8AB, 0x42F8E2E1, -0xA3EFE7C7, 0x31133514, 0x1EF608E2, 0x0DECF6EC, 0x0CECE5C5, 0x3DD31D54, 0xECE21545, 0xAE0CECE5, -0x49202B08, 0x0EFE2026, 0x13F41B35, 0x1B0BEB32, 0x1719F30F, 0xECDAF0FF, 0xECE9ECC0, 0xF212EC3B, -0x3DE8E6EF, 0x13F2EB1B, 0xB008EBE0, 0xBAE22845, 0x1A111DEA, 0xDBFC0EDD, 0x3F29FE50, 0xCDF817E0, -0x4B030CD5, 0xEADCDE05, 0xC31312C6, 0x272EEAA9, 0x340201DA, 0x17F400EF, 0xED1F1608, 0x24D24B55, -0xF4091DCE, 0xF51633C2, 0x03D32B56, 0x2325FA4D, 0xDEDA05FD, 0x01F72831, 0x04F12C19, 0x2716B1C3, -0x1B19F3C0, 0x10E2C909, 0x050C2233, 0x03F22519, 0x1C06F422, 0xE7D70EAF, 0x03D725AF, 0x13EC14EB, -0xF6F631E3, 0xF900DE28, 0x1FE2F7F6, 0xFBE9D2C1, 0xFBEFDDE9, 0xE110F7C8, 0x1C290C50, 0x27D9FFFF, -0x07E421BB, 0x3BE89CF0, 0xF50733D0, 0x2514B2EC, 0xF5EB1DED, 0x0619D241, 0x1FE8B840, 0xEEEA3B3E, -0xED1F1648, 0xFF15D73E, 0x0123D805, 0x0310D5E8, 0x010ED819, 0xECE53B43, 0x03E1D547, 0x01D9D6FF, -0xDFE3B745, 0x1C14443C, 0xDF0908E1, 0x03FE2ADA, 0x1306C5D2, 0xDD001004, 0x1F3AF818, 0x1A3BF3ED, -0x1EBC47EE, 0xF83E1F1B, 0xE21445EA, 0x2101B713, 0xE81AF126, 0x1930BFF3, 0x1533C408, 0xEDBFC60C, -0x060F2EE8, 0x06BDD11A, 0x04F524E4, 0xD94C001E, 0x0334DCDD, 0x06F1D30C, 0xFBDBD219, 0x0EBE1A03, -0x08D230E5, 0x250B4DFA, 0x0903311C, 0x14233C25, 0x1ABAF205, 0x30C5581D, 0x02FAD712, 0xDF2108DE, -0x02DDDB07, 0x1D47F606, 0x0EEF191F, 0x1B3AF2E9, 0xF9E52E12, 0xF0B1C8F4, 0x290CAF28, 0x0013D8E5, -0xE1B50AEC, 0x1A224322, 0xFDE8DB06, 0xF8A531EF, 0x0DD1CCCD, 0xE81AC007, 0x201048F3, 0x1800F1E8, -0x000BD8D9, 0xEC2A13E2, 0xF3EE3502, 0x282F0117, 0x08F8E006, 0xFE542620, 0x19E9C0D3, 0xDD140412, -0x1119C6EB, 0xF6C2E10E, 0x1EC50BEB, 0x15BD13ED, 0x143DC51B, 0xE5F2BE14, 0xF552E41A, 0xE10FF62A, -0x2A0B5218, 0xE33A0CE2, 0x02D7D612, 0xE1A7B800, 0xD8C10031, 0x0810E0E9, 0xD93AB0E8, 0xF8113011, -0x15B73C17, 0xFE46D520, 0xF6C51EE3, 0xD51A52ED, 0x1A0ABD0E, 0xFBF8DEE2, 0xE245BA20, 0x2225FB1E, -0xEC3A3CFD, 0x19340EEE, 0x08FE20F4, 0x1F154727, 0x05F8D213, 0x16F2EEE1, 0x22B6FA1A, 0xF404CCDF, -0xE22E4624, 0xFB3FDDFB, 0xE6F7BF17, 0xF0B6E71F, 0xF013E723, 0x17081114, 0x24EBFCE0, 0xFBE52DEC, -0xE9C310F3, 0x26F04E15, 0xF145E8E8, 0x122B17E2, 0x0D40CCFD, 0x43CA96E8, 0x421D0F00, 0x27DCE70B, -0x233B00FC, 0xCC44FAEE, 0xE0BC0BE3, 0x1BE7071C, 0x01C7F20F, 0xB29B28F0, 0xFB02DBC4, 0x32092326, -0xE648F5E2, 0x4707F2DF, 0xDF36E2E0, 0x1CC308F2, 0xBBA50DEB, 0x1DE71D34, 0xCE36F5F1, 0xCDF90AF2, -0x0FDE0CE0, 0xCF0C1906, 0xE0E509E4, 0xBC37F9F3, 0xDA06E510, 0x1FD3FDDF, 0xDB09F705, 0xF445031E, -0x24311CE2, 0x55EEFDF8, 0x3CEDD216, 0xAFF01516, 0xCA3D29E8, 0xCCAEF1EA, 0xE0F60CD5, 0x4CECF7E2, -0xDCD5DBEB, 0xAEC2FC02, 0x4825D7EA, 0x252D2004, 0x24F604FB, 0xD9D7051F, 0x1AF201FF, 0x3DE70EE6, -0x43BCEC0F, 0x43D8E5E4, 0x20EB1BFF, 0x2AAFF814, 0x021A02D8, 0xD80C26F2, 0xDB00001C, 0x2BF2FCE6, -0x181F0347, 0xAFE8F0F1, 0xE31D2A0B, 0xD015F4C2, 0xEF02072B, 0x361717EF, 0xFA25F2B3, 0xEEFADE22, -0xEE21EBF8, 0xD6F5EA1D, 0xBF160212, 0x03E6190F, 0x452126B7, 0x32D91DFF, 0x2D000A28, 0x25F205CA, -0xDEED043B, 0x36DCFA04, 0x13EAF112, 0x141915F1, 0xF2F0EC38, 0xBC20E6F8, 0x0BF2E519, 0xD0F11D19, -0xC7F6F932, 0xBFE2EFB9, 0xA4F919DF, 0xFFEACCEE, 0x3BDBDAFC, 0x2B1E1245, 0x5CEBFC14, 0xDB10CD18, -0xB718FE40, 0x0BE92012, 0x2414E2C5, 0x3B09FCE0, 0x17DF1306, 0x212F12A9, 0xC71407C4, 0x0901EFD7, -0x22EAE23F, 0xE7E805C1, 0xC6F21037, 0x4A111218, 0x1AEC22EC, 0x27E30EF6, 0x0C000134, 0x1BF10D37, -0xFD1F2A09, 0x1AEFF3E9, 0x160F3EC8, 0xEC173B3F, 0xE8F711E1, 0x050A22CD, 0x15263DB1, 0x07012127, -0x1D22BBB7, 0x34E3A5BB, 0x19210FB8, 0x17D41254, 0xD822B1FA, 0xE6DE0E06, 0x1519ED40, 0xDDE54CBE, -0x1EFC0BD4, 0xFE0D2A35, 0xE8EF40C7, 0x09E5E1F3, 0xF60631DE, 0xD6EDADC5, 0xE61A0FBE, 0x091C30BC, -0x0514DE3C, 0x1D1A45BF, 0x03E0DC08, 0xF4FE1C25, 0x1D260BFF, 0xF6FD3126, 0x1013C8EA, 0xFE18DB3F, -0xDF114916, 0x1806BF2D, 0x0E0535DC, 0xE5ED0DEB, 0x1EE445F5, 0x16DC12B4, 0x23FA4B2F, 0xFFD6DAAF, -0xECF714E2, 0x273D0066, 0x1B15F313, 0x1D0CF533, 0x17003E28, 0x1FD3F654, 0x00EFB117, 0x1C13BBD9, -0xF5C21D15, 0xF1CF3715, 0x244A0309, 0x09321FDD, 0xEFF81609, 0xE1ED091F, 0xFDFA2A16, 0xF742D022, -0xDCECB51B, 0x16FAEE14, 0x140C3C21, 0xEA0AED1B, 0x24E94CE2, 0x17E03F12, 0x1E01BAF9, 0xE82E4128, -0xEE311506, 0xF7FEE1F6, 0x0661DFD9, 0xDFB1FAC8, 0xFF282928, 0xEA3412FF, 0x104FC80C, 0x00ABD927, -0xEE32EA2D, 0x153B3D09, 0xFCB82DEC, 0xE9E8C021, 0x09BECEF0, 0xFCCA2D19, 0xDF09F90F, 0x013F2AE1, -0xFC44D4E9, 0xFD24D6E5, 0x1C0CF3FB, 0x2601021C, 0x1AB6BED9, 0x04B7DCDD, 0x102BC8E0, 0x09331EFC, -0xE8ACC1F5, 0x222E4BD4, 0xF715E1FA, 0x23484BED, 0xEB3913E0, 0xDFE4B711, 0x0C411B0D, 0x18FEE800, -0x42231127, 0x493B19FC, 0x39BCDE12, 0xFB46121B, 0x452DDDE2, 0xEA0DE3FB, 0x2109EF1A, 0x1B3CF81E, -0xE228F2EC, 0x48ADF6FF, 0xC2C0202C, 0x9F3FEB19, 0x192BC8E9, 0x2B0F0F04, 0x4F2DFD19, 0x1045D9FB, -0x0B3FE8E2, 0xF2FBE316, 0xBC0EE623, 0xB301E419, 0x1F2226D9, 0xBE0009FA, 0x27121A27, 0xF95002EA, -0x4714DED8, 0xBAE6E1ED, 0xC5191EF2, 0x3B2E14F1, 0xFB0FEC06, 0xDAB123E7, 0x3DDBFFD9, 0xC318ECFD, -0xDFD014EF, 0xB23D0608, 0x11E326EB, 0xC4CAE90B, 0xD847EC0D, 0xDFC3FFE2, 0x55BD0815, 0x17F9D3E5, -0x3EE91121, 0xF9C41712, 0x22AFE0ED, 0xCDE7FBD7, 0x1BC9F5F0, 0x0422F4F0, 0x200EDC06, 0xC3F700E6, -0x3B20EBF7, 0xD115EDEE, 0xC3ED08EA, 0x5AFEEC29, 0xC21F3247, 0x3315163E, 0xE330F659, 0xEAF5F5CC, -0x1716113E, 0x4CE611BF, 0xD517DBC2, 0xB2EF043A, 0x45DD25B5, 0xC0151E13, 0x131CE843, 0xFFE4EB44, -0x5FFB27DC, 0x381336EB, 0xB8EFF017, 0xECF720CF, 0x200B131D, 0x0622F805, 0xBA07DD30, 0xD9061FDE, -0x30EA013D, 0x40300858, 0x9AD917B2, 0x270FC1C9, 0x1209FFCF, 0x201716EE, 0x2A050723, 0x1BEF0239, -0xBF18F310, 0xA83719A0, 0xA9DDD105, 0xE70F3037, 0xDE0D0E1B, 0xE1D4F955, 0x0CF00AC8, 0xE80FE4C9, -0x1BE2100A, 0x40FB0EDC, 0xDD1A17BD, 0x4E1604C2, 0x5CE7270F, 0x2BF635E3, 0x00D80350, 0xFD0027DB, -0xDD22B54A, 0xEAE11247, 0xF705CE22, 0x01F2D736, 0x1D17443E, 0x1D0145D8, 0x18181111, 0x04FEDCDA, -0x01EAD7C3, 0x05DC23B5, 0x1FCFB959, 0x1A0A431E, 0xFCDC2CFC, 0xD61452EC, 0xECF23DCB, 0x31D6A652, -0x261BFE0D, 0x0CD73552, 0xEAFB11D3, 0x10291952, 0xF7F41F34, 0xEC1E3CF6, 0x180A41E2, 0x03FBDB23, -0x2026F9B3, 0x0C02E42A, 0x08F030C9, 0x0E19E70E, 0x0F1519C4, 0xDCE703F2, 0x100CC833, 0x0105272C, -0x01252903, 0x0DCCCB5C, 0xD21AAA0E, 0x2917AFC0, 0x1BEA0E3F, 0x2A1B52BE, 0xF2E8CAC0, 0x1DDDBB4C, -0x0215D73D, 0x0DF7E5E1, 0x08E230F5, 0x0EDFCA4A, 0x19FE0ED9, 0xE6EC42C4, 0xFB1D23F4, 0x22090632, -0xEA073F21, 0x06ED2115, 0x180BBFCC, 0xE6E20EF6, 0xE512F23A, 0xE21BF7F4, 0xF9F22E37, 0xF82B2F53, -0x1CF94421, 0x16D8C2B1, 0xD9F4FF1C, 0x23EC4B14, 0xF5F03339, 0xFE172B40, 0x1C2F0D57, 0x230A0632, -0xECDA3CFD, 0x1306C52D, 0x01D3D856, 0x1D2846FF, 0xF9D82150, 0x1B0CF31D, 0xEE03C626, 0x1AFFBED8, -0xD605AEDD, 0x2403FD25, 0x01EC28C3, 0xF1E1C8F7, 0x06E7D140, 0x09CF325A, 0xF2151AC3, 0xE7F8F120, -0x0A2BE353, 0x23E5FBBD, 0x1C1645C1, 0xF716D011, 0xF6ED1D15, 0xFB2123B7, 0xE2070A2E, 0x16F7C2E0, -0xE6100D18, 0xFB19D440, 0x2FF15619, 0x1F0FB938, 0x0101272A, 0xF8F42F35, 0xF3DFE649, 0x21E549F4, -0x0D430000, 0x400EE51B, 0x452E181A, 0xF1411DFB, 0xF4DC1919, 0xF247E3FC, 0x33141AE1, 0xF81CF515, -0x3115200D, 0x3FCFF713, 0xE9DA17F6, 0x0BF31102, 0x17D1E3E5, 0x0E9712FA, 0x2EAFE6C0, 0x5900F928, -0x50D8CE27, 0xCDACD9FF, 0x41BB0B2B, 0x2AC9181E, 0x13E1020F, 0x0708EC08, 0x09D220E1, 0x1EC0E206, -0x1F2BF6E9, 0xD23809FD, 0x46D3FBF0, 0xF617E2FB, 0xF4F61EEF, 0x31D71BE2, 0x1AD4F7FE, 0xB534F103, -0xDE15DD0C, 0xC7FBFA12, 0x1931F0DC, 0x4AD8F1F7, 0x4937DEFF, 0xF908210F, 0x35D121E0, 0xECCC0EFA, -0x34CBEDF5, 0x062A0CF3, 0xE4B12103, 0xD73DF427, 0xDCE8FE15, 0xB4FC04F0, 0x0B06DC23, 0x16391D22, -0x23051310, 0xE6FCFADC, 0x1C95F2DB, 0xE3DE0DBD, 0xDB270A05, 0xB4EEFC00, 0x1845DD16, 0x0149F11D, -0xC6D52621, 0x1E34EE03, 0x17D20AF4, 0xA10611FA, 0x20F937DE, 0x5D17F8DF, 0xA00435EF, 0x3ECEC7DC, -0xF9D8EB0A, 0xFC332200, 0x1DE9DBF5, 0x2E580CEE, 0x3E1AF9D1, 0xC64715F2, 0xD7CB121F, 0xEFF400F2, -0x084CEAE4, 0x064DE0DD, 0x2B10DE25, 0xC1FB0218, 0xD4F8EADE, 0x32D6FBE1, 0x0F65F602, 0xEC32E83C, -0xD2F613F5, 0xC526F9E1, 0xF0F51302, 0xF5B017E3, 0xFA0FE4D7, 0xFACBDFE8, 0xC0F222F2, 0xD630E81A, -0xD6DEFEF8, 0x33A602F9, 0xC826F633, 0x10E51002, 0x0308E9F3, 0xE011251F, 0xBAEAF8EA, 0x26F21E12, -0x0000021A, 0xE00E08CB, 0xE0ED0715, 0xE71CC0F4, 0x0A1ECE0A, 0xDB260303, 0xE7E2BEF5, 0xDDE705F0, -0xDA0BFEE3, 0xF6D83250, 0xF4FA1CD3, 0x2805FFDC, 0x1DDBBAB4, 0x1611C218, 0x18E13F09, 0x1C1D0DF5, -0xDC25B403, 0x2BF6AE32, 0x180F4136, 0x39FC61D3, 0xF3DE1BFA, 0x1AD94100, 0xE8F8BFDF, 0x0826E0FE, -0x1AE142B8, 0xF80F20C8, 0x0116D9EE, 0x22E84BF1, 0xEB22C3B6, 0xEE01EBD7, 0x0EE8CA10, 0xD8FA00D1, -0xEB073DD1, 0x1EE3BBBB, 0x12EFC639, 0x3708A121, 0xDFDB49B3, 0x28D85000, 0x0C003429, 0x000D28CA, -0x12D1C6A9, 0x0D061B2D, 0xEBDCC304, 0xEF05C8D4, 0xDACD02A5, 0xF3F7CAE2, 0xE5144313, 0xFC222B4A, -0x23F4B51C, 0x18270FFE, 0xEDDC3CB4, 0xE9213F49, 0x1EF309CB, 0xE3E5BB44, 0x0AF6E333, 0xE1EF473A, -0x080DD036, 0x0FEB38EE, 0xFE0629DE, 0xDAFCB224, 0x0DF9CB21, 0x07D3DFAC, 0x06F822D0, 0x1E1ABAF1, -0x00F32835, 0xE00AF71E, 0x08E2D009, 0xE003F9D5, 0xD5F2AECA, 0xF4EFCCEA, 0x0B0E33E5, 0x0D271A00, -0x1232EB59, 0x07DBDFB4, 0xD2ECAAED, 0x17FC40D4, 0xDAEB0313, 0x07E8E010, 0x07F5201E, 0x13173CC1, -0xDBDCFDFD, 0x24ECFBC3, 0xF2D9E6FE, 0x420695DE, 0xFC172C11, 0xDF0F06C9, 0xF413CC3C, 0x1B11F217, -0xE01148C7, 0x1EEEBA3B, 0xDDDCFCB3, 0x24E1B4F6, 0xF4DA3303, 0xF1FC192C, 0xEAFC11D4, 0xEAD41354, -0x22ED06EC, 0x23090000, 0x0BE7FBE1, 0xE0BFE4F0, 0xF2C4F818, 0xE5BEE6EC, 0xDD3E0DE7, 0xEB360516, -0xFBC6ECF2, 0xFCEC23EE, 0x0A20DD13, 0x12211FF8, 0xF23A1706, 0xCC36E6EF, 0x1C26F5F2, 0x2F05F303, -0xF540FA23, 0xFE4FE3E9, 0x23CED927, 0x18C2FA0A, 0xD1A411EA, 0x1A4306CB, 0x474E0EE6, 0x21331FDB, -0x2C33070B, 0xC60804F6, 0x515A12DF, 0xE8FDD7CE, 0xD7171126, 0x1043FF11, 0x48F8E81C, 0xCF48E021, -0xF9CA09E0, 0x2B26210F, 0x1F10FD02, 0xC9ECF8E7, 0xF9D30FED, 0x33222205, 0xC44E0A05, 0x41381425, -0xCEC21811, 0xCFFFF5EA, 0xC0E7F727, 0xF5481810, 0xE247E3E1, 0x11150AE0, 0x40C116EE, 0xFDEC18E9, -0xCF0F2415, 0x46E5F6E6, 0x430D1DF3, 0x11EEE61A, 0xA45017EA, 0xF1BBCB28, 0x35DC19E3, 0xECBC0CFB, -0x3631ED1D, 0x202C0EF8, 0xE7D2F8FC, 0x441910FA, 0xBED4E4F2, 0xCE3DE6FD, 0xD8CB0B15, 0xDE3C01F2, -0xD7F1F914, 0xFDCE00E7, 0xBDEF240A, 0x2CC5E616, 0x1C16FCED, 0xE805F412, 0xE4F11023, 0x14110DE8, -0xE2ED1418, 0xD7F7F6EC, 0xF8E9001E, 0x18C3E111, 0xAA4BF1EA, 0x2BB02DDE, 0xEB18FDD9, 0xEECFED11, -0xAEF8E9F7, 0xB0D129E0, 0x1952D9FA, 0x07D40ED6, 0xB13EDF03, 0xC74C28E9, 0xD7DB12DC, 0x0B11FFFD, -0xCEFC1D17, 0xC34CF623, 0x4A011523, 0x0410DDDA, 0xF2072317, 0x33101B21, 0x35F7F4E7, 0xF2CBF3E0, -0xAACDE6F4, 0x00002F0B, 0xE51344C5, 0x1211E938, 0x091EE1F6, 0x26CD02A4, 0xE028F84F, 0x2522B206, -0x1BFDF3D5, 0x0C23CC06, 0xE809C031, 0x19D30F54, 0x1B0DBD1C, 0x2EE256F5, 0xE11A080E, 0x17DF11B8, -0x16E4C20C, 0xEECA3B5F, 0x05EA2D11, 0x140AC432, 0xE0F6481D, 0xE024094B, 0x16F6121D, 0x14083C20, -0x200A481F, 0xE1F308E5, 0xFB0623D1, 0xDE1EF946, 0xEE211606, 0x15EC3D13, 0xF402E4DA, 0xF1D8E700, -0xE6D0F358, 0xEEF9C621, 0xE3F3BB36, 0x0A171E3F, 0x0D0ACBE1, 0x09071F21, 0x04DDDDB5, 0x051422C4, -0x07F2211B, 0xFD1BD5F3, 0xEFFE3926, 0x261602C1, 0xF40F3438, 0xEE07EB21, 0xF4DA1CB2, 0x241EFCBA, -0x2600B2D8, 0x11DC174C, 0x1A0542D4, 0xDF1349C6, 0x19E10F47, 0x09131F16, 0x010A27E2, 0x0A12E2C5, -0x01E229F5, 0xE3090AE1, 0xDEFEB629, 0x150E1319, 0x221D050B, 0xE3F4F6CD, 0x21F6071D, 0x23FC4C24, -0x1312C6EA, 0x12F01738, 0xEFFF3AD7, 0x1FFD48D5, 0x1C0B0CE4, 0xF5F71C30, 0x03F725E0, 0x0D38349F, -0xEB0614DE, 0xFB03DCD5, 0xEAC9EDA2, 0xDEF8B6E1, 0xDD0B0532, 0x17ECC2C3, 0x27E1FEB9, 0xEF14EA14, -0xF9FC2F2C, 0x160AC232, 0x1C0445DD, 0xE92311FB, 0x06162F3D, 0x03F12538, 0x0AFE1E26, 0x06E72141, -0xE1E6F841, 0x3221A5B7, 0x00E6D70D, 0xF8F8E030, 0x24FF4CD8, 0xFB02DCDB, 0x162313FB, 0xEAF1C2CA, -0x190CBFCC, 0xEFF4E834, 0x60370000, 0x25C139F2, 0xF731FCEA, 0xF734E009, 0xF10AE00B, 0xD2C81AE2, -0x26590710, 0x1ACE0231, 0xF41D0EF5, 0xD62BE4F6, 0xEF340303, 0x0AB9EA0C, 0xBA251EE1, 0xCE6BE204, -0xC1530A42, 0xC411E82A, 0xD4CD15E9, 0x35D4040C, 0xBEBE0C04, 0x01D4E7E5, 0xE9CAD9FD, 0x58F1EFF2, -0xAC46D1E6, 0x21DED4E2, 0x2C240706, 0xE0330304, 0x4931F80B, 0xF44C2109, 0xB74A1DDB, 0x2AC320DE, -0xBC2D02EC, 0x07EEE4FB, 0x2DCB20E9, 0xC910FBF4, 0xAF52F217, 0xD720D72B, 0xDBCC02F8, 0x1342FDF3, -0x26B315E7, 0x3D450325, 0xC7C0151E, 0xE9471219, 0x42E4111F, 0x4AA3E60B, 0x5537DF36, 0xB4E92E0F, -0xDCFEDC10, 0x18F1FCDA, 0xBFFA10E7, 0xD706E721, 0x2BD20022, 0x16500305, 0x4CC2EF29, 0xD71F2417, -0x20120009, 0xE7EC08EA, 0xE520F1EC, 0x42C8F3F8, 0xF23A19F0, 0x34111BEE, 0xCBF00DE8, 0x02F50DE8, -0xC3F0DA1C, 0x67CC1518, 0x09463FF4, 0xFCF7E11D, 0x01F6DC20, 0x2F1D27E1, 0x2816F9F4, 0xAA1800EE, -0x2E592DF0, 0xF4DC07CE, 0xCF49E504, 0xD33BF6E0, 0x17040514, 0xC445EE25, 0x4C33EB1D, 0xBB39250C, -0x4BAFE310, 0x58F8222A, 0xDD34CF1F, 0x4CCBFBF4, 0x32FDDC0D, 0xCF230ADC, 0x2D13F7FC, 0x49D6FA15, -0x09E2E002, 0x4425E20A, 0x170D1C02, 0x47DDF0E4, 0x2A441F05, 0xC0B502E4, 0x40B71823, 0xCFEE19DF, -0xD34A0917, 0xE7370521, 0x0000F1F1, 0x1CFDBD25, 0x1B080D30, 0xC61F61F7, 0x05122C3A, 0xDEF606CF, -0xF805D023, 0xD91D50F6, 0x1E0D0AE6, 0xE111F7E9, 0x1B1F42F7, 0xE9221106, 0xF7101EC8, 0x061C2FBD, -0xE8E711F2, 0xFB0E2335, 0x0DFDE6D5, 0x10E7E742, 0xF1FFE62A, 0x04F424CC, 0xF82B1F54, 0x10F8E821, -0xF40B1C33, 0xE2F3BA1B, 0xFBFBD32C, 0xF6E531BD, 0x12F7171E, 0x13073BDF, 0xDDEFFAC8, 0xDC1DFB0B, -0x0D00E4D9, 0x120AC7E2, 0xFEE1D546, 0xD9EFFEEA, 0x1EF0F737, 0x021225E9, 0xD4DE54FA, 0xF3FC1B2D, -0xF80DD1CC, 0x1EE1470A, 0x01E6D7F2, 0xE1E6F70D, 0xF9F0DEE9, 0xFB14D2C5, 0xE603F2D5, 0xD82750FF, -0x011AD941, 0xE2040A23, 0xE425BD4C, 0xFC28DC01, 0x22D94BFF, 0x0AE6E242, 0x16EDC2C5, 0xD90B011C, -0x050AD232, 0xDB114E18, 0xF2EB3512, 0x1AE642F3, 0xCFF1A7E7, 0xF220C9F8, 0x171FC148, 0x0735225D, -0xF2FF1926, 0x14D914FF, 0x0DFC36DC, 0x191BF00E, 0xE50CF3CB, 0x07F5221C, 0x2305FAD4, 0x1FD9094F, -0x25FFB4D6, 0x170FC1CA, 0x0FF3C91A, 0x02E82BF0, 0xDFEA07ED, 0xECE9143F, 0xE2E44645, 0xF2F6E71E, -0x26FAFE21, 0xFD17DB3F, 0xF0F6181E, 0xF818D0F0, 0xDD24B5B5, 0x00E8D8BF, 0xFE08DA20, 0x1104C6DC, -0x22FCB5D4, 0xE5FFF3D7, 0xE4CEF5A6, 0xF1EBE6EC, 0xEC06EBD3, 0xF5E91DC1, 0xE70540D4, 0xFC1A2D0E, -0x08E7E10F, 0xFAFE22D9, 0x06F82130, 0x09E80000, 0xF4F51F10, 0x49EE1CE2, 0xEEFADF17, 0x44ECE9DE, -0x0ECEE415, 0x354C1AF6, 0xCC020DDC, 0x50100C25, 0x1F362818, 0xCCB6090D, 0xE5C30C21, 0xFDDA0DEC, -0x350DDA01, 0x131A0C1A, 0x1AAB15F2, 0x2B590DD2, 0xC4A80331, 0xC517EC30, 0xCED3EEEF, 0xCC44F505, -0xF40DF5E3, 0xE2341BE5, 0x20C50AF3, 0xF9D308ED, 0xE345DF06, 0x3DF10CE4, 0x203D15E6, 0x1F4BF8EB, -0x1D37F8DD, 0xFEDC0BF1, 0xC14726FC, 0x0EDD1820, 0xCC221A05, 0xC1CB0D06, 0xC1CAE90C, 0x45EC180F, -0x9A3AE3EB, 0x15D23EED, 0xABCDEE06, 0x5EB52DF4, 0x19D33523, 0x0C41F1FB, 0xE8F8E4E8, 0xCD24F01F, -0x1239F604, 0xE6EA1611, 0xF23E0E11, 0x14F01A16, 0x450F14E8, 0x44BD1DE8, 0x3DE3E41C, 0x13E316F5, -0xEABEECF6, 0xEE00121B, 0x3AEEEB28, 0xE33AED15, 0x229AF5ED, 0xBF26FAC1, 0xE7351A02, 0xA6D80FF3, -0x5303CEFF, 0xCF082ADB, 0xB7BFF6E1, 0x3521E0E6, 0x07120DFA, 0x25E9E0EA, 0xB423FDEE, 0x0E012305, -0x1DF21B28, 0xCE1AF6E6, 0x2AF50AF2, 0xF80602E4, 0x0AB71FDF, 0x1F2A1E21, 0x0316F8FE, 0x0F4F2512, -0xEBCE1A27, 0xC0B3EC0A, 0x23E818DA, 0xEB0AFBEF, 0x164F13E3, 0xCDE61326, 0xC4DF0BF3, 0xBE3C14FA, -0x51E8E714, 0x10F2D710, 0xD3DB191B, 0xEA1F06FD, 0x344311F7, 0x21D60C1A, 0x301207FE, 0x2FF3F9EA, -0xEED1F9E4, 0xD335EAF9, 0xFA0505F3, 0x4B62DDDD, 0xD130DC3A, 0xD1D60708, 0x21D508FD, 0x4112FAFE, -0xEE431816, 0xAE0BEAE4, 0x03E0D51D, 0xD0AEDC07, 0x092BF72A, 0x07C92003, 0x20BDDEF1, 0xDC45F9E5, -0xCC1905E4, 0x0AE50CF2, 0x53D41E0D, 0xC928D505, 0x48B90F00, 0xF9CCDF1F, 0x3D4D21F4, 0xCB0B15DB, -0xF0050D1D, 0xE1F2E8DE, 0x36E5091A, 0x3EF20E0C, 0xD8E6161A, 0x241D00F3, 0xC1E7FD0C, 0xCFB8EA0F, -0xE33CF6DF, 0xF1AA0CEB, 0x45F11A2E, 0x3BFDE3E7, 0x28971425, 0x2DDC00BF, 0xE9DFFC03, 0x05B6EE07, -0xF1DE23DD, 0xB6E01807, 0x1F31DDF7, 0xEB390A0A, 0xD44B13F0, 0x11E2FC22, 0x5021E80A, 0x072E28FA, -0xEEBBDF07, 0xEC30E9E3, 0xD2F2EDF8, 0x3AE8061B, 0x4CB6EF10, 0xCBD2DC23, 0x302F0D07, 0xB73308FA, -0xAFE821F6, 0xD63FD6F0, 0x4CF20216, 0xBFEC23E6, 0x17DB19ED, 0xC9E8EF03, 0x3A34F10F, 0x404711F3, -0x1814181E, 0xEF17F1EB, 0x551F17EE, 0xD7D62E09, 0xF519FFFD, 0xFC16E4F1, 0x28E62412, 0xDD2600F2, -0xFD220501, 0x5DE52407, 0xB9B6CC0E, 0x180220DE, 0x27351026, 0xFA13010D, 0x050222EC, 0x2BE0DDDA, -0xCEB2FC08, 0x0CD00A27, 0xC3FBE509, 0xF6F51422, 0xEEAC1EE3, 0x10CFEAD5, 0x1FDBE9F7, 0x47C20AFE, -0x3AC8E2E9, 0xC80DEEEF, 0xECD9F1E5, 0x0FCEEC00, 0x1F2CE70B, 0xE5BCF8FC, 0x37B10DE4, 0x4200F1DA, -0xFB081A27, 0x385C231F, 0xC7210FCB, 0xFEF610F9, 0x26E30000, 0xEBF8132F, 0x051ADEBF, 0xEDE13CBA, -0x1819C0BF, 0xFE0F2AE7, 0xFC1D24F5, 0xDBE90311, 0x02F02918, 0x190FF037, 0x1CE10B46, 0x0AD0CF58, -0x170410DD, 0xF72231FA, 0x1D15BBED, 0x16053EDD, 0x0A1D1D45, 0xF412E316, 0x191510EE, 0xE3DE0BF9, -0x10113838, 0x02D92AB2, 0xFF07D7E0, 0x21ECF83C, 0xEDEBC4C2, 0xE8EDC13B, 0xF9042025, 0xDB35B4A4, -0x1AE3BF45, 0xFEEB2514, 0xEDFAC522, 0x0B08E3E0, 0x13F2151A, 0xF3D7E551, 0x1D110BE8, 0x25170312, -0x19C9F1A2, 0xEA0C1234, 0xE3FBF52D, 0xF3DC1BFD, 0x11F518CC, 0xFDF92521, 0xF61E31F6, 0xE0EA47EF, -0x09E6E142, 0x09F8E031, 0xDDF9B52F, 0xDAE34EBA, 0x160111D8, 0x1524C34C, 0xF01C170C, 0xDDE14BB9, -0xE7EEC0EB, 0x34005CD8, 0x17E1C2F7, 0x0F1B1943, 0xFD11DCEA, 0xD5EF5417, 0x08D73052, 0x1CDAF4B2, -0x162AED52, 0xFBE9D3EF, 0xF31C1CBC, 0xF225CA03, 0xEB231405, 0x13FFEC2A, 0xDAF4B135, 0xDC21FDB8, -0xDBF90420, 0x0F23184B, 0xE40945E1, 0xFE03DBD4, 0xDF1B48BE, 0x0CE01C49, 0x1200C728, 0xEFF016C7, -0xFC12D43A, 0x0AE9CDC1, 0x15101318, 0xDFE949C1, 0x2314B6C4, 0xFADF2349, 0xFCE4D5F4, 0x1EFA462E, -0x03DEDBFA, 0x19230F05, 0x210D061B, 0xFF2327FB, 0xDA21B207, 0x1302ECD6, 0xEF14E93D, 0xE4010D27, -0xEEE7E942, 0x1B1DF30B, 0x1A180D3F, 0xFF17DAC1, 0x0000F2FA, 0xB1351ADD, 0x4FE626F3, 0x2A12D80E, -0x1434FEEA, 0x36F2EC0D, 0x42C6F2E7, 0xB8C1E512, 0xE23821E9, 0x0E3B0AF0, 0xFC3E1BEE, 0xB631DB15, -0x0623DDF8, 0xD81B2306, 0x28B5FFF3, 0xEF270023, 0x1718E9FF, 0x33EB110F, 0x30F0F5ED, 0x1426F8E7, -0xC727ECFD, 0xB34010FF, 0x3CFFDBE9, 0x44141326, 0x5EA2E4EC, 0x3325CBC9, 0xD8130BFC, 0x0C1E0016, -0xF92EE4F7, 0x1109DEFA, 0x2632E9E0, 0x520EFEF6, 0x342ED619, 0x3229F4F9, 0x0D0DF700, 0x1D111BE5, -0x15BC0C18, 0xA728ED1B, 0x54283000, 0x47C32B00, 0xCAEE1FEB, 0x11EEF2E9, 0xC00C1717, 0xB215181C, -0x030CDA13, 0x480325E4, 0xEDCAE126, 0xD8D915F2, 0x23DAFF01, 0x16240503, 0x374AED04, 0x2904F1DE, -0x3D3DFF25, 0xB3CF1516, 0xDE0A25F8, 0x3306F9E2, 0xCDB9F622, 0xBCD0F5E0, 0xEC291DF8, 0xA8DE14FE, -0x07FC2F06, 0xCB3CE0DC, 0xFBC4F213, 0x2ED0DE15, 0x35DEFB08, 0x38C8F305, 0xCF36F010, 0x3ACE0A0E, -0xEC3A1209, 0x2152EDEF, 0x40440729, 0xCC04E91C, 0x0C56F424, 0xB04A1C2E, 0x28CAD721, 0xCDD8FF0F, -0xCC1CF400, 0xE6BDF3F3, 0x0F020E1C, 0xFBFD19D9, 0x3DC12326, 0x00D8EA17, 0xCB2ED900, 0x5008F3FA, -0xEF2B28DF, 0xA726E9FE, 0xEAF5CFFD, 0x3FE4EEE3, 0x3F27180B, 0x3C47EA01, 0xC8B5EBE0, 0xBEC1F023, -0xD7231A16, 0xE15501FA, 0x40AAF82E, 0x4511E72D, 0xF8DAE317, 0x20030000, 0x0BF7E232, 0x0BF1CDE6, -0xCFF25835, 0xFAE12DF7, 0xCFEAA613, 0x22FFF928, 0xE8E93FC1, 0xE327BAFE, 0x1E030A24, 0xDFDFFAF8, -0x06F2D3E6, 0x00FED8D6, 0xE7DFF2F8, 0x10FB39DD, 0xDBD74CB0, 0x072BDEAE, 0x1EE90A11, 0x26DB4DFD, -0x16E8EEC0, 0x17FEC126, 0xEB03C4DB, 0xFCF924D0, 0xDBD8FC00, 0xE510F3E9, 0xEBF6C4E2, 0xFF2127F8, -0x0DE335F6, 0xE1E7B840, 0x1724C203, 0x0D23E5FB, 0xFD1ADB0F, 0x2C0C5434, 0x22EEFBC6, 0xDB130316, -0x1EE60A0F, 0x27E94F3F, 0xF7E21F46, 0xF1D837FF, 0xECFB3B22, 0x330FA638, 0x0CE21CF7, 0x22FFB728, -0x281AB042, 0xF714CE13, 0x11E0C707, 0x11D9E9FE, 0xD9EBFF3E, 0xF8043023, 0x1C15BCC3, 0xCAC95DA0, -0x13ECEB15, 0xDFEDB73B, 0x201CF8BD, 0xF033185B, 0x160B12CD, 0x01092631, 0x0E06192D, 0x0E001BD8, -0xEC0FEC37, 0xE4E143B9, 0xDD2405B4, 0x1EDAF501, 0xEFFF16D6, 0xD8F70130, 0xF1EF3738, 0xFBEB2E3D, -0x1F0147D6, 0xFAF52EE4, 0x00D92800, 0xE31B440D, 0x02112617, 0xF1DCE6B4, 0x17E3C144, 0xE117B9C1, -0x10F1E719, 0x0C15E3EE, 0xE315F53C, 0xE5260D4E, 0x02F8DB31, 0xEA14EF3C, 0x4B178DC1, 0xDC070320, -0x0F1CC8F4, 0xEAFB122D, 0xE71042C8, 0xEBE8EC40, 0x0EEDE6C5, 0xEDEF1618, 0xFFDE2AFA, 0x260B4DCE, -0xF3D9E600, 0xF816DFC2, 0xEA26EE4E, 0x14F23CCA, 0xD51AAD43, 0x0000133C, 0xFF5116EB, 0xCEF7D9D7, -0x3EFCF7E2, 0xE13E16DC, 0x39D5F7EA, 0x583312FD, 0x3FEB2FF6, 0x35B3E9EE, 0xDD01F424, 0x26230528, -0x5EB4FFFB, 0xB91E3623, 0x0AE11E09, 0xF6201F09, 0x4CC6E208, 0x1CBA2413, 0xC4370D1E, 0xD1001310, -0x35150627, 0x122AF4ED, 0x0BF71502, 0xC618E3E1, 0xF202ED10, 0xF2C31A25, 0xB3F71BEB, 0x2312DB1F, -0xC20804EA, 0x11FAEBDF, 0xA8DE18DE, 0x28113006, 0xE9CC0016, 0x4021120C, 0xEFC41908, 0xEB51E9EB, -0x331113D7, 0x5ACBF5E8, 0x10C431F4, 0x0927E914, 0xB403E0FE, 0xFBE925DA, 0x1B24DD10, 0xB43B0CFB, -0xE7C52413, 0xB94A0F13, 0x1DD7E1DE, 0xE5D10A01, 0xAE560C07, 0x290E292E, 0xF3F3001B, 0x5A131B1B, -0xB4E0CE15, 0xBAE6DDF7, 0xC801E20D, 0xEEC61028, 0x16F1EB11, 0x2FC5EEE6, 0x4D2FF814, 0x2DB526FA, -0x15B105DD, 0x2932EDD9, 0x0FD1FEF6, 0x2DD719F9, 0x29F30601, 0x3AFFFFE5, 0x44BFEFDA, 0xA437E5E8, -0x0E38350F, 0xDF07E510, 0x06AA0821, 0x0052222E, 0xEFEB27D5, 0x1ED11814, 0x0B0E0908, 0x2DA11D1A, -0xEB3405C9, 0x161C140C, 0xC2FBEF0D, 0x02E8E923, 0xD5BADAF1, 0x24C303E3, 0x374F04EA, 0xE8F10FD8, -0x21B01118, 0xB536F8D9, 0x3BF1DDF2, 0xFD0012E6, 0x2F4FDB28, 0x0D2CF826, 0xBEBC1C04, 0xC64C1A1B, -0xC62911DB, 0xF3AAEEFF, 0x40D5E52E, 0xA21C18FC, 0x18ED36F3, 0x00000F15, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -hard_output0 = -0x7FE75E62, 0xB98D686A, 0x16FBEDEE, 0xB22861F2, 0x0A1180B7, 0x666C4407, 0x1D4C462A, 0xB81A3416, -0xC6948E41, 0x3CCAE97E, 0x55352D5A, 0x85474DAC, 0xB8DBF013, 0xB9AF7B16, 0xEABEE865, 0x1EB02EF7, -0xBDE86A3E, 0x24EDAAC9, 0x88A3D4B9, 0x8CA15C44, 0x42487190, 0xF4BF8BFF, 0x05EA0214, 0x4708DC42, -0x222993B3, 0x24AAA18B, 0x4D49B2EA, 0xBBA8E2B3, 0x40426630, 0x5676818F, 0x1B79CC4B, 0x1595A8CD, -0x9088385F, 0x351D2A23, 0x0EDC4446, 0x8F17D03E, 0xEA8B3464, 0x8799E718, 0x79E11F5A, 0xE771403F, -0x38C65263, 0xA969930A, 0x59942FBB, 0x74138F31, 0x80518035, 0xB42D7BE0, 0x0C4A7E00, 0x4ACA8CB5, -0x76C89CCB, 0xB56F2806, 0x1C8CF4E5, 0xA192BBF1, 0x1139DA94, 0x46B1C7C9, 0x8B630748, 0xA882704B, -0x69DA8BE2, 0xF2508EA5, 0x05E4AEAF, 0x5AA0A9C8, 0x6177DDCE, 0x8D06A0E1, 0xECD023CA, 0x34FC0800, -0x5AE69AAD, 0xFE8E2F72, 0x5ED3DC49, 0x8B46EB93, 0xC0C3D55F, 0xAC8C8B89, 0x54A20A93, 0x81F6659B, -0x412B7086, 0x09D572AB, 0x85891AB0, 0x96DC6C57, 0xD7117C38, 0xFBA06F16, 0x9EAAFCE5, 0x44AD2185, -0x618D398E, 0xD9AC89E7, 0x031F1D0B, 0xE7D05975, 0x9E500DF3, 0x06BFEF20, 0x42888C91, 0xD6AF7FA6, -0xC839E4C7, 0x0E7B7724, 0x48693BD9, 0xD17B6519, 0x48004F1A, 0xF5A147D5, 0x521C8AD6, 0x26E19AE7, -0xAA17116F, 0x7196631D, 0x89643E51, 0x8CE6B02E, 0x128B9CF6, 0x2F45C206, 0x4EB6C731, 0xCFB17835, -0xCFE85026, 0xA4B9B9B0, 0xD2C152AC, 0xA4F89035, 0x79ED0C5F, 0xBC030479, 0x51D91130, 0x570C019C, -0x4E0306B7, 0x27978CCD, 0x5F8DA612, 0x33C121FE, 0x4407BB22, 0x6FF06E2F, 0x5D7F378B, 0x491B9A93, -0xA0BDE688, 0x0EA89618, 0xE91C3661, 0x27C69F6D, 0xC46463FD, 0x67649FE9, 0x8F6E077F, 0x4D456A5F, -0x396B7218, 0x0C26C824, 0xA4E8FD71, 0xDCA1C865, 0x6F1CC581, 0x97C974D3, 0x38D0F6FC, 0x04190419, -0xED8C7FC5, 0x794BA619, 0x0090798D, 0x3044F72D, 0xBB77EEEF, 0xF9BCFDE1, 0x2C1580F7, 0xC0292305, -0x86827E71, 0x356C7D12, 0xA84DBECC, 0xCA53E3D9, 0x236E73F0, 0x9FD2AFBA, 0x652E7A66, 0x744A1147, -0xBFE9AF5B, 0x59F2552F, 0xBD77D3C0, 0xCD726524, 0x1D56A0FB, 0x85207831, 0xB6F1861B, 0x369CF946, -0x71CA18BD, 0x5EE3F7CF, 0x2C3FC902, 0x4301214D, 0x53A64F16, 0x2956B34F, 0x3DF40618, 0x41A36C68, -0xF7BB2B5F, 0x0C5CD46D, 0x3E4354AC, 0xC29AFEF7, 0xC1A310AF, 0xFFEF128F, 0xBE1C8D14, 0x8B123664, -0x854B7E00, 0xAE175861, 0xE4067FE2, 0xA264F00A, 0x988634EF, 0xEC9E38E7, 0xFE2968A6, 0x2B30719D, -0xFE3DC88D, 0x09E222C8, 0x6B4F1B50, 0x436C7137, 0x161DFE10, 0xA68C403E, 0x12A2856F, 0xAAB8DFF0 - -k = -6144 - -e = -10376 - -iter_max = -8 - -iter_min = -4 - -expected_iter_count = -8 - -ext_scale = -15 - -num_maps = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_CRC_TYPE_24B, -RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN - -expected_status = -OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_low_snr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_low_snr.data deleted file mode 100644 index 8ff71aac42..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_low_snr.data +++ /dev/null @@ -1,643 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_DEC - -input0 = -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x16000000, 0x081112e9, 0xcd2d1fac, 0xf9fdf4db, 0x110edf1a, 0x0dd9e84f, 0xdbe9e611, 0x0fde0206, -0x43df19f9, 0x071ee4f7, 0x1f1322c5, 0xd4e5f6f3, 0xe3fafcde, 0xd002f52a, 0x4427f801, 0xbadce403, -0xce101dc9, 0x09fff729, 0xd5f91f2e, 0xf3f0fee8, 0x4f061cde, 0x4a2b2753, 0x1d24dffb, 0xd3040bdb, -0xcaf2fbe6, 0x1cd9f350, 0x00fff42a, 0x49d02759, 0x4005de2d, 0xd3fb1923, 0x36cbfc5c, 0x020a0de1, -0x39072621, 0x3b0defe5, 0xb4ebec13, 0xddee2416, 0x24f206e5, 0xd1e1fcb9, 0x0e150713, 0x21f6191f, -0x0d0bf9e3, 0xf0061bd2, 0xae2717ff, 0x0de9d740, 0x13031a2b, 0x4c0215d6, 0x4534dc5c, 0xa1f41c1c, -0x001b3842, 0xeaf83ecf, 0x2519b4be, 0x1d220afb, 0x05162312, 0xee00ea29, 0x25ef4d39, 0x0cc03398, -0x08f5e0ce, 0xb7e68f43, 0x14f7ec31, 0xe7f5f11e, 0xfd29d6ae, 0x0af133c9, 0x03fdd5db, 0x0bca1d5f, -0x00172840, 0x061add0e, 0x0516ddee, 0xe10cf735, 0x1709101f, 0xdf0908d0, 0x06fe2dd6, 0x18ed11c6, -0xd315ac14, 0x06f0d3c8, 0x1ed9474f, 0xef223806, 0x28f3ffe5, 0x0eeb1aee, 0x080de0cb, 0x29f452e4, -0xdbd702b0, 0x041b2cbd, 0x1df30b34, 0x1927f102, 0x2010b719, 0xf0fde8d5, 0xe9eaef3e, 0xf10b36ce, -0xdff4fa1b, 0xfd0cd5e4, 0x04f923d0, 0x110f3936, 0x06fe2e26, 0x00e42844, 0x11e839c0, 0x13ecea13, -0xf621e349, 0xff332600, 0xe604f1f5, 0x0533d425, 0xf240c9f5, 0x0b5933e8, 0xdf1bf931, 0x02c929f2, -0xeee6eb0f, 0x12a2160f, 0xfdde26ca, 0xf016c8f9, 0xdd03b5ee, 0xe2ee09da, 0xfdf4db17, 0xdb0603e4, -0xffda2821, 0xf6f9cefd, 0xd5ca5421, 0x12f03af2, 0x182f0fe9, 0x10423808, 0x0c19e41a, 0x27af02f0, -0xfc14d42a, 0x08c9d114, 0x274700f2, 0xe8c110e1, 0x0e0f19e9, 0xeb58c3e7, 0xe20fbbd1, 0xe52e0e1a, -0xf145e607, 0xe316bc1d, 0xe3e04511, 0xd93c0009, 0x27db01ed, 0x0a30cd03, 0x23434af8, 0xe13f09e6, -0xe4d00de9, 0x07202208, 0xdb3ffd07, 0x0955cfea, 0xeae8112c, 0x041324f1, 0x1011e815, 0xf6d01f17, -0xe5eb0cf9, 0x17be00ee, 0xa2dbeee6, 0xb2e73603, 0x08ebda0f, 0x250fe0ed, 0xe61a0218, 0xf1dbf2f3, -0x420b18fd, 0xa1e9e5e4, 0xd9e1caf0, 0xe7cffe08, 0xeba8f009, 0xc45213d0, 0x20a1ed29, 0x28fa0737, -0x1ad900dd, 0x1bc10dfe, 0xab360c18, 0x023bd3f1, 0xacfd2514, 0x4d382c25, 0xf25adbf1, 0x1eda1a32, -0xf11e0902, 0x23a5e70a, 0x1f32fcce, 0x0ef0f8f5, 0x2029e6e9, 0xdfda0701, 0x1860fafe, 0xd8e5f139, -0x5612010d, 0xf2572d15, 0xba23192f, 0x2ac1e2fb, 0xe91e02e8, 0x44d2100b, 0x08f9e307, 0x5edddfe0, -0x240fc906, 0xc1c3fbe7, 0x0f231614, 0xaa111806, 0x1e2d2eea, 0xc6ba0a06, 0xedc9121e, 0x1ffc150e, -0xd11b0a23, 0xe800f80d, 0x2f27f101, 0x06110638, 0xd01fdef8, 0x15ee0717, 0xba0e131a, 0xcde51f43, -0xd21df6bc, 0x051006c8, 0x2616ddc3, 0x3ef8fee0, 0xf3cde9a4, 0x3bd81b4f, 0x25001229, 0xf6eb023e, -0xd81ee3b9, 0x1cecff14, 0x29fef4d9, 0x9f2d0255, 0x121e38f5, 0x18eb16c2, 0x271a1041, 0xf7f700cf, -0x28f3e1e4, 0x49e90011, 0x4b0fde1a, 0xd9e723f1, 0x0de402bd, 0x261f1b0a, 0xbe0afe1e, 0x0823e606, -0x3d041f2c, 0xf1f21436, 0xec1ae7f1, 0x02ebebc3, 0x52f1da1a, 0xc9e5d60d, 0xa9dc0e04, 0xc504d22d, -0x09fd1325, 0x3706e02e, 0x26dc0f4b, 0x2012fe3b, 0xeef109e7, 0xb509161f, 0xf01dde45, 0x13d51853, -0xc823ebfb, 0x2d23f0fc, 0xcbf6fbcd, 0xd505f22d, 0xee0afd1e, 0xa6e615bd, 0xa020ce07, 0x411937c0, -0xbcd318ab, 0x2a1d1cf5, 0xc400ff28, 0xe32014f7, 0x2bf30b1b, 0x0e03fc25, 0xe1e41bf3, 0x2f1b0943, -0x06060721, 0xc601de26, 0xd3faee2e, 0xe51c05bc, 0x0411f4c8, 0xcfe7dcbf, 0x2d12083a, 0x0bedfb3a, -0x0efc1d2c, 0xca1f1909, 0x13f80e30, 0x3a21eab7, 0x3c2b1252, 0xf2e4140b, 0x2527e5b1, 0x2ffe03d6, -0x44e4f90b, 0xcf21e449, 0xd8e9f6c2, 0xeef8001f, 0xfb151513, 0x48f9de22, 0x2ad6e0ad, 0xe63602a3, -0xdae50e0d, 0xe3e5ff0c, 0xc721f449, 0xa0d5efac, 0xe70039d8, 0xc7f71031, 0x2b22eefa, 0xe5fb04d3, -0x0021f2f9, 0x2bce28a5, 0xdffefa00, 0x1af642e2, 0x1d190bf1, 0xecf515cd, 0x0af4cf34, 0xf406cbd1, -0x08ebd013, 0x14173b40, 0xe40e0bca, 0x29ff51d9, 0xd303abda, 0xe303f5d5, 0xf6facddf, 0xecef3cc8, -0x1324ecb4, 0xd213563c, 0xe00ff91a, 0xef121639, 0xf5d2cdaa, 0x1914f013, 0xe80f3fe8, 0xe31c0bbc, -0xe3d5bcad, 0xe610be38, 0xe72df155, 0x1cef44c7, 0x13ccc5a3, 0xe1e20909, 0xecf2c337, 0xf2fd35da, -0xe5cd435b, 0xdc1304c5, 0x050722d2, 0x121fea46, 0x36f8a1e1, 0x1223c6fb, 0x18040fd4, 0xef1517ee, -0xf8e32ff5, 0xf22cc953, 0xfe04d7dc, 0x10e7390e, 0x1ef4091b, 0xdbf2fde6, 0x1afa432e, 0x2211b5e8, -0x211eb8ba, 0xff1529c4, 0xdaea004e, 0x11e539ed, 0x13b4eaf2, 0xe10af7db, 0x11e9c81e, 0x1eeef6f0, -0x17b73fea, 0x09c61fde, 0xeefdebef, 0xd92fffdc, 0xd7e05007, 0xfe42d9f8, 0xd2feaae6, 0xf3001cd9, -0xee12c727, 0xe5d90cea, 0x2c21ac01, 0xe3de0b08, 0x265703fa, 0x1a410d30, 0x2f1f5719, 0xe742bff6, -0xfc2e23e5, 0x2746b105, 0x262efe1d, 0xe43ff4fb, 0xf01018e9, 0xd9014e18, 0xef043927, 0x23fb0524, -0x27094e23, 0x19ce41e1, 0xf70a200b, 0x1daff5e3, 0x274eb22a, 0xf612cd26, 0xf903df17, 0xe3f1ba25, -0xe45bbc18, 0x062a2132, 0x11bfea01, 0xf4fe34e7, 0x0637ddda, 0xede0c510, 0x02022509, 0xfbbf2c26, -0xeda8c619, 0xecb0edd0, 0xeb00d0d8, 0xf054edf7, 0x0356182c, 0x5fd3252e, 0xd74e3805, 0xc2100026, -0xe4161517, 0xf106f412, 0x26f219df, 0x440bfde5, 0x1b031d1d, 0xe6c4f325, 0xd349f213, 0x2b0605df, -0x4bdbfcdf, 0xe32e23fd, 0x49460a07, 0xcff022e3, 0xf9c2f617, 0xdfbc2116, 0xed2f071b, 0xd6a91406, -0xc33bfe2f, 0xc623eb12, 0xc2d0ee06, 0x243aeb07, 0x1fe8fb13, 0xffc409f0, 0x1ed6d814, 0xde4bf602, -0x31dcfb22, 0xf5da0afd, 0x0afd1e03, 0x1cc01fdc, 0xf82bf4e8, 0xcccce003, 0xfb0f0df4, 0xd2ff23e8, -0x0845fbd9, 0x16e821e2, 0xe5c5eef0, 0x14bbf4ec, 0x1cefeb1d, 0xffcd0de9, 0x5bbad90b, 0x0630331d, -0xf826dd09, 0xc62c2001, 0x00ed12fc, 0x16e8eb40, 0xf3e4120c, 0xc105e52d, 0xca181610, 0xb9e0f149, -0xfc011f28, 0xfc17233f, 0xc5f12318, 0xea1dedbb, 0x37e91240, 0x47d9f0b2, 0x19271e01, 0x09240ffb, -0x1edd1f4b, 0x02240ab3, 0xf3e6d90e, 0xfd03e425, 0xb12325b5, 0xb92cd9ac, 0xcee71e41, 0x47fa0bdf, -0x0fcb1fa3, 0xd406e7de, 0x31defcfa, 0x300af71e, 0xfa0608dd, 0x10e922c1, 0xb2f3e936, 0xf336265e, -0x0610e517, 0x16e72242, 0xab23134b, 0xbaddd34b, 0x1afee225, 0xfc100d38, 0x44e6dcbe, 0x02ede4c4, -0xbe19da41, 0x2ff1e6c9, 0xea14f8c3, 0xc21bed0d, 0xac1017e8, 0x35202df8, 0xd9f10dca, 0x03fc02dc, -0xf2e425bb, 0x29efe5e9, 0x3ce10046, 0x09153000, 0x0b061d2e, 0x1f1a0abe, 0xfb18d2c0, 0x0008d730, -0xf3071b30, 0x17dfeff9, 0xc5d09da8, 0x23d7fbaf, 0x07e921ee, 0x16e4ee45, 0x1624c304, 0x01f828d0, -0x20ddb8fb, 0x030325d5, 0x0424d5fc, 0x0216dac3, 0xe5040c23, 0xd71552ec, 0x28ef00e9, 0x16de13fb, -0x1520edb8, 0x0416db12, 0xdeee07c7, 0x07fc20d4, 0x08fadf2e, 0xf0f639ce, 0x30f0a7e8, 0xef0d39e6, -0x210d071c, 0xf2f235cb, 0x05192242, 0xd6095130, 0x2605ff2d, 0x19f8bf30, 0x1320eb48, 0xfbd72e51, -0x01d92701, 0xe127f601, 0xdc0a051f, 0xfdf1dc37, 0x0b0bce1e, 0x09ff1f29, 0x1507c3df, 0xf7e3e1bb, -0xdb204df8, 0x11e517bd, 0x3004a7dc, 0x0d1300cc, 0xf42134ea, 0xe9b9c1f8, 0x1fbef720, 0x07bcdfe5, -0xeccf3ce5, 0x17301109, 0xf2b4e6f7, 0x1258c723, 0xdaf84dd0, 0xd507ae1f, 0x011d2a22, 0xfd3f25f5, -0xfd4edb17, 0xf9cadf26, 0x144dc3f1, 0x09003124, 0xec503b27, 0xfed1d628, 0x0ffbc9f8, 0xf2e619de, -0xf832dff1, 0xf3d034f5, 0x1dea0b09, 0xe80e0fef, 0xf1dd38e6, 0xf8fce104, 0xde1f07db, 0x06ccdef7, -0x24554b0c, 0xcde0a6d2, 0xe2e0baf8, 0xeae6ef09, 0xe31b440f, 0xe5c6f3f2, 0xf447ccee, 0x1944f2e1, -0xe33fbb1b, 0xebad3eea, 0x0b1de32b, 0x0d24e50c, 0x18e711fc, 0x2830b110, 0x14413cf8, 0xe7e7f219, -0x1c49bc0e, 0x0734e0df, 0xe255f50c, 0x540045d2, 0xe3c0d3e3, 0xef0ff518, 0x34c017e6, 0x052af517, -0xff4e2402, 0xc4eadada, 0x00d3ed12, 0x4bc727fa, 0xaaf62211, 0x28e1d21e, 0x530a00f7, 0xfd40d5e1, -0x0dafdbe8, 0x2b0de5d6, 0xc722fce5, 0xca241007, 0xe1eb0efc, 0xfa63f8ee, 0x28dfdec5, 0x07420107, -0xccf6dfe7, 0xcb1df4e1, 0xd9def40b, 0x47ef0105, 0x1041e0e9, 0xe849e919, 0x27f10fdf, 0xef2c02e7, -0xe74fe805, 0x4cb7f2d9, 0xe7ee2521, 0xee430f17, 0x5b09161b, 0xdce2cd1f, 0x2343050a, 0xc22c05e5, -0x5ae7eafc, 0x9749cef1, 0x4dea4221, 0x0e2726ee, 0x24a8e6ff, 0xcc5afcd0, 0xbcd2f432, 0xf514e306, -0xbd0ee414, 0xc4dbe41b, 0x310a1302, 0x090cf8e2, 0xd5dce11d, 0x1c13fdfb, 0xeacbf515, 0xc5eeeef3, -0x3027eee9, 0x29420701, 0xc01700e6, 0xc4b7e910, 0xaaebec21, 0x129fd2ee, 0x2ec5eac7, 0x0eecf9ec, -0xe10b1aec, 0x57b3f7e3, 0x3939d1db, 0xcf42f012, 0x163ef719, 0xd5111217, 0xe92203e9, 0xf13eef05, -0xece5e6ea, 0x3301ecf4, 0xfff6f527, 0x39ded9e2, 0x110deffa, 0x262fe91a, 0xb7bd0207, 0x39d8dfe4, -0x0a2e1101, 0x2adf1ef9, 0xe52ffef9, 0xb70ff307, 0x1cdd22e7, 0x2b3bf4fb, 0xe4eb02ec, 0xd80bf4ed, -0xfebaff1d, 0xcd12271e, 0xfeee0aea, 0xc70726e9, 0x0f4fefdf, 0xd9b6e6da, 0xf5d300df, 0xccbc1dfa, -0x34270de4, 0xf0d3f400, 0xc649e7fb, 0x18deeede, 0x4d0f0600, 0x2bdf2549, 0x1f07fe21, 0xf0e6f60f, -0x0c1b1743, 0x0f0a1b1d, 0x46efe7e9, 0x0ae6e242, 0x0ff61f33, 0xae21e84a, 0x500ad6e2, 0xfcddd74b, -0x4a17ddc2, 0xe9d9dd4f, 0xc7241205, 0xb9e8110f, 0xda111ec7, 0x37e1fe46, 0x39f3f1e5, 0x000512d2, -0x0e05d92d, 0xfeec193c, 0xf519daf0, 0x1e291d52, 0x362bf652, 0xbce9f311, 0x30fae5d2, 0xe6fcf7db, -0x36ec0fc4, 0xddfa0f23, 0xf1f605e3, 0x1ed1e857, 0xb9def6b6, 0xc0091ee0, 0xcff1e8ca, 0x3fe5090d, -0xf3edea15, 0x23111b16, 0x0207fbd2, 0x1d2cdbac, 0xbdf6f6cd, 0x1a311ba8, 0x420af2cd, 0x1bde1ab7, -0xc512f217, 0x0fe3edbc, 0x1afe19d6, 0x200bf1e3, 0x100900c8, 0xfe1a29f2, 0x12c51663, 0xdfe606f2, -0xf7ea1f12, 0xf841df96, 0xe2f50a33, 0xe9f5efcd, 0x13fdeb25, 0x2524044d, 0x0d1a35be, 0xfaee23c7, -0xf0043824, 0xda200108, 0x04f225c9, 0xe101f7d6, 0xf30dcb36, 0x07fb22dd, 0xd1fba92c, 0xdf03f824, -0xd0efa8e9, 0xf5dd1d05, 0xfe332a5c, 0xf4221bb6, 0xe5ddbdb5, 0x1401c3d9, 0xfc12d33a, 0x1b14bd3b, -0xddf2fb36, 0xf0e13709, 0x12d9c601, 0x0cf7cce1, 0x1b06bc22, 0x22d6b7ae, 0xf7291eae, 0x15f81321, -0x1a04f2db, 0xe425f404, 0x05f32435, 0x060f2218, 0x0bd93250, 0x26f9fd20, 0xfe2fd5aa, 0x121deb45, -0xf6e731bf, 0xf90c2e1d, 0xe9dbc2b3, 0xfb0edd36, 0x1500b93e, 0x281db01e, 0x061ddff5, 0x2712fe0a, -0x0f461ae9, 0xe32f0b1f, 0xed691507, 0xf61d32bf, 0x0d24e5f5, 0xfae422fd, 0x03d126f4, 0xee0ac6f9, -0xd8a4b11e, 0xebf51335, 0x15f7c31e, 0x07fd22e1, 0xe40a0cdb, 0xdd04b5e3, 0xd1f25825, 0xec033de6, -0x12fee925, 0x292051da, 0xdff54af7, 0x34d0a4e3, 0xf53de209, 0xedeceb14, 0x0f4cca13, 0xe3340b25, -0xf023e90c, 0xf6be32fa, 0x2254fae7, 0x07c1212b, 0x31015816, 0x1bd24227, 0x1438edf9, 0x151f3df0, -0x02d1270a, 0x0fffc9f9, 0x0d4235da, 0xf638e2e6, 0x241ffc0f, 0x1d380b08, 0x1a93bdf0, 0x1b4f44bb, -0xfe57da26, 0x24c8fbd1, 0x1112c711, 0x1f3ef6eb, 0x00173116, 0x100311f8, 0xf2dfe7db, 0x292ce5f8, -0x46e1fffb, 0x45c71ef7, 0x2bc31c11, 0x4abcfceb, 0x00e0dd1c, 0x202628f9, 0x42f2f801, 0x0bb41b1a, -0x0d16e225, 0xd2f11a12, 0xf6ec06e6, 0x13ef1deb, 0x48c51617, 0x09ff1f13, 0x314b1f28, 0x1ecf0823, -0xf9adf6f7, 0xd4da222a, 0xef0f0501, 0xe146e8e8, 0xfe4308e1, 0x4803dbe5, 0x21bc2025, 0x0fc5f9e4, -0xd341e813, 0xa9d9fae6, 0xaaf5d1ff, 0xb546d2e3, 0x12e2221f, 0xbee715f6, 0xd325e60f, 0x1adc05fd, -0xf533f3fb, 0xf3d0e3f6, 0xcb11e5f7, 0x33fb0ce9, 0xa3be0b23, 0x29b8351a, 0x312f0120, 0xebbb0afa, -0xc31a12e3, 0x0c47150d, 0x21c21be2, 0xe1570715, 0x19e0082e, 0xc8f2f800, 0x2a0b11cd, 0xcd3001a8, -0x2f1e0bf7, 0x1909071f, 0x1c15f2ed, 0x4612f53b, 0x40021d27, 0x3108e821, 0x0c1108c7, 0xcd0d1ce4, -0xe51c0b44, 0xb4ebf412, 0xf1dddc04, 0xd6f7e6e1, 0xc32efe56, 0xfd10ea18, 0xdb2eda55, 0x48ff0329, -0xe2fce12c, 0xd5f9f5df, 0x2cda04fe, 0xdf0dfdcb, 0xc5e70741, 0xdf16eec2, 0x3ce1faf7, 0xcc0eec35, -0xfa28f450, 0xf1e72210, 0x451de7f5, 0x4dfde324, 0xfdf3db35, 0x31eadc3d, 0x391c09bc, 0xcc09ee1f, -0xdaf90dd1, 0xf6e1ff09, 0x22f8e1d0, 0xe70efae5, 0x13faf02e, 0x271e15ba, 0x03df0007, 0x11ff2627, -0xb8e9173f, 0x38ecdfec, 0xc4ed0f3b, 0xe4d91402, 0xd5010c29, 0x050400d3, 0x1e01ba26, 0xe3390b60, -0xe11d0a0c, 0x2adaaefe, 0x1222e906, 0x0ff6e7ce, 0xebeb3cc4, 0xfd082b31, 0xf52a1e52, 0xf1dde7b4, -0x0ee8e6c1, 0x0c2ae352, 0x0df3cbca, 0x131bebf2, 0x23214bf9, 0xd6f5ad1c, 0x21fff8d6, 0xe3e00a48, -0xf00119d8, 0x03d02ca7, 0xf1fcc92c, 0x0c0b1b1c, 0xf4daccb1, 0x131ac50f, 0xd6295250, 0xe4f6f3e2, -0xe9f91221, 0xe6e0be49, 0xdcebb5c3, 0x1f1bf8f3, 0x27f6b2e3, 0x1a1c0e45, 0x0504d224, 0x0918e20f, -0xe4dabb4f, 0x0a001d27, 0xec193b42, 0x08e9d1c2, 0x0c09e51e, 0xff28d700, 0x0d0ae5cf, 0x0704202c, -0xfce0d408, 0x0c0b341e, 0x27ee00ea, 0x1206c7d1, 0x1000e9d8, 0xf8000830, 0xe334f5e1, 0x0bc81ef4, -0xeed33b10, 0x280050fb, 0x02d1d928, 0x0e3be608, 0xdc130412, 0xf6ffceea, 0x03142a28, 0xfeea2aec, -0xfdc4d613, 0xf1151aed, 0x1425c4ee, 0xfdd0db04, 0x10df1807, 0x0af7cd07, 0x20c108e2, 0xf61bce17, -0xe6e6f10e, 0x03d0da0e, 0x20edf808, 0x37dc60eb, 0x1bfd0e04, 0x18b73f24, 0xe8f91021, 0x0ed31ade, -0x1fe50afc, 0x07e020f3, 0x0c2ccb07, 0xedd91405, 0xf700e202, 0xdce903d9, 0xf4b31c12, 0xfcbbd425, -0x08d431e2, 0x1f00b905, 0xd04158d9, 0xd2acabe8, 0x18e911d3, 0xedca3c12, 0xe467bb0f, 0xd9c350c2, -0x00c12816, 0x082220e9, 0xfe692bfa, 0xfc322cc0, 0x0d1ae5f5, 0x1de446f2, 0xe136b80d, 0xf2001af2, -0x1be3bdd8, 0x013e29f4, 0x272301ea, 0x0a021f04, 0x22d1b5da, 0xedafecfa, 0xf958d0d8, 0xb1f48ad1, -0xf816d01b, 0xe7caf2ee, 0xf7e11ef1, 0x0ae31df7, 0x0feb180b, 0xece61513, 0x3f10670e, 0x0baa1c17, -0xf233e6d2, 0xce46a7f5, 0xe6c642e2, 0x033225ee, 0x0b3de20a, 0x00f7d814, 0xf8cccf20, 0xe2ee0bf4, -0xd93601ea, 0xefdf3a0e, 0x2202fb07, 0xe5c70c25, 0x01da29ee, 0xf8182101, 0xdef7b610, 0xeb0aed1e, -0x0017d8e2, 0x2fa4a9ef, 0x0c25cd35, 0x05f62304, 0x08e7e01f, 0xe11409f2, 0xf5e81ded, 0xeefeeb10, -0xfe122b25, 0xe9153f16, 0xe34f44ed, 0x1cca0c27, 0xf3dbcb0e, 0x08c231fc, 0xe2cfea00, 0xf031f5f7, -0xc7e91809, 0xdfe5ef10, 0x1234fa0e, 0xee28ea0c, 0xc6061700, 0xccb8eede, 0xed190b20, 0x21441510, -0xb1e007e5, 0xe1c7d9f9, 0xcacbf611, 0x3acb0f0c, 0xd7e4110d, 0x41c2010c, 0xef0418ea, 0xffc917dc, -0xc7e4270f, 0x40e3eff5, 0xaf4c19f6, 0x413f28db, 0x2e12e616, 0xd1e6fbeb, 0x1008f80f, 0x070719e0, -0xbdebdfde, 0x16f31b12, 0x2e1c12e6, 0x41eafaf4, 0xccc7e6ef, 0x26ff0bef, 0xc201fed9, 0xe733ead8, -0x373cf10a, 0xfdd5f213, 0xe1dcdcfc, 0xa9400904, 0xe432d018, 0x15340c0a, 0xcd3aedf4, 0x24210cef, -0x02d90407, 0x43c827ff, 0x27341c11, 0x1226fef4, 0x192cebfe, 0x280cf204, 0x96ff00e4, 0xb5dd4204, -0x1a2adc52, 0x1bf00ec8, 0x1d07f320, 0x09ed0a15, 0xb5e3200a, 0x12f7de1f, 0xe915eaee, 0x3bf11219, -0x3df1ec19, 0xe3ecec13, 0x1ce6f543, 0x0d18f4ef, 0x21ea1a13, 0xc8f507ce, 0x22e511be, 0x0b1cfaf3, -0xcfe8e3f0, 0xc104f6dc, 0x301817f0, 0xb825084d, 0x3fe920c2, 0xeff3171a, 0xc7e01809, 0x2efc10d3, -0xb602f92b, 0xdecb215c, 0x0d13053c, 0x3908e5d1, 0xb5efefc7, 0x44e0dcb9, 0xe8161def, 0x1de8f040, -0x2f140b3c, 0xc5ec07ec, 0xd403ed25, 0x0aeefce9, 0xd412e23b, 0xf4f804e0, 0xf218e5c1, 0xca17e612, -0xc5050ed3, 0x1afc142b, 0x2e2c0dab, 0x39ecfb13, 0x1de6100e, 0xf81ef4ba, 0xf600211d, 0x12c03968, -0xe8f90f2e, 0xfbe42c44, 0x260bfee3, 0x051b22be, 0xe50842df, 0xfef6d632, 0x130514d3, 0xe6def24a, -0x09213107, 0xdfddfa05, 0x0418d310, 0xf00739d1, 0x0afa1ed3, 0x1bfff4d7, 0xfddc2b4c, 0xf1e0c9b8, -0x04e1d4f6, 0xd423acb5, 0x320c5b1b, 0x160eefcb, 0xe11347ec, 0xedfc16d4, 0x10f8c7e0, 0x220e4ae6, -0xf0f5c834, 0x272002f8, 0xdf0df9cb, 0xe02ff8a9, 0xd7df5106, 0x152512b2, 0x02fe2bd6, 0x1707112f, -0x2519b2bf, 0x051e2eba, 0x0bdbcefd, 0xf1eae8c2, 0x08dee007, 0x02142b3c, 0x001628ef, 0xe21fb9f6, -0xe0e9f7c1, 0x31ed593c, 0xe4ff442a, 0x16e1c247, 0xe6e3be0b, 0xdbfc0324, 0x001110c7, 0xda2affe8, -0x05b6d302, 0xf94a2023, 0xe5350dde, 0x1ee0f60d, 0x282a00f8, 0x28ba50ff, 0x08e5211f, 0xf1f8190d, -0xd5abad20, 0x16fbc22c, 0xf8cc1fdd, 0xda1efe0d, 0xeb0ec3f5, 0x014c26e7, 0xf0e118dc, 0x1d11bb08, -0xe4bc44e8, 0xd4d0541d, 0xe43a44f8, 0x28445112, 0xdae0fde5, 0x13e3c6f8, 0xe11b09f4, 0x2ad2520d, -0xef59eafb, 0x1dcaf530, 0xde4d06f2, 0xf617e325, 0xf3c5e512, 0xf4b1cc13, 0xf91d2128, 0xd8affff4, -0xe54d43d8, 0x1a060fdc, 0xe7c3be22, 0x2441b415, 0xf3171a19, 0x180ff011, 0x30e4a919, 0xfaed2ff4, -0xd54253ec, 0xe7df0e1a, 0x232afa08, 0xe9f7effe, 0x1cb5f31f, 0xf4083422, 0xdfd4b620, 0x2223fc00, -0xddcf06fb, 0x6cc004f8, 0x041c4418, 0x4b04230d, 0xc6f92225, 0xf61aee22, 0xba001d0d, 0x06c3e2d9, -0xd5c2dd15, 0x240ffde9, 0x405a0319, 0xe3a01731, 0xde3c0b37, 0x2206faeb, 0x27fcfb22, 0x33af00dc, -0x3ba60a29, 0x2cc913cd, 0x4ef505f1, 0xccbbda1c, 0x203df4e2, 0xe407f815, 0x1a15f321, 0x18d30eed, -0x2d1f10fa, 0x3c47fb09, 0x3cf9eb1e, 0x4cf114e0, 0x0caadde6, 0x594ee5d2, 0x1ed6d026, 0x2229f602, -0x18f4faff, 0xddf5f0e4, 0xaf07fae3, 0xdc0fd8df, 0x14c3fce7, 0xf2d2edea, 0xb106e6fb, 0xdb0ada22, -0xc6bdfce1, 0xcdf111e4, 0x1dcf0ae7, 0x27c4f6f7, 0xe5e5ffeb, 0x20380d0c, 0x4b3e070f, 0x322300e9, -0xede80a0f, 0x65f7ebe0, 0xcbddc306, 0x572b0d53, 0xb0082f2f, 0x5d0729e0, 0xbf0f3537, 0x18c2199a, -0x57e3110c, 0x4512d23b, 0x18f01e17, 0xf9f3f11a, 0xc6f1df37, 0xeae1ef47, 0x0df111c9, 0x19fce6d4, -0xd3f90fd2, 0x08f70520, 0x15f4e0cc, 0xefff12d8, 0xaee6ea0f, 0xc1db2afd, 0x1cdaeab3, 0xbe0bf433, -0xe6e01b47, 0x5503f125, 0x30fbd422, 0x3723f7b4, 0xcb1510c3, 0x09fdf4d5, 0xeeee1e39, 0x0ae7ebc0, -0x02d81d00, 0xbc33db5a, 0xc501e429, 0x12e0edb8, 0x03f1eac8, 0xf0eb25c4, 0x09e4e7bd, 0xd71de0f6, -0xc8ee0017, 0xdf00f0d9, 0x4209f8e2, 0x3100e6d8, 0xe2190942, 0xd5070921, 0x0b0c02e3, 0xee00e4c7, -0xf5eaceef, 0x2011f7e9, 0xdf1106c7, 0xfede29fa, 0x1c1f0d0a, 0x1f0d08e6, 0x0d2ccc54, 0xf6e61df3, -0x121f1647, 0x1610c3c8, 0xded7b6af, 0x1ef8f61f, 0xf9172ef0, 0x391f60f7, 0xf3ebcced, 0x273050a9, -0x1305ebd3, 0x16221206, 0x12e5c6f4, 0x0006d822, 0xecfa152f, 0xf9f92f2e, 0x1fe2470b, 0x2425fc4e, -0x33285cb1, 0x070430d3, 0xe421bd48, 0xede1c5b9, 0xf4ea1c12, 0xe1c809a1, 0xfa05d223, 0xedf83a2f, -0xc4259d03, 0x1f180810, 0xdb10fee8, 0x11daeab2, 0xec2614fe, 0xb31e74ba, 0x14143b14, 0x07ff2fd7, -0xfb23d305, 0x25fffcda, 0xe7dbbefe, 0x13e43abc, 0x070c301c, 0xff0726d1, 0x16dc3eb3, 0x04ee2dc6, -0xdeff05d7, 0xf8dfd0fa, 0xde13fb15, 0x0b1acebe, 0xe2f1f6e6, 0xee1d3a0b, 0x3003572b, 0xf9d32fab, -0x0420ddb8, 0xcef05919, 0xd126a9b2, 0xdac9fda1, 0xe0ee083a, 0x30e259ba, 0xecf1ed19, 0xd0da58fe, -0x071f2e46, 0xe2da4602, 0xf3cecba5, 0xd8e20045, 0x18d6ef53, 0x11dbe9b3, 0x1819c00e, 0x09f930e0, -0xf2183640, 0x250bfd1e, 0xcae3a2bb, 0x17d13fa8, 0xefe6c8bf, 0x1ff8f620, 0xfaee22c7, 0x0afdce25, -0xd9010029, 0x1727c2ff, 0xf2221bf9, 0xd8e10147, 0x0726224d, 0xe0ea4811, 0x1a2e0ea9, 0x0d3635a3, -0xf0f1e7e8, 0x0c0234d9, 0x0ef8c920, 0xecf4151d, 0xe817c112, 0x0e0637dd, 0xddf305cb, 0x16e2ef0b, -0xf1c10000, 0xfd2ce717, 0x092ada04, 0xb929e202, 0x2902e1ff, 0xcecaff25, 0xd23c09f2, 0xee2107eb, -0xd9c0e908, 0xd3bc0018, 0xb3bc051d, 0x29ab261b, 0x0b0bff2c, 0xdf5ae41c, 0xe6ef07cf, 0x2ea10fea, -0x1db5fac8, 0x083a0cde, 0x4ff5e1ee, 0x4643281c, 0x08dee1e6, 0x1a0e1ffa, 0x2a30f11b, 0x0b4a02f8, -0xe1f5e321, 0xf5eaf71e, 0x21e3e312, 0xccfffaf6, 0x3932f5d8, 0xe3efeff5, 0x314df518, 0xbdc709db, -0x1336e5ef, 0xeb2bec0d, 0xc4a6ec02, 0xe3b2eccf, 0x33210b27, 0x1a2b0a08, 0xb536f304, 0x51f7def2, -0xa946d6e1, 0x0f1fd2e2, 0xd5cee6f8, 0xe60303f5, 0xdc25f225, 0xab360303, 0xd9aa2c0f, 0x30f9ffd2, -0x611ff8e0, 0xc6fa3909, 0x33241323, 0x023ff505, 0xc3f827e8, 0x1601ebdf, 0x35d91228, 0x0cf70d01, -0xbc271ce1, 0xbae8e400, 0xed09e310, 0x13ec16e2, 0xbffb1513, 0x3452e724, 0xff010cd7, 0x53ddd9d8, -0x18da2cfc, 0x3b28f102, 0x1ae1ed00, 0x051c0ff7, 0xe16b23f4, 0xfb4f0844, 0x091fdcd8, 0xbea1e109, -0xbcdc1a36, 0xd908e5fc, 0xd7f301e1, 0xbd1d02e5, 0x2319e5f4, 0xed0cfbf0, 0xed46eae5, 0x3442ebe2, -0x0323f4e6, 0xd62a25fb, 0xbec7fd03, 0x3841e6ee, 0xd3cc1018, 0x4d06faf4, 0x31422521, 0x15b1f8e7, -0x354b12d9, 0xe3ca0dde, 0x1fd30cf1, 0x25ddf705, 0xf5e8fdfb, 0x0a121df0, 0x5bc81e17, 0xd8e8cdef, -0x000000f1, 0xdfec4a13, 0x0d1e1cba, 0x0ff918d1, 0x00de274a, 0x07242105, 0xe5030cd4, 0xe0f40734, -0xee02ead7, 0x15dc3d4d, 0x0de3cc46, 0xe817f1ee, 0xfbe3d40b, 0x0d09cbe2, 0xd22256b6, 0x1904bf2d, -0xea17ee10, 0xe019f842, 0x15ebc33d, 0x39ef6217, 0xe6f8f1df, 0xf1001ad8, 0x1cf90dde, 0x19e40fbc, -0xe9e6ef0e, 0x0103d72a, 0xeffe3929, 0xf7d83151, 0x11273901, 0x28fdb0dc, 0x07f22f36, 0xddddb505, -0xe0e3f8ba, 0xf3dc354d, 0xe613f1eb, 0x09f4e2e3, 0xe70df1cc, 0x28d950b1, 0x001128e9, 0xfe312658, -0xf624cdb5, 0xee1217eb, 0x1ac04268, 0xd414ab15, 0x0d191b0f, 0x0e021b26, 0xe10cba1b, 0xfc09d4cf, -0x1b2b0c53, 0x0be8343f, 0x04d92c01, 0x01f4d733, 0x0d01cad8, 0x16f2121b, 0xddebfbc4, 0xdff2fa37, -0x1dea0bee, 0x1b0cf4cd, 0x2ff7a9cf, 0x13da15fd, 0x35fb5c2d, 0x0b0fcd36, 0x0e19ca40, 0xef1e380b, -0x0303d5db, 0x02fdda24, 0xe30845e0, 0x14fc1424, 0xeef115ca, 0x04e5d40e, 0xde2bfaad, 0x2ddaaaff, -0xf2e91a3e, 0xd51e530b, 0xdde405f3, 0xd908b11f, 0x0fe0c807, 0xecf0c318, 0x20064723, 0xf814d03c, -0xe9081120, 0xe0f808cf, 0xdbf4b235, 0xfdf225e6, 0x10da19fd, 0x170fef19, 0xedc53a64, 0xea133e16, -0x1725effd, 0xe4fbbcdc, 0x0208dadf, 0x1ff50933, 0xf706d0d2, 0x0901cfd6, 0x130515d2, 0x1e1e0909, -0xe01247e9, 0xbe3f0000, 0x35dbe517, 0xdfcd0d03, 0xff29f9f5, 0xb0c0d900, 0x30eed8e7, 0xdabff816, -0xaa4203e7, 0xd9f62f19, 0x5453ff1d, 0xdbd32bd6, 0xec07fd06, 0xeedd14df, 0x462debfc, 0x173e1d04, -0xe423efea, 0x4f6cf505, 0xd701da45, 0xb13602d9, 0xa2fd28f3, 0xeec7c9dc, 0xfae21610, 0xd4c9de0a, -0xd5db04f0, 0x1503fd03, 0x0360eddb, 0x2abf2639, 0x34fdfde7, 0x462bf5dc, 0x3c1f1e04, 0x1d04ec09, -0xbdd20cdd, 0x1c561a06, 0xfb1d0c2e, 0x19b824f6, 0xd1f4f120, 0xbe23061b, 0x1dcb1bfb, 0x22f10cf4, -0xc5f8fa18, 0x5227ec20, 0x33d1d501, 0x03caf6f8, 0xd3fc260d, 0xb9150523, 0x5811e114, 0x211bd0e8, -0xcd1d08f2, 0x44c2f50b, 0xf3d6e417, 0x0535e5ff, 0xfbccddf2, 0xc102def4, 0xf5d01825, 0xfb27e207, -0xeff62300, 0x3a1417e1, 0x17b6efec, 0xddd9ef23, 0x2ddefb02, 0x0a2bfbfb, 0xfb561e03, 0x2ceedd2e, -0x17f50416, 0xc4f3efe3, 0xb9e2ece5, 0xe3e71f0b, 0x47e5f4f1, 0xebdbe1f3, 0xe4e514fc, 0xfc280c0d, -0xfdbb2501, 0x0508251c, 0x0d0add1f, 0xcb201b1e, 0x2e480df9, 0xf3f2061f, 0xc7181b19, 0xe42310f0, -0x32b3f4fc, 0xe5c70b26, 0x1ceef3ee, 0x3def0d16, 0x2309ec18, 0x3544fb1e, 0x5050f3e5, 0x000d29d9, -0xef5b271a, 0x57b0ea33, 0xecc6d0d7, 0xd619ecee, 0xc60101f2, 0x3954efd9, 0xf2db11d4, 0xf7b31afc, -0x433d20da, 0x0000e515, 0x06f5d234, 0xdef0b6c8, 0xed1dc4f4, 0xe8fef126, 0xe215bb3d, 0x14fcedd5, -0x0deb1aed, 0xe528f2b0, 0xe0e84840, 0xdd1ab542, 0xe91ec10b, 0xe11ff648, 0xbf0968e0, 0x0ddccab5, -0x0b1ae30e, 0xe6020ed7, 0x07f42f33, 0xf4e91cef, 0xfbe9d3c0, 0x24e4fb44, 0x12fa162f, 0xe9063f21, -0x01f6d931, 0x22f806df, 0x1d04f423, 0xdffc4923, 0xe4eff3c8, 0x190af11e, 0x18f4111c, 0x170311da, -0x16f73e20, 0xdbcb04a2, 0x0dfc1bdc, 0xedf43a1d, 0x10cfc8a6, 0xfb402d68, 0xf2273500, 0x21fc4a24, -0xfae2d345, 0xe7001028, 0xeaf1ed36, 0x00f329e6, 0x0d1234c6, 0xdf27f8ff, 0xecf8eb20, 0x09f432e5, -0x0bfacdde, 0xeffbe9de, 0x14e73c40, 0x2007f821, 0xe005b9dc, 0xeafe3eda, 0x0701d0d7, 0x29015027, -0xe9fdee24, 0xe31ff408, 0x24244db4, 0x03f5dcce, 0xf3151c3c, 0xf5da1e01, 0xe01b0843, 0x02db2b4c, -0xdcf34c35, 0x07f620e1, 0xf40e1b19, 0x0cffcc27, 0xf9112ec8, 0x3c0e9bca, 0x1615123e, 0xf7ddcf04, -0xfe0326da, 0x2a26524d, 0x09031fd4, 0xe6dc0dfd, 0xfbf32ecb, 0x18121115, 0x231d050a, 0x011a2abe, -0xfc0bdc34, 0x0a0632d1, 0xe3dabbb2, 0xeee2c60a, 0x11eae9ee, 0x031ad6bd, 0xf6131e3a, 0x0d22cbb6, -0x13103c18, 0xf5161c3e, 0xf01ae8f2, 0xf306e42d, 0xed04c623, 0xf1211a08, 0xdbf34d34, 0xe9e6eff2, -0xd90db1cb, 0x0aedcf3b, 0x3f110000, 0x2dffe818, 0x20fbfbda, 0x08fc07dd, 0xd6182025, 0x9d27fff0, -0xb5e63c01, 0x295323f2, 0x06d401d5, 0xa0ee22fd, 0x15ec3816, 0xba24ed14, 0xe13be1fb, 0x39360aed, -0xb60f10f3, 0x15e2dee7, 0x174aedf6, 0x1146ee22, 0xee16171e, 0xed1d1512, 0xd7fdec0b, 0x110200db, -0xfb5116db, 0xf50923d8, 0xd7bae3e1, 0xc960021e, 0x14400e38, 0x33d01419, 0xc737f407, 0xdc6011f0, -0xebfd05c8, 0x120ced25, 0x0845e9e4, 0xfaf620e3, 0x394923e1, 0x5217efde, 0xc1c8d6ef, 0x030fe810, -0xf418db19, 0x0ff3e510, 0x0ec7e71c, 0xfbaae5ef, 0x27c823d2, 0xc3c6ff0f, 0x0ed0ecef, 0xbbd11b07, -0xb8411cf8, 0x42e6e1e7, 0xafcee50e, 0x29bdd8f7, 0x4cf6ff1b, 0xefe2dc1e, 0xc518e9f5, 0xc313ec10, -0x0ccfea14, 0xba27e309, 0x0c9ae201, 0x19d31bc3, 0x4aec0e06, 0xfa0e23ec, 0xeac5211b, 0xe9281313, -0xdd711101, 0xed41fab7, 0xbb2f14e7, 0xd6a1e4fa, 0xb6b3fec9, 0xd0b32324, 0xcbdbf8db, 0x4fb60cfc, -0x3503d9df, 0x06c3f225, 0xd2c7de15, 0xbefff9ef, 0x0aec1ada, 0xbe401eec, 0xc92fe519, 0xb6bf0ff9, -0xddbcde1a, 0x2047fb1b, 0xcbbaf91f, 0xa7fdf3e2, 0x30eed025, 0x435b07e9, 0x2efc1b34, 0x0ac70723, -0xbefce311, 0x4ca719dd, 0x1d04db31, 0xead20a24, 0x2a5b12fa, 0xc613ffce, 0xb52c12ea, 0x03bd23fc, -0xc9b9dc1b, 0xd0e40e1f, 0x000007f4, 0x0cde354a, 0xd2dcaafc, 0x21d908fe, 0x1bf5f3ce, 0xe40d0d1a, -0xcd06a42f, 0x0fe7180f, 0xda0c4e35, 0xfe28db00, 0x13efc5e9, 0x08032024, 0xff35275d, 0x22eeb639, -0xeb2bc3ad, 0xe9ec3e14, 0x2523fd06, 0x06f3d1cc, 0xdb2903b0, 0x0fdfc8f9, 0x18e50ff4, 0x0efbcb2e, -0x11fae8d3, 0x33e4a545, 0xe22af6ae, 0x1f10ba38, 0xe30bf633, 0x0c06e322, 0x0eeb1b3e, 0x09f1cf18, -0x10ef1939, 0xe9f21036, 0xee17e9c2, 0x1aec0f13, 0xeff4ea1c, 0x16dbedb4, 0x03eb253d, 0x1400c5d9, -0xfd00db28, 0xdcda03b2, 0xcdff5a28, 0x0bd6ceae, 0x24f8fbd0, 0xfdecd5c4, 0xdfe4faf3, 0x0cedccec, -0x0807e030, 0xf6213208, 0xebdfc208, 0xf312cbea, 0x1d21ba49, 0x03f02517, 0xda0e4ee6, 0x14ed3dea, -0x090ae132, 0xfdefd5c7, 0xe019f9f2, 0xf4121dc7, 0xe7febfda, 0x27ee0116, 0x18fbbf23, 0xff04d625, -0x252d4eab, 0x271d000c, 0xf8ed3116, 0x2009f831, 0x1b17bd3f, 0x201209c6, 0x2af95220, 0xee0816d0, -0xd6e352bc, 0x240f04e6, 0xf21d19f6, 0xf41b1cf3, 0x171b3ff4, 0x0c26cd4e, 0xfe05d6d4, 0x021dd7f5, -0x22cf4a59, 0x14efec39, 0x1c0abbce, 0x12d3c655, 0xe8fb4023, 0x07e82fc1, 0xdae6b30e, 0x1d0af5e1, -0x27f0ffc8, 0x01ed29eb, 0xe625be02, 0xdfe2490b, 0xf11c1945, 0xca21a1f9, 0xe91810c0, 0x20190842, -0xf1fec929, 0xe2e9b9ef, 0xe814c0c4, 0x6d0c0000, 0x14d0451b, 0x11aeebf8, 0x393d16d6, 0xa9dbeeec, -0xdbf7d103, 0xa45e0320, 0x1ab1cbc9, 0x0b25f2d9, 0xbf111e02, 0x2b2e1818, 0xb2000305, 0x1608dbd8, -0x210e1220, 0xfdf1fa1b, 0x2d9e2519, 0x01d0fcc7, 0xd5b8d9f8, 0x08d603df, 0xce25e0fe, 0xea000a03, -0x234b12d9, 0xe72ffa23, 0xedf00efa, 0x361614e9, 0x2c3a0e13, 0xe114fd11, 0x2a3a0915, 0xbfe3fdef, -0xd95a180b, 0xbd20fece, 0xbd391c07, 0x610de4ee, 0xbb0d38e4, 0xee08e4e5, 0x10fe1720, 0x2f0fe8d9, -0xc92af919, 0xdf24f001, 0x64f0f9fc, 0x1551c317, 0xccf61229, 0xbd39f41e, 0xe9ece511, 0xf9f21214, -0x1dc5e01a, 0x3ac00aec, 0xbf1012e8, 0x2f00e8e8, 0xdffc07d9, 0x1477f9dc, 0x0c301450, 0xfb0d1cf9, -0xd92ddd1b, 0x43df0006, 0xcc541cf9, 0x0de40d2d, 0x043c1b0b, 0x48ec24eb, 0xcc27e0eb, 0x2ea1f401, -0x02e00536, 0xec2c25f7, 0x380dec04, 0xe9faf01c, 0xb01b10de, 0x41f527f3, 0x31a6191c, 0xdfeef6ce, -0x4632f916, 0x2a2c1ef6, 0xff17fefb, 0x3fc2d9ef, 0xc3e717eb, 0xe70915f2, 0xc7110fe1, 0xe9caf0e9, -0x3a26eff2, 0x44361301, 0x40f11b0e, 0xedc81818, 0x09d8ebf1, 0x2013e2ff, 0x35ccf8eb, 0xaa2c0ef4, -0xb033d2fd, 0x03dd280b, 0xd0d926fa, 0x4203f7ff, 0xcff31a25, 0xe8cef7e5, 0x403ef00a, 0x0bd8e817, -0x30251d00, 0xaa10f8fd, 0x3ea7d218, 0xa708e9ce, 0xdde231e0, 0xc3e5040a, 0xeda7140d, 0xb51715cf, -0xd2dc22f0, 0xedb70603, 0xfc19ecdf, 0xb2e2ddf1, 0x1e06d90b, 0x28ee0a21, 0xb3c90117, 0x21212510, -0x31b8f8f8, 0xeae0f8df, 0x48bbeef7, 0xd20e20e2, 0xd029f9e6, 0xdd01f9ff, 0x0726fa27, 0x3a0edf01, -0x160ced1a, 0x1cb412e3, 0xd24c0b23, 0x01b50624, 0xe1e526dd, 0x321ef7f3, 0x200e0af5, 0x362bf819, -0x04130efd, 0x1af72315, 0xc7f3f31f, 0x2ad8f0e4, 0x47f1fe00, 0xa9411fe6, 0x0be92ee7, 0x1f2be4ef, -0x14c30804, 0x5c1214ea, 0xf1cd34ea, 0x5535e7f5, 0x3410d30e, 0xfa2e0c18, 0x4218defa, 0xbcbd19f0, -0xe6fd1c1c, 0xf5fe0eda, 0xf5e0e426, 0xb1041d08, 0xbf06da24, 0xc0d41823, 0xcfaae8fc, 0x25b0f82e, -0xd9d5fc29, 0xc8ccff02, 0xf04cf00b, 0x32d0e725, 0xda090af9, 0x5604ff1f, 0x2fef2edd, 0xdce2f818, -0x1fd30409, 0x4c300afb, 0xe018dcf8, 0xb54308f1, 0x281fdde5, 0xc202fff8, 0x3ca11525, 0xc241ecc9, -0xc06d15e7, 0xc11ce8bb, 0xf51a180c, 0xb43b1cf2, 0xcd2b2413, 0xefd3f4fc, 0x3e30e8fb, 0x43df1708, -0xd44ae4fa, 0xe912fd22, 0xeb16eee9, 0xe1aa12ee, 0xe2be0a2e, 0x24f90a19, 0x02b1fbdf, 0x4f33d9d9, -0x1fe4280c, 0x0336f60c, 0x09bc250e, 0x2b36e11d, 0xf2fffd0e, 0xfd33e727, 0xd2ecdb0c, 0xebdc0614, -0x16ec13fb, 0x2427ee15, 0x0a5d03ff, 0x2f0a1e36, 0x08e20000, 0xe0eaf813, 0xfe1c2bf5, 0x300c57cc, -0x13e8c510, 0xe2e50a43, 0x0cdd35fa, 0x040f2c37, 0x0001d828, 0x4404932d, 0xdaddfe4c, 0x012d29ab, -0xee1ec6ba, 0x1b0ef236, 0x16f6121e, 0xd4faab2d, 0xe9e5eef3, 0xe80d4035, 0xe5f642ce, 0xd8010028, -0x141d3c0c, 0xe7110fe9, 0x14eac5ee, 0xed1c3af3, 0xd616523f, 0xdef7facf, 0xf2e01b47, 0x2211fa16, -0x290cb033, 0x29e05007, 0x300d58e5, 0xf82b30ad, 0xf01c370d, 0xd4ebadc4, 0x080c1fe5, 0x1324eb4c, -0xec13c5eb, 0x08fbcfdc, 0xe8ff4029, 0x08e920ee, 0x02fddb2b, 0xf20ce6cd, 0xe6184140, 0xfd1624c2, -0x27f0b0e8, 0x1b15423d, 0x151c3d0b, 0x21e0f9f7, 0x16e1c148, 0x11161812, 0x0b0e3435, 0x07fb20dd, -0xe30045d7, 0xebecc33c, 0xe10b471d, 0x1ceb0cc3, 0xf020e809, 0xf412e53a, 0xe905c124, 0x2eef56c7, -0x10dbc804, 0x13181541, 0x0913cfc5, 0x0be3cef4, 0x34ed5dc5, 0xff10da37, 0xd827ff4f, 0x11d81701, -0x13e81540, 0xcddd5a04, 0x090ce233, 0x22db49fd, 0x3d09651f, 0xf5edcc3b, 0x25224c06, 0xf7c8e15f, -0x190dc0e4, 0xf81fe009, 0x08272fb1, 0xec11c417, 0xefe7e9f2, 0x13e1eab9, 0xe6fdf325, 0xf1f01918, -0x0c27cb01, 0x0e0d36e6, 0x1a0bbf1c, 0x1122c649, 0x0020d9b8, 0x2120f9f9, 0xd50f531a, 0xdbeeb416, -0xf0fdc9d5, 0x1ee20bf6, 0x24ebfcec, 0xebf1c31a, 0x00003030, 0xd1570709, 0x5a3707d1, 0x482033f1, -0xfb262008, 0xb8fddcfd, 0x33301fdb, 0x39fff4f8, 0xf9ac11d8, 0x0115e0d4, 0x0401d814, 0xda3323d8, -0xc72803f5, 0x0bba1100, 0x48e11de2, 0xe81f1f09, 0xfe3af00a, 0xd105da12, 0xacc1fa23, 0x1bc92d16, -0x05f90cf1, 0x49f52421, 0x35e6211d, 0xe52f0df3, 0xdf50f3f9, 0xf6c3f9d8, 0xf3df1e15, 0xc45e1bf8, -0xf9c6ebcb, 0x07ec2111, 0xace8dfed, 0xc606d311, 0x3f161223, 0x3e071712, 0x5e3ae9de, 0xdef5c912, -0x34fcfae2, 0xd0e9f525, 0x0431f9ee, 0xc2bdddf6, 0x0aee161b, 0x0827e217, 0xdf322001, 0xcfbd06f5, -0xe0daf71c, 0xde3bf802, 0xe11c0613, 0x013ff7f3, 0x1df1d917, 0x46ecf419, 0x40d41e15, 0xd22618fb, -0xa1360702, 0x1d25c8f3, 0xe0310a04, 0x0939f8f7, 0xe8a51e11, 0x1fbe10cd, 0x4126091b, 0x3c2ee6fe, -0xdae21406, 0x2624fff6, 0x37380205, 0xb4db0ff1, 0xfddd2504, 0xe51eda05, 0x09c1f30a, 0x15f420e9, -0xb138ed1b, 0x26142811, 0xc41e0315, 0xba1eedf7, 0xe3ce1e0a, 0x9cef0b0a, 0xfbe2c4e9, 0x370f23f6, -0xc4f9f019, 0xdb5fece0, 0x140f03c8, 0x1ec115e6, 0xbecd0be8, 0xd1cce60b, 0xc3b007f4, 0xe9ca1628, -0x1adbf00e, 0xbdbc0efc, 0xc930e51d, 0xb42cf2f9, 0xc2a723fc, 0x35fa17cf, 0x539b0edd, 0xfaffd63d, -0xe4b62228, 0xe3fc0d22, 0x4ab40a24, 0x3a0cdd24, 0x13bc121c, 0x15e30000, 0xfcee2c3a, 0xf7f2e1e7, -0x1528c2b0, 0xe51c0df4, 0xdc03fbdc, 0xffe12af8, 0x1c294451, 0xfc18db10, 0x1f0048d8, 0xdc06032f, -0x0bdee2fa, 0x04162cef, 0x09e7d0c0, 0x0c24e34b, 0xbddc6bb4, 0x09f72032, 0xe11d4746, 0x0bf2e4e6, -0x2122fab5, 0xd60653d3, 0x30dda84a, 0xfded2b3a, 0x1de80b10, 0x08ead13f, 0xd3055522, 0x2610fe37, -0x34fc5cd4, 0x1fecf614, 0x0cf41ce4, 0x16f7ed1f, 0xe6150e12, 0x0c00e427, 0x11ee3917, 0x0eee363a, -0xe3de0cfa, 0x24054c23, 0x2efb5623, 0x27d00058, 0xe71441eb, 0x231b4bbc, 0xf3141c3d, 0xb9f66f32, -0xd3ecab3c, 0xeb04122d, 0x1a1ebef7, 0x0c0fcce6, 0xeae81240, 0x14ec3c3c, 0x41ea9711, 0xfeded64a, -0x00ccd95c, 0x22fef926, 0xec063b2d, 0xeae93f3f, 0x1ffff827, 0x25264cb3, 0x180a101e, 0xdcfc0523, -0xf1dbe7b2, 0xfbe424f4, 0xe9053ed3, 0xdafc4ddc, 0xea23c2b4, 0xf2fe1a26, 0x252403fd, 0xfd0e2537, -0xd01b59f3, 0x101be80d, 0xd9dd4fb5, 0x1edf0a08, 0x27e702bf, 0xd9f400cc, 0xf914d214, 0x1debf53e, -0x1524ee05, 0x121f3a0a, 0x01dcd604, 0x3901a029, 0x1dfef629, 0x11dc1804, 0x23f00538, 0xfd1124c8, -0x32215a07, 0xf7173112, 0xdc0e4dc9, 0xe00008d8, 0x1c1dbc0b, 0x200c09cc, 0x0805e0dc, 0x14e03bb8, -0x2bf3ac36, 0x2f0aaacf, 0xeadc124c, 0xff16d8ee, 0x01f3da1a, 0x0000163b, 0xfaf213ed, 0x0a08221a, -0xcebf1f20, 0x46dd0a1a, 0x3fcd1e05, 0xe7cee8f5, 0xf23410f6, 0xedf0e50b, 0xef42ec17, 0x08fdeae6, -0x975ce0db, 0xca19bf34, 0x241b0df0, 0x27bd04f2, 0xf8f8001b, 0xccbfdfe0, 0xf607f4e6, 0xec4ce3e0, -0x17d614db, 0xdfd0effd, 0xf751fa07, 0xc7081fd8, 0x225011e0, 0x16e7fbd8, 0x2af71210, 0xef32fd1e, -0xf5e9ea0a, 0x11f2e411, 0x26cceae5, 0x4e00fff3, 0x724f2728, 0x29ea4a26, 0x1aca00ee, 0x460df30e, -0x201c1ee4, 0x46dff7f3, 0xd3d41ffa, 0x3beb04fc, 0x4401ed14, 0xd3b3e4da, 0xc03cfb25, 0x1c1de7eb, -0xcccc0bf4, 0x2ae10df5, 0x402802f7, 0x0117e901, 0xc201d9f0, 0xf7fc15d9, 0xfedc2024, 0x24c82503, -0xc1fafdef, 0xfef2e9de, 0xd4c1da1a, 0xaff104e8, 0xc12a29e6, 0xb625e8fd, 0xd7c72204, 0xb5c4ffef, -0xcd45dd15, 0x25330a1d, 0x3ff0030b, 0xa9b2e917, 0x25c12fd9, 0xc23a0218, 0xd2bfea11, 0xe3170518, -0x282a0aee, 0xda0300ff, 0xfeb6fe26, 0xebd5db22, 0x1ce6edfd, 0xe4d4f5f2, 0x16f2f404, 0x26c8ee1a, -0xe2e9feef, 0xa8fbf5ee, 0x01073123, 0xe843d920, 0x1416f0e6, 0x0b24ebed, 0x5123e204, 0x0000d7fa, -0xbd290000, 0xbef21bfe, 0x19eee7e7, 0x0000f1e9, 0x00000000, 0xfa490000, 0x17e0df22, 0x000012f7, -0x00000000, 0xbadc0000, 0x0f3fe1fd, 0x00001a17, 0x00000000, 0x31c60000, 0x09ee0000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -hard_output0 = -0xcddb5769, 0x627f0a91, 0xbcf446fb, 0xc930d133, 0xdd7b82f0, 0xbd591856, 0xb73094b3, 0x32436132, -0xac268fdc, 0xeeb03845, 0x0087cc79, 0xd372eb62, 0xb595a1bd, 0x511605f7, 0xa428b83f, 0xfb9380a8, -0xe43c2efb, 0x0a04017a, 0x674608a3, 0xc2464812, 0x208bc693, 0xb03d0580, 0xdc62b803, 0xc2808805, -0xccaf7f16, 0x848dacef, 0xedf69b49, 0x222d2bd9, 0x78ffa7a5, 0x749cb755, 0x9f4abc69, 0xa27f3a72, -0x9652d070, 0x8a83be54, 0xa9820b7f, 0x8b00e52a, 0xb02159e4, 0xeddabc6a, 0x47b69064, 0xf161d47f, -0xc243b0df, 0xebb2ac39, 0x4fd6cddb, 0xc0d38ba3, 0xd9ddef17, 0x8c638875, 0xa132cfef, 0x5893a4f6, -0x1a29ce5f, 0x9072f3eb, 0x486bda03, 0xf5250cda, 0xdc10edbc, 0x392e6b7f, 0x4664de06, 0xfde2f3f2, -0x37c7d442, 0x32b60d29, 0xbcb7c8ff, 0xa1542cd0, 0x91b36e18, 0x231f9e19, 0x97cbc4a6, 0x51ceb1df, -0xc02dedf8, 0x4bfd9728, 0x569deda7, 0xc0790501, 0x132e47b0, 0xb8229185, 0x81cbe103, 0xa30dbf5f, -0x72c54db6, 0x4abdbdf7, 0x557d21d3, 0x3b75be17, 0xf540476b, 0xc48d78e1, 0x767d44ec, 0x87dc6193, -0x7a4c52fc, 0x306c3548, 0xa66e51b3, 0xfc627273, 0x5f349268, 0xf5e74974, 0x232388b6, 0x01d8e49e, -0xbf29f75f, 0x378a9d02, 0x59a45656, 0x46fb25b1, 0x75219b62, 0x4f0d6f71, 0x220c6763, 0xdde47b70, -0x8c0dce8f, 0x3e3db100, 0xabad4262, 0x800eddcb, 0x32416450, 0x61d260ce, 0x6e2a0fac, 0x73cdb847, -0xeee01947, 0xe5a3a37f, 0xa710e211, 0x98ecaa36, 0x69197474, 0x6e73e13f, 0xb2100f2e, 0x7714b2fd, -0xec3d81cb, 0xc50e5194, 0x5c69a3d8, 0xce0bdc13, 0x08e7df1c, 0x5fb014a5, 0x75b5801e, 0xf57d3b75, -0xac5dd149, 0xa5096b77, 0x4b5da0af, 0x656506d3, 0x3823d675, 0x3840530c, 0x1c0980ba, 0x3bd4150f, -0x3df8c0f8, 0xa2834aa4, 0x479ea855, 0x4f4557b5, 0x15d730db, 0xe6809738, 0x0aec8f7d, 0xf5e2188e, -0xa9a0fac7, 0x785c3166, 0x049dd244, 0x72cada2a, 0x5655bab3, 0xff73ca65, 0xb3dc51f1, 0x259f555b, -0xdaa1933d, 0x0f716b8f, 0x1e29bde6, 0xbe8bf3a9, 0x908b5a60, 0x667636c0, 0xfce80b0b, 0xcf43d154, -0xfffc60f5, 0x324b1632, 0x1609e45b, 0xf8e09aed, 0x1a01f6ee, 0x013cea78, 0xdd89ba42, 0xfe5bca8f, -0x894e3aef, 0xda292f76, 0x457a93bd, 0x73a9c254, 0x7b5ca9d1, 0x947355ba, 0xb8a797c8, 0x3b5e97f4, -0x946889ec, 0xd49316a3, 0xa5383830, 0x55f63bbf, 0x47b3a4ca, 0x415bd007, 0x1227c60a, 0x3610fab0, -0xa68c75fc, 0xa1441c62, 0x68a02596, 0x6d083d07, 0xceeb9057, 0x915054bc, 0x6f2c7fa8, 0x62be6166, -0x963703a3, 0x5af6e614, 0x5bc3e4f0, 0xf517a95e, 0x408a2bfd, 0xab7fe7a8, 0x37aac030, 0x9956f2f5 - -k = -6144 - -e = -10376 - -iter_max = -8 - -iter_min = -4 - -expected_iter_count = -8 - -ext_scale = -15 - -num_maps = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_CRC_TYPE_24B, -RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN - -expected_status = -OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_posllr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_posllr.data deleted file mode 100644 index fe4f5eefd2..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_posllr.data +++ /dev/null @@ -1,645 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_DEC - -input0 = -0x81814e1f, 0xba81fb11, 0xc4554696, 0xe17e9454, 0x427f8119, 0xa8b355f1, 0x244ba17f, 0x1c816fa1, -0xc94f5bcc, 0xb5b97fbb, 0x634b8e81, 0x815a6cc1, 0x7f6bb016, 0x2f7249d6, 0x604664f0, 0x31817f81, -0x6fa66b81, 0xd49763f6, 0x777fa4f1, 0x81aa6da8, 0xf0fea881, 0xaccfbfd0, 0x7f81e582, 0x7f58a2d6, -0xa77f430e, 0xf47f50f1, 0x997f42f2, 0xd7814f81, 0x037fe14d, 0x81f98125, 0x2d813e55, 0x7f81f0dc, -0x7f7f8181, 0xc37c723a, 0xbc7a3364, 0x8193817f, 0xe381066d, 0x7fcab836, 0x2481eea2, 0x567f5968, -0xa07d720c, 0x7fa13343, 0x7f35636d, 0x7f817f78, 0x383d2a69, 0x7f860e2a, 0xca78797f, 0x7f7fe912, -0xc95a8141, 0x770c9c4e, 0x81e2817f, 0x811b3f81, 0x745f1104, 0x13817e31, 0xb681a63a, 0x8101482a, -0xbe81818d, 0x8c8181fa, 0x2133de57, 0x8147677f, 0x8a098d7f, 0xd429f1ee, 0x284fc81f, 0x7f5c16d7, -0xded34e7f, 0x3d60812e, 0xdf817f89, 0x2f33793c, 0x2f7f9961, 0x8181221e, 0x847f59d1, 0x9281a681, -0x89503793, 0x01817ff0, 0x183a53ba, 0xc99622f6, 0xbc819881, 0xa7ea2ec8, 0x787f957f, 0x26819378, -0x1e4e4ba1, 0x8bf18138, 0x3adc2c81, 0x3a7d8187, 0x7f22ae8e, 0x307c81d7, 0x7f53a881, 0xc281819f, -0x38fd2090, 0xdd810a00, 0x74ff7fa2, 0x7fb2f27f, 0x7f9b8211, 0x55d69e44, 0x8d2cd44c, 0x5610c676, -0x7f815b81, 0xa2811e3d, 0x93135d81, 0x92797f73, 0x8a8192b3, 0xa48a7f66, 0x7f7e4a10, 0x242dfd81, -0x7fe8b481, 0x810fb0e4, 0xde390fa7, 0xbb5a7f81, 0x65ad3b19, 0xa96a96a2, 0xf681817f, 0xb6a4eba2, -0x0d81017f, 0x5369080e, 0xfbd1c781, 0x879d7f7f, 0x81818181, 0x7f1d061c, 0x8aa731fd, 0x4386a67f, -0xba445581, 0x5b81975f, 0x467f7f7a, 0xc85db95e, 0x6f587240, 0x29a07904, 0x7f7f7574, 0x815dbeb2, -0x81771181, 0x7f54e8c3, 0xc6586fd6, 0x3c6d835a, 0x86b4ed95, 0x7faa72fb, 0x7f7e7fd5, 0x154f81e3, -0x7c4881b4, 0x0c164a37, 0x7ffdbf69, 0x7f7d43f6, 0x5f47da8a, 0x3236d20f, 0x65818181, 0xa37fcf7f, -0x7f8116cb, 0xf6947f50, 0x66ab65b1, 0x6d688a6f, 0x537f6bf0, 0x5c864ddc, 0x06a98181, 0x455854c2, -0x9a6c49ad, 0x129d3c29, 0xe94c327f, 0x7d40247f, 0x9681bc7f, 0x7f288120, 0x81a43b40, 0x08d81689, -0x457f815d, 0xc27f9ae7, 0x7f819655, 0xdabf8181, 0xf4c07f81, 0x6410e8cc, 0xce4d8181, 0x19b13059, -0x8181bf99, 0xf2819620, 0x7fc37f4e, 0x7f8efe81, 0xb25a3e8b, 0x7fbbdb22, 0xba7f8181, 0x8135d42f, -0x817f6836, 0xc381a056, 0x7381547f, 0x1e407f13, 0x9b917f7f, 0x4e526d9b, 0x9323737f, 0x7a20429b, -0xac6b14a8, 0x3568e8d7, 0xbe621a97, 0x7fbca13b, 0x2dbda9dc, 0x32af4ddd, 0x6e4f978e, 0x10ed8172, -0x81e76681, 0x7f427fc4, 0x7fab7f81, 0x2c7ffd81, 0xea817f7f, 0xa62fcf2c, 0x8144bfb7, 0x7ffc93a0, -0x79e9b564, 0x6c449d46, 0x987f8481, 0xee118173, 0x867f0c0a, 0x81819347, 0xb8ddbf82, 0x5c6866b8, -0x82b48881, 0x5c817fdd, 0x7f6605e0, 0x4181bc81, 0x736b51a4, 0xcd5a7fd2, 0xf939a42b, 0xcd817faf, -0x5e1b1fa6, 0x7c818ef7, 0x070c47cc, 0x8e5981d1, 0xe661d182, 0x54deb54e, 0x7fba81f4, 0xc1712e73, -0xb6885086, 0xae9759e2, 0xb12b814e, 0xf5ae9e41, 0x16c736f6, 0xa981c3e2, 0xb06c7f29, 0x497f95b8, -0xcb3de381, 0x7f7524e3, 0xdcf88147, 0x811e81f9, 0xab7a9c7f, 0x816223d8, 0xf97fe22f, 0xe5cf814e, -0x744f6312, 0xc797e05a, 0x279b237b, 0x622b01b9, 0x37818181, 0x8174e3ab, 0xfa5a69ff, 0x62cc787f, -0x81944e7f, 0xc87f7f2f, 0x30839f54, 0x8122090f, 0xf8e98181, 0x28815f40, 0x0262424b, 0x7fc3ccd0, -0xdf7f7fe2, 0x0c264dfa, 0x5d954581, 0xfb188181, 0x6b810d33, 0x1c7fbee7, 0x8141c17f, 0x7f768155, -0xbd207f27, 0x794079d7, 0xf34bd97b, 0x7f7f5026, 0xb46c9782, 0x7f81574e, 0x81817f27, 0x75267f6d, -0x4a7fe97f, 0x7f879ee0, 0x25f8d63f, 0xd481a3c5, 0x747ffd0d, 0xb33530e2, 0x813f5881, 0xbb8181dd, -0xa2da462a, 0x817f8c0d, 0xd0f061f8, 0x117bda34, 0x1897f8b7, 0x2e477f50, 0x8181814b, 0x7faa1181, -0x6ee68168, 0x811a98e2, 0xdcb2b784, 0xa20a7fb7, 0x41445681, 0x0bffeefc, 0x02817f9d, 0x743071cf, -0x387695bd, 0x847ffb4a, 0x0a287f56, 0xf9b4d4d3, 0x2a7fa481, 0xe3eb2e9b, 0x327f91f4, 0xec3981d2, -0x6681f83c, 0xe675722e, 0x426ac913, 0x4b6154a6, 0x5c30816f, 0x817c8155, 0x277fa781, 0x8dd8a9a3, -0x48c609a0, 0x4bca47bf, 0x7f3f6d81, 0xea497fb3, 0xc181507f, 0x81bf1ffe, 0x8e818916, 0x6ba83d7f, -0xb8547f62, 0x5881670e, 0x7f6281fb, 0x6e7f9250, 0xa7bc817f, 0xb19450aa, 0x7f7f9d58, 0x20f69c1e, -0x7f45815d, 0x817f9319, 0x7a5496b0, 0xb85e8950, 0x72c9337f, 0x81781aba, 0xfecdaf28, 0xe2195ab5, -0x7fbb0ec7, 0x7f7ff8a7, 0xab818181, 0x978f2e6e, 0x7fc38121, 0x18945319, 0x264a8181, 0x93b1dc81, -0x630ed781, 0xe27f8e14, 0xc17f5b93, 0x7081fe2d, 0xbb9ac790, 0x7f81ba5c, 0x7f812f32, 0x68bd4f7f, -0x81217f81, 0x88b87f26, 0x285e7f3e, 0x29817828, 0x747f7f81, 0x159eaacd, 0x8d02b252, 0xa98881e7, -0x817f1681, 0x367fbd38, 0x8a8441e3, 0x81447f1f, 0x8165424b, 0x811676ee, 0x81a48122, 0x4b02ea7b, -0x5c267f38, 0x8195acd2, 0x7f7fb581, 0x9eae092d, 0xab12457f, 0x96f8dc31, 0xa89fd810, 0x222b7f7f, -0x1dd67f65, 0x873a81e0, 0x0e7fd97f, 0x81a83d97, 0x8106d381, 0x7f817f0c, 0x8104d4f9, 0xbb81677f, -0x01be7f39, 0x297297ab, 0xc2f01b81, 0x9dd57f81, 0x81ff692f, 0x7fc28115, 0x077f547f, 0x717fcf81, -0x3d81ed83, 0xff6f7fff, 0x7f50f95c, 0x5650a753, 0x81817f09, 0x963b7057, 0x7f817f60, 0x987fa099, -0xf6207f7e, 0x4c814e98, 0xcd27b681, 0x41bd2ebd, 0x340172b2, 0xbc151ec1, 0xf3b403d2, 0x817f6c81, -0x7f2f3218, 0x26f2ea5d, 0xcc59bd8a, 0xef857f52, 0xe37bc195, 0x7f2a2e13, 0x7381a51a, 0x31e14c60, -0xc2e23fc6, 0x8113f40c, 0x9b2d7f81, 0xf6e1147d, 0x813c7fe1, 0x9a9d7f3f, 0x7fb939ac, 0x573181ad, -0x608a317f, 0xb486b9ee, 0xe67fb10b, 0x62817f8b, 0x7f7f9775, 0x81e6819d, 0x7f6f0f61, 0x4ffd8158, -0x81ae56d2, 0xbe4aa4f7, 0x6c515581, 0x435d8326, 0x7f0e2a95, 0xc28d81e1, 0x357fa0cf, 0x2b9f7f11, -0xd491057f, 0xbc7bddd7, 0xe5b57f34, 0xfba68549, 0xb491d2e3, 0x4fb61f49, 0x81bd3e3c, 0xdd9848f3, -0x81810561, 0x67f5fbdd, 0x8c4dc25b, 0x2ab47f67, 0x68137f5e, 0xcfe53817, 0xa7679d31, 0x501213b4, -0x7f7f1390, 0xbefeccd8, 0x30fe9044, 0x7fd6812d, 0x813cf0e6, 0xccb82825, 0xfa78ec58, 0x024b90e4, -0xba25ec7f, 0xc43b50ff, 0x7f7f3e4d, 0x64c38181, 0x81ed1dba, 0xd58b7f64, 0x0b81311f, 0x03563b7f, -0x817fb491, 0x81e895c7, 0x817f7fb0, 0x1681a581, 0x7f998a50, 0x489b81a9, 0x81bc81a2, 0x3d9e7fde, -0x7c7c6381, 0x817447ec, 0x6e7fc32b, 0x7fab86c6, 0x95b44181, 0x3a7f756c, 0x81458168, 0xc4787fd3, -0x731cda81, 0x73127f03, 0xc9077fcf, 0xc37f9c2e, 0x27817f7f, 0xc4361507, 0x7f9b3581, 0x9d357f2d, -0x7f81166c, 0xb87f815f, 0xb2604f95, 0xc44b5591, 0xcfb8078b, 0x7481e64b, 0x8152a679, 0x53fa387f, -0xfa7f3f79, 0x7f5b5fe5, 0x1e625d7d, 0x1081ad93, 0x7f5019fe, 0x3d8145a7, 0x629f9918, 0xc1ab3742, -0x7f66c057, 0x9cb048dd, 0xeb6e859b, 0x8e5fb72c, 0x94d8f5a4, 0xa381280d, 0x67737de6, 0x45817f81, -0xf055c17f, 0x6a0aafff, 0xdb818cc6, 0x81fc60dc, 0x20377f4c, 0x7feac6de, 0x72e78c7f, 0xdf532124, -0x81d33356, 0x8881bcf9, 0x95817f32, 0x612eae3b, 0x7b186965, 0x50b77f63, 0x718181b3, 0x42d8b481, -0x88edaf7f, 0xa3cd25f6, 0x7fdd7f81, 0x7fb79681, 0x7f786e7f, 0x7fbb41c9, 0xd2618121, 0x1cacc6d3, -0x7fe2a0dc, 0x819e1a46, 0x563081e1, 0xb18d77b1, 0xb4817f7f, 0xa97f81fa, 0x2e81157f, 0x31e67fa4, -0x5b814281, 0x98b18124, 0x7f0a3540, 0x49d508d1, 0x2693bc71, 0x3aeb81ca, 0x817fc081, 0x6674b9e7, -0xa1217f23, 0x517f81f1, 0x7fc4ef26, 0x2914ef7f, 0xa9ff7a19, 0x7f7f0ce2, 0x1b485e45, 0x7f70af0d, -0xd6812a71, 0xc95fc63d, 0xa57f03c8, 0x9dbe7f81, 0x7c978192, 0x81a22306, 0x96447f2f, 0x7faf2728, -0xc2a494ad, 0xd5c7813a, 0xa02b7bb8, 0x3bc04eed, 0x997fa97f, 0x7768d0d0, 0x8a84817f, 0x8f1102c6, -0x7f8115be, 0xfb7f7869, 0x7ff25de8, 0x6745f276, 0x0f23b585, 0x52933552, 0x7fab5340, 0xeb4c403f, -0x7f5465ec, 0x77b0a942, 0x6b67297f, 0xc86a7133, 0x7f8f177f, 0x869e28f4, 0x7a7fb066, 0x81a3b865, -0x5d7fba81, 0x815fd7ae, 0x60817ff7, 0xa633a381, 0x45813981, 0xade1ccd7, 0x814981a6, 0xaa93770a, -0x7f83b4dd, 0xc0967f1a, 0xed7f3764, 0x53772ea8, 0x5a81f453, 0xaff56f92, 0x81067f5f, 0xf596ef1f, -0xd520de7c, 0x81b2bdc8, 0x7f8130dd, 0xfb7f8c41, 0x99816bf6, 0x695a60e3, 0x7f7f817f, 0xed987f26, -0x8f818166, 0x417fecfc, 0x99ec379b, 0xaf7e7f7f, 0x360dd75f, 0x787f44f6, 0x81837dfb, 0xd481a681, -0x81819d17, 0x8781322c, 0x7f7fac0b, 0x0fca7f3c, 0x40b5e37f, 0xf27f2ebc, 0x41c19a41, 0xa6c1d381, -0x066de9ec, 0x32b8a8bc, 0xdac61ba5, 0x812d817f, 0x87b9821c, 0x817f7920, 0x7f557fbc, 0x81738181, -0x918fb098, 0x81ab890a, 0x81b881bf, 0x7f7fc57c, 0xcdbde77f, 0x7f5f7f3a, 0x36e59a81, 0x19a6818f, -0xea7fd850, 0x20606e2b, 0x927f9c22, 0xd27f819f, 0x3c4f7f73, 0x168176ce, 0xf0687f81, 0xec5f7faa, -0x23aa789e, 0x2de996b5, 0x7fd07f7f, 0x9785c156, 0x1eaa3235, 0x9781ea6f, 0xb2de74fb, 0x815a98d6, -0x8cb77f92, 0xbba85fa1, 0x61afcac8, 0x81817f64, 0x8149865f, 0xa251b7ee, 0xec7f8181, 0xf8ad7f84, -0x5c8142bf, 0x212981f2, 0x7fc9e381, 0x37338e67, 0x7f3099c6, 0x4fcdb7d1, 0x0381c0fd, 0x778181e4, -0xe7702cfb, 0x61c21e43, 0x3f987f81, 0x3a0b815c, 0x7d12b8c2, 0x70097f0a, 0x7f244d63, 0x2d81187f, -0xd87f6f7f, 0x7d267f2c, 0x8eaf2486, 0x87d8013d, 0x85367f7f, 0x81817f85, 0x0a067081, 0xc96f952c, -0xf3c14485, 0x227f4330, 0x60ec8124, 0x41f181f5, 0xdb6b7fce, 0x819467cf, 0x81bc7fd4, 0x2c7a7f7f, -0x936ade53, 0x7f81d04a, 0xc4817f81, 0x7fdd78dd, 0x81d3a47f, 0x917fade5, 0x6c81510e, 0x5b16fd74, -0xbe987f81, 0x7fb17404, 0x7fb8e8f7, 0x7fb381e6, 0xc479b081, 0x5c81eee7, 0xb19b0e81, 0xa381d4df, -0x81bacf5b, 0xa67fb9a6, 0x817f11a0, 0x8d565870, 0xce818181, 0x7f4aec3f, 0x813ab981, 0x1b495a42, -0xab7f928d, 0x8106014f, 0x47c3e57f, 0xc418f11e, 0xc9149f6c, 0x1a7f1e25, 0x7f3f2d81, 0xcd5e462d, -0xa8d57f7f, 0x812481db, 0x7f697f97, 0x69cdb891, 0xc31fc20d, 0xdc812b31, 0x57e37f81, 0xa09681aa, -0x7f817f88, 0x1ae385f8, 0x81607f7f, 0xfb752e65, 0xd8dd8141, 0xb17f50a9, 0xb8737ffd, 0x1f7f815b, -0x7f9a9e69, 0x06448b38, 0x8109a225, 0xb69e064b, 0x9881537c, 0x59dee4d8, 0x89c6a692, 0x0e817b7f, -0x81816b97, 0x5de37fd1, 0x7f2c7ca9, 0x81784402, 0x29bd477f, 0x81a07ffe, 0xe822df7b, 0x7f29813c, -0x6d81cd81, 0x1a811bd2, 0x6b2c7f26, 0x7881a08f, 0x7fd0e88e, 0x27f87fce, 0x8181a67f, 0x7f7f5558, -0x81668133, 0x8181bfca, 0xc3792d58, 0x2b7f2d7f, 0xa3d09230, 0x9fa56824, 0x7fd5ce7f, 0x251b3cbd, -0x7f818117, 0x7fac9e26, 0x7fde26f6, 0x4b7f837f, 0x1fd52b94, 0x067f6698, 0x70817f7d, 0xdd9658c1, -0xe5a99465, 0xa59cdc55, 0xc1c2c7ad, 0x147fb081, 0x234cc657, 0x7f7fcc0f, 0x7f3d8150, 0x41b68131, -0x7ff58184, 0x90a57f2b, 0xdd9d9b7f, 0xc4518163, 0x428aa37f, 0xe866ef52, 0x7f6c3644, 0xa09d3b50, -0xf2c4adad, 0xc87ecb45, 0x7f70bace, 0xd5697f2d, 0x297349a8, 0x6bc11cc9, 0x8cdd0ed3, 0x7f53646b, -0x8129b9b8, 0xce65a8d3, 0x20208181, 0x817f5272, 0x6ad11bf4, 0xc58151e3, 0x361572c9, 0x81acd996, -0x6e819466, 0x7e7fbd3f, 0x70bb9ffb, 0x818b810a, 0x879a7f15, 0x8c884edb, 0x9028ae45, 0x81d8f525, -0xaaa781b9, 0xaf1a0108, 0xe2817f73, 0x24b67f8b, 0xf08fd77b, 0xd21a265f, 0x7f3930ba, 0x5f5d9287, -0x66218181, 0x7fd219f3, 0x6f44f09e, 0xbcc58157, 0x7f71b94d, 0x817f81c5, 0x877f6064, 0x81647f81, -0xe5ba2e34, 0x889f8722, 0x27819f0e, 0x7f4c0eed, 0x2d7f79b6, 0x81b1813c, 0x647f3d2b, 0xe92b68be, -0x81375804, 0x6798c04b, 0x2b596e7f, 0x78c97f7f, 0x812c367f, 0x7f468112, 0xa352d785, 0x3806f2a4, -0x6886a9a9, 0xa31540ea, 0x5ab2478d, 0x9f5be57f, 0x9ab06481, 0x1586279b, 0x86267f81, 0xb3a50944, -0x788a485c, 0x838d4c30, 0x8ad44b53, 0x923fb39a, 0x95035381, 0x81817ff2, 0x7f44d5eb, 0xf17f8164, -0x39d117c0, 0x37ea75f4, 0x81927387, 0x817f0623, 0x909f7f0a, 0x997f7f19, 0xc1983b18, 0x60937f6b, -0x8829c381, 0x8e6bf066, 0xfb7781ab, 0x43408e7f, 0x7f7f811d, 0x33eb81d0, 0xb86459a9, 0xadba7fe7, -0xc1967f48, 0xfd0284bd, 0x4bef335d, 0x1b7f5f81, 0xa2c2c237, 0x81b0816a, 0x42ee5c7f, 0x7f009323, -0xb7ced44c, 0xd90958e2, 0x3af8aae8, 0x7fb82e90, 0x989a7f7f, 0x14a22c68, 0x60ef7dc6, 0x7fb9ad00, -0xf9e3c69d, 0x5e3bafbe, 0x81178a81, 0x92c4df02, 0x159d7fb6, 0x812b8103, 0x616f9df5, 0xb9a1df61, -0x454b3944, 0x98931fbe, 0x4aae7061, 0x9572a681, 0x8178a8a8, 0x81fe821f, 0x817f7f6f, 0x7f787f2c, -0xe584ff82, 0x7b7f5637, 0x9e815970, 0x517d8181, 0x97faba7f, 0xcfe3ce17, 0x9181f55f, 0x857f5f3b, -0x81b17fbc, 0x7f1d7fbc, 0xae7356c3, 0xe4f77f8b, 0x4695f639, 0x8ddaec55, 0xa5d4a381, 0x7f7fa418, -0x4d818145, 0x3881723b, 0x7f507f7f, 0xa5357fca, 0x81dbdc3b, 0x0b187f28, 0xb0325181, 0x09dd795f, -0x2c39b28c, 0x9ac18118, 0xda52b681, 0xa3819da8, 0x7f884525, 0xba0d7ffe, 0x50ce81ad, 0x60e70e69, -0x110b81ee, 0x8181871e, 0x7fe07f81, 0x8d1c4dde, 0x67649db7, 0x6e4669c2, 0x818144a4, 0x7f6c9cb7, -0x51b57f81, 0x36aec300, 0x7f7f8141, 0xc5eca67f, 0x14ac7892, 0x7f35e9c2, 0xa1fe9a81, 0x6a867f7f, -0x767f817f, 0xc447c4bf, 0x067fedca, 0x8c024b57, 0x7ee5707f, 0x52589b51, 0x0f81b28f, 0xae7f00a7, -0x5244c5ca, 0x9671812e, 0xf0631d15, 0xb4aba1b8, 0x7f9a3488, 0x81b485b8, 0x392f2d7f, 0xed7fad81, -0x6055a4e1, 0x60f300c7, 0x7feb817f, 0xd1e0917f, 0x544ca57f, 0xd23d7e0d, 0x8110c8c2, 0xbc24a615, -0x3d817f33, 0xbdabcdfa, 0x5ac3817f, 0x81817fc0, 0x81817f76, 0x837e43d9, 0x7f817581, 0x5da96bcb, -0x3e1c888f, 0x7f7fa6f5, 0xb769907f, 0x8eb43d8e, 0x3a7f3e81, 0xd5845510, 0xd07f5a54, 0x14816ab2, -0x8126c62d, 0xbeda8f5c, 0xa0007fa8, 0x818d7281, 0xad72917f, 0x49c2f650, 0x87969baf, 0x7f53e975, -0xe78de481, 0xe5083e96, 0xb635812c, 0xafdf4bb9, 0x26ac8101, 0x82b0a109, 0x7f8101b8, 0x607fc7cc, -0xc3b1892f, 0x7d0dd911, 0x396d8195, 0xcb84b67c, 0x3f7d3681, 0x43a07f25, 0xd020297d, 0xb7d65b81, -0x455a99e2, 0x509e4611, 0x817f81e0, 0x81da81a8, 0x8147b5c1, 0xbc81a5df, 0x489c6781, 0x8150a908, -0x4fc0e681, 0x814b8163, 0x11457f8b, 0x9a77db7f, 0x81fa0681, 0x7f867010, 0x852b87c5, 0x3d8253dc, -0x91165c42, 0xc6ac7422, 0x727f0774, 0x7f497f67, 0x1a3fe7c0, 0xb39c81d1, 0x44a47f7f, 0x7f8b066f, -0x7f787ab5, 0x7ba7e870, 0xb932a3a9, 0xc85c1149, 0x32a28d61, 0x7f8d812c, 0x93819da2, 0x647ae98c, -0x777f7e9e, 0xbb447fec, 0x2fabd677, 0x3a7f8c08, 0x51707f28, 0x35f81da5, 0x0b3cfc4e, 0xd4179b8a, -0xef77a6ca, 0x31e02016, 0xdbb81924, 0x7189b4a7, 0x08a671aa, 0x817f2352, 0x81819e81, 0xec7fb7e4, -0x81699ae5, 0x88817f20, 0x5ee7d181, 0x944d8150, 0x7f7f52d9, 0xc1815114, 0x3281a67a, 0x52fa8181, -0xc4e47f7f, 0x7f824cbd, 0x728cf0bf, 0xa6b20e46, 0x9ffe631c, 0x639d82cc, 0x7f638136, 0x7f7f3381, -0x7f8b4794, 0x44b19231, 0x08da5253, 0xaa815d93, 0x7f6a7f69, 0x616331c2, 0xdaa47fcf, 0x7f272255, -0x3ee4098e, 0x819527f9, 0xcfc187a5, 0x7f81e781, 0xf71402bd, 0x9fecc0d1, 0x2067a67f, 0xa1dace7f, -0x42817fa8, 0x8181da23, 0x03818181, 0xc35e3af7, 0x941d7ff3, 0x817f33e5, 0x7f2a78f7, 0xbe426494, -0x0d2d81a4, 0x817f20cf, 0x89b2f4d0, 0x8171ba71, 0x6245be4e, 0x817f8140, 0xed8a7f81, 0xdb097f7f, -0x81724d42, 0xe0de7bfb, 0xde611f7f, 0x7f54d981, 0xb1d07fd7, 0x487f7fef, 0x7f2c8139, 0x7f7f7f10, -0x3e812db6, 0x63447ff6, 0x7c7f277f, 0x9f7f8b7f, 0x76d47f81, 0x197faadb, 0x6a596c91, 0xc681a3a3, -0x7da1d13f, 0x4af8d329, 0xaa819881, 0x7d7f7f4a, 0x3a9d1753, 0xaf818145, 0x5b905350, 0xee313e4c, -0x3fa881c7, 0x437fc046, 0x817fbd9a, 0x30f77f14, 0x3e81df81, 0xa42f4e53, 0x7f67d481, 0x4f4b819e, -0xc5474f22, 0x6eed3376, 0x7fb1ed92, 0x5b3e813d, 0x6c8181a7, 0x720df323, 0x2d0e7017, 0xc7448174, -0x817fb27f, 0xad7f01de, 0x817f10b1, 0xf6231fed, 0xa56d7a81, 0x98817fef, 0x8181e4a0, 0x48aa7fb1, -0x81727f6a, 0xa4059a04, 0xe0cff64c, 0x5ea7679c, 0x69c1009b, 0x7f816b2a, 0x5cc58181, 0x7f954f3d, -0x848b7f17, 0xaee99031, 0x7fbb951f, 0xa2da7f73, 0xc5acfb81, 0x2c1ecf2a, 0x6981fdba, 0x19897fb2, -0x7f4af7a6, 0x85cd8129, 0xe845e0d5, 0xdf658407, 0xd522567f, 0xab242f2e, 0x7fdd70a4, 0x1c9d038c, -0x2f923f85, 0x27f1b2c5, 0x7f812781, 0x7f818181, 0x7f9603cb, 0xc32881af, 0x5ad1f2a1, 0x61b99a32, -0x57cd3bfb, 0x7ffc6fd7, 0x9e81c281, 0xfea25f7f, 0x85a2bfe7, 0xf3ef5107, 0x7f81565e, 0x1d447f81, -0x814e817f, 0x40853b00, 0x6caf3f7f, 0xe13a7fe2, 0x816162c5, 0x81b4e66f, 0x81e18fb8, 0x7da87f66, -0x7fef667f, 0xea2ba1f4, 0x408181d2, 0xba81676f, 0xdd817481, 0x7f9d7fff, 0xd6544752, 0xb1bd61ce, -0x3aa26a56, 0x817e9bf8, 0x8158964a, 0xa0d3253c, 0x308130f6, 0x501d7f23, 0x367f34d2, 0x818581eb, -0x817f4743, 0xdf9e81c8, 0x5c7f13a4, 0x12182965, 0x9cca6c7f, 0x47817f4f, 0x0cbd2918, 0xb05cf048, -0x28810542, 0xe8a869a0, 0x7fb7682b, 0x3f7fb5d1, 0x813dc581, 0x2ea58dcb, 0x4a4e6881, 0x687681b8, -0x665c057f, 0xa78127e0, 0x81b28166, 0x817f686e, 0x7f261637, 0x81ad7131, 0x54817f68, 0x2eae6470, -0xf110f558, 0x8aa44bc2, 0x81f12d55, 0xf37f35cd, 0x7f68679f, 0x3fc481db, 0xe02a5a41, 0x817f8130, -0x919b6c25, 0x14749815, 0x9d7f6c60, 0xc5777fa4, 0x7f8db49b, 0x524a623d, 0x2ef59cc0, 0xd18f4a24, -0x37707f92, 0x4af98126, 0x81b43c76, 0x7f965818, 0x7f81c786, 0x057f7f49, 0x1ab3ef1e, 0x1781eb8a, -0xf0909181, 0x656da3b4, 0x5181cbb9, 0x81e9a237, 0x8ace577f, 0xd19f2c0c, 0x86a7817f, 0xb7628100, -0x817fcfa2, 0x7f3cddf4, 0x744a96d2, 0x19967ffb, 0x7f7f813a, 0x81f2b043, 0x7d46cd81, 0x7f006e7f, -0x363a7c9b, 0x9f812dda, 0x77c77f1c, 0x8172274d, 0xa7ba8181, 0xff7f1ea8, 0x817f4e7f, 0x377f9ad7, -0x81447f7f, 0xf81f3623, 0x58ce7f7f, 0x8a4a208f, 0x4d938115, 0xb0ac7029, 0xf72b23cf, 0x467f9dd3, -0x81819130, 0x62bb7fc4, 0x84b4b190, 0x2781b070, 0xdc81cda4, 0xcb8145b3, 0xda812b38, 0xda307f7f, -0xafbc8158, 0x7fcb7205, 0x47e781ae, 0xc056245f, 0x81997f56, 0x51d9d6f7, 0x7f895c4e, 0xb7814beb, -0x7f658181, 0x757f81bf, 0xdb81816e, 0x582edcb2, 0xb9860711, 0x587f81ca, 0xa45a7f0b, 0x81e68a35, -0x7f7f3b0f, 0x3c233956, 0x7f5f3e44, 0x81ba915e, 0x9ea4dd81, 0xc323e1bc, 0xb1ac0322, 0x5e7f0e2b, -0x6b2fb26b, 0x0e92812c, 0x667fc670, 0x7faccae4, 0xce8181be, 0x815e68c5, 0x273e7f69, 0x10f3e868, -0x47a8b82c, 0xc8817f10, 0x617281b6, 0xe4a44714, 0xe19d4b04, 0xe8818333, 0x81e481fb, 0x58ab1e34, -0xa68c8168, 0x815f4c12, 0x181be656, 0x817f147f, 0xc87f7f8b, 0x7f7fa1f9, 0x7c787f7f, 0x7f7ff8ae, -0xcf9200a0, 0x7f65e492, 0xc37fbb89, 0xa234a37f, 0xa27f7fb4, 0x818a6fb3, 0x04817fb5, 0x2e7f636a, -0x905db630, 0x812bbc0d, 0x8f1beb7f, 0x7f83bb5c, 0x81b96698, 0xbebc8152, 0x6669b181, 0x7f81452e, -0x6861ca81, 0x8806d040, 0x4570d28b, 0x812681fe, 0x817e3b48, 0xcd3ddb3c, 0x21777fa4, 0x7f3d81cd, -0xae0d8104, 0x8134b9fe, 0x7fb87fdc, 0x81ac7f6a, 0xbeec5c5d, 0x60cc4dfe, 0x967f82fc, 0x3a8187a2, -0xe9577fa9, 0x818181a5, 0x8181b4aa, 0x81204f7f, 0x81708146, 0xbe08d127, 0xdec25eca, 0xc3e0db2f, -0xf7817f4f, 0x7f5da797, 0xc9c44f90, 0xbc5b84c5, 0xda44a681, 0xcc9b810a, 0x38c5c3c1, 0x674294d4, -0xe47fe181, 0xa4817f54, 0xcd06b70a, 0x5b3d7f7f, 0x7f137fbc, 0x38769bd6, 0x817f811d, 0x6bc4046f, -0xba9a7f2d, 0xca91ea2a, 0xe881d10b, 0xf9810daf, 0x42e57f81, 0xc87c147f, 0x4f817f7f, 0x66c7bd81, -0xb991549f, 0x816febec, 0xdc50fd71, 0xaab9aa83, 0x7fbd3952, 0x7f50c6cf, 0x1481f8a2, 0x3ff381ab, -0xf6b0470a, 0x81e12ebc, 0x817f5f39, 0x3c7fb836, 0x79813781, 0x7fefa2c9, 0x7e81030d, 0xb849bf3e, -0x81613b40, 0x08817f32, 0xbd5ffe64, 0xd688be81, 0x0166eab3, 0x81077f0a, 0xe5817f56, 0x91b83696, -0xac8181d6, 0x5732a410, 0x40818181, 0x81915bb3, 0xa87f8145, 0x816a06ce, 0x033f7d7f, 0x86438281, -0x3afc477f, 0x9cdf8102, 0x786d4383, 0x81ecfe7f, 0x89a7471d, 0x349c7fd7, 0x7f377f3a, 0x51d55daf, -0x62337f61, 0x547f910e, 0x4bea99d2, 0xbfa9557f, 0x7f2ee96a, 0xcb9ccccd, 0x0fc3a681, 0x687f30fd, -0xb07f4530, 0x83814334, 0x955bf3c6, 0x7f909981, 0x7b4e617f, 0x7659def0, 0x05565d7f, 0x81f271cc, -0x31ca8581, 0x1afd6755, 0x818181ff, 0x7f8181ef, 0x7f7f77ce, 0x1d6692cf, 0x73c57f7f, 0xf083d53f, -0x707f9c09, 0x1ce6813b, 0x17bcb0c6, 0x15b59ba7, 0xde7f817f, 0x7f925801, 0xeba91d81, 0x568190e4, -0x7f817e72, 0x8d7ffa3c, 0x82f281fb, 0x548a7f7f, 0xe9777fa8, 0x407f16cd, 0x7e8167a8, 0xc5812c04, -0xeae8e181, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xf481c67a, 0x89b07fc3, 0x2e4d7b44, 0x9181818e, 0x83b88158, 0x8181739b, 0x4aa97f6a, 0xb36d7fa6, -0x075bb9b8, 0xcf839c97, 0x20ba9176, 0x117a6a6d, 0xc35b571e, 0x8181fb5f, 0xec3a7fa9, 0x3eec7fcb, -0x53622f7f, 0x8681a07f, 0x0ff39b65, 0xb6c82420, 0xefb381d6, 0xd5390961, 0xf1887f0f, 0xbec2abad, -0x64d57f81, 0x2281057b, 0x1f7fe936, 0x99038181, 0xc1450b81, 0x65cc5386, 0xb886acc1, 0x109dde08, -0x6417d0dd, 0xcb7f7f76, 0x9681b397, 0x53c39e81, 0x437fd46e, 0x751c3481, 0xdd4c813c, 0x38817f65, -0xf0b39281, 0x31357fcc, 0xf37fae31, 0xba8181e7, 0xefc1e23b, 0xa8650162, 0xbb815838, 0xd6eeba30, -0x8de2db81, 0xc01ca018, 0xed2dfb81, 0x7f84731f, 0x40633968, 0x557f2c0f, 0x5f5c6374, 0x41b02181, -0x447f6e09, 0x8d56b3a6, 0xe47f81bd, 0xbe712a04, 0x3e7e78b2, 0x470a8128, 0x298981b3, 0xe65e2866, -0x5bad817f, 0x78884acf, 0xb521287f, 0x81df4b81, 0x33818184, 0xb3d65f30, 0xc2ed7fbc, 0xc4811ccd, -0xec92a11d, 0x5bc5817b, 0x57ad8103, 0x7f6226e4, 0x07c2d87f, 0x3d7fb181, 0xff73974c, 0x08815f61, -0x50616fbc, 0x923ec16c, 0x2181c73a, 0xb8f88181, 0x047f7f7c, 0xe87fa53d, 0x399ca775, 0xef139839, -0x7f217f43, 0x811415c8, 0x37f6b9c6, 0x7f7f817f, 0x11c6ad81, 0x81b3c88d, 0x0ca47c91, 0x024a7604, -0x2dda2f7f, 0x811c5281, 0xc27f814b, 0x7f37a317, 0x42433381, 0xddfbc9da, 0x23737f7f, 0xe3acaecd, -0x1d846dc3, 0x7f1bd4e3, 0x4055d37f, 0x7f1e9a81, 0x31d29025, 0x6d90cf64, 0xdf532fea, 0x1a3dc07f, -0xf997ee19, 0x597f5460, 0x2a0b5b30, 0x5751a381, 0xd27f8489, 0x7f1f9ae4, 0x2bd07f7f, 0x5281923c, -0xbb7fae6b, 0xd344db7f, 0xb0431bc3, 0x33744f44, 0xd2996981, 0xce048861, 0xd57f36c1, 0x1181819f, -0xe7592aef, 0x7fbe817f, 0x177f7f04, 0x2cc78381, 0x27558149, 0x7f64746e, 0x2bb97dc7, 0x10aba652, -0x02f70c7f, 0x7fd8ae81, 0xcd81f07f, 0x9352c65e, 0x344a817f, 0x4f282881, 0x3e2d23fe, 0x69517fb3, -0x7fd1e4a6, 0x3bf47f7f, 0x33909ff6, 0x81aba30c, 0xaa8181dd, 0xf6f36f81, 0xb57f7fa4, 0xe8b6a572, -0xb0ac3a81, 0x81817413, 0x104de181, 0xef977fcf, 0x2054acbe, 0xa9013b81, 0x4a7f34fe, 0x49747f6d, -0x5ad74c74, 0x0e582cc5, 0xa7ea83c9, 0x7f7f750e, 0x38847f81, 0x41817281, 0x3344debd, 0xd229728c, -0x027f839f, 0x5d9fc4ff, 0xdb1e7f51, 0x439681ca, 0x1b81b581, 0x7f777f9f, 0xd6bfb07f, 0xb050814a, -0x1981648e, 0x2cca7f56, 0x30814ab8, 0xc48143a5, 0x5bab3c8b, 0x7f97249c, 0xf7f09eb9, 0x074aa055, -0xc86bbe54, 0x815ed4b2, 0x7fd0b28f, 0xd7e07470, 0xcf815cc6, 0x7e7f7f63, 0x81dfe09b, 0x4098da7f, -0xc1d5a339, 0x7928937f, 0xa481bf6e, 0x81accdd5, 0x3b9c5cb7, 0x817f81a8, 0xc49b8a56, 0xec817f93, -0xb7a9306f, 0x43555d59, 0x5f815d7f, 0xb79e7fc8, 0xc9d17fa5, 0x7f9999b8, 0x73467f81, 0x38627fd7, -0x7a9138ab, 0xbd46b67f, 0x71b5823e, 0x5c81fbb3, 0x3d508f7b, 0x8173c630, 0xd4816172, 0x3f81d92d, -0xcd6b9d7f, 0x72ee607f, 0x851bd2ce, 0xbc4e7fde, 0x1c6c8193, 0x9252b181, 0xcc217f96, 0x296d7f98, -0x5957ae75, 0x817f14bb, 0xbf7b8191, 0x44d87f81, 0x352a84fa, 0x524a882e, 0xae66ac81, 0xbc7fc592, -0x2cb1dc81, 0x42e56887, 0x7981b76a, 0xa5667333, 0xd2ab7e7f, 0xe37f817c, 0x26817f7a, 0x23570c5a, -0x1a685290, 0x814bb476, 0xf6527bb0, 0x7b810805, 0xe63cd272, 0xc1d97fb5, 0x1e8124d3, 0xd34f157f, -0x367f82a6, 0x14819e1e, 0x39226087, 0x818681da, 0x8121417f, 0x81186358, 0x57e88e9c, 0x077f6e37, -0x96087f7f, 0x9a82c77f, 0x0781c4b8, 0x81217f81, 0xc565447f, 0xab41447f, 0xf7915a1f, 0xe58b5a81, -0xcb817d13, 0x81819181, 0x0d4cc8ee, 0x63b4f36e, 0x587f81b3, 0x47947981, 0xcc7f7f88, 0xa3816781, -0x2581a481, 0xc750aa5c, 0xcd440151, 0x4d684b81, 0xd8a6b50f, 0x4f7fa9b5, 0x3f1b93cf, 0xb58f812e, -0xaacd817f, 0x136d7fa9, 0x81b581b9, 0xb75d7fd5, 0xd29a8133, 0x337f8ec0, 0x75ac901a, 0x0a6d7fb2, -0x2d208186, 0x8186b97f, 0x0cb42af4, 0x03ac9e7f, 0x1167a77f, 0x7f19fad8, 0x2d4781b9, 0xf97f6658, -0x9081bc81, 0x6f7f4087, 0x8e527f8d, 0x6873d688, 0x817fbc88, 0x4b81608a, 0x22814ea0, 0xe97f81c5, -0x10bb3de5, 0x818115ed, 0x421b3081, 0xa17f6e52, 0xf46d7f09, 0xd87f8185, 0x68a79c2b, 0x7f7f837f, -0x4d7f4967, 0xc8507f81, 0xc67881f1, 0x0dad027f, 0xad7f8125, 0xa47fb3aa, 0xc74ceb01, 0x373974a7, -0x4e7f8153, 0xa87c423b, 0x2ad75081, 0x4a817f35, 0x357f5517, 0x55816581, 0xcb7fa97f, 0x7b797f7f, -0x504ee981, 0x7adecc6b, 0xce338197, 0xc49ab9bd, 0xe3877f3e, 0x7f817f81, 0xea3624fa, 0xfd889681, -0xfd7f7ff9, 0xa6732f2f, 0xa81b81e0, 0x817f7fae, 0xbcb4b010, 0xc37f7ff4, 0x9a52819e, 0xc730eaec, -0x437f817f, 0x8865815a, 0x53337f64, 0x2d817f8f, 0xd7e2417f, 0x2b6ec637, 0x3d819d41, 0xe4877f52, -0x26a26a63, 0xdc74a867, 0x71433c4d, 0x94b02e35, 0xd6a155f5, 0x3cd37f73, 0x5c89997f, 0x569e7f03, -0xe0adb53a, 0x49d78e81, 0x9c7f22a4, 0x01385b17, 0x9081db0e, 0x3a8c46a9, 0x1e016448, 0xfebdc287, -0xf072dec5, 0x9f816429, 0x4bb0817f, 0x5a0ac21a, 0xf74ca8aa, 0x82811b7f, 0x1c08bf81, 0x1fe36842, -0xbc7f8181, 0x373b7f21, 0x097f8150, 0x54935b9a, 0x3a7f1381, 0xceb77ff1, 0x55ab4e7f, 0xcb1ab47f, -0x9f17477e, 0x7374b97f, 0xb2512a9d, 0x8148d0d2, 0xc057444f, 0xe94f8162, 0x7f816e40, 0x1da3d14d, -0xb458eb23, 0x7f907a47, 0xc8657f81, 0xc4f36ba1, 0xbc8181e6, 0x81efd081, 0x53607fa6, 0x51368181, -0x32b84fdc, 0x8127b27f, 0xd2247f5c, 0x56f77669, 0xecfdfe9d, 0x697fc681, 0x7f7f2781, 0xdb7f371a, -0x1b8181fb, 0xea78f17f, 0x5a187f7c, 0x7f7c705e, 0x2b58816c, 0x757f607f, 0xc87fc97f, 0xec5b66a6, -0xb89574c0, 0x77ccb739, 0xe1fd2aa7, 0x7f45d8cf, 0x20283a95, 0x5f45909a, 0xe581748f, 0xf97fab7f, -0xc8e0357c, 0x73c7da4b, 0x7f0e812e, 0xba01c67c, 0x0324fb81, 0xea2ee62f, 0x253e88ae, 0x077f81cc, -0x817fc781, 0x94f17fff, 0x0ed6f0f4, 0x84677f8f, 0xb598462a, 0x81a87fec, 0x3dbaa47f, 0xbd62fd81, -0x277f81ae, 0x0f43ab6c, 0x07c1617f, 0xc7bc8181, 0xba2460fa, 0x6d0df181, 0x92dfa27f, 0xf7d1033d, -0x53b71860, 0x81b28146, 0x6564b13a, 0x7fcf0981, 0xf9004e81, 0x10229f55, 0xdb7f7f05, 0x281845aa, -0xca6ddfab, 0x6481d77f, 0x4e4120ab, 0x81006b47, 0x518dce81, 0x907f8145, 0x4d5e7f2a, 0x064076ad, -0xdc1c8e81, 0x354b2545, 0xc8426706, 0x4447b281, 0x21daad30, 0x6d21a202, 0x04249781, 0x19ac7063, -0x3a7f00a0, 0x81f41c2f, 0x523c5b36, 0xb6817f43, 0x3f817f86, 0x811234c1, 0xd77fd8a3, 0xc2f2927f, -0x557f7fb1, 0x41d9e881, 0xeec06dde, 0xe4633caf, 0x3c72fd19, 0x9cffc57f, 0x4b7c8659, 0xcbf6e57c, -0xd9bb7f7f, 0x5fdd819f, 0x69ecd881, 0x7f817f90, 0xe68181f7, 0x10811439, 0x2a7a2c37, 0x66438157, -0xbc634044, 0x3fe98163, 0x81ac8166, 0x8143811d, 0x364f63d5, 0x377f4e81, 0x24755bb8, 0x17adfc5a, -0xdedea8e0, 0x2e6e9e14, 0x0e816188, 0xe56cbe81, 0xb9c85cca, 0x817fb120, 0xae7f8181, 0xe37f7f7f, -0x0827d377, 0xdc7f815d, 0x9a2a5625, 0xb2ab4736, 0x817f2274, 0x817fb29c, 0xdcece2cf, 0x5bddd988, -0xcc1e817f, 0x24793971, 0x40ea214f, 0x326f7e64, 0x1a9e3ed0, 0x268c1a7f, 0x314b8548, 0x0f7f8701, -0x347f7c7f, 0xb9ca13bb, 0x3492187f, 0xc67fa67f, 0x7f49814e, 0xaa7f91d1, 0x18d53577, 0xc88b53a1, -0x20af691f, 0xe6853f81, 0xcf5d08bf, 0x81705981, 0xe30d47f0, 0xa8c17fa5, 0xdb817fb4, 0x12818172, -0x83433d81, 0x4a7ff6e4, 0x327f937b, 0xbb6509d3, 0x2c02fc7f, 0xf3b7feb4, 0x415d60ab, 0x136551d0, -0x0e818181, 0x832eb165, 0x3c7f7f82, 0x817770ae, 0xf9b3a525, 0xddcb3d02, 0x008b6181, 0xdbe55445, -0xec8137cb, 0xf5e8f76c, 0x61815ac9, 0xc8810fb0, 0x35547799, 0x0d81a035, 0x1c3eea42, 0x88d77f96, -0x2948677f, 0x0852db6e, 0x42367f74, 0x0d7f867f, 0x3a7fff81, 0xd1d1d271, 0x02a981e5, 0x2bfd2988, -0xd3818199, 0x4e7f4010, 0x09297fd4, 0x7f816b68, 0xe60a05ca, 0xeb81c97f, 0xa2cf5e81, 0xfd7f7f52, -0x07057f53, 0x8672147f, 0x389bd281, 0x3a855c79, 0x41328181, 0x21fe5e81, 0x073f7fc3, 0x3654f170, -0x24bc7f7f, 0x4f816ee1, 0x67427f7f, 0x8140676d, 0xef53e53d, 0xa48bce41, 0xdb5832d8, 0xf64a58dd, -0x3d3e70ab, 0x53ab4a16, 0x137f2023, 0x74569bad, 0x017f8138, 0x81902bed, 0xbdca8f24, 0xa34d8193, -0x81cf7f90, 0xab43b32b, 0x003f7f49, 0xbf3d4570, 0xbce67f72, 0x7c197fc0, 0x5376d47f, 0xd53d7fa8, -0x7e9bb47f, 0xd72aa0f2, 0xde818138, 0x5cc3a981, 0xd57d9c5d, 0xecb2d6a9, 0xf97f81e4, 0xb67f8f33, -0xb92b577f, 0xc483f97f, 0x469d9481, 0xd4868181, 0x7031e886, 0x95b4ca8f, 0xc6d4bd93, 0x117f227f, -0xb67e7fe9, 0x7fb35540, 0x07d01f81, 0xb4ce9b40, 0x1b118681, 0x7f657bfc, 0x2bbe817f, 0x287f176e, -0x6c96bb02, 0xcfff9e59, 0xec7f647f, 0x817f81b6, 0xabd131be, 0x819081e8, 0x4724b87f, 0x5f817f3e, -0x62b99368, 0x81818110, 0xc99ad3b2, 0x25816734, 0x0702743f, 0xe1b4812f, 0xcb787f81, 0xac864257, -0xcb928181, 0x55e27b81, 0x26f281a4, 0x63898181, 0xbbe1e54a, 0x58d2f881, 0x49e3cc81, 0xf7ea287f, -0xe9827f82, 0x81a69a5c, 0xdd81d292, 0x7f935122, 0xd17fdc3f, 0x321a8fa8, 0xfa819a81, 0x1fdb7f79, -0xc6cf9b09, 0xe181547f, 0x0acacab3, 0x0e7f72ca, 0xf562e081, 0x13d3827f, 0x5692de7f, 0x35b04a5d, -0xdd818e3a, 0x6b7f6160, 0x29303878, 0xc7687fbf, 0x38508173, 0xa6bd37be, 0x0d339881, 0x5e198614, -0x67f745e5, 0x81081a7f, 0xa3c77d84, 0xaadb7f81, 0x578d7ff0, 0x75a0b54e, 0x0d01587f, 0xa1cb624b, -0xf94181b7, 0x819d3a81, 0x37258135, 0x5aa87f3b, 0x0e7f7fd0, 0x5b7f817f, 0xda4ce9b1, 0x40917f81, -0xc57f7f3e, 0x4115b391, 0x627b816f, 0xa8575f49, 0x99ec8124, 0x33db907f, 0x4973c07f, 0xc9b71548, -0xde548177, 0xb608bfcc, 0x1d0787bd, 0xd37f793a, 0xfe847f7f, 0x7f3f4111, 0x3dd5de99, 0xbedb817f, -0x4c65c24d, 0x5d2c813e, 0xd901b37f, 0x974c5c92, 0x7f7f7f7f, 0x812b7f81, 0x0057836f, 0xf0778181, -0x2881f3c5, 0x35147581, 0x817fb31a, 0x7e7ae063, 0xfa1e4184, 0x7f1e787f, 0x529c5123, 0x553b9a81, -0x12de4220, 0x1fa92f8f, 0x4d66a52a, 0x554a2f40, 0xad3f637f, 0xbc81257f, 0x04f8976a, 0x2aa1fc7f, -0x3881b3cb, 0xcfc6ee25, 0xa37f5f60, 0xffddf08e, 0xce817f2a, 0x824f4685, 0x17b8a353, 0xa97f8a81, -0xfc81dc7f, 0x7f81a5b0, 0x26fab529, 0x811085c4, 0x031c5a76, 0x817d7f95, 0x1a8181cc, 0xe6aa0f7f, -0x1e454a7f, 0x1c98818c, 0x2b5ef528, 0x7f2b7f5a, 0x4ec7adbe, 0x6981f15d, 0x7f1d4b23, 0x0f337fb9, -0x1db1b85f, 0xdb7fbe3d, 0x1eb3aff5, 0xba2a7f96, 0xd6a0761a, 0xa97f117f, 0x341781f3, 0x9981817f, -0x56dd7f44, 0x431981b3, 0x115d7f7b, 0x7f5a818b, 0x943248aa, 0xb78a45db, 0xc2046981, 0x7a330a6f, -0xedb7817f, 0x81198df6, 0x29e37f9d, 0x74818143, 0xe5147f86, 0x7fac4869, 0x39e2bb4a, 0x422b983d, -0xdb949bec, 0x2c7f5181, 0xe7539781, 0x7f818ca1, 0x2e815f79, 0x2b199727, 0x28ea3181, 0xe65c7fa5, -0xfda2810a, 0x7b227ff5, 0xc259caa9, 0xdf9e7f4e, 0x1c7fbc49, 0xce892118, 0x083b81e0, 0x7081b06f, -0x0c7f507f, 0x637fae31, 0xf2967f40, 0x810181fa, 0x0878b37f, 0x98817f4d, 0xdaa946cb, 0xae813eb4, -0x67bb97b4, 0xe156b2a5, 0xc97f6dcc, 0xa90bd681, 0x14817f81, 0x7f816058, 0x1d587f76, 0xea425425, -0xd62e4781, 0x477fdca5, 0xcb667f7f, 0x8169daa2, 0x631cc881, 0x1381fb76, 0xf27f817f, 0xb297434b, -0x3b1d7bae, 0x89b8d27f, 0x947f8bbe, 0xbc81d770, 0xf94f0724, 0x3cdc817e, 0xf981817f, 0x1b75245a, -0xab20818c, 0xf2811c81, 0xfc78c27f, 0xb77f0881, 0x838132d7, 0x20818381, 0x127f815a, 0x8e9e267f, -0x1fa87fc5, 0x1da2bf47, 0x0f81939b, 0x118ba016, 0x52c07c6d, 0x697fdd00, 0x0e617f92, 0xab812b56, -0xce754988, 0x5e8181db, 0x22814b35, 0xfda981f5, 0xa981e85b, 0x477f93e0, 0x1e73d681, 0xdc748147, -0x01a1479b, 0x6d4e8164, 0xd37f8b7f, 0xbf6b7f6b, 0xc68110bc, 0x81819156, 0x257f497c, 0xb07fa0c3, -0xcac10d73, 0x39b9284d, 0xad817fd5, 0x7f8a5781, 0xe37f7f2d, 0x7f7fe7d7, 0x186d2c39, 0xc4813181, -0x0ac8a47f, 0x569d4cd2, 0x7f3d597f, 0xb87fbe59, 0x35117742, 0xc18c7fa7, 0xb03bd7ce, 0xd77f6829, -0xec3a7281, 0x81285968, 0xf8a69dd1, 0x81e38181, 0x4e1dbe77, 0x783d4e9e, 0x50bc7f85, 0x4181dd76, -0xa61a4bac, 0x627dd07f, 0xa08168a3, 0xfefdde94, 0xcdc19d05, 0x39817f7f, 0x18d78181, 0x631681cd, -0x91d2e1ac, 0xd2bfce81, 0x01f1817f, 0x810681d0, 0xccc18c5a, 0x7f0b617f, 0x563a8345, 0x917f26e1, -0x87147fad, 0x88161a8c, 0x1481928f, 0x5c96b841, 0x1b7ff206, 0xf1bf4759, 0xc6efdc5b, 0xa1078181, -0xf52b428b, 0x817f7f10, 0xdcd1c062, 0x0c863afa, 0xe26a27b1, 0xbd5a967f, 0xe8047fa4, 0x5be68181, -0xef7b2e81, 0x60f47ff1, 0xf9761c7f, 0x8f297a94, 0x2c81096a, 0x7fc40ec0, 0xbb7fb3b8, 0x4494cae8, -0x5847c916, 0x7d728183, 0xe74d7f81, 0x818d426b, 0x0006ba4d, 0xb4bd9ba6, 0xe00a813e, 0x68032681, -0x18877f81, 0xb46281d3, 0x3381113e, 0x6a7f57f7, 0xe2a7194d, 0xcb7f7fca, 0x62c66981, 0x5181e082, -0x6acdde81, 0xbcbbf27f, 0x3e3ea181, 0x81e6c17f, 0xf854097d, 0x307d58c8, 0x2e9e81a7, 0x93ce81ce, -0xcad4d5a2, 0x1272b081, 0xb84ccf3b, 0x007f9d7f, 0xe294efb0, 0x830c7fb7, 0xca07b17f, 0x3b9a88bc, -0x09350bd4, 0xae007f48, 0x3a6a8181, 0x38777f48, 0xce7f7f12, 0x9781570e, 0x3766817f, 0x4b607f7f, -0xe38c2477, 0x9cc64b35, 0x157f0742, 0x6881d981, 0x53c88c81, 0x9f8974ae, 0xa77f8319, 0xfb527fbc, -0xdf865f22, 0x407f8117, 0x5f5a4c24, 0x14207f77, 0xbfe8e081, 0x667f7f58, 0x31f17f37, 0x467f307f, -0xed7f7f48, 0x2bc96b81, 0x04816572, 0x8137a081, 0xea407b02, 0x7f06814a, 0x097c819a, 0x3ef22003, -0x077d1469, 0x32e06181, 0x1e7fa7de, 0xc7508658, 0x2d58ddad, 0x921d7e79, 0x3af381d7, 0x31b971a9, -0xa7b38de5, 0xf274be04, 0x9690d41d, 0x857f4dff, 0xcf7f5cb0, 0x8117bc7f, 0x1b7f4a91, 0x288181d6, -0x3f4d7b12, 0x7f7f979c, 0x4581b06d, 0x7faf7f81, 0xaf1dac81, 0x4d068bb7, 0x367f50bc, 0xdb7fbd41, -0x4f7f7f38, 0x81ac15f8, 0x2c3725a9, 0x98577f4e, 0xb20f8197, 0x6f816981, 0x26c87aa2, 0x1781c2a1, -0xf5449d24, 0x14cc2651, 0xe33d7f7a, 0x4d7f7ff2, 0x3554512e, 0x25c23b96, 0xde7f8d7f, 0x44bc34b3, -0x2a7f3050, 0x1aec3857, 0xada98181, 0x2644d0ee, 0xcbc2333e, 0x7f8e7f87, 0x4aa03181, 0x11b736b7, -0x3abb2381, 0x2f96817f, 0xe1476381, 0x83ca2b85, 0xfc3281ba, 0xa0d62222, 0xefbe354f, 0xa022be81, -0xd77fb435, 0x17538367, 0xee85d87f, 0xa4a66071, 0xc8402561, 0x818a277f, 0x9d4ddd7f, 0x23bf327f, -0x32ec1b81, 0x8c138d68, 0x237f1a15, 0x4a0e2b7f, 0x5b7f4981, 0xba747f29, 0xa1d37848, 0x0c7f03df, -0x923f1d7f, 0x8faa7c7b, 0x35068194, 0x60d2f465, 0x27606681, 0x7fc37f8a, 0x31bd3bd5, 0xcf58445f, -0xdcce241b, 0x88d9816c, 0xb9b2a7d2, 0x2205817f, 0x01ec81af, 0x4581c8a8, 0xdb0f1b6f, 0xca0628cd, -0xf63881c7, 0x7fa3697f, 0x5246567f, 0xb77f7fa1, 0x297f897f, 0x4cb8c84b, 0xce9e977f, 0xbf811e0a, -0x219d746e, 0x7adcfa81, 0xbcce1a61, 0x28987681, 0xfa7faeeb, 0xdb454581, 0xa5a5919d, 0xbf85a57f, -0x34b68581, 0x925c812d, 0x189a4c7f, 0x3ad03756, 0xf8c97f13, 0x97227f81, 0xfd7f070e, 0x7c7fd41e, -0xfe81b327, 0x81a6627f, 0x0016cf64, 0xded56665, 0xcc5fbd10, 0x81112f30, 0x4c6c877f, 0xefb9b53f, -0x33bc2181, 0x5e797cc7, 0x2a10c047, 0x917a7f81, 0x3a81817f, 0x8197ccbd, 0x73df4f32, 0x264f522b, -0xc1e9528f, 0xbb494681, 0xfbde6eab, 0x4f7f280b, 0x987a7f1d, 0x167f1f7f, 0x0b817f81, 0x8124a87f, -0x927f8181, 0x7f81ad86, 0xc779dc81, 0xd0f681fb, 0xcfd8fb81, 0x19cf4981, 0xb87f4bf5, 0x4893529b, -0x0040eb60, 0x7fc78bae, 0x474455dc, 0x0b7f7f7f, 0xa92f7f70, 0x7f3d9c73, 0x137fc699, 0xb4a3c6fa, -0xcb7f5c1d, 0x9c259c99, 0xdf5183d9, 0xa62181a9, 0x9a273761, 0xa5e8cd8b, 0x41b4bf1b, 0xa9818110, -0xb27f7f7f, 0x0e6bb7c4, 0x2e3e7f90, 0xa4c68172, 0xf73f7f7f, 0x81818164, 0x5299a157, 0x0a297f5c, -0x9a46f024, 0x8178d77f, 0x02818181, 0x8181025c, 0xd96828bb, 0x77644a05, 0xb77e4427, 0x407fa650, -0xab7f7f56, 0xaeeff9fe, 0x2f871d3b, 0xb8d7dd43, 0xe8817f7f, 0x7f4d0a27, 0x036a5b7f, 0xd4a3e67f, -0x9122dd23, 0x627fb09d, 0x055c6534, 0x0689a1b3, 0x4f484a7f, 0x7f77b1e5, 0xc47f9d06, 0xd381c37f, -0x3b819a7f, 0x4381827f, 0xed81817f, 0x95c3917f, 0x1b1e9ff3, 0x4c98cf7a, 0x81927f81, 0x703fd644, -0xed5db0d6, 0x23225674, 0xf95a8187, 0xe6ac7f32, 0x488150e5, 0xf6b5e281, 0x29810449, 0xfdada97f, -0xa6a19781, 0xfe36879a, 0xc96ac845, 0x3bf937bf, 0xa2812172, 0x84203765, 0x5f9e3403, 0x017f6a34, -0x2cc6607f, 0x99877f7b, 0x2ad981d2, 0x81933581, 0xdf81338a, 0xd478056f, 0xfa7fa571, 0x1d818352, -0x17c9db81, 0x9c7f7f52, 0xdf9bd4b1, 0x417f98a5, 0xca5517df, 0xc44b22d0, 0x58727f9e, 0x28817fd5, -0x477f2fb3, 0x8b3f7f59, 0x0940765f, 0xa970b281, 0x0a0a7828, 0x81319e7f, 0x2dc34181, 0x4081668d, -0xe7817fcb, 0x3641753a, 0xc17f3d81, 0xb88154b1, 0x73246eb5, 0xb0db8186, 0x09a2ec6a, 0xd82e2c71, -0x336f7f81, 0xd6817f4e, 0x43814a81, 0xc579811f, 0xc0812803, 0x447fa1e0, 0x81b01b7f, 0x752152b3, -0x4f15817f, 0xf97f61c0, 0xc99bd9b4, 0x2281307f, 0x607f8181, 0x7342b07f, 0x06bd9181, 0xb8b8bac5, -0x3b3ca425, 0x8175e89b, 0xa50d7f4a, 0xbb56b781, 0x817fca6c, 0xac0fa7e8, 0x8e7894b7, 0x1d05cf50, -0xf34f5b7e, 0xb65332e5, 0xc76e9375, 0x66d058a1, 0xe5a09f7f, 0xe493eaa5, 0x05fb81b5, 0x33817f14, -0xee418105, 0x81a16f2c, 0x367fa849, 0x7aedbecc, 0x100f81c4, 0x81b2fb3c, 0xcc7fb181, 0x1b3ff096, -0xd3b03a81, 0x4b815f75, 0x497f9c7f, 0x81015625, 0xa0817f81, 0xb0b8167f, 0x7eb7a3fe, 0xe97f6585, -0x555a877f, 0x4b7f8181, 0x12a95e4a, 0xcb6f5afe, 0xd87b5fad, 0xbe655fa0, 0x8b81300b, 0xccb26381, -0x39868173, 0xd6817fa0, 0xcf684e81, 0x7f3bae43, 0xfd8c20a8, 0xcfa0a31f, 0xc0307f81, 0x4e7f5d84, -0xeb941e81, 0x6f77d070, 0xfa0b7f7f, 0x3cb88193, 0xf6818163, 0x3d5f8fbf, 0x40c4c73b, 0x4b7f4e4b, -0xae968181, 0x818181b2, 0x81148181, 0x6b325381, 0xeae5582e, 0x7630307f, 0x1c0f6ba9, 0xa54a0457, -0xd37fc693, 0x2345817f, 0xe44f1e7f, 0x3e4cc9cc, 0x3081babf, 0x817f45c7, 0x5265e57f, 0x427f81ca, -0xe451817f, 0x8190b7de, 0xf0718981, 0x7f9ad381, 0xb9645da5, 0x7f7bed3e, 0x5ce37af9, 0x307f4ecb, -0x0a7f8135, 0x81ffa7a0, 0x534fa1a5, 0x7f42d641, 0x0e501e61, 0x7f7f6edc, 0xc859c081, 0x377f85f7, -0x0df9ab94, 0x817f7f7f, 0xfe7f7f81, 0xc1327ff4, 0xe84c842c, 0x7f1e5bc4, 0x1da77cf1, 0x1e817f53, -0x5f9ab07f, 0x86209e4a, 0x204e81cb, 0x33c9928d, 0x275a2d8d, 0x7f810281, 0xfe7ff7ba, 0xfab77fea, -0x658145e5, 0x73d57fd6, 0x01ec097f, 0x6d83207f, 0x49810cb5, 0xb5d9ce39, 0xf9e0436a, 0x629c81ed, -0x48cf2c8c, 0x7fe37f7d, 0x5b257d81, 0x765f50b6, 0x2cc98403, 0x817fbebf, 0x127114c7, 0x347f287f, -0xd2d72990, 0x81099d9a, 0x8143cac5, 0x8c452fc2, 0xd27f8f6e, 0x61957f25, 0xbc6fc54d, 0xce81f31f, -0xd381787f, 0xac0e5156, 0xf081afc4, 0xb47f6f2f, 0xef811a81, 0x015ee99c, 0xd46de9d9, 0x30655a6d, -0x09b2b87e, 0xaf13753a, 0xc6dd2a7d, 0xb9bd8190, 0x81537f7f, 0x669ff8ed, 0x5b810c81, 0x42e5a566, -0x0c4174cd, 0xbdf9b7bc, 0x1c118e65, 0xe28f9b2a, 0x8c207f3a, 0x1e7f7ff4, 0xd6b57f1c, 0xf0131edf, -0x38c9a381, 0x7f40817f, 0xb735817d, 0xa1a864de, 0xd99cbf57, 0x811a81f5, 0xb381e381, 0xe88e7fb6, -0xfb4a5b89, 0x7fc006a3, 0x1c81653d, 0xbceaa09c, 0x8d7799d7, 0x4b407a81, 0xdc81bca1, 0x3437d76c, -0xd79fe5c9, 0xd9adeea8, 0x163e8164, 0x2cc1b281, 0x3e81e9f1, 0x936504c9, 0x047f6f7f, 0xf981a776, -0x203b2d68, 0x81dde8d1, 0x13e9e9bd, 0xe04108a3, 0x50304281, 0x486d7fb7, 0xbbff81ce, 0x31d43aa3, -0x21813c7f, 0x81c8f989, 0x7f481024, 0x0a979b6a, 0x010081d7, 0x7792e641, 0x0654d37f, 0xa53da946, -0x96c781d2, 0x41524ca6, 0x2ab2d581, 0x1c65bb79, 0xaaa494af, 0x81e09681, 0x3d7facf5, 0x04c3818d, -0x2c1461c7, 0x788581d9, 0x1d3f2081, 0x49dfaec2, 0xfdf07f61, 0x40396d32, 0xc8835fbf, 0x7fb19f54, -0x2fcc8142, 0xe7dcb4e1, 0x73c3a807, 0x7fc68137, 0x061e81ac, 0x81c70c7f, 0x1d817f73, 0xfdbace27, -0xa5fa4081, 0x9b5575ca, 0xee81cc4b, 0xe85a7f53, 0x8daff2e0, 0xd1d1067b, 0x98ec3662, 0xa5818253, -0xf8266d26, 0x38da26ac, 0x3f98912e, 0x4a10f144, 0xd845a345, 0x811bd786, 0x4b137f7f, 0x3427fa81, -0xe981eb9f, 0x8f4ce6e7, 0x277f8181, 0xb0a5b03b, 0xd0633788, 0x4781b17f, 0xb27f3ee7, 0xd37f30b6, -0x21c3a15f, 0x0492a4d0, 0x097a6c7f, 0x047f1c81, 0x994b7f81, 0x818ea981, 0xd46d7fca, 0x2b8a5381, -0x9d424d91, 0x814d7f81, 0x32aa367f, 0x28ff1b73, 0xbea1dbde, 0x76db7f86, 0x248a8d37, 0x294b8136, -0x6e8142d6, 0xec65687f, 0x66297f57, 0xdfb563b3, 0xd352ee79, 0x0689d45c, 0xc58123cb, 0x0b62bf8c, -0x53c6d80b, 0x7fbc9773, 0xe4596e21, 0x2584812f, 0x1793b781, 0xaa815927, 0xb8659035, 0xccbe2281, -0x5eabb4c9, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0xb339946b, 0xd7497238, 0xc36e8181, 0xd0816d3e, 0x7f7f2681, 0x6709bf21, 0x92e3bf81, 0xe54358cc, -0x6bb5a661, 0x3a7f81f9, 0x8140f0fb, 0xc5a67f1c, 0x8d3381a5, 0x817f81c4, 0x72817fd5, 0xa72c76fd, -0x68dc8b11, 0x9b5f4098, 0xc0f43965, 0x7f0ecf02, 0x7cfdd720, 0xe1a0ac15, 0x087fc3c6, 0x81b66e6a, -0x410a893b, 0x81c491f4, 0x81d87033, 0x2056562a, 0x7f526cd8, 0x817fe90f, 0x81f78178, 0x81d93134, -0x3699e0a2, 0x7fa181c9, 0x81f64081, 0x8f816b2e, 0x816ece59, 0xd548fd2c, 0xc4ee3919, 0x6d847f16, -0x81e423c5, 0xfade4a40, 0x9e29eeb9, 0x7fe450f5, 0x5207177f, 0xf17f710b, 0x8cf291ad, 0xd09f9cf0, -0x7f022d20, 0xb7ea81c6, 0xbb89cfa5, 0x1c6fd006, 0x7f8481dd, 0x81020914, 0xb14c81e9, 0x4d9b4f08, -0x7f6064c8, 0x817f7fcc, 0x6b9819e9, 0xb253e7df, 0x724368fa, 0x816fe408, 0x7481a204, 0x0e6fec58, -0x70449617, 0xf5a1da3f, 0x7f446e7f, 0x1005abce, 0x38664981, 0x8240472c, 0x10f52409, 0x818186dc, -0xf7810be2, 0x9c2ad304, 0x81817f62, 0xcc40a43d, 0x5e6b81e7, 0x7ff0e2fb, 0x812a7f7f, 0xe3017f51, -0x817f24dc, 0x85c49997, 0x863c7024, 0x7fc0ce3b, 0x637f8c81, 0x814c9dbe, 0x8ea08156, 0x2cf47f9f, -0x5b55a9b1, 0x107d7546, 0xcd0381b9, 0xd8617f42, 0x7f81b8f1, 0xb506abd3, 0x745f2b2b, 0x7f81b7d5, -0xbf7fdb20, 0x1ca3a610, 0x7fe5e9af, 0x20b37f08, 0x810e6f81, 0x9b7fe6ad, 0x1aa35d81, 0x46032cc7, -0xad7f7f77, 0x8bd48245, 0x3dffaa81, 0x507f91d9, 0x907f9a25, 0x404b81b7, 0xc67f7f97, 0xb1eae864, -0xed2a18c5, 0x2ea85ef3, 0x8153434e, 0x816daaf3, 0x7f03ad67, 0xa0ec264e, 0x640ca1e5, 0xf0818f2b, -0xcbd27ff7, 0xa6a39206, 0x4ca811b9, 0x4c57a068, 0x8647e4c9, 0x7f438ad2, 0x7f945029, 0xc168e72c, -0x7fed4781, 0x81f706cd, 0x62810667, 0x177f7f32, 0xb105d09c, 0x81fa7f16, 0x7f11fa53, 0xc8a6430b, -0xececbb81, 0xe82644a6, 0x3e82f381, 0x28817feb, 0x90c18135, 0xd0f5810f, 0x507f0ba3, 0xfeb38808, -0x8e6c66ea, 0x70a0c4c8, 0x8146912c, 0xb8e01cb1, 0x2b817f51, 0x64818207, 0x9f3a4e81, 0x7f4aece1, -0x84aeafb6, 0xa17f8188, 0x9a7fe759, 0x1cbf5681, 0xad7f6bad, 0x818eebdf, 0x438181e9, 0xa7d07f22, -0x75dbd318, 0x81817f3f, 0x5457bd92, 0x4b204ffc, 0x7f1c637f, 0x8b4c7ffe, 0xa4d97fe8, 0x6194ca37, -0xb06c7f06, 0xad2f1ac0, 0xaef07f7f, 0x15818101, 0x22bf8d7f, 0x597f35cd, 0xb155ab0c, 0xc2838b0f, -0x0f81f4e6, 0x181f7f81, 0x31e1817f, 0x6a2846c0, 0xede8048e, 0x2952c3e3, 0x09187fda, 0xce411cce, -0xbbc197b5, 0x8181464a, 0x161922d0, 0xc37f292f, 0xbd736439, 0xc881b6fb, 0x81ba557f, 0x9da521f0, -0x3e7f52dc, 0x3b3a813c, 0x7f544bc3, 0x46b1b3fc, 0xbeb18e34, 0x418156e1, 0xab22e318, 0x7fbe66e3, -0x2237bfb9, 0x010081be, 0xc159b8df, 0xf449b264, 0x017f9e82, 0x9dbd7ff1, 0x09c7cbd7, 0x81bc537f, -0x817fe1c7, 0x7f177f60, 0x7474bcdf, 0x3c7f6f70, 0x7f7f987f, 0x81812ecc, 0xca783f94, 0x64cc4da9, -0xa0ba1d0a, 0x7aeec524, 0x43bb6b81, 0x1a338981, 0x206be419, 0x65819d5a, 0x7f81d73f, 0x81a67f36, -0x22810442, 0x7fd4cef9, 0x6067ad85, 0xd6d17f30, 0xea7f8166, 0x457f7f84, 0x817f1bc8, 0x6b86be00, -0x7f8bc555, 0x519d5bfa, 0xd07f97e4, 0x505c81d4, 0xf1eb8115, 0x72bdd002, 0x9da57f77, 0x817f12cc, -0x81c03652, 0x441872fb, 0x554bdf67, 0x2e46f0d1, 0x81817f8d, 0x7ff5ce55, 0xd2ded97f, 0x817f67af, -0x0539c336, 0xa37f2f7f, 0x8150637f, 0x8156d068, 0x827fbda5, 0x9f176b2a, 0x81878c0d, 0x81117f07, -0xc0d15559, 0x869c81c4, 0x7fa498da, 0x46d5d102, 0x81f7a581, 0x816eca47, 0x67ad9d95, 0xccb49c2e, -0x297c5440, 0x817f7cda, 0x9f55bd08, 0x2b7fc490, 0x817f817f, 0x377a8158, 0x91b5bf7f, 0xc87f4f21, -0x977fc1d9, 0x7f3088f4, 0xe938b6ca, 0x41707434, 0x81a27fd5, 0xcf818116, 0x817f887f, 0x09cf3bc9, -0x814edf19, 0x46206509, 0x34a36c81, 0x313fc7da, 0x92f34a81, 0x21e942d8, 0x365c16d1, 0x68907ff1, -0xcb8190e3, 0x5e7f7fa3, 0x6fb78c98, 0xa1444250, 0x812bb37f, 0x83a26f0d, 0x739bab07, 0xcb2cea1d, -0x668174ef, 0x288b8965, 0x95849a7f, 0xdc0981b0, 0xd875297f, 0x8153d5b0, 0x9d81e6dd, 0xae81d259, -0xd981813d, 0x7f64ed35, 0x1f459b0f, 0xb8ebe4e5, 0x72812e81, 0x81909b54, 0x02f54fb3, 0xa87281f4, -0x7f6381cc, 0x7f3cab5b, 0xb1958152, 0x814b9bfa, 0x81312b5e, 0xc2977f23, 0x347fbb97, 0x3b057fe6, -0x40208144, 0x7f817fad, 0x54cb9deb, 0x37b34a28, 0x81781b81, 0x7f1b8130, 0x81e194f1, 0x882b7f1f, -0x81dfc90a, 0xe4a97fa6, 0x9e81ab40, 0x971c2535, 0x5a7f7f3d, 0x47708116, 0xab778160, 0x81ac57e3, -0xc2854dec, 0x81ea81a1, 0x8b347f7f, 0xe981d130, 0x93c70917, 0x817f812d, 0x81925016, 0x7f813953, -0x52a5a5fc, 0x7a33d8e1, 0xcbd80281, 0x79df8101, 0x797afc87, 0x7581bbf0, 0x81567f94, 0x472ad4cd, -0x23e49434, 0x4c7ffc03, 0x41b0717f, 0xcc67b7bc, 0x7f7f48bd, 0x8c1c81b9, 0x3a460d72, 0x9eb5fa34, -0x03530615, 0x6c7f7754, 0x818167d3, 0x7fc22100, 0x7f3da881, 0xa24e7f61, 0x321bb411, 0xd981c827, -0x76e8814a, 0x69ca13fb, 0x1390b881, 0xb1d08157, 0x7f4669a2, 0x7f237f13, 0x30268178, 0x0eb87f34, -0xee1aaa30, 0x816596e1, 0x31813181, 0x88888243, 0x817de70e, 0x84811713, 0xd74d7f52, 0x06b17f35, -0xed347f1e, 0x66d66058, 0x7f817fee, 0x035edde8, 0x819b18a6, 0x8e8198ee, 0x817fb5f5, 0x311e442b, -0x957f941d, 0x4e6aa649, 0x7f677f41, 0x8d876acb, 0x7e7bb58f, 0x44c27fce, 0x6f39ec5e, 0x7f7f81d2, -0xd43ba60f, 0x488150c8, 0x8181e9e8, 0xfe46ec02, 0xa2cc7fd8, 0x7f810781, 0x7f30c356, 0x22c97fc5, -0xbcc97f40, 0xf2b2ce1e, 0x7b59537f, 0x46d994ea, 0x4ae2273a, 0x7f36d92d, 0x818ad281, 0xbf7f2b7f, -0x8181abf8, 0x924f4eb0, 0xa62c81b6, 0x812b99aa, 0x447f817f, 0x2c7f5746, 0x0859b34d, 0x83e652db, -0x7fc781ca, 0x819e5cfe, 0x55c5d07f, 0xb4bb3dff, 0xc24b8178, 0x93d28123, 0x15e63a7f, 0x7fc87f40, -0x812fd94c, 0x991b8170, 0xb13593c6, 0x3b9a5119, 0x3b752581, 0x20b89686, 0xcac17f7f, 0x81237f6f, -0x99ec643e, 0x02813100, 0x81124724, 0x3455436b, 0x8155cc81, 0x68136028, 0x81517f5d, 0xc57481f6, -0xe4c88159, 0x81fba227, 0xaa814381, 0xb3818ebc, 0x457f8b51, 0x118181a1, 0x575b7fe7, 0x53571239, -0xa7d35d43, 0x4b577f89, 0x1f817fc2, 0x6c7f9609, 0x9714813b, 0x81d723b6, 0x6c7f377f, 0xa3cf6826, -0x08b27f45, 0xbf7f8184, 0x814de5a0, 0x8181a2fd, 0x167f3c70, 0x8a7fa9e4, 0x65ac4b7f, 0x7fd367c5, -0x81112d7f, 0x8170811d, 0x817f589e, 0x8b7f7f44, 0xba2ab081, 0x527f5bf6, 0x2faad6e3, 0xc335a82e, -0xb862c003, 0x81715776, 0x5081817f, 0xdd7585c0, 0xb7989d7c, 0x367f81b1, 0xa0818129, 0xc6f37f55, -0x5006be1d, 0x817faac3, 0x7e667f81, 0xaf2c7f99, 0x347f897f, 0x2bb1aac8, 0x8112eee8, 0x7f5c62de, -0x007f14d1, 0xa1a2140b, 0x95446419, 0x5e7fc82a, 0x7a7ff07f, 0x81fe7d31, 0x010a8149, 0x7f3e7fb6, -0x397f81ae, 0x7b7f7fba, 0x797f5981, 0x7f7f170a, 0xb9cf087f, 0x0be6cb28, 0xdd97cf4e, 0x92520625, -0x817f3ae4, 0x6c81c381, 0x440cc5ae, 0x2b7fb8b7, 0xe94a2081, 0x81967f4a, 0x7f817f9d, 0x7f81a7a1, -0x815b52cd, 0xd59d57f6, 0x899e827f, 0x7f7f9aa0, 0x52819e7f, 0xda3a2223, 0x8b81073c, 0x818132d0, -0x55638800, 0x9804bcb5, 0xc3810a7f, 0x6ddab6e3, 0x7fcae34b, 0x7f814a2d, 0xea7fed91, 0x3b9bb0d9, -0x87d97f1e, 0x16535739, 0xcc2f7f81, 0x7f98813a, 0x5873bbe6, 0x241781f3, 0xbcc7cb33, 0x7ff69847, -0x8d11c0dd, 0x9ac9d787, 0x66cff992, 0x7f7fc312, 0xaa4fe681, 0x39967f26, 0x201c7f7f, 0x9a7f4849, -0x5768a814, 0x814d731b, 0x81917f81, 0x6eea7d7f, 0xad7f65fe, 0x3d3e81d3, 0xae672981, 0x7f1c81a0, -0x9881053a, 0x81a16307, 0xf64c4063, 0xbc7b97d9, 0xa29dc0a1, 0x8161189c, 0x7478b3db, 0x87b330e1, -0x817f0598, 0xcf422b0b, 0xc29b7ac8, 0xc2817faf, 0x8185581c, 0x81d0b675, 0xc93f7fa9, 0x814e3a02, -0x815d6511, 0x5d81075f, 0xd768c13e, 0x89815437, 0xac810d85, 0x1a7fa5e9, 0x14a6bb81, 0x54531dfd, -0x81dafd24, 0x978133dd, 0x818130be, 0xb67f5bb3, 0x2c7f4179, 0x81b281f4, 0xf3a463fb, 0xda36c4d4, -0xb17f811d, 0x37ca75f1, 0x53257f7f, 0x3ef0208b, 0xdc71817f, 0x978181ef, 0x7f81d17f, 0x1197810f, -0x277f7f47, 0x7ff6b1b0, 0x4562fca6, 0x725d89e3, 0x888197cf, 0x05477fd3, 0x4988077f, 0x81cbb5d9, -0x047fcaa8, 0xdb7f7fc9, 0x81ccfe5f, 0xd91643ff, 0x7f3f7f7f, 0x03815ed4, 0x697c7f81, 0x815b814d, -0x287f0d32, 0x7881a041, 0x247f95f4, 0xc87048e8, 0x3d815e7f, 0x71ba7f0b, 0x50815075, 0x7e53dc30, -0x3f7755fe, 0x1d032571, 0x818cbaf0, 0xbda97f50, 0x7ffc0aad, 0xbf457f42, 0x66b48f81, 0x072c3f1c, -0x433d9cfc, 0x71077f76, 0xac2d5564, 0xdc523811, 0x7f54a538, 0x7f707f00, 0x8c10a6f1, 0xf4a581d3, -0xae875d1d, 0xd37f9747, 0x8124b869, 0x81a17745, 0x61bb8b7f, 0x227f8129, 0xa77fc381, 0x997f8119, -0x817f812b, 0x81a78836, 0xdd557fc6, 0x907f6418, 0xbfa9accd, 0x4f815762, 0x97818181, 0xa0524fa6, -0x815b5721, 0xc77f7f7f, 0x7f725efb, 0x437f614e, 0x81f15c6f, 0x7fb77f28, 0x473f7a1c, 0x7f81d71b, -0x7f5133e9, 0x7cd17f32, 0xfb7572e3, 0x16c35e62, 0xc961a649, 0xdec47c37, 0x6d442844, 0x386b4616, -0x9583c437, 0x81d57fae, 0x8114357f, 0x818f9db4, 0x7ff181d7, 0x773fb601, 0x4032fb29, 0x8613b71f, -0x7f81b3f4, 0x1256f605, 0x297f817f, 0x9a7f2996, 0x5d81b87f, 0xc8907ffd, 0x817f7f35, 0xf6719ac7, -0x7b7f523d, 0x18d8ca2e, 0x2681b97f, 0xc02a810d, 0x34cda181, 0x32e081bc, 0x016f7f08, 0x461bdaec, -0x04330900, 0x633f61ac, 0xa3815204, 0xa534dda9, 0x7f81814f, 0x91a66329, 0x7f51aacd, 0x7ff681a7, -0xabe476e8, 0xb57f9cae, 0x177f27c0, 0x7f2f8b0a, 0x1281a9ba, 0xd991af49, 0xea527f82, 0x9be09d46, -0x28b2a2bc, 0x81c8a1d6, 0x5e1f4e71, 0x817f812e, 0x28b981cc, 0xb071cf04, 0x82cb8139, 0x81608181, -0x819381ae, 0x818f90c8, 0x817f64c6, 0xd169c7c9, 0x8f548381, 0x87f7b03e, 0x6657817f, 0x81be8102, -0x0d078c5f, 0x7ff97fd4, 0x7f814981, 0xb3bb7faf, 0x37c3dd6b, 0x4c6930b7, 0xb56ba479, 0xfc82520f, -0x3494f934, 0xa2016c53, 0xc513eeba, 0x8c283bcf, 0x7fa6047f, 0x54319236, 0x42b2c19c, 0xf965c947, -0x60777fca, 0x02767f47, 0x4921bb04, 0x81818fa9, 0x8eab7f5d, 0x81f4aa14, 0x1abdf97f, 0xbdaa220d, -0xac368139, 0xddb1c212, 0x81d9fd99, 0x90b77f3f, 0x029ec8ca, 0x7f93d9db, 0x8563627f, 0xc5b72d52, -0x2e6eacc0, 0x7f66815b, 0x50db375b, 0x4529813f, 0x7f8d817f, 0x44486f52, 0xbcd64c9a, 0x7fd2bf33, -0x43507f58, 0x7281a4d3, 0x7ca82149, 0x29817fd0, 0x653544b9, 0x88c681a1, 0xd93c2bfe, 0x530835cf, -0x5be26556, 0x7fb37fd1, 0x81e68174, 0xe88c0c42, 0xb63b817f, 0x394a81c9, 0x407f8107, 0x747f1f52, -0x91816dcf, 0x5f818161, 0x8514aebe, 0x7f496bac, 0x5e818181, 0xe8e358ee, 0xae1a7f0b, 0xa4c97f05, -0x77a77f52, 0x818160fd, 0x6bab7f81, 0xcec7e121, 0xf4810196, 0x4a7f68e3, 0xe56d5a7d, 0x813d2c6b, -0x7d0b7ff5, 0x7bbd6760, 0x67812b81, 0x188197d7, 0x8146057f, 0x811eff1d, 0x818ecc4d, 0x4a786245, -0x72593331, 0x2e81556a, 0x66aad481, 0x94818128, 0xde89ba81, 0x4df07227, 0x7f73ff8f, 0x7f44b981, -0x9bf9e707, 0x46811bff, 0x85a96a36, 0xc13b7f15, 0x6670ba65, 0x81fcefee, 0xae8187b9, 0x73c3baa9, -0x819e8123, 0x9cfbc6aa, 0x7f89c73a, 0x7fde9812, 0x97136581, 0xc38181e6, 0x81de9c0c, 0x4994ab0e, -0x30977f06, 0x59dda72a, 0xc9f87fd1, 0x8186b4d7, 0xba86de81, 0x98a24c3b, 0x12157f3f, 0xd7674b1d, -0x81816042, 0x8da8926e, 0x397f81f6, 0x3dd281b1, 0x7f6570ba, 0x7f875412, 0xd74f5be9, 0xab81f207, -0x7feaa863, 0xab81da0d, 0x7ae79023, 0x357f8111, 0x654a468e, 0x521c2306, 0x2f817f37, 0xdb818a41, -0x50b5b30c, 0x71817fdc, 0x7f7f7f04, 0xb13471fa, 0xd1843f7f, 0xb700ece6, 0x109064ea, 0x989b4b03, -0x27556fd8, 0x5ecee700, 0x5f5a2281, 0xa81c81dd, 0xac54b6bb, 0xe60f1ae8, 0x139dc4dc, 0x22818109, -0x2c7fc74f, 0xa69cf331, 0x9d272281, 0x7f9a6da8, 0xb1bb8f45, 0x81815a6e, 0x8315517b, 0x638181f0, -0x273db266, 0x90777f18, 0x047d763a, 0xbdf50a4e, 0x7f5f5c12, 0x817f7f53, 0xcb177385, 0xb2ca7f22, -0x818eaa17, 0x815d4c81, 0xa67fc281, 0x7fd856eb, 0x01becb84, 0xa8e2685d, 0x7fadbe7f, 0x1b7f6a05, -0xef47f495, 0x817f1b1b, 0x8c8d0b81, 0x57b9a5d4, 0xdc298159, 0x5e81a7e2, 0x81467f5b, 0x370f6df0, -0xc49c30a1, 0x7a545710, 0x974b81ff, 0x458c814a, 0x237f17dd, 0x427fb6da, 0x1a7fe5de, 0x817f8121, -0x817f1c96, 0x9c817f90, 0x0e7fd365, 0x818aa15b, 0x7fd302f2, 0xdb7c138e, 0x7fe68181, 0xbf818112, -0x7f2e7fc8, 0x81728101, 0x6482d830, 0x59e24b0b, 0x9b67c284, 0x6e811018, 0x81a42c32, 0xd87a4da2, -0x817f2d41, 0x3e2fbce2, 0xd1d44623, 0x7464b44c, 0xcc255f95, 0x56c93b38, 0xa87f1491, 0x04819c5c, -0x7f457fd8, 0x8d6bb866, 0x819c8181, 0xbc118166, 0x3d4c2a5f, 0x7a6d51fe, 0x79065067, 0x8181d1fb, -0xff6f2b08, 0xf5be7f35, 0x9fa567f5, 0xabb581b4, 0x81819a5e, 0x7f8187c5, 0xaa7f5669, 0xdf526044, -0x7f6ea5f5, 0x7f3a68c7, 0x4feb7fb5, 0x627f2850, 0x39f49181, 0x71ec22ea, 0xc17f4c44, 0x56f4db23, -0x7f08cc95, 0x977fde95, 0x7f4f7f81, 0x81e07f1c, 0x5e7c7fe9, 0x1c3534ce, 0x7f907f2b, 0x7f83418b, -0xeb81daec, 0xa6fc892a, 0x757f7ffb, 0x6281cc2c, 0xb826cecb, 0xc7810a2e, 0x60d1906e, 0x7f8175ed, -0xd085cb36, 0x88c4811a, 0x5e3e707f, 0xaba57fff, 0x099c127a, 0xbac67fb7, 0xa9817d82, 0x4f6c7faf, -0x43d17a0b, 0x92a13dc8, 0x81995d8d, 0xab7f90fd, 0x5f1f8189, 0x767f8101, 0xb7caa2bc, 0x7f8177cd, -0xe0655857, 0x81cfebeb, 0x81af6fc0, 0x57ac6dae, 0x437f8176, 0x513c60fb, 0x9ef3c081, 0x78d0d12e, -0xa40c7f0e, 0x438101c0, 0x81816405, 0x6f527f04, 0x8d0fa47f, 0x6d7fbb7f, 0x39187f74, 0x3c7f5f06, -0x677f7fdc, 0x8114250d, 0xe08373c7, 0x9c7f7dd8, 0x816341a3, 0xdf7f073e, 0x7f818174, 0xca84e8ff, -0xd6ff70ef, 0x7fa1a3c7, 0x7f7f8148, 0x81de7fa2, 0x4d323671, 0x5aaafbff, 0x05ac7f7f, 0xd58102e8, -0xad6c45e4, 0x81677f27, 0x818132ce, 0x7fa55a1c, 0x553029ce, 0x81a47f06, 0x81ca6189, 0x5cd581af, -0x70f34733, 0x676d431f, 0x81387f66, 0xef916df0, 0x72099950, 0x867f81fe, 0xaa7f657f, 0xd7521bef, -0x81d573c6, 0x7f76bcd6, 0xaba4c10b, 0xe394b7d7, 0x82579781, 0x88f5715a, 0xf7815cda, 0x65817727, -0xeab07f22, 0xbb5f7c40, 0xc0a48139, 0x95442a2d, 0x857f7d81, 0xcd7a81ee, 0x7971819e, 0x3a31f0fe, -0x537f6181, 0xc307bed6, 0x8936627f, 0x98b18136, 0xd07c817f, 0x7f7f8126, 0x133a607f, 0x98d40015, -0x368a8123, 0xe181501d, 0xc9817681, 0xa27b2e00, 0x47dd81e1, 0x0e7f81d3, 0xf3287fce, 0x7f3400c9, -0x8d65c745, 0x4c8148c4, 0x21817f7f, 0x81ac0af0, 0x4462c1fa, 0xa99e4e8e, 0x7f153ad8, 0x8168bb47, -0x8370e19d, 0x7f3281ca, 0xf2437283, 0x667f279d, 0x9cb4c17f, 0xde814315, 0x72d3a17f, 0xac113b66, -0x6c13abef, 0x7f816cb5, 0xc8c7c37f, 0xa7d1862e, 0x8b7fb87f, 0x9dd9a384, 0xb69b22f0, 0x157f710a, -0x9007c13f, 0x4518caf0, 0x836c4246, 0x03f981d1, 0x817f7f7f, 0x4581b92f, 0xb4718193, 0xa8815e05, -0x437f81fe, 0x52817fdd, 0xb1477f54, 0xc12e3cba, 0x7f81815f, 0x4e737f32, 0x817fc141, 0xa67f7f58, -0xd19dab37, 0x8b9eb14b, 0x7fe8be30, 0x905d7fba, 0x16ae520b, 0x81015d10, 0x71812450, 0x1de37f1b, -0x811fa6af, 0xdf77b8e9, 0x647ff1bf, 0x17be7fbb, 0x817f6224, 0x8115e99f, 0x7fca7f7f, 0xd48f0fa2, -0xda7fc4ac, 0x10649756, 0x2f89af26, 0xdb5f3ec4, 0x817fde7f, 0xbde94df1, 0x9a707fb7, 0x7f7a656b, -0xfad88c3f, 0x7ccc7f5c, 0x7f8cc477, 0x7fc26452, 0x28c7812f, 0x85b7a1ab, 0x818181ad, 0x404ce719, -0x540fe3e5, 0x705bf0fd, 0x6206a54a, 0x89486861, 0x75e25f81, 0x3c9bc93d, 0x3457c36d, 0x57ab2f25, -0x3cd9bd13, 0x81769cbe, 0x87557fae, 0x025c7109, 0x05457f64, 0x5f427f13, 0x5c7f26be, 0xb9818130, -0x34e63305, 0x8a81ebcd, 0x673326ba, 0x05647ff7, 0x818b8181, 0x8c81782a, 0x4bc0b30f, 0x759749c7, -0x399e99f6, 0x7fdb4313, 0x9c7f5cae, 0x6cc2a611, 0x811dab81, 0x7f7f413b, 0x4fb37081, 0x818c8164, -0xac4c01d8, 0x1f63813e, 0x81db7881, 0x8194404b, 0xcc9bc55f, 0x542900eb, 0x87ff34c5, 0x507f7fa2, -0x7fd97f03, 0x79e428e3, 0x2f7f7c6c, 0x57813f13, 0x7f7f817a, 0x61c40926, 0x68a9457f, 0x63ea9f2f, -0xea81a8ec, 0xfd81301c, 0x81cd8181, 0x812cf7fc, 0xc996b697, 0x81895df8, 0x8d4ae3ca, 0x4c5de834, -0x81643d19, 0x202babce, 0x55a89081, 0x64ba81f9, 0x7481db7f, 0xa0eba6bf, 0x81c12ee3, 0x8181a75d, -0xc8e9939c, 0x0981295a, 0xf22e527f, 0x817f3314, 0xc4f17f5e, 0x8c83651a, 0x7f74a17d, 0xbdd28405, -0xb6bc4795, 0x388c7cdd, 0x957f7f7f, 0x1db7ec29, 0x68f59c45, 0x8142eaa1, 0x81f0b543, 0xa48163fe, -0x81d08134, 0x7d673f5d, 0x8ecdcf94, 0x6e56195a, 0x7f222687, 0x7fd8fb10, 0x81aa977b, 0x22014258, -0xd541be81, 0x817f62fb, 0x707fea79, 0x7f817f60, 0x4b7f3c7f, 0x60a4032c, 0x1c68c2ae, 0x7fc27f19, -0xd5a55cd4, 0x09a651f4, 0xb5447f7f, 0x7f815bfe, 0xe681d381, 0x1781f900, 0x8eb6b0d7, 0x1d90fdf8, -0x528147c4, 0x816b7f46, 0x7f6381c3, 0xd5d2088b, 0xcce4ae52, 0xdf4ec304, 0x967e5e1f, 0x567f1439, -0x317f810a, 0x815f814b, 0xe13ee67f, 0x7f8177a3, 0xac69c42a, 0x7f5837e7, 0x61b481c8, 0x777f812f, -0xcea38116, 0x6b6b7f37, 0x8feac838, 0xf9457f3c, 0xe5107f74, 0xcc957f56, 0xa3ab7f81, 0x81817f6e, -0xc5817f2b, 0x197d0d99, 0x7ad0c84a, 0x81ada865, 0x81b31c81, 0xee7f9b54, 0x815a3406, 0x3f617fce, -0x3d4db8c2, 0x5ac39e72, 0xd390812f, 0x27c6ede7, 0x6f69d981, 0x2981f141, 0x7faa2681, 0x787f6668, -0xc24ec00e, 0x7f008142, 0xfa811aad, 0x2d567fb0, 0x5adb7f65, 0x8a864fc5, 0x6d817f85, 0x307f7f1f, -0x5c817f47, 0xcc7f43b6, 0x9bb08159, 0x496f7f2f, 0x41e383c2, 0x4e7f7f88, 0x71ce63e4, 0xe07f4c7f, -0x857c58ad, 0x8599641d, 0x655c687f, 0x97a64fde, 0xdd42707f, 0x29ced6b6, 0xdf25c153, 0x7f047fbb, -0x7c5f462e, 0x61d08548, 0x7f7fab7f, 0x48b1ecb0, 0x93c63349, 0x039c7fe3, 0x817fce1a, 0x29bb7112, -0x7f3bbaf0, 0x81818d2f, 0x7f5b3d41, 0x1fa18160, 0xc481af81, 0xfc818130, 0xdae2bd73, 0x4d3c81cc, -0xa47f5f0a, 0x5e3ad1a6, 0x1a816eab, 0xb307dbd0, 0xa8798b88, 0x7f81252a, 0x6d7f2899, 0x4d7fa214, -0xc375762c, 0x7fb655ab, 0x5bb98185, 0x1381682c, 0x5281ca7f, 0xc56d7fc8, 0xa81d8170, 0x8daa50f4, -0x8bbf7f03, 0xcf7fb0c2, 0x3b733caf, 0x7f756442, 0x8c81353c, 0xf7e82f0f, 0xa5a620f2, 0x8ae39fea, -0xada55ad4, 0x74f1de4c, 0x37714753, 0x538193e3, 0xb1811481, 0xe5bd81cb, 0x70fc4ea8, 0x888473eb, -0x30b57f1a, 0x90c3f010, 0x81817577, 0xea8c4ae4, 0x6977547f, 0x549481a8, 0xf27f54b8, 0xf87f7fd3, -0xef81843e, 0x5a437fbb, 0xa77f8181, 0x77354c05, 0x9781667f, 0x7fc2ae7f, 0x0b81b868, 0x1267b5e3, -0xa0de743b, 0xb4cce348, 0x8192819d, 0xf0817faf, 0xecc781ab, 0x7f57af2a, 0x499e13c0, 0x7f3d632a, -0xac96fcc8, 0x81727829, 0x7f7ff281, 0x81819bb4, 0xc5bfd358, 0x76553120, 0xb57dbcb5, 0x9b425d12, -0xb0814cc1, 0xea3d393b, 0x1dde5e27, 0x03a6f127, 0x39a9a981, 0x94304751, 0x3af97f00, 0xceaa49d8, -0x3c8124d1, 0x7f24b547, 0x2830e08d, 0x3d7a8f0e, 0x456ffc4c, 0x814e7f4a, 0x357f817f, 0x7f61bc51, -0xd7097f44, 0x213ecf47, 0x815281bd, 0xa9a58187, 0x0c3cbfb2, 0x18f92fa4, 0x307f7f52, 0x727f3361, -0x6cdc8e37, 0x7f9d9e24, 0x64466e7f, 0x2491328c, 0xd58181cb, 0xc97ff4b1, 0x1890627b, 0xa48168b3, -0x7fad44dc, 0x411b7f43, 0x6681647c, 0xc5171bcd, 0x4a6d7fd9, 0x7e369d2b, 0xf8124f61, 0xa71515f1, -0xb381ec09, 0xc4ab71c0, 0x9e2e977f, 0x7f7f0d58, 0x1cdb7b16, 0x81f87f81, 0x517f7f60, 0xf4a3ea33, -0x5c2112c3, 0xc67f7e06, 0x9d7f78c6, 0x811730e4, 0xa29b6170, 0x81817fd1, 0xb6637f87, 0x4f1c540d, -0xe57f7707, 0x277d5c28, 0x7f817f21, 0x5e31e1ab, 0x7f81cd81, 0x815daab2, 0xec5284bc, 0xb45d7b63, -0x7f4d815e, 0x0860494f, 0x81874034, 0x81d0f00a, 0x5b4274ea, 0xdce04fd7, 0x8188680f, 0x827f7fc7, -0x8137e715, 0x9f7f6699, 0x786e75eb, 0x8253202d, 0xb2813ddd, 0x7315a11a, 0x81c18164, 0x7f7f8141, -0x6870da25, 0x117f3efd, 0x7f1c5f1f, 0xcb6d63bf, 0x45561890, 0xc3df8136, 0x23275f32, 0x81817f5d, -0xa50f7fde, 0x7f3ba6ae, 0x37a4bbf4, 0x81a6fd1a, 0x9b9bb6ec, 0x8b2cff0a, 0x2035d781, 0xa1c47fce, -0x095dee2d, 0x7f3a2d51, 0x69727f7f, 0xec8aad61, 0xb0dbcc42, 0x2e706fee, 0x962a9d53, 0x81814554, -0x759026dd, 0xb38851cf, 0x817fa70b, 0x7f462fb9, 0xcc7faf23, 0xa2981632, 0x3e8d8160, 0x07815dd2, -0x82817f22, 0x5a755325, 0x45c77f81, 0x81653cac, 0x93f73dd9, 0x3d81c4cd, 0xf67aa181, 0x467e7f1f, -0xe6c10cfa, 0x9bd4c12f, 0x6c51ca85, 0x4d7f2835, 0xc0bb341b, 0x81812aed, 0x87a181be, 0x4f7f7f6d, -0x81c9e3c4, 0x117f95bf, 0xd457e634, 0xb84b567d, 0x5618f922, 0xda7fc1ed, 0x7f7f81d6, 0xa07da0b1, -0x2e627f0a, 0x814ee836, 0xb65bff90, 0x3e29b6de, 0xb1b78f5d, 0x1724a1f0, 0x81484221, 0xe16d7fb6, -0x578181f2, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -hard_output0= -0xb5bc6ac8, 0xf5373664, 0x1310345c, 0xd5bae4e7, 0x1fc9e83e, 0xebfdfded, 0x84bd86ab, 0xb7aabe00, -0x60b44fea, 0xb9067464, 0x30325378, 0xa9195955, 0xf70c6e5c, 0x90922632, 0xc90b1cdb, 0xf2f5fb69, -0x73056b63, 0x1a33bf3f, 0x17755b5c, 0xc58bff6d, 0x2f4390b2, 0x2869d508, 0xe7c7dfe8, 0x38552963, -0x21da5367, 0x07282b9b, 0xa4767105, 0x1e294251, 0xe350a940, 0xb8a6aa27, 0xed12d778, 0xf10d9ece, -0xab93527f, 0xcf2da7e7, 0x68f6d0b1, 0x811f4bca, 0x577b06b2, 0x3234f13e, 0x30bab7df, 0x8dc47655, -0xbb843bed, 0x86da3aba, 0x30950c97, 0xdd096d7a, 0xa871fd6c, 0x8bee4e6b, 0x8fea30d0, 0x6c05b4d2, -0xf3e144d3, 0xd24ebb1f, 0x065635e5, 0x8d3f2cf9, 0x536c6c6a, 0xfbb0a5d0, 0x3d707b42, 0xc44d5982, -0xa5f4ad8f, 0xf32c0970, 0x1bccf1a6, 0x05916020, 0xa64fb176, 0x5ede6a35, 0xaf4966da, 0x9df5e0e7, -0x75042abc, 0x9ef10481, 0x11ddcbc8, 0xa0f5518c, 0xd5c23418, 0x2393d558, 0xfbe7dfeb, 0xed1c64c2, -0x86a36508, 0xde2dfb1e, 0xb8d0fef9, 0x24505232, 0xc894e71c, 0xbcc752a0, 0x40b74e83, 0x90d23c8c, -0x728e4a61, 0x108f0b08, 0x66f522ee, 0xc258d851, 0x35a31c44, 0x11311b5b, 0xfd3d5be9, 0x5ae448ff, -0x4f64994b, 0x5b8247a9, 0x4021114d, 0x2f0b6e82, 0x5eaa9828, 0x50ac71c0, 0xfb86ee52, 0x0dc1ac9b, -0xbbd47645, 0x8f357115, 0x978ceea0, 0xd557db99, 0x99b30388, 0xfc9a8a1c, 0x0f75be1a, 0x50143e22, -0x8840989b, 0x738ec50e, 0xe6b2783d, 0xf67899c8, 0x27ebed69, 0x6c415a16, 0x3a6cc2dc, 0xcd4e4e5d, -0x6cb12b2e, 0xdb88d7c0, 0x79cd1582, 0xbc422413, 0xe72ad2f4, 0x8eaac30f, 0x0bd86747, 0x6d87f69d, -0x15d62038, 0x4b375630, 0x0d51b859, 0x16db2cb2, 0xf210603a, 0x0abeb833, 0x55c694d0, 0xe57ca43b, -0x0ba94428, 0x1398a406, 0xe47d3889, 0x5a20203d, 0x250d7a1a, 0xd930ffec, 0x03992e79, 0xf2759376, -0x024ec121, 0x91fc3a2c, 0xb7e11cc5, 0x4ff7d459, 0xb8700134, 0xd6e61758, 0x4eba0a32, 0xb747e3ec, -0x7073fad7, 0xded80f99, 0x331e2f1b, 0xfa1f1bed, 0x056424a2, 0x1d1d95e0, 0x550b9ec8, 0x51ee2a38, -0x19525153, 0xd70c4cd5, 0x0d6cd7ad, 0xe44d1cf2, 0x30dfecda, 0xdacd7fe8, 0x7321d795, 0xddf48ef4, -0xe271e6a4, 0x9c1feecb, 0x951fcd7b, 0x8acc5a03, 0x3fb83527, 0xe306de74, 0x7b9cd6ee, 0x8e140885, -0xd4c91e8d, 0xe8c39733, 0x0f02f87f, 0xfb06b1b9, 0x0dc9349c, 0xf76bae8e, 0x4f642a07, 0x3d48a9aa, -0xe3ea323a, 0xa1cd5c8a, 0x40aa0e70, 0x132042d3, 0xa9732f6c, 0xd15a00c4, 0x43d3b046, 0x9a51ebd4, -0xc46ee0ed, 0xe2a2148b, 0xf5c478f0, 0x1fb01cf3, 0xf4f321ec, 0xd973811f, 0x11ad11b9, 0x5c67adda - -e = -34560 - -k = -6144 - -rv_index = -0 - -iter_max = -8 - -iter_min = -4 - -expected_iter_count = -8 - -ext_scale = -15 - -num_maps = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_negllr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_negllr.data deleted file mode 100644 index b5ef624616..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_negllr.data +++ /dev/null @@ -1,1224 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation -op_type = -RTE_BBDEV_OP_TURBO_DEC - -input0 = -0x0a45ef00, 0xb2bdc60f, 0xc810d206, 0xf21cc300, 0xb0c93da1, 0xaae019d7, 0x23ba3c29, 0xa61d1e09, -0x202906d1, 0xd2b61ef3, 0x59e7f241, 0x2ec8daec, 0x68015520, 0x0912f4a3, 0x01282329, 0xa1fd1439, -0x0701231b, 0x0fdcba0a, 0xbe97c6c3, 0x0438e652, 0xd5f644d4, 0xbd0e5f4b, 0xfcb6d0d4, 0x0825b15a, -0x362e2fc8, 0xbbd5abda, 0x0df8c12d, 0xd016b5de, 0x1e439a0c, 0x44c94242, 0x00e2e8c5, 0x0639d241, -0xef6aa40b, 0x90de9def, 0x43e0ea14, 0x31dd07cf, 0xbad70a05, 0xcffc228a, 0x00293bd7, 0x6038080c, -0xdaeb3e20, 0xdd260c4c, 0xaa41fb3c, 0x6eeef0d4, 0x5b02c0f3, 0x14d6ac69, 0xfef0ce44, 0xc5abccf2, -0x2a0f00c4, 0xd6cadb30, 0x38e212cf, 0x5e9abc29, 0xf105fce4, 0xde34e024, 0xb9d42365, 0x281eb22e, -0xb219c055, 0x6504b01e, 0x465602ab, 0x1233a4e7, 0xa9ebf4cf, 0x63c1ed3f, 0xdbe9b71f, 0xf994579c, -0x22f359b5, 0x3606379d, 0xae30fa1e, 0x1d6e290c, 0xc6e0440a, 0x2f129132, 0x1b317bf6, 0xcfdbc119, -0x32022857, 0xaef168dc, 0xa1251d37, 0x65eec43b, 0x9630e70e, 0xe9e1fd98, 0x3e02d8ab, 0xf348af3e, -0xf7b0f027, 0x2ff021db, 0xecae5bd4, 0x1b2f3e34, 0xbb2511c0, 0xd611ddad, 0xf951d2d6, 0xb1dd0191, -0xc325cf35, 0x58bdf4b7, 0x36094dd7, 0x07cd3b44, 0x02c4ae4d, 0x812af6d9, 0x32f63731, 0x31103329, -0xac0033ff, 0x817f583f, 0xc4817f88, 0x8d81790a, 0xa6a2817f, 0x7f81910a, 0x7fc5ed7f, 0xbf2f7f8d, -0x7ff14707, 0x49cc3bda, 0xb04d5a2d, 0xd8d392b0, 0x7f69d3e1, 0x83ae43ad, 0x99b7da75, 0x3a7f7fd3, -0xd46d6fd2, 0x4f7fc524, 0x137f812f, 0x587fcd8a, 0x81c481bf, 0x9caa6184, 0x0bc3a499, 0xe2901a23, -0xfeb59b6f, 0x7f818171, 0xf68ed39d, 0x8113a975, 0x81dd6681, 0x7ffe707f, 0x5836757f, 0x48a98122, -0x7f724081, 0x81588447, 0x59f8b799, 0x7f6dbab0, 0x817f8f09, 0x13c3ecb6, 0x7ff98d64, 0xc4911e81, -0x33922f9b, 0x05c9e85c, 0xa19071b3, 0xec1ca24e, 0x02a48181, 0x813b8196, 0x7fca7d51, 0x7f81814d, -0x00815911, 0x242a7f5f, 0x29d6ee98, 0x8a61887f, 0x4e815e7f, 0x773e811d, 0x8e65d1a7, 0x8d514860, -0x3081b248, 0x7f2393ab, 0x815d2e31, 0x817f4be2, 0x81818519, 0xa07f677f, 0x0defa853, 0x22811c4c, -0xbe81d32d, 0x2d7fdc7f, 0xd8f3195c, 0xf69bc13a, 0x7f7fdae1, 0x2a56717f, 0xd4811c7c, 0xbe218c81, -0x81a556d3, 0x3f43a8c4, 0x6a95b0cf, 0x427f79db, 0x959cbc5c, 0x9f00dd19, 0xa1e8c5d4, 0x59814997, -0x4e35eb7f, 0xf87f348b, 0x76749124, 0xab7f7f1c, 0xf0816c81, 0x8c62b45d, 0x744ec34f, 0x329a7fce, -0x9048b815, 0x0076dcd0, 0x812d2981, 0x98d5cb15, 0xd29652cc, 0x2cd15e33, 0xc2557f91, 0x03517f6a, -0xfc1cc134, 0x0f7f6a00, 0x81939c0e, 0x7f4677a9, 0x7f597f5e, 0x4f972a86, 0x81b2ab81, 0x207f7f69, -0x85b9b234, 0xc1857fac, 0xedaa7c08, 0x7f50057f, 0x7f1dc26d, 0x7fa47f81, 0x7ff57f76, 0xb3bca5cc, -0x6b31d550, 0xce3a6583, 0xdac01f7f, 0x81184838, 0x65239c09, 0xde415bf5, 0x7f7f3881, 0x097fdc7a, -0x81698160, 0xa8da57db, 0x3281530a, 0x628d057f, 0xad7381f2, 0x18a35579, 0x3d909f7f, 0xbf7f7f81, -0x8181eb36, 0x6bd45881, 0x578c7520, 0x417fdc89, 0x307f5bad, 0x667f8181, 0xe1b44f6e, 0x817f7f2b, -0xd55cb62e, 0x8aa0ab9a, 0x81e42e47, 0xbc925270, 0x77aa4a90, 0x56247581, 0x8ff5f670, 0x7d7f9cc7, -0x3a013a2e, 0x10810005, 0x815eab7e, 0x812fe1c6, 0x81f0b47f, 0x7f2b8c03, 0x7f7fc07f, 0x7e497281, -0xd1d70cd5, 0xd981b501, 0x0c63b57f, 0xd8a8ea7f, 0xdeaece7f, 0xa08107f0, 0x9f54e62e, 0xa8cfc431, -0x7f985ee1, 0x811ae887, 0x7f81df4d, 0xc081d1bb, 0x81a15a9a, 0x7f44bf05, 0x037f057f, 0xf22c7f9d, -0x7f7f7f7f, 0x81856e03, 0xbcb08381, 0x46bb372d, 0x7f7bd59c, 0x8157e815, 0xa1910b3a, 0x5c537f7f, -0x3e81717f, 0x4851ac7f, 0x813b7f83, 0x867fb25e, 0x098131ca, 0xb06fc77f, 0x7f60e97f, 0xa25f5c46, -0xe82eae48, 0x40bf987f, 0x817f81e2, 0xf5b2c831, 0x810597de, 0x045c7f4b, 0x81e33f36, 0x81aaf35e, -0x81817fc6, 0xe700587f, 0x93b37fea, 0x9f81fc97, 0x4def727f, 0x6bc07fe7, 0x7f811076, 0x81248175, -0x0a7e5cf6, 0xcd7f7f81, 0x7f49f37e, 0x8181917f, 0x7f70df81, 0xd17f81b5, 0x1f6b4ef7, 0xa21d6b8b, -0x7fb0461a, 0x5c027581, 0x81819bb4, 0x816ee78f, 0xad7f817b, 0xe481a10a, 0xa1cb8d81, 0x32813e3a, -0x947f7f81, 0x8184bff3, 0xa96cd072, 0xeb0c5881, 0x814ab385, 0xe3f67f7f, 0x584a81c9, 0xdbc5c781, -0x78816e49, 0x817f8a81, 0x7f3f7fff, 0x56d89f40, 0x4397e427, 0x7f29b20d, 0x7f597fad, 0x35817f65, -0x0a7f3b19, 0x61c97f81, 0xc6817a65, 0xaa5ceb7f, 0xfc427fef, 0xb8684c75, 0x447fbaa3, 0x4d7fae7f, -0x8196e3bb, 0xe1588132, 0x7ff27f34, 0x8173bff4, 0x7f705f6d, 0x7f7f817f, 0xa353354c, 0x7f58ca67, -0x7a5a7f9c, 0x1e81ee7f, 0x98d681d9, 0x9e60c443, 0x7f7f39a3, 0xc79bc87f, 0x3ae8827d, 0x9f812e81, -0x7f6f8170, 0xa987947f, 0x2481aa81, 0x538fdd7f, 0x237f1442, 0x14e99a84, 0x6e62b068, 0x7b810541, -0x73a57fad, 0x69977881, 0x9be9cd7f, 0x9a48537c, 0xfccc7f47, 0x7f40a457, 0xbc63b4b8, 0x74bb447e, -0x36817f12, 0xd371cd1f, 0x7f1ed17f, 0x36624bbe, 0x726c811b, 0x4abe5c58, 0x81de39c1, 0x7b5ae996, -0xaa818105, 0xa881bebd, 0x5e7f6edb, 0xa8d08165, 0xd495f17f, 0x7fd06098, 0x7fb157fc, 0xc0f661d3, -0xd09f812a, 0x7f8ef77f, 0x69477f00, 0xf45f8481, 0x0f7fa07f, 0x97f17f7f, 0x6ceaac7f, 0x7f7f8163, -0x7fbcbe98, 0x698b697f, 0x79c0da81, 0x8b81e681, 0x81817f36, 0x6b814881, 0x7f918ec6, 0xb67aed0e, -0xc5020b85, 0x81ee8c18, 0x7ff650a5, 0x814f6233, 0x508139a1, 0x814e6aa1, 0xa055487f, 0x3ed75817, -0x4f7f81da, 0x1ddcfa81, 0x7f7f1dbc, 0x825b6454, 0x2ee6819b, 0x73eb6861, 0xf7fe9516, 0xe3816dc5, -0x527f3f7f, 0x550d8fb9, 0xf3f82681, 0x5954b562, 0x7e7f20bc, 0x817f6b4f, 0x8108bc22, 0x17fb8113, -0x7b040f33, 0x586282d5, 0x078c5c7f, 0xe17fc493, 0xdd813545, 0x9ba17f6e, 0x7fccfad5, 0x916f7fa3, -0x21ce7f1f, 0x1a037f81, 0x8e4d0081, 0x7a360731, 0x167fd77f, 0x96762a84, 0xca5660e3, 0x45f0d87a, -0x7fd151ae, 0x9e7f22a6, 0x7f817f8c, 0x1501b9cb, 0x886c4184, 0xea627f6c, 0xc53e7f08, 0x1a63d6eb, -0x481b4a73, 0xca816575, 0x167f7f7f, 0x15814549, 0x6d985e81, 0xa60b1f62, 0xa1818181, 0x33af7f7f, -0x816c7ff7, 0x7f81b67f, 0x08602281, 0x9a81815b, 0xe6787f3f, 0x7aba4f81, 0x5015817f, 0x1d02d55e, -0xbaf3e826, 0xc34ca8cb, 0x503e7c82, 0x647a7f60, 0x7f810873, 0x81149d63, 0x7f818181, 0x7f7ff3d1, -0x11d8dce2, 0x7fe3634c, 0xb63c535b, 0x810e6181, 0x81277f54, 0x817fa2dd, 0x34c34476, 0x848a65f8, -0x96f911b0, 0x9aa76464, 0x8200816e, 0x6d7f56a6, 0xcdb9e57f, 0x874e836a, 0x93a363a6, 0x41c09883, -0x8144c072, 0x52a77fef, 0xe8ded5e2, 0xf6857f81, 0x81b79f4c, 0x7f7f71a2, 0x2b5852bc, 0x1f7b43b0, -0x4c5aa37f, 0x557f3d2a, 0xa17fb581, 0x7349d204, 0x4042ec2b, 0x89cd96bb, 0xd3368281, 0x7f7b8181, -0x0f28f5cd, 0xe8aa4d23, 0x88628b33, 0x8181817f, 0x758197af, 0x37b43b4a, 0xc081c1a5, 0x8e3c4881, -0x7fcb0983, 0x55fe14e4, 0x734c7f20, 0x89267c21, 0x7781a4b7, 0x7f7f4eb3, 0x81ac8fa2, 0xddc20981, -0x7f9b2659, 0x2d7fc65e, 0x818181e8, 0x6a176a89, 0xaa7fb68e, 0x5c5446d2, 0xda7dcc81, 0xc3a5e054, -0x7881477f, 0x7057146f, 0x00764b7f, 0x7fa87f7f, 0xa4ff8181, 0xf07f7f7f, 0xa37a5cd3, 0x28a881b1, -0x13e0cb4f, 0x8f7f9804, 0x3d343181, 0x567fda8a, 0x5828c7d0, 0x434fe70a, 0x7fd5fe78, 0x1f818181, -0x686103cf, 0x62aab5ee, 0x5506cb88, 0x5428ad7f, 0x51908c1a, 0x6d5db4ef, 0x3f7f686a, 0xa6a15a8d, -0x917f7f53, 0xb77fea86, 0x7f816aa2, 0x6ae581d7, 0x54ad634a, 0xd59ca328, 0x6d815bfa, 0x5f470046, -0x23818188, 0x817a9419, 0x7f57dc81, 0xb02a81ad, 0xe986757e, 0xd9810681, 0x81f7be26, 0xbcb5cf7f, -0x63776b56, 0x4358bc47, 0x528aa47b, 0x9e7f7181, 0xd0818100, 0x0d811a7f, 0x7f818155, 0xbe207fc3, -0xb70d393c, 0x812bbd48, 0x7f7f7d0e, 0x81b5ab00, 0x1ecb8681, 0x24c67fcd, 0x2fc7ed01, 0x5503a881, -0x7f3d7fb4, 0x9a81559e, 0x6508d5f4, 0x08b56b7d, 0x96d84e10, 0x7fac9ec1, 0x817ca281, 0xd9b01081, -0xaf81d3a7, 0x8102b34b, 0xa0f98181, 0x7f7f929e, 0x3cf6d023, 0x990ed581, 0x147f817f, 0x81483a81, -0x68375130, 0x487f1451, 0xa0973d81, 0x87d4d4f7, 0x90633e22, 0xbc7f45e0, 0x2c4ea77f, 0x0811896e, -0x8d7f52e9, 0x8120aeb0, 0x3d159d81, 0x93cb0097, 0xce81bb81, 0x74194855, 0x4e7f3f26, 0x817f819f, -0x4531814f, 0x517f7fbb, 0x4981a87f, 0x4c810f4e, 0x3239b67f, 0xa17f194c, 0x81e58e81, 0x7f4890e5, -0xb07ffa3c, 0x937fa181, 0x447fa516, 0xbab5000e, 0x887f7f7f, 0x8181b17f, 0x7f82d4ad, 0x7f828159, -0x81b35c57, 0x23bcb1dd, 0x819446c7, 0x7fbf9ea6, 0x817f7fc1, 0x33817f81, 0x5cfe7fb6, 0x7f81fc61, -0x91477f4c, 0x88994381, 0x65bb447f, 0x198d61ae, 0x817f9f7f, 0x557cbcb8, 0x81fab781, 0x1bab3f7d, -0x7f812298, 0x7f44fadc, 0x1dc1c665, 0x7fde3a8d, 0x94c37f2b, 0xc7d8eb23, 0xdaae8181, 0x129c68bc, -0x7f819111, 0x7f32ce2c, 0xf0d17f02, 0x7f6a817f, 0x5cd564e0, 0x7f7fc47f, 0xd6995c9d, 0x70a7d476, -0x3b7ff299, 0x7f2f237f, 0x4381ac1f, 0x0bd67fb2, 0x81ba594d, 0xa6777fd5, 0x881cc254, 0x8189977f, -0x7f813b3e, 0xc17f7f7f, 0x3baa3dc9, 0x81007f57, 0x7f810295, 0x81f7a1c3, 0x7f65de7f, 0x4ca87f53, -0x407f81b9, 0x7f436fa6, 0x399f9581, 0x7f177f86, 0xbc698194, 0x447fd081, 0x81663d37, 0x01faee9b, -0xc485ff7f, 0xed6ff281, 0x4c6713c4, 0x28b0487f, 0x7f88e8c9, 0x8169016d, 0x7f7f71dd, 0x474bf37f, -0xb756b143, 0x95caeed0, 0xec7f872d, 0x437f23e1, 0xb42b3030, 0x662f8d76, 0xd4818f71, 0x8161fd50, -0x8863663e, 0x78256b06, 0x661b549c, 0x8e817fb4, 0x06b98354, 0x5a905ec1, 0xec960281, 0x2c30bbe3, -0x937f7f63, 0x6ade543f, 0x7f7f9f5e, 0x98dac336, 0x81327f73, 0x677f6d46, 0x637f5c7a, 0x82478181, -0xedbc9014, 0x9a7f431b, 0xb2d25981, 0x7f898181, 0x81815ab1, 0x2d7fa683, 0x7f03b2b0, 0x89bc7f18, -0x81947fb8, 0x1995817f, 0x78e54c17, 0x816cb1c3, 0x1a2681e0, 0xac3a7f8a, 0xdff245bb, 0x422ada81, -0x1ed1e07f, 0x7f6f5276, 0x8481db81, 0x9a817fe4, 0x1e132dab, 0x5c7fdf7f, 0x7d81ac7f, 0x937f7fe0, -0x49568171, 0x3f81907f, 0x81466896, 0x7f667f2b, 0x577f9a7f, 0x7fd73c0b, 0xc946df59, 0xd72f767a, -0xb51d326a, 0xc77f4f7c, 0xbc814bf5, 0xdae47fab, 0x40a64f73, 0x898188ea, 0x1c751c97, 0x7f8ed37f, -0x81b9585f, 0x6eb6758e, 0x5e11b233, 0xf0a47f81, 0x81709065, 0x447fbcc6, 0x58d1819b, 0x9fa36e74, -0x817fa9f3, 0x9f506f66, 0x81cd047f, 0x187f8136, 0x9d810500, 0x64cd8eb0, 0x7f817f7f, 0xf850e2f6, -0x81b61869, 0x606a66c4, 0x81638118, 0x20dca772, 0x6287b381, 0x8e056874, 0x086d99b9, 0x54438172, -0xb281697f, 0x5c470c16, 0xb0340523, 0x7f81b96b, 0x4451b8a1, 0x7f7fe6db, 0x57887f3a, 0x14438129, -0x927758ce, 0xe27fa16a, 0x8c30bd81, 0x7b7fff47, 0x41e58175, 0x35812462, 0xe7ff4358, 0xb4c04079, -0xa87c108b, 0x81aae151, 0x3d797f8e, 0x33007f3c, 0x27c2715a, 0x188c7fba, 0xb481e081, 0xe026d96e, -0x402d8185, 0x7066ffcd, 0xc5914e7f, 0x977f655f, 0x7f68b5d9, 0xcad3235d, 0xc77f8e81, 0x1cb4817f, -0x7f473044, 0x15168159, 0x7f5c81d2, 0x7f99bd6f, 0xb7ab0006, 0xf2487f41, 0xd2de0f82, 0x6a81627f, -0x2e8e87fa, 0x25187fb3, 0x6d31b393, 0xdd3d4b81, 0xa942a11d, 0xd21281d0, 0xe6b0e17f, 0x8a5646ad, -0x907f8124, 0x7f81d2e2, 0xd8c8e17f, 0xeb8b7f81, 0x3ad8bb1a, 0x7f7fbf81, 0xcb30ddf4, 0xa09134d8, -0x8187d2bc, 0x4949168a, 0x53998181, 0xd5e21412, 0x81811cb0, 0x11349a98, 0xdab2afe4, 0xd97f7f7f, -0x7f7f8181, 0x327e7fd4, 0x97818114, 0x827b6517, 0x5f0aabbd, 0x7f905b81, 0xafdde37f, 0xcd40cf7e, -0x7f56817f, 0x95810db2, 0xaf7fd131, 0x8181811a, 0x9e7f8f73, 0xe250d481, 0x7f2abb90, 0x5f7d981f, -0xb3257f91, 0xec657f2f, 0xfa815e3a, 0x6e223481, 0x6c00eaa8, 0x7fb19394, 0x8799c181, 0x810e7fde, -0x7d478181, 0x7fdc76bd, 0x035f8102, 0x627f447f, 0x7ff7ff7f, 0x81265db0, 0x6e81ac2c, 0x8802d277, -0x81c3f781, 0xec81d259, 0x817b7d81, 0x7a5b7f7f, 0x4953ab64, 0x896a52a0, 0xb28111f8, 0xd25d8f0e, -0x7f818174, 0x813f7f3b, 0x7fff7f72, 0x0fa87f88, 0xbcfad248, 0x507dd360, 0x7fae817f, 0x81f27f81, -0x72fa4d1b, 0x5a21d2a1, 0x6381817f, 0x5fb55ab3, 0x8ec3816f, 0x257f4ab5, 0x4c74ef81, 0x19a3f27f, -0x752746c6, 0xe17f8181, 0x7f7c8199, 0xdb9981a1, 0xcb984bd7, 0x815ea881, 0xdc50e0d9, 0xb9366f24, -0x7f455dec, 0x817cb181, 0x424856f3, 0x67ab02a5, 0x0081657f, 0x105e8191, 0xeab817a7, 0x3a7f6d5a, -0x425a1503, 0xeaac317f, 0x7fbe2cd0, 0xd2819a6d, 0x34887f6b, 0xef7f817f, 0xc3577f8f, 0xb124a664, -0x9981167f, 0xb4946031, 0xb8817f7f, 0x81c570ed, 0xc9c88181, 0x3a4cdf81, 0xd9514781, 0x8948c0fe, -0x2d5a8111, 0x68817f7f, 0x6be87f81, 0xa62c0381, 0x857f7fba, 0xa8c4ab7f, 0x279cc57f, 0x98816e0b, -0x817ff70e, 0x21536d81, 0x875ca181, 0x008164f2, 0x96955a53, 0x57a53917, 0x6517faad, 0xdecd7f49, -0x81819c32, 0x7f7fc25d, 0xfd81b181, 0x9f818166, 0x9c7f107f, 0x7f15b67f, 0x81636692, 0x18f276b5, -0xbb9d08e2, 0x6c25797f, 0x417f43fc, 0xd0a37eca, 0xd4702b8f, 0x5c72ba00, 0x7f9dcdbe, 0xd4ad8122, -0x39f1a381, 0x9b419181, 0xac816ace, 0xfb7c81e6, 0xdd7f7fb9, 0x2a27bb61, 0x3781499f, 0x7f6a7f93, -0x4bbf81a5, 0x4a07e527, 0xab4f8143, 0xc2703e81, 0xb1813d81, 0x81747ba3, 0x11cb7f81, 0xd7a385fd, -0xc9d0c981, 0x647fe554, 0x811d3681, 0x18817fdc, 0x81811bef, 0xd381845e, 0x466539da, 0x1081617f, -0xb5b99261, 0x56cd7f8d, 0xaaa79076, 0x7f814a81, 0x7f7fe313, 0x7f7f8170, 0x5df9817f, 0x102fe72a, -0x0c7f79ae, 0x4368d9e1, 0x6b0af013, 0xc13ed920, 0x98ed6a7f, 0xc494d37f, 0x81816a35, 0xc27f7f4f, -0x451a7f3a, 0x4c812e15, 0x032f49b1, 0xbd7f02a1, 0x507f0d67, 0x9c5f007f, 0x8712c21b, 0x6ba7385a, -0x7fb62c58, 0x7f818bcf, 0x7f7fc57f, 0x4141698d, 0x1e817f5c, 0x813fbe97, 0x6f817fa8, 0x51637759, -0x7f4ed17f, 0x81ac2c28, 0xf1c75bfd, 0x1463c260, 0xcb7f7fcf, 0x7483675a, 0x40eb7f7f, 0xad7f81a2, -0x7f817f50, 0x66816683, 0x407f8c81, 0xaf8190b3, 0x81d347f2, 0x5a215a81, 0xca7f8132, 0xd0528ef2, -0x8129c3a0, 0xa4a7c52b, 0x0b816383, 0xbc7faf5d, 0x38d34e66, 0xff65a68b, 0x817999d7, 0x5a620463, -0x885a817f, 0xad947f81, 0x7f1c902c, 0xaa0e9003, 0xd7ccb971, 0x64a68198, 0xb2337f11, 0x81a4d5dd, -0x817f81fd, 0x7e814f81, 0x817f3da2, 0x8381fd08, 0x81a35a81, 0x7f0099e3, 0xfa1f5850, 0x6773efd6, -0x6e7e5268, 0x138e7fc5, 0x81449526, 0x815781c2, 0xca2faff4, 0xf37f7f64, 0xaa080369, 0x7fb07f5c, -0x81397fcd, 0x972dbbbe, 0x813f8e81, 0x812ed669, 0xbf76e310, 0x0be7f981, 0x81929781, 0x577f8644, -0x0cc7e94b, 0x7e1d2995, 0x7ace8119, 0x81814867, 0x617f505c, 0xb9ad7f3e, 0x3ad56e18, 0x81e5b75d, -0xca874729, 0x7f81ad9c, 0x5881813e, 0xbb240a46, 0xcc908863, 0x6fc2815b, 0xfa4bca7f, 0x8f817319, -0xfe819dae, 0x81814281, 0x867f21e9, 0xfdaa0500, 0xd08c9e41, 0x99ea3b94, 0x7fa9394c, 0x81337f7f, -0xb57f23f9, 0xc59a8181, 0x815a7fa4, 0x16c9c781, 0x9f17b97f, 0xb2817f89, 0x7fbd95a5, 0xb27f7f8e, -0xa5e0b5c9, 0xefabff4c, 0x7fb7ea7f, 0x9aec9841, 0xb0e1784b, 0x81b29d1d, 0x7fba1781, 0x81f7086b, -0x8129f27f, 0x818181ea, 0xc1ce8113, 0xfbfbaacf, 0x9d4c14ed, 0x40c1ea26, 0x6051cd3f, 0x6cd681be, -0x4c469beb, 0x17637f22, 0x81882850, 0xbc91d4be, 0x6e318122, 0x95628181, 0x6c7f7f33, 0x6c47537f, -0xa8d27f7f, 0x3de9b857, 0xc73a2c81, 0x4e7f8101, 0x3b7f817f, 0x3a78815c, 0x1a67771c, 0x5a8286a4, -0xf7b98166, 0xd3b37f81, 0x4eb17f2f, 0xc1098181, 0x969a7fc5, 0x0bfbfbb9, 0x316f8194, 0x7f6f8184, -0x484ec57f, 0x364a007f, 0x1f81817f, 0xc5b9ac81, 0xbb81b97f, 0x1f82647b, 0x2c4b4600, 0x89813d0c, -0x75ffc374, 0xad7f5e23, 0x0af481a5, 0x3d0e3eee, 0xa49481cb, 0x39815284, 0x8187f438, 0x1a7c7f7f, -0x817fa8b5, 0x7fca781e, 0xb401d779, 0x424c7fda, 0x3c429944, 0x488d7f7f, 0x78966481, 0xaf687f5d, -0x89052b37, 0xbf7f407f, 0xe07fce79, 0x9fdf45d3, 0x8181de83, 0xe67f7f5a, 0x7fe6a3fa, 0x38705b81, -0x81518232, 0x7d5d9978, 0x270372c9, 0x818568a2, 0xca7f66c8, 0x43a06a3c, 0x831b4281, 0x853a7fb0, -0x8178cf45, 0x7f7f7fbc, 0xbdb69d20, 0x525c5392, 0xc081d97b, 0x18217f16, 0xb6ec7659, 0x0861819b, -0xc48b819e, 0x817f38f2, 0x7f7f787f, 0x7f365c81, 0x64a9f87f, 0xe4e67dac, 0xd1580073, 0x81817f54, -0x597f2ced, 0x575cabd0, 0xce81d781, 0x819c81a4, 0x7f5aceb2, 0x7f57ac33, 0x81e4d87f, 0x1df5d24d, -0x7f4f7f7f, 0x7feb81e8, 0x6a81816a, 0x7f668144, 0x3431b13e, 0x3cc6b82b, 0x815dc38c, 0xc65781b0, -0xae897f81, 0x9751537a, 0x817f0e88, 0xb15e69ea, 0x6f7f7f90, 0x24e681a4, 0xd97fa74f, 0x1881fa61, -0x2e743b95, 0xeb817f7f, 0x7fcd677f, 0x317f7fec, 0x9246f573, 0x2e7fae81, 0x7eb72b7d, 0x4d8144bd, -0x3f7fcb81, 0x7f619f9d, 0x51e7b87f, 0x81688e5c, 0x0d3d55d4, 0xb9b0817f, 0xaec17fd2, 0x017f2ffb, -0xa8af3550, 0x81187f3d, 0xa033427f, 0x38c83442, 0x7f7f8181, 0xe38a35cc, 0x1f00c081, 0x7f297f7f, -0xd17f7f81, 0x6e81c637, 0xc4387945, 0x26839381, 0xd481e281, 0x0b72bf12, 0x057f9e7f, 0x5eef2c81, -0x9216b507, 0xd7906948, 0x637f627f, 0x0a11bfaa, 0xd605bd9e, 0x81ea9c81, 0x72f03c3d, 0x4f819f7f, -0xc563d7b7, 0xad5a3899, 0x7ff15105, 0x7f692e81, 0xbf79c6c9, 0x3c738181, 0x7f4a0597, 0xecb5d588, -0x7f7f2b3c, 0x888144dc, 0xbd7f6e61, 0x6b6e81e5, 0x5d5b1caf, 0x4c743b73, 0x7f727f2f, 0x667f3551, -0x8fc63881, 0x81565a6c, 0x61817f3d, 0x0aa5d083, 0x81215ea2, 0x60461f02, 0x0d7fc1ee, 0xe77f813b, -0x40d9767f, 0x1c817fa8, 0x7f815e7f, 0xa5447f7f, 0x2ac45607, 0x81417f7f, 0x00aceb81, 0x8181cfe4, -0x817f81aa, 0xaa3eda6e, 0x7fbd4adc, 0xf8bb5deb, 0xf0867fe7, 0x3f33a481, 0x819e1bb7, 0x81458b81, -0x9573148c, 0x986d1ee0, 0x45deb557, 0xcf7f688f, 0x23d5b1a9, 0xc3fdfeb0, 0x3fad633c, 0xe4be21bb, -0x81819acf, 0x567f1571, 0x5a2c130b, 0x7f14e77f, 0x37d38908, 0xe55da5d4, 0xf2e16033, 0x23db8181, -0x7f8160bf, 0x177fa17f, 0xa00f4dc8, 0x47818153, 0xf7817b81, 0x529681a0, 0xeca34413, 0x7f49a081, -0x2c9c81c3, 0x8181ae14, 0x8125425f, 0x39b1123a, 0xe4e781b8, 0x4f83e39f, 0xd298507f, 0x49e92f7f, -0x26bac981, 0xf0a27f49, 0x81d281a8, 0x993dc681, 0x48c19a95, 0x98af7a6f, 0x3baa107f, 0x899d3c00, -0x7f814467, 0xc6e821df, 0x05226d8c, 0x9a813aba, 0x8d818117, 0x81688142, 0xd9244ff9, 0xdb0da3d0, -0xbef62430, 0x55868181, 0x8176d83f, 0x33813ef2, 0x941a6534, 0x81d0741b, 0x4e37927f, 0x6b2515e2, -0x8181aa81, 0x9581605b, 0x678113a0, 0x6e7f2681, 0xc1819f81, 0x813ca072, 0x7f81b97f, 0x3d95817f, -0x81233f81, 0x911e90e0, 0x76a6d5d9, 0xc6b5057f, 0x5262b67f, 0x81812681, 0xa68110fa, 0xc74a6049, -0x478eef7f, 0x8ea225d1, 0x77fd31f8, 0x7f568422, 0x81207f81, 0x94628118, 0x81a47fc0, 0x7f637f7f, -0xa8898caf, 0x8125b97c, 0x3de89f9a, 0x7f81bb71, 0x24183337, 0x88c0437f, 0xe97f6bb5, 0xa0dc007e, -0x36dcd381, 0x887cd84a, 0x0a817381, 0x9b818176, 0x46327ffa, 0x487f926d, 0x07508107, 0x7f7ffe06, -0xcefe7f7f, 0x028172d9, 0x7f7381da, 0x81f97f58, 0x81818d0d, 0x06597fcb, 0x817f7ff5, 0x8e999e7f, -0x7fd22e8f, 0x81766ae5, 0x817f7f86, 0xca81bf7f, 0xfd144e10, 0x947ff681, 0xa9817f4f, 0x7f187748, -0x81819081, 0x8170ca74, 0x7a5d9c79, 0xbe483f81, 0x6f7f9fa0, 0x7fb0505b, 0x7fc7f15f, 0x81793081, -0xbc7bb830, 0xce7ff56d, 0x81e02681, 0xa5968113, 0xa47fd381, 0x81a68197, 0xf4ca2a7f, 0xd220acb6, -0x7f837ae6, 0x5c812609, 0x847fd94f, 0x6adf9afc, 0xb17fc822, 0xfd1b82ec, 0x8dfbf181, 0xbe008215, -0x1dfd1081, 0xd1768cc8, 0x76818144, 0x7a917f9b, 0x0c6aada1, 0x16d3654e, 0xea1a8d7a, 0x9508c955, -0xbfe88c4c, 0x593fa4d6, 0x8c45818e, 0x7f7f557f, 0x7f1dcc7f, 0x984c8181, 0x6b817f7f, 0x6c8131d9, -0x4c8185e0, 0x678457da, 0xa6bb81f1, 0x79c0ca67, 0x7fe2c433, 0x257b8381, 0x37323c7f, 0xd768283d, -0xdde15d81, 0x7996d7be, 0x7fd38110, 0x81706b66, 0x7feb685e, 0x817fba69, 0x8182ec99, 0x53c67fac, -0x7f7fc1da, 0xf8afcee6, 0x09816181, 0x8a4f9e6c, 0x5b94c2c6, 0x812b3b97, 0xd0237f7b, 0x81817f64, -0x81768181, 0x7f24b359, 0x1f326247, 0x7f7f5e38, 0x81267f42, 0xff8781be, 0x85817758, 0x7f172281, -0x81599137, 0x22423760, 0x81c8e277, 0x7f46f381, 0xbb668184, 0x7f547f7f, 0x4aa27e87, 0x217f8c35, -0x925eb643, 0x48b89ac8, 0x7f9d8181, 0xffe3a47f, 0x3e810ac3, 0x7f2c7fa0, 0x847f4681, 0x8106818d, -0x81787f10, 0x3e2a5fa5, 0x81a38181, 0xfa7f712b, 0x74dd166f, 0x0d2819a4, 0x557f426d, 0x7f818158, -0x1b817f93, 0x927f0e81, 0x7f1b9a56, 0x78c78898, 0xbb07493f, 0xd4b37f1b, 0xae8aafef, 0x7fc2c3a0, -0xb1bb3d19, 0x1189816f, 0xc2813c7f, 0xc27ff3be, 0x7f3bc183, 0xd1817c7f, 0xc6817fa9, 0x0f9ad87f, -0x7f10c96f, 0x517f7fca, 0xb9958181, 0x9870315a, 0x1c091752, 0x7f0a4746, 0x509ec654, 0x168190cf, -0x8e3d0000, 0xc0817f69, 0x7f8a6f85, 0x7fe8b634, 0x2631815a, 0x67942d85, 0x5a7f8b38, 0xa2a07e1d, -0xfa816e81, 0x3c81bc7f, 0x813b7fed, 0x81aae601, 0x7f81ba4e, 0x81817fa7, 0x32453b81, 0x8e8aa579, -0x7f81d1e2, 0x78a4847f, 0x81819b57, 0x13137779, 0x81c5557f, 0x7fd18195, 0x049928a6, 0xedd7897f, -0xa0816adf, 0xb0815ab9, 0xb2c73281, 0x7f01a4b5, 0x5ebacf94, 0x7fbb8181, 0xa97f7fd1, 0xec9d5661, -0x3da381ec, 0x4445a98f, 0x291ca97f, 0x9d948d9b, 0xf9f0d592, 0x8b1fcd81, 0x81d54fea, 0xdb81600e, -0x69a781c0, 0x817f78f0, 0x818181a4, 0x36810aa0, 0x646f9f7f, 0x70c25f34, 0x9471817f, 0x3e5081db, -0x5cc37f74, 0x7f0a814d, 0x990ba07f, 0xe55babcf, 0x59813a5b, 0x26b96e7f, 0x199c8125, 0x812e0db3, -0xe581b498, 0x8174a97f, 0x440f7ff0, 0x812d487d, 0x227f9881, 0x7fcb77b8, 0x157fc3e9, 0xdbfcff7f, -0x81085d64, 0x44a9bdaf, 0x42998481, 0xb885b098, 0x94817f94, 0x81d3367f, 0x48394f81, 0x817a697f, -0x64671052, 0xbd81153c, 0xd8637f02, 0x558cd081, 0x8485d766, 0x9ea7c1ae, 0x81b2afc6, 0x81657f40, -0x62d4f31b, 0xbd7f7f8b, 0x7b909c60, 0x2f81734e, 0x5060ab22, 0x10b62281, 0x1d83812a, 0xc7aa8866, -0x31444bc6, 0x815d6281, 0x822f8f58, 0xb75aa477, 0xc21f9a27, 0xd3545a36, 0xad30af19, 0x6b813f7f, -0x0000188d, 0x7fa14165, 0x177a549f, 0x8f9e037f, 0x1cd8f7f1, 0x1e7fb9d0, 0x557363c3, 0x7f9c1a26, -0x769fda1c, 0x7f7f8192, 0x157f7e7f, 0xcb61817f, 0x4a9d3d64, 0x8148aa58, 0x637fd2d0, 0x308481d2, -0x95a8324b, 0x7f7f3681, 0xbe407f4b, 0x2b769128, 0x8156657b, 0x7f7f7f7f, 0x45c97f0c, 0x81577f8d, -0xe90f8181, 0x817f689e, 0x2781f97f, 0x7fd1a966, 0xa07f6a14, 0xddbb7fab, 0xa53f57fe, 0x56c77f81, -0x35e0837f, 0xde818164, 0x7f5bb62f, 0x7ffe814c, 0x4a8fe8cb, 0x7f7f5b81, 0x81137fbf, 0x8157a240, -0x81048171, 0xa9d17f18, 0x8458817f, 0x81424a81, 0x9d817fb2, 0x31ef5181, 0xd081507f, 0x567b6e81, -0x91a3276b, 0x7f257f81, 0x98d9a897, 0x8eb301e8, 0x7f8a11a8, 0xac7fb482, 0x1420dd00, 0xa629e6aa, -0x98628159, 0x4a815981, 0xf081eda7, 0xaf5ac540, 0xde387936, 0xf6f2cc49, 0x7fa88152, 0x4587a0b6, -0x0549f981, 0x7f6a817f, 0x7fde8f79, 0x7fd77f81, 0xbd58b276, 0x477f5db5, 0xa3d0817f, 0xb3811743, -0x378d5f7f, 0x889c8175, 0x00d9bffb, 0xa386f71b, 0x9b9b5a7f, 0x05301691, 0x077afd81, 0xc9813d20, -0x655b8118, 0xb1810fc4, 0x2ae18160, 0x7f818141, 0x81c2db39, 0x7f3cd124, 0x52c77f7f, 0xcfdb5141, -0x8113b964, 0x0c0bd10c, 0x8137637f, 0x56bf8149, 0x5fceb17f, 0x01857f81, 0xea81917a, 0xd67a3c7f, -0x5fd93fa4, 0x93720000, 0x31e08193, 0x957faa7f, 0x30e1b019, 0x557f19fc, 0x327f5c1c, 0x81e98181, -0x567f6f7f, 0x817f60bc, 0xe4f481a2, 0xb1f2aa31, 0xba5b7f36, 0x4d2bd790, 0x914d4e38, 0x817f7722, -0x10fb7fcd, 0x2f7f3026, 0x8c7f3c92, 0xbe81392b, 0x1cae7f78, 0xb6cb6581, 0x2f52db43, 0x49cb7f71, -0x7fe6dfe9, 0x232e7e66, 0x1497965f, 0x67316ca2, 0xaf71c384, 0x727fbd7f, 0x5e7f6ab9, 0x7b5181bd, -0x38e38170, 0x48cae97f, 0x4a81669c, 0x3d2d7f7f, 0x69508352, 0xac988181, 0xe093a587, 0xbd907753, -0x817fb87f, 0x894ac8c0, 0x9f7f9ccc, 0x6336a2de, 0x7f7fd741, 0x75b723c5, 0x396e7fc6, 0xc5c0819d, -0x813c7172, 0x816a7fa6, 0x95bdf475, 0x69b21f5f, 0x817f7f06, 0x4c90685e, 0x7fea7f7f, 0x7f958f0b, -0xf6a7937f, 0x5b6caa7f, 0x5fbf7f30, 0x4c6cb506, 0x7f097f95, 0x8181d881, 0x817f34b8, 0x937f7089, -0x830181a8, 0xa6b2817f, 0x4912930e, 0x7f8fd67b, 0xf69bd281, 0x7a5fd981, 0xc4aa7f7f, 0x817f819b, -0x9c05c2f5, 0x8f579881, 0x5aa4818e, 0xc14dc0bd, 0x7fce0981, 0x147fcd41, 0x817fe75b, 0xf8e1a54f, -0x817f8981, 0x1334585f, 0x810281db, 0x146db1bd, 0x25347f7f, 0x9cbf987f, 0xb6736d0c, 0x814ab481, -0x0fd1653e, 0x7fd67170, 0xe564ce22, 0xd05df37f, 0x10871f96, 0x9dc9e03e, 0x53bc03ad, 0xc47fd1c5, -0xaa4dd88d, 0x00004ad1, 0x8a35a85a, 0xcff89253, 0x64d0819b, 0x149ab17f, 0x819f7a33, 0x49fc81c7, -0x1881d433, 0x196171c4, 0x784dbdae, 0x8193148e, 0x75b63674, 0xdf81e4ab, 0xad299a6d, 0x8168b3d3, -0xeea6426e, 0x81c99981, 0xb17f647f, 0x814ec5d2, 0x2e3b16a8, 0x81597f81, 0xa97f8181, 0x2caec714, -0x387906fd, 0x818181be, 0x7f7fbcb3, 0xd55a81e6, 0x8134ae81, 0x7fc3817f, 0x9853ee56, 0x5881999d, -0x9ea98184, 0xfa8181a6, 0xceff5978, 0x688e505f, 0x7fbbb830, 0xc678d06a, 0x3c90e3ae, 0x4b6d7f23, -0x24cd7f58, 0x7f92c181, 0xb1a97fc2, 0xba872981, 0x66ec49a3, 0x7f7f26b5, 0x7f8163b8, 0xae7f7f7f, -0xde7f3781, 0x4147d381, 0xe191cb81, 0xd45b81c3, 0x474c9e91, 0x55b546db, 0x0e81b5a6, 0xb5b976aa, -0x7f7f7f3d, 0x968a81d7, 0x7f1f9333, 0xb37f7f7f, 0x2f7f6418, 0x2532a07e, 0x8b81bf44, 0x89818144, -0xa1572ffd, 0xfebf182a, 0xe54d7f5f, 0x107f8949, 0x00210081, 0xc53345a1, 0xa2818ff6, 0x81c181e2, -0x9b81f1d5, 0xd1061965, 0xb7a47ff0, 0x81817fb0, 0x18bc6181, 0x7ccc5981, 0xbe2b9dae, 0x038f8173, -0x7f3bec4d, 0x81ec81b0, 0x817b9a6a, 0x817cb47f, 0x7fa98fb5, 0xb0355e36, 0x8dad6109, 0x4b138116, -0xa3e19d81, 0x449ab793, 0x984acd21, 0x168aeb94, 0x85baac5d, 0x7fac8173, 0x81ad81d9, 0xa34abb7f, -0x81ca817f, 0x817f6074, 0x7fbc0000, 0xc79b108a, 0xc06990ca, 0x317f12cf, 0x9281e743, 0x90c681fd, -0x17b57f3a, 0xbdd05681, 0xfafcef3d, 0x6f0a0d81, 0x4337197f, 0x7f4881af, 0xb592de71, 0x44c24881, -0x536f9532, 0x21506996, 0x68489d79, 0x4aaf4312, 0x740c9447, 0x657f6673, 0x637f7f0f, 0x81205569, -0x8fb3fe9c, 0x4881995c, 0x8163cfb0, 0x17a4817f, 0x7f59ad84, 0x6d0c30d2, 0xbdc6b981, 0x1bfa8155, -0x7f22a8ca, 0x9c9a817f, 0x3bdba778, 0xf6817eb1, 0x07858141, 0xc037817e, 0x3f2c868c, 0x8181d07f, -0x02b704dd, 0x467f6bc8, 0x4881ab7f, 0xa25c814e, 0xcb4d8e6e, 0x477c7f88, 0xd991aecb, 0x9c81b243, -0x12d6b7e6, 0x03d745a0, 0xdf0bc9d8, 0x52637f85, 0xd557817f, 0x96342cc0, 0x81423981, 0x70657f81, -0xde8181cb, 0x8a81de2b, 0xf55d3e2f, 0x2d717f81, 0xba81289e, 0x99c27f7f, 0x81c5817f, 0x90be817f, -0x918ea3dc, 0x8de39c22, 0xce577f93, 0x3f7f8186, 0x9e817f7f, 0x816c8aeb, 0x3d818e2e, 0x8181be9f, -0x0fb9429c, 0x3c7f5155, 0x81275b24, 0xa47fda70, 0x84cc88c5, 0x70797f81, 0x812eaebb, 0x16a1314f, -0x7f7f817f, 0x38b61a4c, 0x7fb7388b, 0x7fb6e681, 0x5581987f, 0x9281c37f, 0xc45b7f7f, 0x8b35b97f, -0x7f7f7f81, 0xa23c0e3b, 0x7f9b2083, 0x9cc39283, 0x8843699c, 0xc07f81dc, 0xa1f98b7f, 0x81d245b5, -0x8181597f, 0x1aa93681, 0x000001df, 0x81574196, 0x7f3f3df1, 0x6fc8c7c4, 0x5e4d7f8c, 0x81b4dc44, -0xd56f7f8b, 0x8116a381, 0xb03f5f81, 0xf5020639, 0x7f02b25c, 0x55818143, 0xab658147, 0x357f1daa, -0x296ac18e, 0x8186e57f, 0x7464272d, 0x417863e1, 0xeae67831, 0x1a605547, 0x45ffb1d5, 0x7f066c81, -0x81bfb062, 0x4cb8f381, 0x81817f7f, 0x145a4bc0, 0x2e813d7f, 0xc6524d71, 0x81818181, 0xc9d681fb, -0x2a5db57f, 0x12c97fa7, 0x317f7f48, 0xf9b88131, 0x354c1389, 0xd77f8155, 0x811b4dbe, 0x9d3d457f, -0xf9dc2f28, 0xb01c8181, 0x5a81716d, 0x7f7f3d81, 0xd87f867f, 0x817f0581, 0x564f8181, 0x7f678181, -0x5cdd7f91, 0x07ad3f96, 0xb4dd9e34, 0x7f7fd50d, 0xa67f81b6, 0x01353420, 0x6481798a, 0xa5a68181, -0x9c7f816e, 0xafc73c84, 0x427b8d32, 0x1bbb817f, 0xd45c7fa5, 0xb0c2ec48, 0xb459aa7f, 0x70818181, -0x5ec983e7, 0x81294066, 0x81447f6f, 0x9b819f5e, 0x7fb1a47f, 0x81b8a081, 0x5f91c62b, 0x7f63de81, -0xdc813ff2, 0x817f81ce, 0x3d677f0b, 0x4da9dae5, 0xcc8190d9, 0x1d7fbbfa, 0x5ffdd2b7, 0x69624b8f, -0x50963e7f, 0x7f7fa281, 0xcc4b8149, 0x8102da7f, 0x3f7f9df5, 0x435732c5, 0x7f07d881, 0xb20fe07f, -0x4896ac46, 0x44b3ed39, 0x7f7f8127, 0x9e7f81e4, 0x8181b15f, 0x7c818132, 0x7f41980b, 0x299ea18d, -0x7f196381, 0x7fc95f36, 0xbecb7f35, 0xdaa80000, 0x292a7fe2, 0x3292947f, 0x7f98e9c5, 0xb77c984e, -0x74847f81, 0x917f487f, 0x537766db, 0x30b71c7f, 0x81237f81, 0x9d7f9542, 0xfc75737f, 0x72499c3a, -0x6885625b, 0x7f061c6d, 0x818e7f81, 0x5b814381, 0x81f17f4d, 0x4d81b6cd, 0xd2f7d778, 0xe5e9d5db, -0xf7f081c2, 0xb80b0481, 0x975658f2, 0xe8b1197f, 0x81634b1a, 0x7f6bd994, 0xdbd67f7f, 0x757f3406, -0xc4d07f7f, 0x63e7507a, 0x102b7709, 0xe08cf836, 0x1db26230, 0x1a814510, 0x40679bdb, 0xf336a87f, -0x7fc3bf7f, 0x818e69c8, 0xf67aa2a3, 0x75425b7f, 0xa4b654c1, 0x7f7f5ac1, 0x5f10488d, 0x57dc7f30, -0x7d817f81, 0xfc81237c, 0x388a81d6, 0xbce67f42, 0x7f7a7f56, 0xfbb7ff87, 0x467f4681, 0x22dc9b7f, -0xba939029, 0x4a44c1a5, 0xa4be71d3, 0x7ffb3589, 0xfefae9a6, 0xa1963e4f, 0x66b3d6b3, 0x81506f83, -0xee7f32ee, 0x7ffe7f7f, 0xbf505c53, 0xd769ca7f, 0x69c267d2, 0x7f9f8346, 0x3f7f7f7f, 0x48813f51, -0x7fed8115, 0x9e81aef0, 0x7f7f22e3, 0x819fa190, 0x55457f81, 0x7f813b81, 0x251b4a0d, 0x6476818e, -0xc4d8da21, 0x52fd2d4b, 0x81943c7f, 0x273ce481, 0x7d53817f, 0xcd9d9058, 0x754151d2, 0xcb9f365b, -0xac73ecd4, 0x7ffd9a4b, 0x577f2d92, 0x41c60481, 0x81297fa9, 0x9f7f850f, 0x8c513329, 0xe854c39f, -0x34bb4a20, 0xc37f5178, 0x0787cc22, 0x6c86717f, 0x75815a48, 0x2023777f, 0xd37fdd7f, 0x6a819cf7, -0xdc44f5e3, 0x258157bd, 0xe8e7813d, 0xb9118195, 0x9a5a4581, 0x2d8c517f, 0x0c728161, 0xaec769ac, -0x1f554191, 0xfc8be381, 0xca703b7f, 0xab813d5a, 0x3f7faced, 0x707a2181, 0x7f1b8c7f, 0x7fad7f99, -0xb307377f, 0x6c9d5b81, 0x7f3bfac6, 0x8182567f, 0x5a246cdd, 0x55408105, 0x277f7f84, 0x7fa09c52, -0x817fa355, 0x404fd360, 0xecbc4281, 0xc6897f20, 0x7881ae81, 0x407f81e1, 0xfb35587f, 0x9b67fb81, -0x7f8103ad, 0x36708155, 0xab81f381, 0xa3fe6417, 0xa97f7f98, 0x3cf7cd7e, 0xae1b4dc6, 0x8ac2f749, -0x7fb35e89, 0x07e0743b, 0x7f818135, 0x81a15481, 0x93819bbc, 0x81f68114, 0x194ccd81, 0x81527f7f, -0x583ba074, 0x91654d78, 0x4e81398d, 0x0c54567f, 0xe453d054, 0xd37f8175, 0xd57f81ea, 0x345e5b7f, -0x3589262c, 0xa8b886de, 0x811b8197, 0xbbc890ee, 0x8db0b9dc, 0x9fcb817f, 0x39817f7f, 0x55391fe5, -0x7f7f3f92, 0x5a7f55d9, 0x747f3c71, 0x43e31da0, 0x67dccd81, 0x81ddffaa, 0xc32a5881, 0xb9816d7f, -0x424d7f7f, 0xb97fa435, 0x7fdb7f81, 0x48fb8182, 0x8181407f, 0xba7fa88d, 0xa16d467f, 0x81cb8a81, -0x8181a66c, 0x8c747c1b, 0xb4810470, 0x8133dc82, 0xbc77727f, 0xee981437, 0x7f2e8981, 0x26be1939, -0x12da817f, 0x81a1da61, 0x1d2af46f, 0x7f3781f5, 0x29500000, 0x657fc67d, 0x81817f7f, 0x49e406cb, -0x0b787faa, 0x7bc2643b, 0xe4e4f0ec, 0xd28175e5, 0x7f425abc, 0x900c1828, 0x7fa85f7f, 0xe8365361, -0xc5d87fa2, 0x81baffab, 0x81818612, 0xbcb5af1b, 0x7a7e5d7f, 0x81b07f7f, 0xa27aba93, 0x817fd881, -0x818481b0, 0x7f8d1c22, 0xb48c869b, 0x977f9429, 0x9a8c7fc5, 0xb8d9b270, 0x6e340e88, 0x670f7f39, -0x7f4efebd, 0x41b5b57f, 0x7f277f0c, 0x5f177f23, 0x94818592, 0x68362b87, 0x6681ea7b, 0x7f187fd2, -0xa38131ae, 0xc97f698e, 0x25bd8155, 0xe37d88d6, 0x2d018f4d, 0x391e7f7f, 0x7f7f845a, 0xe8f8ee81, -0x4beb9d63, 0x7fd47ff8, 0x5e5781ec, 0x237ffe3a, 0x8e818168, 0xa1e781e7, 0x85de7f81, 0xbaaad281, -0xa7486481, 0x555e737f, 0xa2b28f7f, 0x70635a47, 0x7f837fd8, 0x64ea8641, 0xc20c7f81, 0x0b9e738e, -0x698e8145, 0x783a5a00, 0x7f376e81, 0x7f8cbd20, 0x7f548181, 0x81149934, 0x3dad456a, 0xb4561fed, -0x815d8127, 0xaea4bb24, 0x2187755a, 0x847ff0b7, 0x7fdb9039, 0x81887695, 0x8781e111, 0xe0de037f, -0xc879f7ca, 0x7fc18381, 0x7f7ff7bf, 0x958b7f81, 0xa65fe7ad, 0x3481817f, 0x9f897b7f, 0xa2bb7f7f, -0x31018170, 0x70e08c81, 0x4c1da62b, 0x16f27ff7, 0xdf0781ed, 0xbf4081c0, 0x3a233c53, 0xf8aed938, -0xef24617b, 0x812681ab, 0xa66e4db4, 0xef9b65b3, 0x00007f44, 0x7f7f997f, 0x7f341fc7, 0x0f9b2be4, -0x7ff67f81, 0x81817e2a, 0x4b4d7f81, 0xc0706505, 0x81fc60e1, 0x30d87f9c, 0x7fff9c0d, 0xa789757f, -0x3881d769, 0x6367bf81, 0x9bae7f8d, 0x8e81bbb6, 0x61e88127, 0xc96c7fbf, 0xdf813181, 0x7f7f7de7, -0x3e817f81, 0xb97f817f, 0x8b927f81, 0x5e74742d, 0x7c49817f, 0xbc1172b1, 0x81818181, 0x6dd2d4bb, -0x98f3e058, 0x7f81efde, 0xaeee76df, 0xd57fca01, 0xf5817f81, 0x26747f81, 0xdc3f8181, 0xc335c749, -0x7f2f7f7f, 0x7f02e67f, 0xfb706975, 0x8f4efde7, 0x819b414c, 0xb14cde70, 0x22e6812e, 0x3843892d, -0x6f81ce60, 0x50c12725, 0xb4e279d5, 0x7fb1ac7f, 0xbc7f8183, 0xc7767881, 0xb6e71854, 0xb37f7f77, -0x3d7f7f7f, 0x817f6824, 0x4981ae81, 0x7f811a7f, 0x58c37f74, 0xbef5a27f, 0x92a62541, 0x8643aa3c, -0x8f838181, 0x397fe4f4, 0x8a814677, 0x93e3affa, 0xa6fa21e9, 0x7a3e7f7f, 0x332a7872, 0xf28c8176, -0x227f573d, 0xbbbb6348, 0x7fefb2de, 0x43817f69, 0xc4c37b31, 0x747fa118, 0xacb3819c, 0x7f689f89, -0x74e0604b, 0x81b57f88, 0xe925a0cf, 0x81be2181, 0x126d34f1, 0x7648d74e, 0xd760b29b, 0x04d0fda1, -0x3b858181, 0x1be20981, 0x8127ac7f, 0x8a6b8181, 0x7f616ca2, 0x37e6e881, 0x7f9b82c0, 0x7f6e7f93, -0x8dc72420, 0x752f3d39, 0x5e7fd2e5, 0x7f25c372, 0xe97f2677, 0x307f0000, 0x81383b86, 0x713de0fd, -0xe47c817f, 0xf0214e8f, 0x8108349e, 0xe0c92881, 0x7fafb0e2, 0xe939b48c, 0x4855d8ae, 0xb581e469, -0x967feb6a, 0xba543d20, 0xc47f0c62, 0x2a28e6b2, 0xd27fb09a, 0xbadf7f7a, 0xbf98d54c, 0x5f54cfa3, -0x4881248d, 0xc97f7f53, 0x17816966, 0x3450877f, 0x4ff681c8, 0xfdb8786d, 0x0209730d, 0x7fbbba84, -0xc5994cff, 0x4d31cc44, 0x7fb99400, 0x239d757f, 0xa2bd517f, 0xd5558194, 0x93818191, 0x819b8190, -0x447f9289, 0x777f3e81, 0xc2c04a7b, 0x27c38eaa, 0x437a383d, 0x7f812432, 0xbd77707f, 0x7f81ea6d, -0x40256698, 0x81a95b58, 0x2fb47f81, 0x74b64d86, 0x70f07f23, 0xd7d6bbd5, 0x817f18a6, 0xe862327f, -0x3ff56cff, 0x7f7f8197, 0xcb75c381, 0x58954f57, 0x43818176, 0xa903811d, 0x7f6abbfa, 0x8cd7a77a, -0x55814473, 0x7f819e1a, 0x557f9e89, 0xa9c955e0, 0x648191b0, 0x81a97f51, 0x1dbc1181, 0x685a6b36, -0x7f2e5ef2, 0x59819afb, 0x3f30fd68, 0xe986702b, 0x810a2581, 0xfedf7781, 0x947ffb3a, 0xa9777f29, -0x9c547f3d, 0xe36d7f07, 0x81909281, 0x2b87817f, 0x07aa817f, 0xd9137f30, 0xb791d3ff, 0xb84869c5, -0x4db4e1ce, 0x81beed66, 0x1637adce, 0x10a1897d, 0xfd817fbb, 0x5771c343, 0x3b16dc58, 0x7fbf813f, -0x7f9ba269, 0x353a7e21, 0x14f07fa6, 0x7f81815b, 0x484bb301, 0x0000c27c, 0x59141b93, 0x7f637f3e, -0x3012937f, 0xf2a2b350, 0x1d7f7f7f, 0x81b6d4ed, 0x4fc3ba54, 0x3f7f107f, 0x02af3855, 0x598c814a, -0x3eb09fd7, 0x636832b6, 0x7f9e817f, 0x7f939c7f, 0x7fa99581, 0x7f817fb1, 0x387f3475, 0x9893f771, -0x52813581, 0xc5c75881, 0x7f787887, 0xb97981d0, 0x27436262, 0xfae6f21d, 0x81cacf5d, 0x41a5de81, -0x81817d81, 0x3b2f7f9e, 0x5dc0ade8, 0x3d0e8154, 0x81bd3a0a, 0x6e818153, 0x7f818123, 0x817fc575, -0x811b669b, 0x7f037929, 0x26acac81, 0x7fb3efb6, 0x82817fc3, 0x0c81f981, 0x607a677f, 0xc8258116, -0x0ae77a50, 0x816fba35, 0x7f256549, 0x04c57f89, 0x4381075f, 0x81cd3b56, 0x8ccdad7f, 0x7fa45cd5, -0x817fb67f, 0xb7698dbe, 0x5562298b, 0x688c257f, 0x9d7fde81, 0xe57f4e81, 0x7f81c9ea, 0x281a41f9, -0x7ffdfc6c, 0xaa32217f, 0x81a08166, 0x8181b1ae, 0xc447880e, 0x2b81367f, 0x2944a47f, 0xc6de9b49, -0x81816841, 0x54fa7fa8, 0x587beb7f, 0xe3475a81, 0x81dc2cb1, 0xa95dc06d, 0x8bd7477f, 0xb05d7f81, -0xb4c19d7f, 0x43817f53, 0xde7f5c7f, 0xe3d2817f, 0x8948aadf, 0xc17f7ffb, 0xd08188c1, 0x8181204e, -0xb3b6d781, 0x7381b381, 0x787f7681, 0xee640849, 0x657f8181, 0x811b329b, 0x5c728eed, 0x0c7f59c9, -0x4cc3b12c, 0x814f7e3d, 0x5f7f7f46, 0xf9817fd9, 0xb1b5ba76, 0x1f42609e, 0x3db30000, 0x400d7f46, -0x7f7f7f81, 0x45d36281, 0x81df9581, 0x7a7f7f53, 0x8181330a, 0x7ff5c3ab, 0x9e81b4bd, 0x7f70c27f, -0xac1666b3, 0xcf7f52e2, 0x817fea30, 0x8c4b3f7f, 0xa085bde5, 0xabae307f, 0x817f7fde, 0x17bc61b4, -0x914ccc4b, 0xe1e56bae, 0xac294f88, 0x75e562cd, 0xbfbd35cd, 0xed507f81, 0x81afcf81, 0x7fdc819b, -0x5a0385e8, 0x4f2aabf2, 0x569c7f3f, 0x7fbee1bf, 0xb0407fc4, 0x6b548214, 0xbcd6877f, 0x3d6e7716, -0x9a8134a3, 0x0a7f7f81, 0x29d73eca, 0xadbe7f65, 0x7fc1bb81, 0x7f63dc7f, 0x7f815430, 0x810e2366, -0x7f36057f, 0xda39d7d0, 0xe9855ddb, 0x7fffa2f9, 0x3b9a8181, 0x7f06b781, 0x844db0a2, 0x7b1d7fa3, -0x99a795ad, 0x7b819a6a, 0x3781819a, 0x867fc788, 0xa181817f, 0xfcc3637f, 0x747f5a5a, 0xf27f690f, -0x2f8a9c2f, 0x617f7fb3, 0x81b4b1c2, 0xa2818b96, 0x7f7f7fa6, 0x20707f81, 0x7fc9817f, 0x55577fc3, -0x777b40b9, 0xdffa3781, 0x38ba0e4e, 0x4f667d32, 0x9cf081ea, 0x8187d122, 0x79af9ebc, 0x647f99c2, -0xd1a47f79, 0xaba67f7f, 0x6b270e96, 0x90c07265, 0x817f4b81, 0x71f31f65, 0x2d818692, 0x65570681, -0x81f59b98, 0xe6b181ec, 0xc5b1a58f, 0x7fb2c981, 0x7fdb5914, 0xe37f81bd, 0x7fefd823, 0x9a7f9ccb, -0x631762c2, 0x7f4e81b8, 0x813d88c1, 0x9768c97f, 0xbb867f81, 0x2cd79456, 0x00004aa7, 0x8ec66e57, -0x7f7af878, 0x747f3cb4, 0x8c774fa4, 0x7f8df013, 0x8c5c7264, 0x3aade68d, 0x81819c30, 0xb0d38147, -0xbd816181, 0x4f415cbc, 0x7f21f710, 0xf7ba5565, 0x81df367f, 0x637f7f9a, 0x7f182e7f, 0x6f81996f, -0xca547fe5, 0x637f8db9, 0xccb4fe59, 0x55ca7f81, 0x7f7f7fae, 0xceffc677, 0x2955d0f8, 0x91a07f7f, -0x7f818181, 0xebc2f87f, 0x7f213646, 0x94a2a981, 0xd1819bdc, 0x7f866084, 0x2381ff8b, 0x75b58114, -0x447f162b, 0x5275e0a3, 0x37578cc2, 0x0dc1ec31, 0xb73681a8, 0xb081978a, 0x74429a2c, 0x698859dc, -0x937fb91d, 0x7fcdc06e, 0x81b4ffff, 0x7e2b168d, 0x4b649aa9, 0xe648be08, 0x44e37b7f, 0xc0fc27e9, -0x1b16521e, 0x81577fc5, 0x7f8152a8, 0x2981ee7f, 0xf08dd19f, 0x7d93ed81, 0x814435c5, 0xe6c67f29, -0x7ffc8111, 0x87f65881, 0x3f62563a, 0xa09a81f9, 0x490f5781, 0xc70d6284, 0xfb818181, 0x56817f38, -0x87420960, 0x0d2dedb3, 0x8ef18143, 0x4c5b4a62, 0x8f947f81, 0x667f8121, 0xcc817f81, 0xb567a44c, -0x7996b182, 0x736e9881, 0x81627f7f, 0x7f8e7f81, 0x725ee43d, 0x9f436a50, 0x7f055d88, 0x93498181, -0x21d08f7f, 0x26f17f3c, 0x581d939b, 0x90595ba7, 0xf5200e81, 0x4b91b78f, 0xcb7fc693, 0xe87fd04b, -0xaf81087f, 0x14ac4a01, 0x7f7d7f81, 0xe014dd7f, 0xc2816aed, 0x79760a93, 0x7f9b817f, 0x81480000, -0x844d73a5, 0x7f8181bb, 0x819dae3f, 0xc87f8e82, 0x9d81a23e, 0x7fbd813a, 0x8181702e, 0x4fab7a67, -0xd57f70b6, 0x817c53ac, 0x1355de7f, 0x4264437f, 0x81b0ff2f, 0x16d6e094, 0x7fc40f55, 0x7f9b7edf, -0x7f5a7f81, 0x7f996e66, 0x8e932881, 0x7f817f81, 0x6d4ca679, 0x815f871e, 0x81b4817f, 0x7fa97f81, -0x5e03827f, 0xbcd8b6a8, 0xc5683edc, 0xbb007fdc, 0xea266973, 0x498e467f, 0x86b1cc7f, 0x17814738, -0x81b7ae62, 0x56fea8f3, 0x5eac534d, 0x54f67f81, 0x24add4ce, 0x811a7881, 0x81cfc383, 0x9f2f81ef, -0x7f1f41fe, 0x819e3781, 0xcc73a3b0, 0xee148181, 0x7181d87c, 0x81c1c9e2, 0xfee4727f, 0x9b608139, -0xa2ec4ace, 0x7f810c7f, 0x9a7f2288, 0x46b169e4, 0x9b40817f, 0x547f2f7f, 0x81ef4f81, 0x243fffe3, -0x8181dd3f, 0x347f6596, 0x7f59c3fa, 0xa26cc7ac, 0xf7384881, 0xbdc0a118, 0x7f8173a8, 0xabf1b3e3, -0x7e3e8eac, 0x30c07bce, 0xbca0b981, 0x75816414, 0x81377f81, 0x7f7feaa1, 0xd8287f86, 0xfbd98bd1, -0x7f987fc1, 0x81b8347f, 0x8c7f37e2, 0x987f3c7f, 0xb5f681ab, 0x347f1adc, 0x1b815481, 0x91f17f60, -0xbf85a67f, 0x6d7f2374, 0x587f3c1b, 0x74b0ae9c, 0x97a64fb4, 0x1437697f, 0xc77f3b81, 0xf4e0bbad, -0xb6892b64, 0x5ed0e47f, 0xa55c8100, 0xbbe24e10, 0x50bb6551, 0x6db5349d, 0xaaae405f, 0x4d7f4f6d, -0x989e95a5, 0xcae9bf2b, 0x811e7f4d, 0x90538181, 0x7f9f096e, 0x4126a5df, 0x1369537c, 0x81a73581, -0x722f1409, 0x8b297c54, 0xf17f5081, 0xc22b4595, 0x7f6fde57, 0xdea96095, 0x7f98814f, 0x40f8fb81, -0x697fd77f, 0x35e07f33, 0x27459a7f, 0xc0818181, 0x3e817fb2, 0xdd5eae81, 0x8a8efd53, 0x13e91281, -0x2c486ba8, 0x7f6b447f, 0x7f818120, 0x1c496781, 0xf8e45993, 0x48817f81, 0x009db045, 0x7fd9c722, -0xab817fe2, 0x73bd7951, 0x687fa97f, 0x7f7f7fb8, 0x4f447ffb, 0xfc31d9c2, 0xc1d5d865, 0x526abd82, -0x7f6e7f47, 0x6b31817e, 0x8509817f, 0x5581fcbf, 0x7f9bd8ac, 0xcc22f37f, 0x547fa07f, 0xbd4fd2bb, -0x6f49a523, 0x835e896c, 0x65458e81, 0xd0e37fd2, 0x81587fe0, 0xd95fb08b, 0xd938d43f, 0x11e67fc6, -0x7fec3c2e, 0x7f8581d5, 0x017981b9, 0x812c8133, 0x307415cb, 0x2081bd7a, 0x994d5c83, 0x53812ab3, -0x7f8190bc, 0xad811645, 0x73c1ca14, 0x94c87d32, 0xbd4a7063, 0x7f442f7f, 0x06812617, 0xc481acc0, -0xc7bacc81, 0x81de5481, 0x7fa3167f, 0x4a3a385f, 0x2b817f37, 0xae912b7f, 0x32c4cfeb, 0xc3bf3bb1, -0xa4a63e50, 0x846c7b7a, 0x5c81816a, 0x75813daf, 0xd0665307, 0x6031117f, 0x507f5429, 0x29bfc44e, -0x81b69437, 0xa4c54d61, 0x81391b7f, 0x98347fec, 0xf7da5b06, 0x7e3d8b7f, 0x7f7f1abe, 0xa955d23a, -0xb7810000, 0xa1608164, 0x5f813cfb, 0x16602281, 0x5fb6814d, 0x3c3fd67f, 0x5dae83eb, 0x58ac2c2c, -0x097f5d25, 0x6081da52, 0x7fd4818c, 0xe181d13c, 0xc66d7f2c, 0xe94a00a3, 0x2cec12a0, 0xe84c6398, -0x64398162, 0xd056816f, 0x8147e081, 0x9ceb75c0, 0x7fbec481, 0x16d15734, 0x8158cd7f, 0x369c8172, -0x2a479b81, 0x7f4e9686, 0xb1494e0f, 0xe5816226, 0x057f7f55, 0x81dba929, 0x8f1890e4, 0x5e7f817f, -0x7f7f8162, 0xfced63c7, 0x370aadc1, 0x5f09b34f, 0x7fc0be25, 0x36927fec, 0x814d0ab6, 0xfd077f60, -0x8162f9ab, 0x8185597f, 0x2bac2f66, 0x28e6aa9f, 0x814dc1c6, 0x717f3841, 0xffd1078b, 0x4f5b8a12, -0x7f429a7f, 0x7f734d7f, 0x43817faf, 0x7f4e7f52, 0x232e0524, 0x7f4158e4, 0x327f7f7f, 0x89b464d8, -0x8130a3a7, 0x7fe6ac32, 0xd1818e81, 0x427f957f, 0x8150c60e, 0x3cb50481, 0x31955f7f, 0xec427f9f, -0x99eb5f69, 0x8ac893da, 0xf97da17f, 0x7f847f73, 0x7f97ce7f, 0x7f7fe806, 0x8984629e, 0x34539cba, -0x8a64a575, 0x25297f49, 0x1c509d07, 0xd5aa7f7e, 0x74817f79, 0x81819981, 0x95815a8b, 0x9518a19f, -0x3d9183ce, 0x817f00a1, 0x30306781, 0xc67f7f7f, 0x81594a49, 0x3d620f81, 0x3481bd81, 0xc3af8e63, -0xc249dc8b, 0xe5fa637f, 0x81185512, 0xa0b48307, 0x814c817f, 0xc6dac58b, 0x8b5c781a, 0x81982c81, -0x0000b269, 0x8105f78d, 0x81ad60f7, 0x81ffb8cc, 0x917ffed4, 0x104fc0a1, 0xfa38b45b, 0xb5318137, -0xbd781466, 0x0bd8068c, 0x72c57f91, 0x8181b48e, 0x7f81aedc, 0x43677f7f, 0x7f4f7f3a, 0x437f8178, -0xe99d0b81, 0x868792bc, 0x17727f57, 0xada05e06, 0x694d707f, 0x9081e59b, 0x7f3a8181, 0xb2bae481, -0x7f81dde5, 0x3e307f7f, 0xcaa07f3a, 0x2e1a8170, 0xed0f4881, 0x297f7f61, 0x81cc815e, 0x4fec813b, -0x1a4f02b2, 0xc6e66a4e, 0xe9817f6f, 0xc2c36a02, 0x302e9f60, 0x4ea28137, 0xb9d57f32, 0x462a7f81, -0x9085bb36, 0x7f7f817f, 0x3c714908, 0x70c9c17e, 0x5a7f204b, 0x8fbf6f70, 0x97880981, 0x0cbacfdb, -0xb80f6d81, 0xb6bb3aef, 0x81691db8, 0x1081e2df, 0x7f0504a0, 0x797d5e7f, 0x006de423, 0x7f19f16f, -0x1eb28181, 0x819f7f81, 0x7f6a84b9, 0x936537f2, 0x14a87f81, 0x7fa9cb81, 0x81813a8c, 0x8182c47f, -0x56758144, 0x81c55c97, 0x86de0b81, 0x818181d9, 0x7f386281, 0x7fbb2738, 0xffd18d81, 0x17e1eb34, -0x656449b7, 0x7f7fbe33, 0xd7f681b6, 0x77313c4f, 0x7dc9151e, 0x28debefb, 0x7f7f5c62, 0xa850b25f, -0x81166b59, 0x7aea7f05, 0x325d81a1, 0x7fd06471, 0x93137fbb, 0x43a51892, 0x3e326cfe, 0xab81a942, -0xb208d017, 0x817f0781, 0x08fcca86, 0xa31a7f81, 0xeb93206a, 0xd4fa21f4, 0x684f9029, 0x7f817f57, -0xdca7812c, 0x7f7f0000, 0xf2dc5a96, 0x7f62aa7f, 0x918d1c7f, 0xfbb5add6, 0x407fc0da, 0x4d5d9f7f, -0x935d8166, 0x817da9b1, 0x205d7f3a, 0xe08b4181, 0xd8bd7f7f, 0x4f33818c, 0x8105b781, 0x2f81cd81, -0xbaf8a48d, 0x2b81aa7f, 0x90b5810d, 0xbc62c181, 0x1592f72a, 0x4d81b5fe, 0x7f81e447, 0x99d22181, -0x303e3ea5, 0xa23078a5, 0xba8a7995, 0xd5282790, 0x6681453a, 0x7ff7ab7f, 0x7f4e8195, 0x8bc48181, -0x817fd481, 0x81b98142, 0x265a8182, 0x81f768a7, 0x85f11690, 0x7f957f7a, 0x109981a4, 0xeabba365, -0x577f9057, 0x5f7fae65, 0x817f8199, 0x718e3daf, 0xd6818181, 0xd1a1cc81, 0x97a48187, 0xd8d14520, -0x497b7f10, 0x7f81d781, 0xb77f747f, 0x7f813974, 0xc52a7f7f, 0x7a292226, 0x81602ef8, 0xe481cc7f, -0x0b4266a9, 0x4722287f, 0x7648747f, 0x9c861ec6, 0x4ba9efbe, 0x2063813f, 0x5b277f81, 0x54608181, -0x81b3ae7a, 0x5b812281, 0x6c306f81, 0x4fa0bcd5, 0x540c85d5, 0x2f81817f, 0xd2c9078a, 0x4281a39a, -0x3e7fa1d8, 0xa47fb881, 0x3efe9c7f, 0x7f5f6c23, 0x4681d46f, 0x49cb81c9, 0x7f4eaa68, 0x2e7f7fac, -0xbb497fd0, 0x3a4253a8, 0x91a6aaaa, 0x4f7f5a52, 0xf9375fad, 0x8b2a7f2d, 0x746e7f81, 0x7fb0cbe0, -0x5a917fd1, 0x5b65867f, 0xe9606f9c, 0xe9f8814e, 0x3045cf65, 0x937fad52, 0x760f5a81, 0x9be4ba50, -0xb59d81e5, 0x0000d77f, 0xd481bd81, 0x27224a55, 0x61467c81, 0x91d865df, 0xffa17fe4, 0x7f8a0c68, -0x1640fd52, 0x987f7f6e, 0x4d815a5a, 0x3081b65b, 0x7d7f6c8e, 0x5b26bf60, 0x44814281, 0x5a813427, -0x81f47a3b, 0xef9281eb, 0x81994ca6, 0x7081317f, 0x7f7fd49a, 0xfb8c8e7d, 0x546ad581, 0xd6817f16, -0x7f3e4b81, 0x4f4c4898, 0x817fe22f, 0x819a37c9, 0x387f1a55, 0x8cfddd03, 0x318aa9bb, 0xcb6e2d90, -0xa47f0d1b, 0xae81c204, 0x7f797f27, 0x0a7f65ad, 0xe4ac81af, 0xb2d74d81, 0xca0fad81, 0x357f69a8, -0xad71a581, 0x5be9d4de, 0xaebe8181, 0x95817fd8, 0x8f7aedb6, 0x0a81e59e, 0xa07f20eb, 0x7e66427f, -0x56769b04, 0x2e8149f1, 0x81f6f87f, 0xc3813768, 0xbcc28850, 0x6cbd3dac, 0x7fda99dc, 0x657f7fd5, -0x7fcf7f60, 0x81233698, 0x81daf17f, 0x867f7f7f, 0x7fda7f36, 0x0c7fae20, 0x7f817d78, 0x7fd09481, -0x818f30e0, 0x7f437c7f, 0xaecc2b3e, 0xcf427fca, 0xccfd2cce, 0xefd898bc, 0x7f5b81e2, 0x1d4b812c, -0x865871ae, 0x553ab4ae, 0x69817f7f, 0x811a745a, 0xa32a163d, 0x2e967f57, 0xff817f7d, 0x70d43e9a, -0x814681ae, 0x9f817f31, 0x819b8110, 0xfca3819d, 0xc4fc45b2, 0x56b2817f, 0x7c811d7b, 0x997f8181, -0xbe0dc3d8, 0x9f5b56a6, 0x7f8181e2, 0x5d59eb29, 0xa357e4c6, 0x8161817f, 0x3c7e7f32, 0x7fd07f06, -0x817f82ad, 0x93de8341, 0x92850000, 0x0c65c06f, 0x0a4d2817, 0x7705d752, 0xbcd8687f, 0xc4397f7f, -0x1b7ffd47, 0xada5012d, 0x7f8158e5, 0xba617e10, 0xa97d811f, 0x1fb61081, 0xac41e74e, 0x8c7ea7a3, -0x997f452e, 0xb5858149, 0x5c3cb0a0, 0xc8ffab38, 0x49d65d7f, 0xbbd07c81, 0x35b06b7f, 0xcc7f7f7f, -0x50c42881, 0x707f7fde, 0x7fd67f7f, 0x7f819981, 0xd4d6a781, 0xcb103b7f, 0x7f4fee9f, 0xb3997fe0, -0x7f9381a5, 0xbc7f9a28, 0xf4aa819f, 0x7fe862df, 0x316dd1f8, 0xb4a66f81, 0x98816581, 0xdb817f2e, -0x34819ee0, 0x746c817f, 0xdc9cd3e1, 0x8e7fab2d, 0xec368b2e, 0x7f8381c8, 0x817f7f7f, 0x814de179, -0xed5b7f4d, 0x274bdfa1, 0x5851250b, 0xec811a81, 0x7f365569, 0x57935681, 0x08757781, 0x196d813e, -0xa67581b5, 0x83a7d981, 0x73988163, 0x816eb57f, 0x2ce47e40, 0x5bef6481, 0xb131155f, 0xc2f9817f, -0x519b67b4, 0x7d2c7f59, 0x7fdb8150, 0x5c7fc881, 0xca285c9d, 0x7f7f7fe6, 0x39aabd59, 0xb9b494e6, -0x81401831, 0x74247792, 0xab7dfaab, 0x817fcd81, 0x819b25e3, 0x587f337f, 0x817fd238, 0x818a332c, -0x9db6bcc3, 0x1681c227, 0x7058306d, 0x50a27f64, 0x8181a4b2, 0x7fe2a57f, 0x8d5f4777, 0x7f7f8f81, -0x6e8381f7, 0x22518136, 0xae72d0d6, 0x7f9bba7f, 0x8117d27f, 0x792b7ff0, 0xe45892e0, 0x8e6f5c34, -0x3994817f, 0xa981afca, 0x0000a592, 0x7f811d81, 0x09548181, 0x0ea8127f, 0x7f7fb49d, 0xd6690b81, -0xa1846059, 0x81d15d81, 0x6ccaf481, 0x81ddef83, 0x7fccc681, 0xab502722, 0x4620e862, 0x3981de76, -0x7f81889f, 0x5b818154, 0x797222dc, 0x4b8153a6, 0xa470816d, 0x7fb2657f, 0x81150b64, 0x89dc1f57, -0xaa636e7f, 0xe59cba67, 0xb3b2da41, 0xc7818192, 0x7637d0d9, 0x1a78a78c, 0xaf5e3f5c, 0x8181a581, -0x56285469, 0xeed47f7a, 0x697ff6a5, 0x7f7b7f1e, 0x398181cb, 0x999fe4a0, 0xc17f8816, 0x5c815aa2, -0x78717fce, 0x7f7f842c, 0xf07f4c43, 0x7f818148, 0xbc66c134, 0x8168ce22, 0xaf1791a8, 0x3522ae40, -0x95afa97d, 0x435d4e69, 0x2ab59d7f, 0x8197c47f, 0x93cfe645, 0x8dba727f, 0x227f7f81, 0xb17feb7f, -0x702a7f81, 0xebd463b7, 0x5381e929, 0x817dba7f, 0x5c811a24, 0xfa7f814d, 0x817f8197, 0x2f7f704f, -0x36817f7d, 0xe87f0d7f, 0x54b07fb6, 0x81733686, 0x8fcb7fcf, 0xd888c623, 0x2de5ebc5, 0x8f6f6569, -0x7f7981f9, 0x908136b1, 0xa93a7fb5, 0x405f8141, 0x01a54dbc, 0xb6815763, 0x8ccc3ffc, 0x5681105b, -0x4a1498bf, 0x4c6f82e5, 0xa67f556c, 0x7f5d564f, 0xdb8132d0, 0x1e958139, 0xe386811b, 0x04845a40, -0x7fbd8109, 0x833b62ec, 0x81f40717, 0x701d8181, 0x8191ee44, 0xae2d9d7f, 0x3fa17854, 0xcbcad981, -0x73c2d681, 0x5f738681, 0xb87081dd, 0x817f0000, 0x037fcda9, 0x922caef5, 0x7cc7f91e, 0x9a7fbd88, -0x81819528, 0xf2cd7f53, 0xfd7c8170, 0xfb7fb997, 0x7f7f3f7f, 0xe4818154, 0x18c4414b, 0x4fa48da4, -0x81718181, 0x817c957f, 0x7f2e1582, 0x09bc81bf, 0x5e4b817f, 0xd5590d7f, 0x7f818b44, 0x88abcf7f, -0x39508181, 0x81ab86bf, 0xba58c325, 0x65bc83ed, 0x3402857f, 0x81c61e7f, 0x8bbab505, 0x81b2aba0, -0x8153ec32, 0x6803d681, 0x819d817f, 0xb6de31a4, 0x367f7fc2, 0xb1048db9, 0x6389815b, 0x7ffb7b01, -0x8f1b817f, 0xc1817f7f, 0x04187f64, 0x45cfac7a, 0x0f1b578c, 0x0f209f24, 0x33817f7f, 0x7f7f7f81, -0xac814781, 0x5a9d3dbf, 0x62a65581, 0xcb8a7353, 0x7f81c5b8, 0xba447fa1, 0x9081774d, 0x7af9ed38, -0xb6849bce, 0xacf07c18, 0xa1894581, 0xd7634242, 0x2d0e8174, 0xdbf799d9, 0x7fe7b446, 0x84110cf7, -0x6474da81, 0x8185e120, 0x9da4f123, 0xd07fce54, 0xa9cdf7af, 0x84db817f, 0x9e9a23b7, 0x81774c7f, -0x7f818152, 0x817f5243, 0x39058181, 0xbbc91e81, 0xe3d87581, 0x81b66581, 0x7fb06a61, 0x0bcd0fdf, -0x8188dee9, 0x1cd87f92, 0xf036977f, 0x977f4d61, 0x1da12581, 0x3a7fbee0, 0x87467fa8, 0x7fe27fa3, -0x89d37f7c, 0x397c7ff4, 0x57e64171, 0xc4819181, 0x93677f41, 0x65be2517, 0xbe6c7f7f, 0xaa7f7f81, -0x255d650e, 0x098181c9, 0xe8124525, 0xc73a4949, 0x24d14b47, 0x6730f681, 0xfe251c6e, 0xbc7fa092, -0x81917f5f, 0x81d1ab81, 0xd6128193, 0x13d62e52, 0x941c14f4, 0x25b452c6, 0x7f9c947d, 0x815d3f42, -0x81c8c9d0, 0x7f524663, 0x40ae7524, 0x2f81c77e, 0x815c8483, 0x7f7fb27f, 0x7fc37f44, 0xe07f9db7, -0x7b812117, 0x1c965b7f, 0x1822ad4b, 0xccb9e67f, 0xc5b18115, 0x7f8c377f, 0xd13939cb, 0x38e8147f, -0x4e722d21, 0x9e81ef00, 0x81c0fa81, 0x812d8158, 0x9d84a57f, 0xefc32797, 0x7fc9987f, 0xa37f8199, -0x81812681, 0x81818190, 0x89a9814c, 0x7945c381, 0xa57f816d, 0x7d65af81, 0x81bb7f72, 0x1c81cd7f, -0x6d3e4e7f, 0x6cbef90d, 0xca24894d, 0xb04892b6, 0x7f7f1e81, 0xf57f5965, 0x0769a7b0, 0x698562b9, -0x16817f7f, 0xabb94bb7, 0xc35c81f3, 0xb9b5728e, 0x8181641f, 0x81d2d2be, 0x9181bb37, 0xf82b9222, -0x7bdc7ff5, 0x9b812fa1, 0x8173f4ec, 0x94810185, 0x2bd00d63, 0x814c50dd, 0x9be376e5, 0xed7f90dc, -0x817bf98c, 0xe1df634d, 0x287f81ae, 0x27a4f115, 0x62101a81, 0x2723b481, 0x9c507f66, 0x44a01769, -0xbfd13025, 0x7f815b81, 0x5d5c817f, 0xb37f7fa5, 0x7f79b2c6, 0xa1e2847f, 0x813ac57f, 0x417f8b7f, -0x4b505b55, 0x22d47fbb, 0x7f886ad7, 0xf78c7f48, 0x53a5245d, 0xdfd37f1b, 0xb37f81c4, 0x907fc99f, -0xa393f1c0, 0x7f5f7015, 0x37be3fb3, 0x7f4c9e28, 0x7f770000, 0x9b7a0531, 0x7f35cdde, 0x5b4047cf, -0x81881773, 0xdc6e9ea5, 0x517f477f, 0xb2a77f81, 0x9981472d, 0xd4c57f81, 0x6ef2a77f, 0x81d481a3, -0x3d87307f, 0x214321bd, 0x7b7f7f8e, 0x997f1cbe, 0x266681ec, 0x3639f87f, 0x687f7fed, 0xf17f8191, -0x1558ae38, 0x815ac086, 0x81247f78, 0x7f612db7, 0x128d7fc9, 0x187fbf81, 0x4a898116, 0x3a6c818d, -0x7f7fdcf1, 0x60cb3e9c, 0x81bf627f, 0xe7c17fa1, 0x52247fd2, 0x814781dc, 0x6eb67f1a, 0x9d0b7f7d, -0xc2b238f8, 0x81b1427a, 0xa1555aad, 0x103c0c29, 0x97319c81, 0x05ab3a7f, 0x811f1d7f, 0x817f8195, -0x40bffc7f, 0x3aa38f4a, 0x46e17fcb, 0x6781fc31, 0xb725a5e4, 0x427f8cbd, 0x7f857fd4, 0xca1f7f9d, -0x2f77c6b9, 0xdde30a0e, 0x7f93fca2, 0xc6aa7fc7, 0x7f9e7f7f, 0x9b78012e, 0xdda0d07f, 0x0b4c7f83, -0x7fee4b44, 0x81640552, 0x40d573c0, 0x390efbce, 0x327fb881, 0xf5e69aec, 0x81e9c7d1, 0x81717f74, -0x81817d78, 0xac6eba86, 0x41a2d07f, 0x8981da45, 0x5264b681, 0x527f46f2, 0x949e7f52, 0x7fdd7fbd, -0x81678102, 0x87756c64, 0x3d2a81ca, 0xc87f8107, 0xd17fb64a, 0xa7b553b5, 0x8191812a, 0x55ddbf7f, -0x517f7b7f, 0x897aad7f, 0x63817f8d, 0xd9547f7f, 0x43437351, 0x84818181, 0x3a7f8127, 0xccbfdf7f, -0xe1191588, 0x81c80c65, 0x7ffcf571, 0xcc147b7f, 0x00007081, 0x2b7f7f7f, 0x889b3a2b, 0x5358e78b, -0xfcb917ab, 0x81c3f74d, 0xd57faa18, 0x69937f23, 0xd7321b81, 0x5db1ad81, 0x17577f0a, 0xf48118bf, -0x81822681, 0x2981e87f, 0xc16e6c7f, 0x891d38ae, 0xf37f813f, 0x81b96b55, 0x2fcd81b1, 0x23b5f981, -0x695c4d28, 0xa0810fab, 0x6cd5ea3d, 0xefc68ec4, 0xae32887e, 0xa27f0b17, 0x7f8baa97, 0x8116b3a1, -0xa393817f, 0x817019f0, 0x1d7f8193, 0x18f0d764, 0xb27fb7c9, 0xc4da637f, 0xcd586f56, 0x7f23810d, -0x572f25f3, 0x05df7f15, 0x817f815c, 0x8b147f84, 0x0f817f6b, 0x7f1f7f7f, 0xbccee4a8, 0xcb5ad7ed, -0x33a5f88b, 0xc7817ecd, 0x8781817f, 0x817e6444, 0x6697817f, 0xf9490257, 0x83d5f581, 0x7168b332, -0xf4ed4781, 0x17e0c1c4, 0x16b9c997, 0x8581247f, 0x81887b3f, 0x2281a5c7, 0xce437f0f, 0x994c6f81, -0xbcd09735, 0x9269d57d, 0x449a7e61, 0x8c6e7f81, 0x81b38c7f, 0x81db7791, 0x62602681, 0x3246817f, -0x81bb2881, 0x6d2510b4, 0xb07fbf69, 0x49ea817f, 0x938153e7, 0xf17f425b, 0x3b817f89, 0x36b48181, -0x837c1d0a, 0x853cbd2c, 0x2950527f, 0x388de1bc, 0xfa1c7f54, 0x7b507f7f, 0xad311c42, 0x8d8ae6c3, -0x9081677f, 0x58810e81, 0x984b4881, 0x4b9f407f, 0x819a00ff, 0x857faee2, 0xa06d9fb5, 0x448979b8, -0x9cc0f17f, 0x7f2fce7f, 0xa0b9ad7f, 0x428a7f7f, 0xdf562afa, 0x7f6f0000, 0xe04a5bef, 0xa7ad2867, -0x23818146, 0x7f7f0642, 0x7f481981, 0x7f810f81, 0x99a9db81, 0x64d437cd, 0xaf7fcb6d, 0x81815311, -0x723c81bd, 0xcc7fc729, 0x81a47e49, 0x9abce744, 0x7385eb5b, 0x7f7f5b7f, 0x2bb3819d, 0x81fd7f49, -0x7f5f8198, 0x7fb6a2f3, 0xe97fc33c, 0x436c79d3, 0x5ea67fff, 0x5a7ff2ac, 0x28aa713c, 0x8181c681, -0x7f7c8846, 0xaf817f39, 0x90bcc57f, 0x841c7f4a, 0x817f8181, 0x7f4e811b, 0xb53a81ce, 0x7f451a7f, -0x5f38027f, 0x7b81e4f3, 0x817f87c6, 0x8141318c, 0x532c81a4, 0x817fc84c, 0x919d33db, 0x29f2b781, -0x7f568139, 0x4658b1a6, 0x7f69342d, 0x81ab9582, 0x367fa301, 0x47468181, 0x7f8c8181, 0x81216a81, -0x9b577f7f, 0x7f447f7f, 0x72ef4649, 0x45418103, 0xee48bb81, 0xa7027c7f, 0x0ea4237f, 0x6b717cf4, -0xa296a17f, 0x17007f7f, 0x869835c8, 0x8a7f77ec, 0x5d7b8139, 0x32688f81, 0x7fdab0b3, 0x815c7f7d, -0x06a01fb6, 0x814981de, 0xa1c681d8, 0xdc6ff522, 0xd13081b1, 0x9c5a7ff5, 0x7f7f7f5c, 0x86faa148, -0x811a696b, 0xbb7fa2c5, 0x815779bf, 0xae3b7f48, 0x8c45d6de, 0x7f867f9a, 0x3e359b7f, 0xb7c48181, -0x78c27f95, 0xc4818181, 0x81cd7f3f, 0x558a8193, 0x7f4ca874, 0x4e1eb447, 0x2744355f, 0x9020ead4, -0x16e47ff6, 0x708123b7, 0xbeb61418, 0x27fcdd50, 0xde21e5d8, 0x9500a3db, 0xefc29f4d, 0x5ef0c542, -0xe02a3bc8, 0xe91a38bf, 0x24f81e3c, 0xe0fe4f11, 0x3be6891d, 0x7fef09ae, 0x16977ff0, 0xe8b74a18, -0x1a50fa2e, 0x24c04bf9, 0x39c84714, 0xbed7f6c1, 0xaeddab44, 0xa7f9ca2d, 0x275dc01b, 0x1df6e74b, -0xc3171107, 0xbcc93481, 0x1403f685, 0xcc1c0439, 0xb602ebaa, 0xe235d0e1, 0xf1afe3e3, 0x0814c025, -0xb4f93607, 0xa709c243, 0xbbfabdd8, 0xfd3e81e7, 0x2f9ae335, 0x1c1d52e9, 0x00f133a5, 0x23eee238, -0xc625eced, 0xefd56878, 0xe3cadc03, 0x585db90a, 0x024ace2b, 0xe3d804ef, 0xdf54d5a1, 0xc9e11709, -0xc3a20ccb, 0x18c0005f, 0x52424437, 0xccaba110, 0xc75736d6, 0xa8f1401a, 0x3186aa67, 0x0b1aaebe, -0xf952cf90, 0xfa4edd16, 0x9d72bee5, 0x2824f455, 0x9a3cb150, 0x6bbfe929, 0x6a6f5f9d, 0xbfa5385f, -0xf89828bc, 0x6b6d0baf, 0xcab514c5, 0xa9baf505, 0x24cff2c2, 0x1c2511d8, 0x3abccde9, 0x7f60deef, -0xbbf4dddd, 0x11366331, 0x0241c141, 0x5111c984, 0xc17f54da, 0xed4c1bb8, 0x0af6fb57, 0xfd2c28c0, -0xe790142d, 0x6bff6403, 0x7fd8cce3, 0x3c282cc0, 0xea48f68b, 0x3ecdd5e3, 0xb917f2e5, 0xd2b25334, -0xf65b10b5, 0xfdd0d4be, 0xe6e22cc9, 0xc59ec206, 0x3f3238cc, 0xbcbe2fd0, 0x2418c910, 0x3d07f7cc, -0xa25bf9cf, 0xdb81ebfc, 0xd35b2203, 0xde2d23cc, 0x3cd706d5, 0x0e34f6f5, 0xc2d20000, 0xfef1e4e0, -0xd26ad6e1, 0xfa130b0d, 0x324b211c, 0xc5dfc3a9, 0xf83ebec9, 0x0dd627c0, 0xcee99850, 0x4fcd1533, -0x04597ff0, 0x40d0ff25, 0x045cd181, 0x908f9ca1, 0xd0417f7b, 0x2f0a2c87, 0xfef998c7, 0xcc3370f3, -0xb0f4267f, 0x1bbe5072, 0xd8d6063a, 0xd058cb32, 0x448fffad, 0xa9b50064, 0x184ebdf7, 0xfe2e3538, -0x561f16a6, 0xe7f20181, 0x449b95f9, 0x0338f7b2, 0x4012bcae, 0xd67f6797, 0x4966f6f2, 0x1dcc60c0, -0xeecec631, 0x279f81c4, 0xc9f751be, 0x75994dc8, 0x01001ded, 0xb0ba1822, 0xbb14eff9, 0xb2dae837, -0x4cf69e23, 0xf35d6ad7, 0xf69e57c9, 0x3727d2e3, 0x31b3517f, 0xc1da575d, 0x30e2c1d5, 0x54d7beef, -0x293edf19, 0xeb37d80e, 0x296cee35, 0xeff14f04, 0x232d06de, 0xb2815853, 0x2c601508, 0xa5ecb6ff, -0xb407f524, 0x4ccd9a19, 0xe448b0c2, 0x01ebd4c6, 0x52fc03a1, 0x286afce2, 0xe4d45ebb, 0x2953101d, -0xca12d31f, 0x10cb00dd, 0xd2ae6347, 0x46e82f44, 0x45d64600, 0xae393c05, 0xf7219fb9, 0xeffe09d2, -0xedfbb5d1, 0x07070413, 0xd7d6ec37, 0xa0f7a621, 0x75bd023f, 0xc45b5d37, 0x19ca9b39, 0xd1ee50b7, -0x50062231, 0x301ca07f, 0xbeadd410, 0x1ce01d02, 0x51a5fbff, 0xd9104c7f, 0x79e4f23a, 0x33e47449, -0x1ceda8ea, 0xf6d65581, 0x418dd3e3, 0x9fc1e612, 0x54f747d9, 0x839acbce, 0x0000221c, 0x031434b6, -0xcc48960f, 0x1045ea23, 0xa8d7f8a1, 0xaf01243e, 0x2bf461c7, 0x9c2139dd, 0xd42bd5d5, 0xf8c2f5d5, -0xdeb61f4b, 0xf12ac9cd, 0x107f3209, 0x818d1d3c, 0xca34572c, 0x34da0052, 0xf9a951e2, 0xdf34d209, -0x0f8b37c1, 0xa7dee3d3, 0x1a390c98, 0x1d16e135, 0x33c3ad66, 0xd9e2cca4, 0xcbabcce4, 0x2eadd581, -0x81383b81, 0xc0db251b, 0x0a6e91c3, 0xdab3c725, 0xd2293bfc, 0x22d6abb5, 0xdb524adc, 0x30cf5f24, -0xb92527e8, 0x6000b7bf, 0xfefe1fe4, 0x2cf9035e, 0x2743f125, 0xd007b3ad, 0x2dd5e43a, 0x5a35e7b9, -0xea06e5b7, 0x39f3e1aa, 0x592614f3, 0x7fc3bab7, 0xf1aefe00, 0xf3e9b9fc, 0xcd81aee6, 0xae3e31cc, -0x95d8fbc7, 0x7f26bbf8, 0xf20e57e3, 0xf9eee307, 0xfde2bff2, 0x10e8f7db, 0xfbb0de50, 0xdfaa10e8, -0x5e18ee3a, 0x0520a445, 0xddd2bc9e, 0x13c97536, 0x33cf5159, 0xfac6d2f7, 0x18ca01e5, 0x112251da, -0x0211d9b6, 0x375feb63, 0x9a25b9cf, 0xfb5bf632, 0xe5b4a803, 0x95f55e8d, 0xdbede748, 0x39aed0bf, -0x5efd9c49, 0xcc7fd13c, 0xfba1a3d7, 0xa8a80206, 0x08f7e7d3, 0xd1fac77f, 0x32fb9272, 0xe1829834, -0x45408175, 0x34e4eec0, 0x0ca4ecae, 0x15e31638, 0x1d072d02, 0xee44d6ee, 0xafa5282c, 0x4d4d9f2a, -0xcdfc0f24, 0x9dfaf345, 0xbf3839c3, 0x3268a3e3, 0x2e4eacb5, 0x93dce12c, 0x4a484f3b, 0xdf7d0000, -0xeb113c3d, 0xd4bdf13f, 0xecc0f511, 0xd4cdf8c2, 0x42fc05f9, 0x53be2def, 0xb22e49cf, 0xead92e2e, -0xf956f1cc, 0x02c821e0, 0x1da533e5, 0x1fc50531, 0x34c30f37, 0x7ccba6e4, 0xab1afe2e, 0xb93bd67f, -0xea28a8a8, 0xf3ef282e, 0xac0c507f, 0xd0cbdd53, 0xd344ea1d, 0x472a1029, 0xed099f70, 0x1240edc6, -0x7f143244, 0xbae0d3d5, 0x7a4bddfd, 0x5f07d846, 0x1cdf4aaf, 0x4fc40ac1, 0xcfca381a, 0xb67fd847, -0xd381dde6, 0xdad40d1d, 0x64cb2d07, 0x171a8bc6, 0x11110cbf, 0x2c442dff, 0xbe90f52b, 0xd75500e5, -0xd8459ef9, 0xff0bc92f, 0x44a903c8, 0xb767d7f2, 0xc281fc02, 0xca534906, 0x25fdec32, 0x5f2aaeb2, -0x121b376c, 0xe3e41dd2, 0x12ecd9f8, 0xc5071a9d, 0xfaaeee7d, 0x183a1a57, 0xadcb921d, 0x1e33a3b2, -0x72e52634, 0xc8d4e81e, 0x3b1e0200, 0x321e1608, 0x49add232, 0x0516ff41, 0xc23181d3, 0xfa4e0151, -0xa63502cb, 0xda381204, 0x72d92da5, 0x7cd7ebff, 0xce08d106, 0x61c6f034, 0x55310f68, 0xed66c357, -0xc527d609, 0xdab11518, 0x41b808e5, 0x5f21e65e, 0xd4f6f036, 0xfc40008d, 0xaa7f19a0, 0xbff0ac1b, -0x78283b60, 0x1d0a4a03, 0xd6d0d016, 0xf1f23847, 0x58d93518, 0xd6d481b7, 0xaf11e02e, 0x5c74b67f, -0xd5734f27, 0x2fb07fc2, 0x29564eff, 0xcafae603, 0x1228f673, 0x3367ce30, 0x132d1342, 0xc80c10e9, -0x68ad07f9, 0x379c0c9c, 0x3a73c010, 0xc1a534bc, 0x69b0fc14, 0xf0d3ba81, 0x0d07bbe3, 0x3319fa45, -0x38815afe, 0xc1a67850, 0x7fe740fe, 0xc43fb638, 0xa0864249, 0x07a7dc33, 0x05e606d4, 0x3c6a81ca, -0x0cdb2635, 0x5dd3f756, 0xcbf09b70, 0x53b2a5b3, 0x5f035ab0, 0xfdda1fbd, 0x0510ac20, 0xa8611f44, -0x38ceb74c, 0x5048e2e5, 0x907f0238, 0xd9ad00d9, 0x7c247736, 0x8aabe3c6, 0xf5443d27, 0x7ff84622, -0x4bcc0a34, 0x797dc7e0, 0xf914e5f2, 0xa12df5d7, 0x0fdc23f9, 0x377f50c3, 0x8f47bf82, 0xb9948a4a, -0x8135ca9e, 0x523ace17, 0xd299fb23, 0x523b5407, 0x38b42a22, 0xadee2cd8, 0xee04b9c8, 0x2de3a5e2, -0x9f132faa, 0xa0030325, 0x019996f4, 0xd6c5562a, 0xf3e19255, 0x00ff2432, 0xe8f6cf36, 0xe55a7f14, -0x7079f06f, 0x1e11ff0b, 0xcbe89aa8, 0x6b363996, 0xe61dd6f7, 0x15133821, 0xf35940f9, 0xd9b139c1, -0x2ad6e10b, 0x2a29c0c6, 0x3c6ee3ce, 0x4b0a3624, 0x23cc10df, 0x17cdb502, 0xa46eaa3f, 0x42350300, -0xed66334e, 0x1d6fc255, 0x3213e4c5, 0x23d4a65a, 0x05b9a3e9, 0xbacd0c19, 0xc9c5b5b1, 0x8e12670d, -0x4aabbe2d, 0xb815e3c7, 0x5a2dd152, 0x3ef6551c, 0xf0a1b4f3, 0xb8b8459b, 0xc52dd72e, 0xb9f4b9f7, -0xbd05dcc8, 0xfae04029, 0xb16ad8df, 0x03d167d4, 0xaf08525b, 0xdbdf3117, 0x4192d163, 0x00a2caad - -hard_output0 = -0xb5bc6ac8, 0xf5373664, 0x1310345c, 0xd5bae4e7, 0x1fc9e83e, 0xebfdfded, 0x84bd86ab, 0xb7aabe00, -0x60b44fea, 0xb9067464, 0x30325378, 0xa9195955, 0xf70c6e5c, 0x90922632, 0xc90b1cdb, 0xf2f5fb69, -0x73056b63, 0x1a33bf3f, 0x17755b5c, 0xc58bff6d, 0x2f4390b2, 0x2869d508, 0xe7c7dfe8, 0x38552963, -0x21da5367, 0x07282b9b, 0xa4767105, 0x1e294251, 0xe350a940, 0xb8a6aa27, 0xed12d778, 0xf10d9ece, -0xab93527f, 0xcf2da7e7, 0x68f6d0b1, 0x811f4bca, 0x577b06b2, 0x3234f13e, 0x30bab7df, 0x8dc47655, -0xbb843bed, 0x86da3aba, 0x30950c97, 0xdd096d7a, 0xa871fd6c, 0x8bee4e6b, 0x8fea30d0, 0x6c05b4d2, -0xf3e144d3, 0xd24ebb1f, 0x065635e5, 0x8d3f2cf9, 0x536c6c6a, 0xfbb0a5d0, 0x3d707b42, 0xc44d5982, -0xa5f4ad8f, 0xf32c0970, 0x1bccf1a6, 0x05916020, 0xa64fb176, 0x5ede6a35, 0xaf4966da, 0x9df5e0e7, -0x75042abc, 0x9ef10481, 0x11ddcbc8, 0xa0f5518c, 0xd5c23418, 0x2393d558, 0xfbe7dfeb, 0xed1c64c2, -0x86a36508, 0xde2dfb1e, 0xb8d0fef9, 0x24505232, 0xc894e71c, 0xbcc752a0, 0x40b74e83, 0x90d23c8c, -0x728e4a61, 0x108f0b08, 0x66f522ee, 0xc258d851, 0x35a31c44, 0x11311b5b, 0xfd3d5be9, 0x5ae448ff, -0x4f64994b, 0x5b8247a9, 0x4021114d, 0x2f0b6e82, 0x5eaa9828, 0x50ac71c0, 0xfb86ee52, 0x0dc1ac9b, -0xbbd47645, 0x8f357115, 0x978ceea0, 0xd557db99, 0x99b30388, 0xfc9a8a1c, 0x0f75be1a, 0x50143e22, -0x8840989b, 0x738ec50e, 0xe6b2783d, 0xf67899c8, 0x27ebed69, 0x6c415a16, 0x3a6cc2dc, 0xcd4e4e5d, -0x6cb12b2e, 0xdb88d7c0, 0x79cd1582, 0xbc422413, 0xe72ad2f4, 0x8eaac30f, 0x0bd86747, 0x6d87f69d, -0x15d62038, 0x4b375630, 0x0d51b859, 0x16db2cb2, 0xf210603a, 0x0abeb833, 0x55c694d0, 0xe57ca43b, -0x0ba94428, 0x1398a406, 0xe47d3889, 0x5a20203d, 0x250d7a1a, 0xd930ffec, 0x03992e79, 0xf2759376, -0x024ec121, 0x91fc3a2c, 0xb7e11cc5, 0x4ff7d459, 0xb8700134, 0xd6e61758, 0x4eba0a32, 0xb747e3ec, -0x7073fad7, 0xded80f99, 0x331e2f1b, 0xfa1f1bed, 0x056424a2, 0x1d1d95e0, 0x550b9ec8, 0x51ee2a38, -0x19525153, 0xd70c4cd5, 0x0d6cd7ad, 0xe44d1cf2, 0x30dfecda, 0xdacd7fe8, 0x7321d795, 0xddf48ef4, -0xe271e6a4, 0x9c1feecb, 0x951fcd7b, 0x8acc5a03, 0x3fb83527, 0xe306de74, 0x7b9cd6ee, 0x8e140885, -0xd4c91e8d, 0xe8c39733, 0x0f02f87f, 0xfb06b1b9, 0x0dc9349c, 0xf76bae8e, 0x4f642a07, 0x3d48a9aa, -0xe3ea323a, 0xa1cd5c8a, 0x40aa0e70, 0x132042d3, 0xa9732f6c, 0xd15a00c4, 0x43d3b046, 0x9a51ebd4, -0xc46ee0ed, 0xe2a2148b, 0xf5c478f0, 0x1fb01cf3, 0xf4f321ec, 0xd973811f, 0x11ad11b9, 0x5c67adda - -soft_output0 = -0x81818181, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x817f817f, 0x81817f81, -0x7f817f81, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x817f8181, 0x81817f81, -0x7f7f7f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f7f8181, -0x81817f7f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, -0x7f818181, 0x8181817f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x817f817f, -0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, -0x8181817f, 0x817f7f81, 0x81818181, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, -0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f81817f, -0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, -0x81817f81, 0x81817f81, 0x81817f81, 0x817f817f, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x8181817f, -0x7f817f7f, 0x817f7f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x817f8181, 0x7f7f7f81, -0x7f817f81, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, -0x7f7f817f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x7f81817f, -0x7f7f7f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f817f81, -0x817f7f81, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x81818181, 0x7f818181, 0x8181817f, -0x817f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x817f8181, 0x81817f7f, -0x7f7f8181, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x81818181, 0x7f81817f, 0x817f817f, 0x81818181, -0x817f8181, 0x817f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f81, 0x7f7f8181, 0x7f817f7f, 0x7f7f817f, -0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, -0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x81817f81, -0x817f7f81, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, -0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, -0x8181817f, 0x817f8181, 0x81817f81, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x7f7f8181, -0x8181817f, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x8181817f, 0x81817f81, 0x817f8181, -0x81818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x817f8181, -0x817f7f81, 0x817f7f81, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f81817f, 0x81818181, 0x8181817f, -0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, -0x8181817f, 0x7f81817f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, -0x7f81817f, 0x81817f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x81817f7f, -0x81817f7f, 0x81817f7f, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x7f7f8181, -0x817f7f7f, 0x81818181, 0x7f818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, -0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f817f, 0x81817f81, 0x817f8181, 0x7f7f817f, -0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x817f817f, 0x81817f7f, -0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, -0x7f81817f, 0x7f818181, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f81, -0x7f7f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x8181817f, -0x817f817f, 0x7f7f7f81, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f817f, 0x81817f7f, -0x817f7f7f, 0x81818181, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f817f81, 0x817f8181, -0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x817f817f, -0x7f817f7f, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f81, -0x81817f81, 0x817f7f7f, 0x81817f7f, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, -0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, -0x817f7f81, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x81818181, 0x7f81817f, 0x7f81817f, 0x817f8181, -0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, -0x8181817f, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f81817f, -0x8181817f, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x81818181, -0x817f817f, 0x7f818181, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f817f, -0x817f7f7f, 0x817f8181, 0x81817f81, 0x81818181, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, -0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x81817f81, -0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x8181817f, -0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f81817f, 0x7f81817f, -0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x7f818181, -0x8181817f, 0x81818181, 0x8181817f, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x7f81817f, 0x7f817f7f, -0x81817f81, 0x7f81817f, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f817f7f, -0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f7f7f7f, -0x7f818181, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x8181817f, 0x81817f7f, -0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x81818181, -0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x81817f7f, -0x7f818181, 0x817f7f81, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f817f81, 0x7f7f7f81, -0x7f818181, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x81817f7f, 0x8181817f, 0x817f8181, 0x8181817f, -0x7f818181, 0x7f817f81, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f7f, -0x817f8181, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x81817f81, 0x7f7f7f7f, -0x7f818181, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, -0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x81818181, 0x817f8181, -0x7f7f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, -0x817f8181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f818181, 0x817f7f7f, 0x7f7f7f7f, -0x817f7f81, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x81817f81, 0x81817f81, 0x7f7f7f81, -0x8181817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, -0x7f817f81, 0x81818181, 0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x8181817f, 0x7f818181, -0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, -0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x8181817f, -0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, -0x817f817f, 0x7f81817f, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x81818181, 0x817f817f, 0x7f7f817f, -0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f81, -0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f817f, -0x7f7f8181, 0x7f7f7f81, 0x817f8181, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x7f817f81, -0x7f817f81, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, -0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f81817f, -0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, -0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81818181, 0x8181817f, 0x81817f7f, 0x81818181, 0x817f817f, -0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x81817f7f, -0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x817f7f7f, 0x817f817f, -0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x7f817f81, -0x817f7f7f, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x81817f81, 0x81818181, 0x7f817f7f, -0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, -0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x7f7f817f, -0x817f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x817f817f, -0x7f817f7f, 0x7f817f7f, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x8181817f, 0x7f7f8181, 0x7f817f7f, -0x7f817f81, 0x7f7f8181, 0x81817f81, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f7f7f81, 0x8181817f, -0x81817f7f, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, -0x81817f7f, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x81817f81, 0x817f7f81, -0x81818181, 0x817f7f7f, 0x7f818181, 0x81818181, 0x7f7f817f, 0x817f817f, 0x7f7f817f, 0x7f817f7f, -0x7f817f81, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x817f817f, 0x7f818181, -0x817f7f81, 0x817f7f7f, 0x81817f81, 0x81818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f8181, -0x7f818181, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, -0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f81817f, 0x817f8181, 0x7f81817f, -0x8181817f, 0x81818181, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, -0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x7f81817f, -0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x7f817f81, 0x7f817f81, 0x7f7f817f, -0x81818181, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f81817f, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, -0x7f817f81, 0x817f817f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x81817f81, -0x7f7f7f81, 0x81818181, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x7f818181, 0x7f7f8181, -0x7f7f7f81, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x817f8181, 0x817f8181, 0x817f7f81, -0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, -0x81817f7f, 0x7f817f7f, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f7f, -0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x81817f81, 0x817f7f7f, 0x7f7f817f, -0x817f7f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f81, -0x8181817f, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f817f, -0x7f7f7f81, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, -0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x7f818181, 0x7f817f81, -0x8181817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x817f817f, 0x81817f81, 0x7f7f8181, -0x7f7f7f7f, 0x7f81817f, 0x817f817f, 0x81817f81, 0x81817f81, 0x81817f7f, 0x81817f81, 0x81817f81, -0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x817f7f7f, -0x7f7f7f81, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, -0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f817f81, 0x7f817f7f, -0x81818181, 0x817f817f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x81818181, 0x8181817f, 0x7f817f81, -0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f817f81, -0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f7f81, 0x817f8181, 0x81817f7f, 0x81817f7f, -0x7f7f817f, 0x817f817f, 0x7f817f81, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x81817f7f, -0x817f817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x817f7f81, 0x817f8181, 0x8181817f, -0x81818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, -0x8181817f, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x81817f7f, -0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f7f, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f818181, -0x7f7f7f81, 0x81817f7f, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, -0x7f7f817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x81818181, 0x7f7f8181, 0x817f8181, 0x7f817f81, -0x7f817f81, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x817f7f7f, 0x7f81817f, 0x7f817f7f, -0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f7f817f, 0x7f817f7f, 0x817f817f, -0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, -0x817f7f81, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, -0x817f817f, 0x81817f7f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x81817f81, -0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f817f, 0x817f7f81, 0x817f7f81, 0x7f818181, -0x817f7f7f, 0x8181817f, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x817f8181, -0x8181817f, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x817f817f, 0x817f7f81, 0x81818181, 0x81818181, -0x8181817f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x817f8181, 0x7f7f817f, -0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x7f817f7f, -0x8181817f, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x81818181, 0x817f7f7f, 0x817f817f, -0x7f7f7f7f, 0x817f8181, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x81817f81, -0x7f818181, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, -0x81817f81, 0x817f7f7f, 0x817f817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, -0x7f81817f, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x817f7f81, 0x7f818181, -0x7f818181, 0x817f7f81, 0x7f817f81, 0x7f7f7f7f, 0x81817f81, 0x81818181, 0x7f818181, 0x7f81817f, -0x81817f81, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x81817f7f, -0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x817f7f7f, -0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f7f, -0x81818181, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81817f7f, 0x817f817f, -0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, -0x817f7f7f, 0x7f7f817f, 0x817f8181, 0x7f817f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x81818181, -0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x81818181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x81818181, -0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x817f7f81, -0x7f81817f, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, -0x81817f81, 0x81817f81, 0x7f817f81, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x81817f81, -0x7f7f817f, 0x8181817f, 0x817f7f81, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x817f7f7f, -0x8181817f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f81, 0x817f7f7f, 0x81818181, 0x817f7f7f, -0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x817f817f, 0x7f81817f, 0x81818181, -0x81817f81, 0x81818181, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81818181, -0x81818181, 0x81818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f818181, -0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x817f7f7f, 0x81817f81, -0x7f7f7f7f, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x81817f81, -0x817f817f, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f81817f, -0x817f8181, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x7f818181, 0x81817f7f, -0x81817f7f, 0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f818181, 0x7f81817f, -0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x8181817f, 0x8181817f, 0x7f817f81, 0x8181817f, 0x8181817f, -0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, -0x7f818181, 0x7f817f81, 0x81818181, 0x817f817f, 0x817f817f, 0x7f818181, 0x817f8181, 0x7f7f817f, -0x7f7f7f81, 0x817f7f7f, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f817f, 0x7f7f817f, -0x7f817f81, 0x817f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x8181817f, 0x7f7f8181, -0x7f818181, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x817f817f, 0x817f7f81, 0x7f7f7f81, 0x81817f81, -0x817f8181, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, -0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x7f7f8181, 0x8181817f, -0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x817f817f, -0x817f7f7f, 0x81817f7f, 0x7f818181, 0x81818181, 0x817f7f81, 0x81817f7f, 0x817f8181, 0x817f8181, -0x81817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, -0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, 0x817f8181, -0x817f817f, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f81817f, -0x7f817f81, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x81817f81, -0x7f7f8181, 0x7f817f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, -0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x8181817f, -0x7f817f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x81818181, -0x7f817f81, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x7f7f7f7f, -0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, -0x817f7f7f, 0x81817f81, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x7f817f81, -0x7f7f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, -0x7f817f7f, 0x817f8181, 0x7f818181, 0x81817f7f, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, -0x7f81817f, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f818181, 0x817f7f7f, 0x7f81817f, -0x81817f81, 0x7f7f7f81, 0x7f818181, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f8181, -0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x81817f81, -0x817f8181, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f81817f, -0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x817f7f81, 0x81817f81, 0x7f817f81, -0x817f8181, 0x7f818181, 0x7f817f81, 0x81817f81, 0x81817f81, 0x817f8181, 0x7f818181, 0x81818181, -0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x8181817f, 0x81818181, 0x817f7f81, 0x7f818181, -0x81817f81, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f7f817f, 0x8181817f, -0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x7f7f8181, -0x7f7f8181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, -0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x81817f7f, -0x817f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, -0x7f7f8181, 0x817f817f, 0x7f7f7f81, 0x7f7f817f, 0x817f8181, 0x7f81817f, 0x7f81817f, 0x817f7f7f, -0x7f817f7f, 0x817f817f, 0x817f7f81, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f81817f, -0x7f7f8181, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f81817f, 0x817f8181, 0x8181817f, 0x7f817f7f, -0x817f8181, 0x817f7f81, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, -0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x8181817f, 0x81817f81, -0x817f817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x7f817f7f, 0x7f7f7f81, 0x817f817f, -0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f7f7f, 0x817f8181, -0x7f7f8181, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x81817f81, 0x817f8181, 0x817f7f7f, -0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x81817f7f, -0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f7f, -0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, -0x7f818181, 0x817f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x81817f7f, 0x817f8181, 0x7f7f8181, -0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, -0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, -0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x817f8181, -0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f81817f, 0x7f7f817f, 0x81817f81, 0x7f7f8181, -0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x817f817f, -0x7f81817f, 0x7f818181, 0x817f8181, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, -0x817f8181, 0x817f8181, 0x7f817f81, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x817f817f, 0x81818181, -0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x81818181, -0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f818181, -0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x81817f81, -0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, -0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x81817f81, -0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, -0x7f81817f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x817f7f81, -0x7f7f7f81, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x7f81817f, 0x817f8181, 0x81817f7f, 0x7f817f81, -0x81818181, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x8181817f, 0x81818181, 0x81818181, -0x81818181, 0x817f8181, 0x81817f81, 0x817f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f81817f, -0x7f7f7f81, 0x7f7f7f7f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x817f7f7f, -0x7f817f7f, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x817f7f81, -0x81818181, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, -0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, -0x7f7f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x81817f81, -0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x817f7f7f, -0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, -0x7f818181, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, -0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x817f817f, 0x817f7f7f, 0x81817f7f, -0x7f81817f, 0x817f817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x817f7f81, -0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, -0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x81817f7f, -0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x81817f81, -0x7f7f7f81, 0x817f7f81, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x81817f81, 0x7f817f7f, 0x7f818181, -0x7f818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f7f817f, -0x81818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x817f7f7f, -0x81817f7f, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x817f7f81, -0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, -0x7f817f7f, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, -0x7f81817f, 0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, -0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x81818181, -0x7f81817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, -0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x7f81817f, -0x81817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, -0x7f7f817f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x8181817f, 0x7f817f81, 0x81817f7f, -0x817f7f7f, 0x7f7f8181, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x7f7f817f, -0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, -0x817f817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x81818181, 0x81817f81, -0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, -0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x7f7f817f, -0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x81818181, 0x8181817f, 0x7f7f7f81, 0x7f818181, -0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f81817f, 0x817f7f81, -0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x8181817f, 0x7f817f7f, -0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f818181, -0x81817f81, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x7f7f7f81, -0x817f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x817f8181, -0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x817f817f, -0x81817f81, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x817f7f7f, -0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81817f81, 0x81817f7f, 0x8181817f, -0x817f817f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, -0x817f817f, 0x817f8181, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x817f817f, -0x81818181, 0x7f818181, 0x817f7f81, 0x817f8181, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, -0x7f7f7f7f, 0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x7f7f8181, -0x7f7f8181, 0x81817f7f, 0x81817f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, -0x817f7f81, 0x8181817f, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x7f7f817f, -0x81817f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, -0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f817f, -0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x7f817f7f, -0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f7f, -0x7f817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x817f817f, 0x8181817f, -0x817f7f7f, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f7f, 0x7f7f8181, -0x81818181, 0x81818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f81817f, -0x7f7f817f, 0x7f818181, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, -0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f818181, -0x7f817f81, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f817f7f, 0x7f817f81, -0x817f7f81, 0x7f7f817f, 0x81817f81, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x81817f81, -0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x7f818181, 0x7f7f7f7f, 0x817f7f81, -0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, -0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x7f81817f, -0x7f817f7f, 0x81817f81, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, -0x81817f81, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x7f818181, 0x7f818181, 0x7f818181, 0x7f81817f, -0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x81818181, -0x81817f7f, 0x81818181, 0x817f7f81, 0x81817f81, 0x81817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, -0x7f7f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x81817f81, 0x7f7f7f81, 0x8181817f, -0x8181817f, 0x7f7f817f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x817f817f, 0x817f817f, 0x7f81817f, -0x8181817f, 0x817f7f7f, 0x7f818181, 0x817f7f7f, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x817f817f, -0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x7f81817f, 0x817f8181, -0x7f81817f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x8181817f, 0x81817f81, -0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, -0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x81818181, 0x81818181, 0x81818181, -0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, -0x7f817f81, 0x817f8181, 0x7f81817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x817f7f7f, 0x817f8181, -0x7f7f8181, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x7f81817f, -0x7f817f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x817f7f81, 0x817f817f, -0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x817f817f, -0x8181817f, 0x81818181, 0x81817f81, 0x817f8181, 0x81818181, 0x81817f7f, 0x817f8181, 0x7f7f8181, -0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, -0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x7f817f7f, -0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x7f7f817f, 0x81818181, -0x7f81817f, 0x817f8181, 0x81818181, 0x81817f81, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f7f81, -0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x7f81817f, 0x7f818181, -0x7f818181, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x817f7f81, -0x7f817f7f, 0x7f7f7f7f, 0x7f818181, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x81818181, -0x7f7f817f, 0x81817f81, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x81818181, 0x817f817f, -0x7f7f7f81, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x8181817f, -0x7f7f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81817f81, -0x817f817f, 0x81817f81, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x817f817f, -0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x817f7f7f, -0x7f817f81, 0x7f7f8181, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x817f817f, -0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x7f81817f, -0x7f7f817f, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x7f817f81, -0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x817f7f7f, -0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x817f7f81, 0x817f7f81, -0x7f817f7f, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, -0x7f817f7f, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, -0x817f8181, 0x7f818181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f7f7f7f, -0x8181817f, 0x81817f81, 0x817f7f81, 0x81818181, 0x81817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f7f, -0x817f7f81, 0x817f7f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, -0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x7f818181, 0x817f817f, 0x7f7f7f81, -0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x7f81817f, 0x817f817f, 0x8181817f, 0x7f7f7f7f, -0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x8181817f, -0x81817f81, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f81, 0x7f818181, -0x7f817f7f, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x81817f7f, 0x817f817f, -0x7f81817f, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f8181, -0x7f7f8181, 0x7f7f7f81, 0x7f818181, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x7f81817f, -0x817f8181, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, -0x81818181, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x817f8181, -0x81817f81, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x81817f81, 0x81817f81, -0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f7f7f7f, -0x81817f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x817f8181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, -0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, -0x81818181, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, 0x81818181, 0x7f7f817f, 0x7f818181, -0x7f7f7f7f, 0x81818181, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, -0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f817f, -0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x81817f81, -0x817f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, -0x7f818181, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x7f7f8181, -0x817f7f81, 0x81817f81, 0x817f8181, 0x817f817f, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f8181, -0x7f7f7f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, -0x81818181, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x817f8181, -0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, -0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, -0x817f7f7f, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, -0x81817f7f, 0x817f7f7f, 0x7f817f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f7f817f, 0x7f817f81, -0x81817f81, 0x81818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x817f8181, -0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x7f817f81, -0x7f818181, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x8181817f, -0x7f7f817f, 0x817f817f, 0x81817f81, 0x81817f81, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x817f7f81, -0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x81817f81, 0x7f817f81, -0x7f81817f, 0x817f7f81, 0x7f818181, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, -0x81817f7f, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x8181817f, 0x7f7f817f, 0x8181817f, 0x7f818181, -0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f7f81, -0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f81817f, 0x81818181, -0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x817f7f81, 0x8181817f, -0x81818181, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, -0x81818181, 0x81818181, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f817f, -0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x8181817f, -0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x817f7f7f, -0x81818181, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, -0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x817f817f, -0x81818181, 0x8181817f, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x8181817f, -0x7f818181, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f818181, 0x81818181, 0x8181817f, -0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x81818181, -0x81818181, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x81817f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, -0x7f7f8181, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x81818181, -0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f817f, 0x81818181, -0x7f817f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, -0x81817f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x8181817f, 0x81818181, 0x81817f7f, -0x7f81817f, 0x81818181, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x817f817f, 0x7f818181, -0x7f817f7f, 0x7f7f7f7f, 0x817f817f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x81818181, 0x7f7f817f, -0x817f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x81817f81, -0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f7f7f7f, 0x81818181, 0x8181817f, 0x7f817f81, 0x8181817f, -0x7f81817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x7f818181, 0x81818181, -0x81817f81, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x7f818181, 0x81817f81, -0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, -0x817f817f, 0x817f817f, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x8181817f, -0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, -0x7f817f7f, 0x81818181, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f818181, 0x7f817f7f, -0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x817f7f81, -0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x81818181, 0x81817f7f, 0x817f817f, 0x817f817f, 0x7f7f817f, -0x7f81817f, 0x81818181, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, -0x7f817f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x8181817f, 0x817f7f81, 0x7f817f81, -0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x8181817f, -0x7f81817f, 0x817f817f, 0x7f817f81, 0x8181817f, 0x7f818181, 0x81817f81, 0x7f818181, 0x81818181, -0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f7f81, -0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x7f818181, -0x7f7f8181, 0x817f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f817f7f, -0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, -0x7f7f8181, 0x7f818181, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, -0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x81817f81, -0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, -0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x8181817f, 0x817f7f81, -0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, -0x7f818181, 0x7f818181, 0x7f817f81, 0x7f7f7f7f, 0x7f81817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, -0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f81817f, -0x81817f81, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, -0x7f81817f, 0x81818181, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f7f817f, -0x817f7f81, 0x817f7f81, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x81818181, -0x8181817f, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x7f81817f, -0x81817f7f, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x81818181, 0x7f7f7f81, -0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x81817f81, 0x7f81817f, 0x81817f81, 0x7f7f8181, -0x817f817f, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f7f817f, -0x817f8181, 0x7f7f817f, 0x8181817f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f7f, -0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f81, 0x8181817f, 0x7f817f7f, 0x81818181, 0x7f7f7f81, -0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x81818181, 0x7f7f7f81, -0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x817f8181, -0x7f817f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x7f818181, 0x817f7f81, -0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x81818181, -0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81817f81, 0x8181817f, 0x7f818181, 0x81817f81, -0x817f7f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, -0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f81817f, 0x7f7f8181, -0x7f818181, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x817f7f7f, 0x7f817f7f, -0x7f7f8181, 0x817f8181, 0x7f818181, 0x81817f81, 0x7f818181, 0x8181817f, 0x8181817f, 0x7f818181, -0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x81818181, 0x817f7f7f, -0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x817f817f, 0x817f817f, -0x7f818181, 0x7f7f8181, 0x8181817f, 0x817f817f, 0x81817f7f, 0x81818181, 0x7f81817f, 0x817f817f, -0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x7f7f817f, 0x7f7f7f7f, -0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f818181, 0x7f7f7f7f, -0x7f7f7f7f, 0x7f7f7f81, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, -0x817f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f81, -0x817f817f, 0x817f7f7f, 0x81818181, 0x7f818181, 0x81818181, 0x81818181, 0x7f7f7f81, 0x8181817f, -0x81818181, 0x7f817f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x8181817f, 0x817f7f81, -0x7f817f7f, 0x81817f7f, 0x817f8181, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, -0x817f7f7f, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, -0x7f817f81, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f818181, 0x81817f81, -0x817f8181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x81817f81, -0x81817f7f, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x817f817f, 0x817f8181, 0x817f7f7f, 0x8181817f, -0x81817f7f, 0x8181817f, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x817f817f, -0x81818181, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x8181817f, -0x7f818181, 0x7f817f81, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x7f7f8181, 0x7f7f7f7f, -0x7f81817f, 0x817f8181, 0x817f817f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f7f7f, -0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x817f8181, -0x81817f81, 0x817f8181, 0x7f81817f, 0x817f8181, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f818181, -0x7f7f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x817f7f7f, -0x7f7f817f, 0x817f7f7f, 0x817f817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, -0x7f817f81, 0x81818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x81817f81, -0x81818181, 0x81817f81, 0x7f7f817f, 0x81818181, 0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f81817f, -0x817f8181, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f8181, -0x7f81817f, 0x7f818181, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x7f81817f, 0x817f8181, -0x81817f81, 0x81818181, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x81817f81, -0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x81818181, -0x81817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81817f81, 0x8181817f, -0x817f817f, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, 0x8181817f, 0x7f7f7f7f, 0x817f817f, -0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, -0x7f81817f, 0x817f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, -0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x81818181, -0x81817f81, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, -0x817f817f, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f81, -0x7f817f7f, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, -0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f817f81, 0x817f817f, 0x81817f7f, 0x7f81817f, 0x8181817f, -0x817f7f81, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x81818181, 0x7f818181, 0x817f7f7f, 0x81818181, -0x81818181, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f81817f, -0x817f817f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x7f7f817f, -0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, -0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, -0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, -0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x817f7f81, 0x81817f81, -0x817f7f81, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x8181817f, -0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x81818181, 0x817f8181, 0x7f7f8181, 0x81818181, 0x817f7f81, -0x817f8181, 0x81817f7f, 0x8181817f, 0x817f817f, 0x8181817f, 0x7f818181, 0x81817f81, 0x81818181, -0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x8181817f, -0x817f7f81, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x817f8181, -0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x81817f81, -0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, -0x817f7f81, 0x817f8181, 0x8181817f, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, -0x81817f81, 0x817f8181, 0x817f7f7f, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x817f7f81, -0x81817f7f, 0x7f818181, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x81817f81, -0x81818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f817f7f, -0x7f7f8181, 0x817f8181, 0x7f818181, 0x8181817f, 0x81817f81, 0x817f7f7f, 0x7f817f81, 0x81818181, -0x817f817f, 0x81818181, 0x817f7f81, 0x817f7f7f, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x817f7f81, -0x7f818181, 0x817f7f7f, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x81818181, 0x817f7f81, -0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f81817f, -0x817f817f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x7f81817f, -0x81818181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x817f7f7f, -0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, -0x7f7f7f7f, 0x817f7f81, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x81818181, -0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x817f7f7f, 0x81818181, 0x81817f7f, -0x7f817f7f, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x81817f7f, 0x817f8181, 0x7f81817f, -0x7f7f7f7f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x8181817f, 0x81817f81, -0x817f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x7f817f81, 0x81818181, 0x817f8181, 0x8181817f, -0x7f817f7f, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x817f8181, -0x7f81817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x817f8181, 0x7f7f7f81, -0x8181817f, 0x8181817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x81818181, 0x7f7f7f81, -0x7f817f7f, 0x81818181, 0x817f8181, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, -0x81818181, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x817f8181, -0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81817f7f, 0x817f8181, -0x817f8181, 0x7f818181, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f8181, -0x7f7f7f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x81817f81, -0x7f817f7f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f817f81, -0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, -0x817f817f, 0x81817f7f, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x817f8181, 0x81818181, 0x8181817f, -0x81817f7f, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f817f, -0x817f8181, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, -0x81817f81, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x817f8181, -0x81817f81, 0x8181817f, 0x7f7f7f81, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f8181, 0x817f8181, -0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x81817f81, -0x817f8181, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x81818181, 0x7f817f81, 0x81817f7f, 0x81818181, -0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f7f, -0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f817f, -0x817f817f, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f817f7f, -0x7f7f7f81, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f817f, -0x81818181, 0x81818181, 0x8181817f, 0x81817f81, 0x81818181, 0x817f8181, 0x7f817f7f, 0x7f817f81, -0x817f8181, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f7f, -0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f81, 0x817f8181, -0x81818181, 0x817f817f, 0x81817f81, 0x817f817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, -0x81817f81, 0x7f81817f, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, -0x8181817f, 0x7f81817f, 0x8181817f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x8181817f, -0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x7f7f7f7f, -0x7f817f7f, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x7f7f8181, -0x7f817f81, 0x7f817f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x7f7f8181, 0x7f817f7f, -0x7f7f8181, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x8181817f, -0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x81818181, -0x7f817f81, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, -0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f817f81, -0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x81818181, -0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, -0x817f7f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, -0x7f818181, 0x81818181, 0x817f8181, 0x81817f7f, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x7f7f8181, -0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x8181817f, 0x81818181, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, -0x81817f7f, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x81817f7f, -0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x7f81817f, -0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, -0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x817f7f81, 0x817f7f81, 0x7f817f81, -0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x81818181, -0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f817f81, 0x81817f7f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, -0x7f818181, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x817f7f81, 0x7f7f7f81, -0x81818181, 0x7f817f7f, 0x81818181, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x81818181, -0x7f817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x8181817f, 0x817f817f, -0x817f817f, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f81, -0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, -0x817f7f7f, 0x81818181, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x7f81817f, 0x7f7f8181, -0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x817f7f81, 0x7f817f81, -0x81817f81, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f81, -0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, -0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, -0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x8181817f, -0x817f817f, 0x81818181, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, -0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x81817f7f, 0x81818181, 0x7f81817f, 0x7f7f7f7f, -0x81818181, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f8181, 0x81818181, -0x81818181, 0x7f7f8181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f817f, 0x817f817f, -0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f8181, -0x7f817f7f, 0x7f817f81, 0x817f8181, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f8181, -0x81817f7f, 0x7f7f7f7f, 0x817f7f81, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f817f81, 0x7f81817f, -0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, -0x7f81817f, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f8181, -0x817f7f81, 0x7f7f7f81, 0x7f818181, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x817f7f81, 0x81818181, -0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x7f818181, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f81817f, -0x817f7f81, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x81817f81, -0x81818181, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f81817f, -0x81817f81, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81818181, -0x7f817f81, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, -0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f817f, 0x7f7f7f7f, -0x817f817f, 0x8181817f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, -0x7f81817f, 0x7f7f7f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, -0x81818181, 0x81817f81, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f81817f, -0x81818181, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x817f7f7f, -0x817f817f, 0x817f7f81, 0x81818181, 0x81817f81, 0x7f818181, 0x81817f7f, 0x817f817f, 0x7f81817f, -0x817f7f81, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x817f7f7f, -0x7f818181, 0x817f8181, 0x7f7f817f, 0x817f7f81, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x7f81817f, -0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x81818181, 0x7f7f817f, -0x817f8181, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x81818181, -0x81817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x7f817f7f, -0x7f817f7f, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f8181, 0x81817f81, -0x7f817f7f, 0x817f8181, 0x817f817f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, -0x81817f81, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, -0x7f818181, 0x7f81817f, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81818181, -0x7f818181, 0x7f817f81, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, -0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f818181, 0x81818181, 0x817f7f81, 0x817f8181, -0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f818181, -0x81818181, 0x7f7f817f, 0x81818181, 0x7f818181, 0x7f817f7f, 0x7f817f81, 0x7f7f8181, 0x81818181, -0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, -0x7f817f81, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, -0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f - -e = -34560 - -k = -6144 - -rv_index = -0 - -iter_max = -8 - -iter_min = -4 - -expected_iter_count = -8 - -ext_scale = -15 - -num_maps = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_SOFT_OUTPUT, RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN, -RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_posllr.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_posllr.data deleted file mode 100644 index 13ad0908ce..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c1_k6144_r0_e34560_sbd_posllr.data +++ /dev/null @@ -1,1225 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_DEC - -input0 = -0xf6bb1100, 0x4e433af1, 0x38f02efa, 0x0ee43d00, 0x5037c35f, 0x5620e729, 0xdd46c4d7, 0x5ae3e2f7, -0xe0d7fa2f, 0x2e4ae20d, 0xa7190ebf, 0xd2382614, 0x98ffabe0, 0xf7ee0c5d, 0xffd8ddd7, 0x5f03ecc7, -0xf9ffdde5, 0xf12446f6, 0x42693a3d, 0xfcc81aae, 0x2b0abc2c, 0x43f2a1b5, 0x044a302c, 0xf8db4fa6, -0xcad2d138, 0x452b5526, 0xf3083fd3, 0x30ea4b22, 0xe2bd66f4, 0xbc37bebe, 0x001e183b, 0xfac72ebf, -0x11965cf5, 0x70226311, 0xbd2016ec, 0xcf23f931, 0x4629f6fb, 0x3104de76, 0x00d7c529, 0xa0c8f8f4, -0x2615c2e0, 0x23daf4b4, 0x56bf05c4, 0x9212102c, 0xa5fe400d, 0xec2a5497, 0x021032bc, 0x3b55340e, -0xd6f1003c, 0x2a3625d0, 0xc81eee31, 0xa26644d7, 0x0ffb041c, 0x22cc20dc, 0x472cdd9b, 0xd8e24ed2, -0x4ee740ab, 0x9bfc50e2, 0xbaaafe55, 0xeecd5c19, 0x57150c31, 0x9d3f13c1, 0x251749e1, 0x076ca964, -0xde0da74b, 0xcafac963, 0x52d006e2, 0xe392d7f4, 0x3a20bcf6, 0xd1ee6fce, 0xe5cf850a, 0x31253fe7, -0xcefed8a9, 0x520f9824, 0x5fdbe3c9, 0x9b123cc5, 0x6ad019f2, 0x171f0368, 0xc2fe2855, 0x0db851c2, -0x095010d9, 0xd110df25, 0x1452a52c, 0xe5d1c2cc, 0x45dbef40, 0x2aef2353, 0x07af2e2a, 0x4f23ff6f, -0x3ddb31cb, 0xa8430c49, 0xcaf7b329, 0xf933c5bc, 0xfe3c52b3, 0x7fd60a27, 0xce0ac9cf, 0xcff0cdd7, -0x5400cd01, 0x7f81a8c1, 0x3c7f8178, 0x737f87f6, 0x5a5e7f81, 0x817f6ff6, 0x813b1381, 0x41d18173, -0x810fb9f9, 0xb734c526, 0x50b3a6d3, 0x282d6e50, 0x81972d1f, 0x7d52bd53, 0x6749268b, 0xc681812d, -0x2c93912e, 0xb1813bdc, 0xed817fd1, 0xa8813376, 0x7f3c7f41, 0x64569f7c, 0xf53d5c67, 0x1e70e6dd, -0x024b6591, 0x817f7f8f, 0x0a722d63, 0x7fed578b, 0x7f239a7f, 0x81029081, 0xa8ca8b81, 0xb8577fde, -0x818ec07f, 0x7fa87cb9, 0xa7084967, 0x81934650, 0x7f8171f7, 0xed3d144a, 0x8107739c, 0x3c6fe27f, -0xcd6ed165, 0xfb3718a4, 0x5f708f4d, 0x14e45eb2, 0xfe5c7f7f, 0x7fc57f6a, 0x813683af, 0x817f7fb3, -0x007fa7ef, 0xdcd681a1, 0xd72a1268, 0x769f7881, 0xb27fa281, 0x89c27fe3, 0x729b2f59, 0x73afb8a0, -0xd07f4eb8, 0x81dd6d55, 0x7fa3d2cf, 0x7f81b51e, 0x7f7f7be7, 0x60819981, 0xf31158ad, 0xde7fe4b4, -0x427f2dd3, 0xd3812481, 0x280de7a4, 0x0a653fc6, 0x8181261f, 0xd6aa8f81, 0x2c7fe484, 0x42df747f, -0x7f5baa2d, 0xc1bd583c, 0x966b5031, 0xbe818725, 0x6b6444a4, 0x610023e7, 0x5f183b2c, 0xa77fb769, -0xb2cb1581, 0x0881cc75, 0x8a8c6fdc, 0x558181e4, 0x107f947f, 0x749e4ca3, 0x8cb23db1, 0xce668132, -0x70b848eb, 0x008a2430, 0x7fd3d77f, 0x682b35eb, 0x2e6aae34, 0xd42fa2cd, 0x3eab816f, 0xfdaf8196, -0x04e43fcc, 0xf1819600, 0x7f6d64f2, 0x81ba8957, 0x81a781a2, 0xb169d67a, 0x7f4e557f, 0xe0818197, -0x7b474ecc, 0x3f7b8154, 0x135684f8, 0x81b0fb81, 0x81e33e93, 0x815c817f, 0x810b818a, 0x4d445b34, -0x95cf2bb0, 0x32c69b7d, 0x2640e181, 0x7fe8b8c8, 0x9bdd64f7, 0x22bfa50b, 0x8181c87f, 0xf7812486, -0x7f977fa0, 0x5826a925, 0xce7fadf6, 0x9e73fb81, 0x538d7f0e, 0xe85dab87, 0xc3706181, 0x4181817f, -0x7f7f15ca, 0x952ca87f, 0xa9748be0, 0xbf812477, 0xd081a553, 0x9a817f7f, 0x1f4cb192, 0x7f8181d5, -0x2ba44ad2, 0x76605566, 0x7f1cd2b9, 0x446eae90, 0x8956b670, 0xaadc8b7f, 0x710b0a90, 0x83816439, -0xc6ffc6d2, 0xf07f00fb, 0x7fa25582, 0x7fd11f3a, 0x7f104c81, 0x81d574fd, 0x81814081, 0x82b78e7f, -0x2f29f42b, 0x277f4bff, 0xf49d4b81, 0x28581681, 0x22523281, 0x607ff910, 0x61ac1ad2, 0x58313ccf, -0x8168a21f, 0x7fe61879, 0x817f21b3, 0x407f2f45, 0x7f5fa666, 0x81bc41fb, 0xfd81fb81, 0x0ed48163, -0x81818181, 0x7f7b92fd, 0x44507d7f, 0xba45c9d3, 0x81852b64, 0x7fa918eb, 0x5f6ff5c6, 0xa4ad8181, -0xc27f8f81, 0xb8af5481, 0x7fc5817d, 0x7a814ea2, 0xf77fcf36, 0x50913981, 0x81a01781, 0x5ea1a4ba, -0x18d252b8, 0xc0416881, 0x7f817f1e, 0x0b4e38cf, 0x7ffb6922, 0xfca481b5, 0x7f1dc1ca, 0x7f560da2, -0x7f7f813a, 0x1900a881, 0x6d4d8116, 0x617f0469, 0xb3118e81, 0x95408119, 0x817ff08a, 0x7fdc7f8b, -0xf682a40a, 0x3381817f, 0x81b70d82, 0x7f7f6f81, 0x8190217f, 0x2f817f4b, 0xe195b209, 0x5ee39575, -0x8150bae6, 0xa4fe8b7f, 0x7f7f654c, 0x7f921971, 0x53817f85, 0x1c7f5ff6, 0x5f35737f, 0xce7fc2c6, -0x6c81817f, 0x7f7c410d, 0x5794308e, 0x15f4a87f, 0x7fb64d7b, 0x1d0a8181, 0xa8b67f37, 0x253b397f, -0x887f92b7, 0x7f81767f, 0x81c18101, 0xaa2861c0, 0xbd691cd9, 0x81d74ef3, 0x81a78153, 0xcb7f819b, -0xf681c5e7, 0x9f37817f, 0x3a7f869b, 0x56a41581, 0x04be8111, 0x4898b48b, 0xbc81465d, 0xb3815281, -0x7f6a1d45, 0x1fa87fce, 0x810e81cc, 0x7f8d410c, 0x8190a193, 0x81817f81, 0x5dadcbb4, 0x81a83699, -0x86a68164, 0xe27f1281, 0x682a7f27, 0x62a03cbd, 0x8181c75d, 0x39653881, 0xc6187e83, 0x617fd27f, -0x81917f90, 0x57796c81, 0xdc7f567f, 0xad712381, 0xdd81ecbe, 0xec17667c, 0x929e5098, 0x857ffbbf, -0x8d5b8153, 0x9769887f, 0x65173381, 0x66b8ad84, 0x043481b9, 0x81c05ca9, 0x449d4c48, 0x8c45bc82, -0xca7f81ee, 0x2d8f33e1, 0x81e22f81, 0xca9eb542, 0x8e947fe5, 0xb642a4a8, 0x7f22c73f, 0x85a6176a, -0x567f7ffb, 0x587f4243, 0xa2819225, 0x58307f9b, 0x2c6b0f81, 0x8130a068, 0x814fa904, 0x400a9f2d, -0x30617fd6, 0x81720981, 0x97b98100, 0x0ca17c7f, 0xf1816081, 0x690f8181, 0x94165481, 0x81817f9d, -0x81444268, 0x97759781, 0x8740267f, 0x757f1a7f, 0x7f7f81ca, 0x957fb87f, 0x816f723a, 0x4a8613f2, -0x3bfef57b, 0x7f1274e8, 0x810ab05b, 0x7fb19ecd, 0xb07fc75f, 0x7fb2965f, 0x60abb881, 0xc229a8e9, -0xb1817f26, 0xe324067f, 0x8181e344, 0x7ea59cac, 0xd21a7f65, 0x8d15989f, 0x09026bea, 0x1d7f933b, -0xae81c181, 0xabf37147, 0x0d08da7f, 0xa7ac4b9e, 0x8281e044, 0x7f8195b1, 0x7ff844de, 0xe9057fed, -0x85fcf1cd, 0xa89e7e2b, 0xf974a481, 0x1f813c6d, 0x237fcbbb, 0x655f8192, 0x8134062b, 0x6f91815d, -0xdf3281e1, 0xe6fd817f, 0x72b3007f, 0x86caf9cf, 0xea812981, 0x6a8ad67c, 0x36aaa01d, 0xbb102886, -0x812faf52, 0x6281de5a, 0x817f8174, 0xebff4735, 0x7894bf7c, 0x169e8194, 0x3bc281f8, 0xe69d2a15, -0xb8e5b68d, 0x367f9b8b, 0xea818181, 0xeb7fbbb7, 0x9368a27f, 0x5af5e19e, 0x5f7f7f7f, 0xcd518181, -0x7f948109, 0x817f4a81, 0xf8a0de7f, 0x667f7fa5, 0x1a8881c1, 0x8646b17f, 0xb0eb7f81, 0xe3fe2ba2, -0x460d18da, 0x3db45835, 0xb0c2847e, 0x9c8681a0, 0x817ff88d, 0x7fec639d, 0x817f7f7f, 0x81810d2f, -0xef28241e, 0x811d9db4, 0x4ac4ada5, 0x7ff29f7f, 0x7fd981ac, 0x7f815e23, 0xcc3dbc8a, 0x7c769b08, -0x6a07ef50, 0x66599c9c, 0x7e007f92, 0x9381aa5a, 0x33471b81, 0x79b27d96, 0x6d5d9d5a, 0xbf40687d, -0x7fbc408e, 0xae598111, 0x18222b1e, 0x0a7b817f, 0x7f4961b4, 0x81818f5e, 0xd5a8ae44, 0xe185bd50, -0xb4a65d81, 0xab81c3d6, 0x5f814b7f, 0x8db72efc, 0xc0be14d5, 0x77336a45, 0x2dca7e7f, 0x81857f7f, -0xf1d80b33, 0x1856b3dd, 0x789e75cd, 0x7f7f7f81, 0x8b7f6951, 0xc94cc5b6, 0x407f3f5b, 0x72c4b87f, -0x8135f77d, 0xab02ec1c, 0x8db481e0, 0x77da84df, 0x897f5c49, 0x8181b24d, 0x7f54715e, 0x233ef77f, -0x8165daa7, 0xd3813aa2, 0x7f7f7f18, 0x96e99677, 0x56814a72, 0xa4acba2e, 0x2683347f, 0x3d5b20ac, -0x887fb981, 0x90a9ec91, 0x008ab581, 0x81588181, 0x5c017f7f, 0x10818181, 0x5d86a42d, 0xd8587f4f, -0xed2035b1, 0x718168fc, 0xc3cccf7f, 0xaa812676, 0xa8d83930, 0xbdb119f6, 0x812b0288, 0xe17f7f7f, -0x989ffd31, 0x9e564b12, 0xabfa3578, 0xacd85381, 0xaf7074e6, 0x93a34c11, 0xc1819896, 0x5a5fa673, -0x6f8181ad, 0x4981167a, 0x817f965e, 0x961b7f29, 0xac539db6, 0x2b645dd8, 0x937fa506, 0xa1b900ba, -0xdd7f7f78, 0x7f866ce7, 0x81a9247f, 0x50d67f53, 0x177a8b82, 0x277ffa7f, 0x7f0942da, 0x444b3181, -0x9d8995aa, 0xbda844b9, 0xae765c85, 0x62818f7f, 0x307f7f00, 0xf37fe681, 0x817f7fab, 0x42e0813d, -0x49f3c7c4, 0x7fd543b8, 0x818183f2, 0x7f4b5500, 0xe2357a7f, 0xdc3a8133, 0xd13913ff, 0xabfd587f, -0x81c3814c, 0x667fab62, 0x9bf82b0c, 0xf84b9583, 0x6a28b2f0, 0x8154623f, 0x7f845e7f, 0x2750f07f, -0x517f2d59, 0x7ffe4db5, 0x60077f7f, 0x81816e62, 0xc40a30dd, 0x67f22b7f, 0xec817f81, 0x7fb8c67f, -0x98c9afd0, 0xb881ecaf, 0x6069c37f, 0x792c2c09, 0x709dc2de, 0x4481bb20, 0xd4b25981, 0xf8ef7792, -0x7381ae17, 0x7fe05250, 0xc3eb637f, 0x6d350069, 0x327f457f, 0x8ce7b8ab, 0xb281c1da, 0x7f817f61, -0xbbcf7fb1, 0xaf818145, 0xb77f5881, 0xb47ff1b2, 0xcec74a81, 0x5f81e7b4, 0x7f1b727f, 0x81b8701b, -0x508106c4, 0x6d815f7f, 0xbc815bea, 0x464b00f2, 0x78818181, 0x7f7f4f81, 0x817e2c53, 0x817e7fa7, -0x7f4da4a9, 0xdd444f23, 0x7f6cba39, 0x8141625a, 0x7f81813f, 0xcd7f817f, 0xa402814a, 0x817f049f, -0x6fb981b4, 0x7867bd7f, 0x9b45bc81, 0xe7739f52, 0x7f816181, 0xab844448, 0x7f06497f, 0xe555c183, -0x817fde68, 0x81bc0624, 0xe33f3a9b, 0x8122c673, 0x6c3d81d5, 0x392815dd, 0x26527f7f, 0xee649844, -0x817f6fef, 0x81ce32d4, 0x102f81fe, 0x81967f81, 0xa42b9c20, 0x81813c81, 0x2a67a463, 0x90592c8a, -0xc5810e67, 0x81d1dd81, 0xbd7f54e1, 0xf52a814e, 0x7f46a7b3, 0x5a89812b, 0x78e43eac, 0x7f776981, -0x817fc5c2, 0x3f818181, 0xc556c337, 0x7f0081a9, 0x817ffe6b, 0x7f095f3d, 0x819b2281, 0xb45881ad, -0xc0817f47, 0x81bd915a, 0xc7616b7f, 0x81e9817a, 0x44977f6c, 0xbc81307f, 0x7f9ac3c9, 0xff061265, -0x3c7b0181, 0x13910e7f, 0xb499ed3c, 0xd850b881, 0x81781837, 0x7f97ff93, 0x81818f23, 0xb9b50d81, -0x49aa4fbd, 0x6b361230, 0x148179d3, 0xbd81dd1f, 0x4cd5d0d0, 0x9ad1738a, 0x2c7f718f, 0x7f9f03b0, -0x789d9ac2, 0x88db95fa, 0x9ae5ac64, 0x727f814c, 0xfa477dac, 0xa670a23f, 0x146afe7f, 0xd4d0451d, -0x6d81819d, 0x9622acc1, 0x818161a2, 0x68263dca, 0x7fce818d, 0x998193ba, 0x9d81a486, 0x7eb97f7f, -0x134470ec, 0x6681bde5, 0x4e2ea77f, 0x81777f7f, 0x7f7fa64f, 0xd3815a7d, 0x81fd4e50, 0x774481e8, -0x7f6c8148, 0xe76b7f81, 0x881bb4e9, 0x7f944f3d, 0xe6da7f20, 0x54c68176, 0x210ebb45, 0xbed6267f, -0xe22f2081, 0x8191ae8a, 0x7c7f257f, 0x667f811c, 0xe2edd355, 0xa4812181, 0x837f5481, 0x6d818120, -0xb7aa7f8f, 0xc17f7081, 0x7fba986a, 0x819a81d5, 0xa9816681, 0x8129c4f5, 0x37ba21a7, 0x29d18a86, -0x4be3ce96, 0x3981b184, 0x447fb50b, 0x261c8155, 0xc05ab18d, 0x777f7816, 0xe48be469, 0x81722d81, -0x7f47a8a1, 0x924a8b72, 0xa2ef4ecd, 0x105c817f, 0x7f90709b, 0xbc81443a, 0xa82f7f65, 0x615d928c, -0x7f81570d, 0x61b0919a, 0x7f33fc81, 0xe8817fca, 0x637ffb00, 0x9c337250, 0x817f8181, 0x08b01e0a, -0x7f4ae897, 0xa0969a3c, 0x7f9d7fe8, 0xe024598e, 0x9e794d7f, 0x72fb988c, 0xf8936747, 0xacbd7f8e, -0x4e7f9781, 0xa4b9f4ea, 0x50ccfbdd, 0x817f4795, 0xbcaf485f, 0x81811a25, 0xa97881c6, 0xecbd7fd7, -0x6e89a832, 0x1e815f96, 0x74d0437f, 0x858101b9, 0xbf1b7f8b, 0xcb7fdc9e, 0x1901bda8, 0x4c40c087, -0x5884f075, 0x7f561faf, 0xc3878172, 0xcd0081c4, 0xd93e8fa6, 0xe8748146, 0x4c7f207f, 0x20da2792, -0xc0d37f7b, 0x909a0133, 0x3b6fb281, 0x69819ba1, 0x81984b27, 0x362ddda3, 0x3981727f, 0xe44c7f81, -0x81b9d0bc, 0xebea7fa7, 0x81a47f2e, 0x81674391, 0x495500fa, 0x0eb881bf, 0x2e22f17e, 0x967f9e81, -0xd2727906, 0xdbe8814d, 0x93cf4d6d, 0x23c3b57f, 0x57be5fe3, 0x2eee7f30, 0x1a501f81, 0x76aaba53, -0x70817fdc, 0x817f2e1e, 0x28381f81, 0x1575817f, 0xc62845e6, 0x8181417f, 0x35d0230c, 0x606fcc28, -0x7f792e44, 0xb7b7ea76, 0xad677f7f, 0x2b1eecee, 0x7f7fe450, 0xefcc6668, 0x264e511c, 0x27818181, -0x81817f7f, 0xce82812c, 0x697f7fec, 0x7e859be9, 0xa1f65543, 0x8170a57f, 0x51231d81, 0x33c03182, -0x81aa7f81, 0x6b7ff34e, 0x51812fcf, 0x7f7f7fe6, 0x6281718d, 0x1eb02c7f, 0x81d64570, 0xa18368e1, -0x4ddb816f, 0x149b81d1, 0x067fa2c6, 0x92decc7f, 0x94001658, 0x814f6d6c, 0x79673f7f, 0x7ff28122, -0x83b97f7f, 0x81248a43, 0xfda17ffe, 0x9e81bc81, 0x81090181, 0x7fdaa350, 0x927f54d4, 0x78fe2e89, -0x7f3d097f, 0x147f2ea7, 0x7f85837f, 0x86a58181, 0xb7ad559c, 0x7796ae60, 0x4e7fef08, 0x2ea371f2, -0x817f7f8c, 0x7fc181c5, 0x8101818e, 0xf1588178, 0x44062eb8, 0xb0832da0, 0x81527f81, 0x7f0e817f, -0x8e06b3e5, 0xa6df2e5f, 0x9d7f7f81, 0xa14ba64d, 0x723d7f91, 0xdb81b64b, 0xb48c117f, 0xe75d0e81, -0x8bd9ba3a, 0x1f817f7f, 0x81847f67, 0x25677f5f, 0x3568b529, 0x7fa2587f, 0x24b02027, 0x47ca91dc, -0x81bba314, 0x7f844f7f, 0xbeb8aa0d, 0x9955fe5b, 0x007f9b81, 0xf0a27f6f, 0x1648e959, 0xc68193a6, -0xbea6ebfd, 0x1654cf81, 0x8142d430, 0x2e7f6693, 0xcc788195, 0x11817f81, 0x3da98171, 0x4fdc5a9c, -0x677fea81, 0x4c6ca0cf, 0x487f8181, 0x7f3b9013, 0x37387f7f, 0xc6b4217f, 0x27afb97f, 0x77b84002, -0xd3a67fef, 0x987f8181, 0x9518817f, 0x5ad4fd7f, 0x7b818146, 0x583c5581, 0xd9643b81, 0x687f92f5, -0x7f8109f2, 0xdfad937f, 0x79a45f7f, 0x007f9c0e, 0x6a6ba6ad, 0xa95bc7e9, 0x9be90653, 0x223381b7, -0x7f7f64ce, 0x81813ea3, 0x037f4f7f, 0x617f7f9a, 0x6481f081, 0x81eb4a81, 0x7f9d9a6e, 0xe80e8a4b, -0x4563f81e, 0x94db8781, 0xbf81bd04, 0x305d8236, 0x2c90d571, 0xa48e4600, 0x81633342, 0x2c537fde, -0xc70f5d7f, 0x65bf6f7f, 0x547f9632, 0x05847f1a, 0x23818147, 0xd6d9459f, 0xc97fb761, 0x8196816d, -0xb5417f5b, 0xb6f91bd9, 0x55b17fbd, 0x3e90c27f, 0x4f7fc37f, 0x7f8c855d, 0xef35817f, 0x295d7b03, -0x3730377f, 0x9c811bac, 0x7fe3ca7f, 0xe87f8124, 0x7f7fe511, 0x2d7f7ca2, 0xba9bc726, 0xf07f9f81, -0x4b476e9f, 0xaa338173, 0x5659708a, 0x817fb67f, 0x81811ded, 0x81817f90, 0xa3077f81, 0xf0d119d6, -0xf4818752, 0xbd98271f, 0x95f610ed, 0x3fc227e0, 0x68139681, 0x3c6c2d81, 0x7f7f96cb, 0x3e8181b1, -0xbbe681c6, 0xb47fd2eb, 0xfdd1b74f, 0x4381fe5f, 0xb081f399, 0x64a10081, 0x79ee3ee5, 0x9559c8a6, -0x814ad4a8, 0x817f7531, 0x81813b81, 0xbfbf9773, 0xe27f81a4, 0x7fc14269, 0x917f8158, 0xaf9d89a7, -0x81b22f81, 0x7f54d4d8, 0x0f39a503, 0xec9d3ea0, 0x35818131, 0x8c7d99a6, 0xc0158181, 0x53817f5e, -0x817f81b0, 0x9a7f9a7d, 0xc081747f, 0x517f704d, 0x7f2db90e, 0xa6dfa67f, 0x36817fce, 0x30ae720e, -0x7fd73d60, 0x5c593bd5, 0xf57f9d7d, 0x448151a3, 0xc82db29a, 0x019b5a75, 0x7f876729, 0xa69efc9d, -0x78a67f81, 0x536c817f, 0x81e470d4, 0x56f270fd, 0x2934478f, 0x9c5a7f68, 0x4ecd81ef, 0x7f5c2b23, -0x7f817f03, 0x827fb17f, 0x7f81c35e, 0x7d7f03f8, 0x7f5da67f, 0x8100671d, 0x06e1a8b0, 0x998d112a, -0x9282ae98, 0xed72813b, 0x7fbc6bda, 0x7fa97f3e, 0x36d1510c, 0x0d81819c, 0x56f8fd97, 0x815081a4, -0x7fc78133, 0x69d34542, 0x7fc1727f, 0x7fd22a97, 0x418a1df0, 0xf519077f, 0x7f6e697f, 0xa9817abc, -0xf43917b5, 0x82e3d76b, 0x86327fe7, 0x7f7fb899, 0x9f81b0a4, 0x475381c2, 0xc62b92e8, 0x7f1b49a3, -0x3679b9d7, 0x817f5364, 0xa87f7fc2, 0x45dcf6ba, 0x3470789d, 0x913e7fa5, 0x06b53681, 0x717f8de7, -0x027f6352, 0x7f7fbe7f, 0x7a81df17, 0x0356fb00, 0x307462bf, 0x6716c56c, 0x8157c7b4, 0x7fcd8181, -0x4b81dd07, 0x3b667f7f, 0x7fa6815c, 0xea37397f, 0x61e94781, 0x4e7f8177, 0x81436b5b, 0x4e818172, -0x5b204b37, 0x115501b4, 0x81491681, 0x661468bf, 0x501f88b5, 0x7f4e63e3, 0x8146e97f, 0x7f09f895, -0x7fd70e81, 0x7f7f7f16, 0x3f327fed, 0x05055631, 0x63b4ec13, 0xc03f16da, 0xa0af33c1, 0x942a7f42, -0xb4ba6515, 0xe99d81de, 0x7f78d8b0, 0x446f2c42, 0x92cf7fde, 0x6b9e7f7f, 0x948181cd, 0x94b9ad81, -0x582e8181, 0xc31748a9, 0x39c6d47f, 0xb2817fff, 0xc5817f81, 0xc6887fa4, 0xe69989e4, 0xa67e7a5c, -0x09477f9a, 0x2d4d817f, 0xb24f81d1, 0x3ff77f7f, 0x6a66813b, 0xf5050547, 0xcf917f6c, 0x81917f7c, -0xb8b23b81, 0xcab60081, 0xe17f7f81, 0x3b47547f, 0x457f4781, 0xe17e9c85, 0xd4b5ba00, 0x777fc3f4, -0x8b013d8c, 0x5381a2dd, 0xf60c7f5b, 0xc3f2c212, 0x5c6c7f35, 0xc77fae7c, 0x7f790cc8, 0xe6848181, -0x7f81584b, 0x813688e2, 0x4cff2987, 0xbeb48126, 0xc4be67bc, 0xb8738181, 0x886a9c7f, 0x519881a3, -0x77fbd5c9, 0x4181c081, 0x20813287, 0x6121bb2d, 0x7f7f227d, 0x1a8181a6, 0x811a5d06, 0xc890a57f, -0x7faf7ece, 0x83a36788, 0xd9fd8e37, 0x7f7b985e, 0x36819a38, 0xbd6096c4, 0x7de5be7f, 0x7bc68150, -0x7f8831bb, 0x81818144, 0x434a63e0, 0xaea4ad6e, 0x407f2785, 0xe8df81ea, 0x4a148aa7, 0xf89f7f65, -0x3c757f62, 0x7f81c80e, 0x81818881, 0x81caa47f, 0x9c570881, 0x1c1a8354, 0x2fa8008d, 0x7f7f81ac, -0xa781d413, 0xa9a45530, 0x327f297f, 0x7f647f5c, 0x81a6324e, 0x81a954cd, 0x7f1c2881, 0xe30b2eb3, -0x81b18181, 0x81157f18, 0x967f7f96, 0x819a7fbc, 0xcccf4fc2, 0xc43a48d5, 0x7fa33d74, 0x3aa97f50, -0x5277817f, 0x69afad86, 0x7f81f278, 0x4fa29716, 0x91818170, 0xdc1a7f5c, 0x278159b1, 0xe87f069f, -0xd28cc56b, 0x157f8181, 0x81339981, 0xcf818114, 0x6eba0b8d, 0xd281527f, 0x8249d583, 0xb37fbc43, -0xc181357f, 0x819f6163, 0xaf194881, 0x7f9872a4, 0xf3c3ab2c, 0x47507f81, 0x523f812e, 0xff81d105, -0x5851cbb0, 0x7fe881c3, 0x60cdbe81, 0xc838ccbe, 0x81817f7f, 0x1d76cb34, 0xe100407f, 0x81d78181, -0x2f81817f, 0x927f3ac9, 0x3cc887bb, 0xda7d6d7f, 0x2c7f1e7f, 0xf58e41ee, 0xfb816281, 0xa211d47f, -0x6eea4bf9, 0x297097b8, 0x9d819e81, 0xf6ef4156, 0x2afb4362, 0x7f16647f, 0x8e10c4c3, 0xb17f6181, -0x3b9d2949, 0x53a6c867, 0x810faffb, 0x8197d27f, 0x41873a37, 0xc48d7f7f, 0x81b6fb69, 0x144b2b78, -0x8181d5c4, 0x787fbc24, 0x4381929f, 0x95927f1b, 0xa3a5e451, 0xb48cc58d, 0x818e81d1, 0x9a81cbaf, -0x713ac87f, 0x7faaa694, 0x9f7f81c3, 0xf65b307d, 0x7fdfa25e, 0xa0bae1fe, 0xf3813f12, 0x19817fc5, -0xc0278a81, 0xe47f8158, 0x817fa281, 0x5bbc8181, 0xd63caaf9, 0x7fbf8181, 0x0054157f, 0x7f7f311c, -0x7f817f56, 0x56c22692, 0x8143b624, 0x0845a315, 0x107a8119, 0xc1cd5c7f, 0x7f62e549, 0x7fbb757f, -0x6b8dec74, 0x6893e220, 0xbb224ba9, 0x31819871, 0xdd2b4f57, 0x3d030250, 0xc1539dc4, 0x1c42df45, -0x7f7f6631, 0xaa81eb8f, 0xa6d4edf5, 0x81ec1981, 0xc92d77f8, 0x1ba35b2c, 0x0e1fa0cd, 0xdd257f7f, -0x817fa041, 0xe9815f81, 0x60f1b338, 0xb97f7fad, 0x097f857f, 0xae6a7f60, 0x145dbced, 0x81b7607f, -0xd4647f3d, 0x7f7f52ec, 0x7fdbbea1, 0xc74feec6, 0x1c197f48, 0xb17d1d61, 0x2e68b081, 0xb717d181, -0xda46377f, 0x105e81b7, 0x7f2e7f58, 0x67c33a7f, 0xb83f666b, 0x68518691, 0xc556f081, 0x7763c400, -0x817fbc99, 0x3a18df21, 0xfbde9374, 0x667fc646, 0x737f7fe9, 0x7f987fbe, 0x27dcb107, 0x25f35d30, -0x420adcd0, 0xab7a7f7f, 0x7f8a28c1, 0xcd7fc20e, 0x6ce69bcc, 0x7f308ce5, 0xb2c96e81, 0x95dbeb1e, -0x7f7f567f, 0x6b7fa0a5, 0x997fed60, 0x9281da7f, 0x3f7f617f, 0x7fc4608e, 0x817f4781, 0xc36b7f81, -0x7fddc17f, 0x6fe27020, 0x8a5a2b27, 0x3a4bfb81, 0xae9e4a81, 0x7f7fda7f, 0x5a7ff006, 0x39b6a0b7, -0xb9721181, 0x725edb2f, 0x8903cf08, 0x81aa7cde, 0x7fe0817f, 0x6c9e7fe8, 0x7f5c8140, 0x819d8181, -0x58777451, 0x7fdb4784, 0xc3186166, 0x817f458f, 0xdce8cdc9, 0x7840bd81, 0x1781954b, 0x60240082, -0xca242d7f, 0x788428b6, 0xf67f8d7f, 0x657f7f8a, 0xbace8106, 0xb8816e93, 0xf9b07ff9, 0x818102fa, -0x32028181, 0xfe7f8e27, 0x818d7f26, 0x7f0781a8, 0x7f7f73f3, 0xfaa78135, 0x7f81810b, 0x72676281, -0x812ed271, 0x7f8a961b, 0x7f81817a, 0x367f4181, 0x03ecb2f0, 0x6c810a7f, 0x577f81b1, 0x81e889b8, -0x7f7f707f, 0x7f90368c, 0x86a36487, 0x42b8c17f, 0x91816160, 0x8150b0a5, 0x81390fa1, 0x7f87d07f, -0x448548d0, 0x32810b93, 0x7f20da7f, 0x5b6a7fed, 0x5c812d7f, 0x7f5a7f69, 0x0c36d681, 0x2ee0544a, -0x817d861a, 0xa47fdaf7, 0x7c8127b1, 0x96216604, 0x4f8138de, 0x03e57e14, 0x73050f7f, 0x42007eeb, -0xe303f07f, 0x2f8a7438, 0x8a7f7fbc, 0x866f8165, 0xf496535f, 0xea2d9bb2, 0x16e67386, 0x6bf837ab, -0x411874b4, 0xa7c15c2a, 0x74bb7f72, 0x8181ab81, 0x81e33481, 0x68b47f7f, 0x957f8181, 0x947fcf27, -0xb47f7b20, 0x997ca926, 0x5a457f0f, 0x87403699, 0x811e3ccd, 0xdb857d7f, 0xc9cec481, 0x2998d8c3, -0x231fa37f, 0x876a2942, 0x812d7ff0, 0x7f90959a, 0x811598a2, 0x7f814697, 0x7f7e1467, 0xad3a8154, -0x81813f26, 0x0851321a, 0xf77f9f7f, 0x76b16294, 0xa56c3e3a, 0x7fd5c569, 0x30dd8185, 0x7f7f819c, -0x7f8a7f7f, 0x81dc4da7, 0xe1ce9eb9, 0x8181a2c8, 0x7fda81be, 0x01797f42, 0x7b7f89a8, 0x81e9de7f, -0x7fa76fc9, 0xdebec9a0, 0x7f381e89, 0x81ba0d7f, 0x459a7f7c, 0x81ac8181, 0xb65e8279, 0xdf8174cb, -0x6ea24abd, 0xb8486638, 0x81637f7f, 0x011d5c81, 0xc27ff63d, 0x81d48160, 0x7c81ba7f, 0x7ffa7f73, -0x7f8881f0, 0xc2d6a15b, 0x7f5d7f7f, 0x06818fd5, 0x8c23ea91, 0xf3d8e75c, 0xab81be93, 0x817f7fa8, -0xe57f816d, 0x6e81f27f, 0x81e566aa, 0x88397868, 0x45f9b7c1, 0x2c4d81e5, 0x52765111, 0x813e3d60, -0x4f45c3e7, 0xef777f91, 0x3e7fc481, 0x3e810d42, 0x81c53f7d, 0x2f7f8481, 0x3a7f8157, 0xf1662881, -0x81f03791, 0xaf818136, 0x476b7f7f, 0x6890cfa6, 0xe4f7e9ae, 0x81f6b9ba, 0xb0623aac, 0xea7f7031, -0x72c30000, 0x407f8197, 0x8176917b, 0x81184acc, 0xdacf7fa6, 0x996cd37b, 0xa68175c8, 0x5e6082e3, -0x067f927f, 0xc47f4481, 0x7fc58113, 0x7f561aff, 0x817f46b2, 0x7f7f8159, 0xcebbc57f, 0x72765b87, -0x817f2f1e, 0x885c7c81, 0x7f7f65a9, 0xeded8987, 0x7f3bab81, 0x812f7f6b, 0xfc67d85a, 0x13297781, -0x607f9621, 0x507fa647, 0x4e39ce7f, 0x81ff5c4b, 0xa246316c, 0x81457f7f, 0x5781812f, 0x1463aa9f, -0xc35d7f14, 0xbcbb5771, 0xd7e45781, 0x636c7365, 0x07102b6e, 0x75e1337f, 0x7f2bb116, 0x257fa0f2, -0x97597f40, 0x7f818810, 0x7f7f7f5c, 0xca7ff660, 0x9c916181, 0x903ea1cc, 0x6c8f7f81, 0xc2b07f25, -0xa43d818c, 0x81f67fb3, 0x67f56081, 0x1ba55531, 0xa77fc6a5, 0xda479281, 0xe7647fdb, 0x7fd2f34d, -0x1b7f4c68, 0x7f8c5781, 0xbcf18110, 0x7fd3b883, 0xde81687f, 0x81358948, 0xeb813d17, 0x25040181, -0x7ff8a39c, 0xbc574351, 0xbe677c7f, 0x487b5068, 0x6c7f816c, 0x7f2dca81, 0xb8c7b17f, 0x7f869781, -0x9c99f0ae, 0x437febc4, 0x289d81fe, 0xab74307f, 0x7c7b299a, 0x62593f52, 0x7f4e513a, 0x7f9b81c0, -0x9e2c0de5, 0x43818175, 0x857064a0, 0xd17f8db2, 0xb0a055de, 0xf04ade7f, 0xe37d7fd6, 0x3956789a, -0xcfbcb53a, 0x7fa39e7f, 0x7ed171a8, 0x49a65c89, 0x3ee166d9, 0x2daca6ca, 0x53d051e7, 0x957fc181, -0x0000e873, 0x815fbf9b, 0xe986ac61, 0x7162fd81, 0xe428090f, 0xe2814730, 0xab8d9d3d, 0x8164e6da, -0x8a6126e4, 0x81817f6e, 0xeb818281, 0x359f7f81, 0xb663c39c, 0x7fb856a8, 0x9d812e30, 0xd07c7f2e, -0x6b58ceb5, 0x8181ca7f, 0x42c081b5, 0xd58a6fd8, 0x7faa9b85, 0x81818181, 0xbb3781f4, 0x7fa98173, -0x17f17f7f, 0x7f819862, 0xd97f0781, 0x812f579a, 0x608196ec, 0x23458155, 0x5bc1a902, 0xaa39817f, -0xcb207d81, 0x227f7f9c, 0x81a54ad1, 0x81027fb4, 0xb6711835, 0x8181a57f, 0x7fed8141, 0x7fa95ec0, -0x7ffc7f8f, 0x572f81e8, 0x7ca87f81, 0x7fbeb67f, 0x637f814e, 0xcf11af7f, 0x307fb081, 0xaa85927f, -0x6f5dd995, 0x81db817f, 0x68275869, 0x724dff18, 0x8176ef58, 0x54814c7e, 0xece02300, 0x5ad71a56, -0x689e7fa7, 0xb67fa77f, 0x107f1359, 0x51a63bc0, 0x22c887ca, 0x0a0e34b7, 0x81587fae, 0xbb79604a, -0xfbb7077f, 0x81967f81, 0x81227187, 0x8129817f, 0x43a84e8a, 0xb981a34b, 0x5d307f81, 0x4d7fe9bd, -0xc973a181, 0x78647f8b, 0x00274105, 0x5d7a09e5, 0x6565a681, 0xfbd0ea6f, 0xf986037f, 0x377fc3e0, -0x9ba57fe8, 0x4f7ff13c, 0xd61f7fa0, 0x817f7fbf, 0x7f3e25c7, 0x81c42fdc, 0xae398181, 0x3125afbf, -0x7fed479c, 0xf4f52ff4, 0x7fc99d81, 0xaa417fb7, 0xa1324f81, 0xff7b817f, 0x167f6f86, 0x2a86c481, -0xa127c15c, 0x6d8e0000, 0xcf207f6d, 0x6b815681, 0xd01f50e7, 0xab81e704, 0xce81a4e4, 0x7f177f7f, -0xaa819181, 0x7f81a044, 0x1c0c7f5e, 0x4f0e56cf, 0x46a581ca, 0xb3d52970, 0x6fb3b2c8, 0x7f8189de, -0xf0058133, 0xd181d0da, 0x7481c46e, 0x427fc7d5, 0xe4528188, 0x4a359b7f, 0xd1ae25bd, 0xb735818f, -0x811a2117, 0xddd2829a, 0xec696aa1, 0x99cf945e, 0x518f3d7c, 0x8e814381, 0xa2819647, 0x85af7f43, -0xc81d7f90, 0xb8361781, 0xb67f9a64, 0xc3d38181, 0x97b07dae, 0x54687f7f, 0x206d5b79, 0x437089ad, -0x7f814881, 0x77b63840, 0x61816434, 0x9dca5e22, 0x818129bf, 0x8b49dd3b, 0xc792813a, 0x3b407f63, -0x7fc48f8e, 0x7f96815a, 0x6b430c8b, 0x974ee1a1, 0x7f8181fa, 0xb47098a2, 0x81168181, 0x816b71f5, -0x0a596d81, 0xa5945681, 0xa14181d0, 0xb4944bfa, 0x81f7816b, 0x7f7f287f, 0x7f81cc48, 0x6d819077, -0x7dff7f58, 0x5a4e7f81, 0xb7ee6df2, 0x81712a85, 0x0a652e7f, 0x86a1277f, 0x3c568181, 0x7f817f65, -0x64fb3e0b, 0x71a9687f, 0xa65c7f72, 0x3fb34043, 0x8132f77f, 0xec8133bf, 0x7f8119a5, 0x081f5bb1, -0x7f81777f, 0xedcca8a1, 0x7ffe7f25, 0xec934f43, 0xdbcc8181, 0x64416881, 0x4a8d93f4, 0x7fb64c7f, -0xf12f9bc2, 0x812a8f90, 0x1b9c32de, 0x30a30d81, 0xf079e16a, 0x633720c2, 0xad44fd53, 0x3c812f3b, -0x56b32873, 0x0000b62f, 0x76cb58a6, 0x31086ead, 0x9c307f65, 0xec664f81, 0x7f6186cd, 0xb7047f39, -0xe87f2ccd, 0xe79f8f3c, 0x88b34352, 0x7f6dec72, 0x8b4aca8c, 0x217f1c55, 0x53d76693, 0x7f984d2d, -0x125abe92, 0x7f37677f, 0x4f819c81, 0x7fb23b2e, 0xd2c5ea58, 0x7fa7817f, 0x57817f7f, 0xd45239ec, -0xc887fa03, 0x7f7f7f42, 0x8181444d, 0x2ba67f1a, 0x7fcc527f, 0x813d7f81, 0x68ad12aa, 0xa87f6763, -0x62577f7c, 0x067f7f5a, 0x3201a788, 0x9872b0a1, 0x814548d0, 0x3a883096, 0xc4701d52, 0xb59381dd, -0xdc3381a8, 0x816e3f7f, 0x4f57813e, 0x4679d77f, 0x9a14b75d, 0x8181da4b, 0x817f9d48, 0x52818181, -0x2281c97f, 0xbfb92d7f, 0x1f6f357f, 0x2ca57f3d, 0xb9b4626f, 0xab4bba25, 0xf27f4b5a, 0x4b478a56, -0x818181c3, 0x6a767f29, 0x81e16dcd, 0x4d818181, 0xd1819ce8, 0xdbce6082, 0x757f41bc, 0x777f7fbc, -0x5fa9d103, 0x0241e8d6, 0x1bb381a1, 0xf08177b7, 0x00df007f, 0x3bcdbb5f, 0x5e7f710a, 0x7f3f7f1e, -0x657f0f2b, 0x2ffae79b, 0x495c8110, 0x7f7f8150, 0xe8449f7f, 0x8434a77f, 0x42d56352, 0xfd717f8d, -0x81c514b3, 0x7f147f50, 0x7f856696, 0x7f844c81, 0x8157714b, 0x50cba2ca, 0x73539ff7, 0xb5ed7fea, -0x5d1f637f, 0xbc66496d, 0x68b633df, 0xea76156c, 0x7b4654a3, 0x81547f8d, 0x7f537f27, 0x5db64581, -0x7f367f81, 0x7f81a08c, 0x81440000, 0x3965f076, 0x40977036, 0xcf81ee31, 0x6e7f19bd, 0x703a7f03, -0xe94b81c6, 0x4330aa7f, 0x060411c3, 0x91f6f37f, 0xbdc9e781, 0x81b87f51, 0x4b6e228f, 0xbc3eb87f, -0xad916bce, 0xdfb0976a, 0x98b86387, 0xb651bdee, 0x8cf46cb9, 0x9b819a8d, 0x9d8181f1, 0x7fe0ab97, -0x714d0264, 0xb87f67a4, 0x7f9d3150, 0xe95c7f81, 0x81a7537c, 0x93f4d02e, 0x433a477f, 0xe5067fab, -0x81de5836, 0x64667f81, 0xc5255988, 0x0a7f824f, 0xf97b7fbf, 0x40c97f82, 0xc1d47a74, 0x7f7f3081, -0xfe49fc23, 0xba819538, 0xb87f5581, 0x5ea47fb2, 0x35b37292, 0xb9848178, 0x276f5235, 0x647f4ebd, -0xee2a491a, 0xfd29bb60, 0x21f53728, 0xae9d817b, 0x2ba97f81, 0x6accd440, 0x7fbec77f, 0x909b817f, -0x227f7f35, 0x767f22d5, 0x0ba3c2d1, 0xd38f817f, 0x467fd862, 0x673e8181, 0x7f3b7f81, 0x70427f81, -0x6f725d24, 0x731d64de, 0x32a9816d, 0xc1817f7a, 0x627f8181, 0x7f947615, 0xc37f72d2, 0x7f7f4261, -0xf147be64, 0xc481afab, 0x7fd9a5dc, 0x5c812690, 0x7c34783b, 0x9087817f, 0x7fd25245, 0xea5fcfb1, -0x81817f81, 0xc84ae6b4, 0x8149c875, 0x814a1a7f, 0xab7f6881, 0x6e7f3d81, 0x3ca58181, 0x75cb4781, -0x8181817f, 0x5ec4f2c5, 0x8165e07d, 0x643d6e7d, 0x78bd9764, 0x40817f24, 0x5f077581, 0x7f2ebb4b, -0x7f7fa781, 0xe657ca7f, 0x0000ff21, 0x7fa9bf6a, 0x81c1c30f, 0x9138393c, 0xa2b38174, 0x7f4c24bc, -0x2b918175, 0x7fea5d7f, 0x50c1a17f, 0x0bfefac7, 0x81fe4ea4, 0xab7f7fbd, 0x559b7fb9, 0xcb81e356, -0xd7963f72, 0x7f7a1b81, 0x8c9cd9d3, 0xbf889d1f, 0x161a88cf, 0xe6a0abb9, 0xbb014f2b, 0x81fa947f, -0x7f41509e, 0xb4480d7f, 0x7f7f8181, 0xeca6b540, 0xd27fc381, 0x3aaeb38f, 0x7f7f7f7f, 0x372a7f05, -0xd6a34b81, 0xee378159, 0xcf8181b8, 0x07487fcf, 0xcbb4ed77, 0x29817fab, 0x7fe5b342, 0x63c3bb81, -0x0724d1d8, 0x50e47f7f, 0xa67f8f93, 0x8181c37f, 0x28817a81, 0x7f81fb7f, 0xaab17f7f, 0x81997f7f, -0xa423816f, 0xf953c16a, 0x4c2362cc, 0x81812bf3, 0x5a817f4a, 0xffcbcce0, 0x9c7f8776, 0x5b5a7f7f, -0x64817f92, 0x5139c47c, 0xbe8573ce, 0xe5457f81, 0x2ca4815b, 0x503e14b8, 0x4ca75681, 0x907f7f7f, -0xa2377d19, 0x7fd7c09a, 0x7fbc8191, 0x657f61a2, 0x814f5c81, 0x7f48607f, 0xa16f3ad5, 0x819d227f, -0x247fc10e, 0x7f817f32, 0xc39981f5, 0xb357261b, 0x347f7027, 0xe3814506, 0xa1032e49, 0x979eb571, -0xb06ac281, 0x81815e7f, 0x34b57fb7, 0x7ffe2681, 0xc181630b, 0xbda9ce3b, 0x81f9287f, 0x4ef12081, -0xb86a54ba, 0xbc4d13c7, 0x81817fd9, 0x62817f1c, 0x7f7f4fa1, 0x847f7fce, 0x81bf68f5, 0xd7625f73, -0x81e79d7f, 0x8137a1ca, 0x423581cb, 0x26580000, 0xd7d6811e, 0xce6e6c81, 0x8168173b, 0x498468b2, -0x8c7c817f, 0x6f81b881, 0xad899a25, 0xd049e481, 0x7fdd817f, 0x63816bbe, 0x048b8d81, 0x8eb764c6, -0x987b9ea5, 0x81fae493, 0x7f72817f, 0xa57fbd7f, 0x7f0f81b3, 0xb37f4a33, 0x2e092988, 0x1b172b25, -0x09107f3e, 0x48f5fc7f, 0x69aaa80e, 0x184fe781, 0x7f9db5e6, 0x8195276c, 0x252a8181, 0x8b81ccfa, -0x3c308181, 0x9d19b086, 0xf0d589f7, 0x207408ca, 0xe34e9ed0, 0xe67fbbf0, 0xc0996525, 0x0dca5881, -0x813d4181, 0x7f729738, 0x0a865e5d, 0x8bbea581, 0x5c4aac3f, 0x8181a63f, 0xa1f0b873, 0xa92481d0, -0x837f817f, 0x047fdd84, 0xc8767f2a, 0x441a81be, 0x818681aa, 0x05490179, 0xba81ba7f, 0xde246581, -0x466d70d7, 0xb6bc3f5b, 0x5c428f2d, 0x8105cb77, 0x0206175a, 0x5f6ac2b1, 0x9a4d2a4d, 0x7fb0917d, -0x1281ce12, 0x81028181, 0x41b0a4ad, 0x29973681, 0x973e992e, 0x81617dba, 0xc1818181, 0xb87fc1af, -0x81137feb, 0x627f5210, 0x8181de1d, 0x7f615f70, 0xabbb817f, 0x817fc57f, 0xdbe5b6f3, 0x9c8a7f72, -0x3c2826df, 0xae03d3b5, 0x7f6cc481, 0xd9c41c7f, 0x83ad7f81, 0x336370a8, 0x8bbfaf2e, 0x3561caa5, -0x548d142c, 0x810366b5, 0xa981d36e, 0xbf3afc7f, 0x7fd78157, 0x61817bf1, 0x74afcdd7, 0x18ac3d61, -0xcc45b6e0, 0x3d81af88, 0xf97934de, 0x947a8f81, 0x8b7fa6b8, 0xe0dd8981, 0x2d812381, 0x967f6409, -0x24bc0b1d, 0xdb7fa943, 0x18197fc3, 0x47ef7f6b, 0x66a6bb7f, 0xd374af81, 0xf48e7f9f, 0x52399754, -0xe1abbf6f, 0x04751d7f, 0x3690c581, 0x557fc3a6, 0xc1815413, 0x9086df7f, 0x81e57481, 0x81538167, -0x4df9c981, 0x9463a57f, 0x81c5063a, 0x7f7eaa81, 0xa6dc9423, 0xabc07ffb, 0xd981817c, 0x816064ae, -0x7f815dab, 0xc0b12da0, 0x1444be7f, 0x3a7781e0, 0x887f527f, 0xc0817f1f, 0x05cba881, 0x6599057f, -0x817ffd53, 0xca907fab, 0x557f0d7f, 0x5d029ce9, 0x57818168, 0xc4093382, 0x52e5b33a, 0x763e09b7, -0x814da277, 0xf9208cc5, 0x817f7fcb, 0x7f5fac7f, 0x6d7f6544, 0x7f0a7fec, 0xe7b4337f, 0x7fae8181, -0xa8c5608c, 0x6f9bb388, 0xb27fc773, 0xf4acaa81, 0x1cad30ac, 0x2d817f8b, 0x2b817f16, 0xcca2a581, -0xcb77dad4, 0x58487a22, 0x7fe57f69, 0x45387012, 0x73504724, 0x61357f81, 0xc77f8181, 0xabc7e11b, -0x8181c16e, 0xa681ab27, 0x8c81c48f, 0xbd1de360, 0x9924337f, 0x7f230156, 0x3dd6a87f, 0x477f9381, -0xbeb38181, 0x47815ccb, 0x8125817f, 0xb8057f7e, 0x7f7fc081, 0x46815873, 0x5f93ba81, 0x7f35767f, -0x7f7f5a94, 0x748c84e5, 0x4c7ffc90, 0x7fcd247e, 0x44898e81, 0x1268ecc9, 0x81d2777f, 0xda42e7c7, -0xee267f81, 0x7f5f269f, 0xe3d60c91, 0x81c97f0b, 0xd7b00000, 0x9b813a83, 0x7f7f8181, 0xb71cfa35, -0xf5888156, 0x853e9cc5, 0x1c1c1014, 0x2e7f8b1b, 0x81bea644, 0x70f4e8d8, 0x8158a181, 0x18caad9f, -0x3b28815e, 0x7f460155, 0x7f7f7aee, 0x444b51e5, 0x8682a381, 0x7f508181, 0x5e86466d, 0x7f81287f, -0x7f7c7f50, 0x8173e4de, 0x4c747a65, 0x69816cd7, 0x6674813b, 0x48274e90, 0x92ccf278, 0x99f181c7, -0x81b20243, 0xbf4b4b81, 0x81d981f4, 0xa1e981dd, 0x6c7f7b6e, 0x98cad579, 0x9a7f1685, 0x81e8812e, -0x5d7fcf52, 0x37819772, 0xdb437fab, 0x1d83782a, 0xd3ff71b3, 0xc7e28181, 0x81817ca6, 0x1808127f, -0xb515639d, 0x812c8108, 0xa2a97f14, 0xdd8102c6, 0x727f7f98, 0x5f197f19, 0x7b22817f, 0x46562e7f, -0x59b89c7f, 0xaba28d81, 0x5e4e7181, 0x909da6b9, 0x817d8128, 0x9c167abf, 0x3ef4817f, 0xf5628d72, -0x97727fbb, 0x88c6a600, 0x81c9927f, 0x817443e0, 0x81ac7f7f, 0x7fec67cc, 0xc353bb96, 0x4caae113, -0x7fa37fd9, 0x525c45dc, 0xdf798ba6, 0x7c811049, 0x812570c7, 0x7f788a6b, 0x797f1fef, 0x2022fd81, -0x38870936, 0x813f7d7f, 0x81810941, 0x6b75817f, 0x5aa11953, 0xcc7f7f81, 0x61778581, 0x5e458181, -0xcfff7f90, 0x9020747f, 0xb4e35ad5, 0xea0e8109, 0x21f97f13, 0x41c07f40, 0xc6ddc4ad, 0x085227c8, -0x11dc9f85, 0x7fda7f55, 0x5a92b34c, 0x11659b4d, 0x000081bc, 0x81816781, 0x81cce139, 0xf165d51c, -0x810a817f, 0x7f7f82d6, 0xb5b3817f, 0x40909bfb, 0x7f04a01f, 0xd0288164, 0x810164f3, 0x59778b81, -0xc87f2997, 0x9d99417f, 0x65528173, 0x727f454a, 0x9f187fd9, 0x37948141, 0x217fcf7f, 0x81818319, -0xc27f817f, 0x47817f81, 0x756e817f, 0xa28c8cd3, 0x84b77f81, 0x44ef8e4f, 0x7f7f7f7f, 0x932e2c45, -0x680d20a8, 0x817f1122, 0x52128a21, 0x2b8136ff, 0x0b7f817f, 0xda8c817f, 0x24c17f7f, 0x3dcb39b7, -0x81d18181, 0x81fe1a81, 0x0590978b, 0x71b20319, 0x7f65bfb4, 0x4fb42290, 0xde1a7fd2, 0xc8bd77d3, -0x917f32a0, 0xb03fd9db, 0x4c1e872b, 0x814f5481, 0x44817f7d, 0x398a887f, 0x4a19e8ac, 0x4d818189, -0xc3818181, 0x7f8198dc, 0xb77f527f, 0x817fe681, 0xa83d818c, 0x420b5e81, 0x6e5adbbf, 0x7abd56c4, -0x717d7f7f, 0xc7811c0c, 0x767fba89, 0x6d1d5106, 0x5a06df17, 0x86c28181, 0xcdd6888e, 0x0e747f8a, -0xde81a9c3, 0x45459db8, 0x81114e22, 0xbd7f8197, 0x3c3d85cf, 0x8c815fe8, 0x544d7f64, 0x81986177, -0x8c20a0b5, 0x7f4b8178, 0x17db6031, 0x7f42df7f, 0xee93cc0f, 0x8ab829b2, 0x29a04e65, 0xfc30035f, -0xc57b7f7f, 0xe51ef77f, 0x7fd95481, 0x76957f7f, 0x819f945e, 0xc91a187f, 0x81657e40, 0x8192816d, -0x7339dce0, 0x8bd1c3c7, 0xa2812e1b, 0x81db3d8e, 0x1781da89, 0xd0810000, 0x7fc8c57a, 0x8fc32003, -0x1c847f81, 0x10dfb271, 0x7ff8cc62, 0x2037d87f, 0x8151501e, 0x17c74c74, 0xb8ab2852, 0x4b7f1c97, -0x6a811596, 0x46acc3e0, 0x3c81f49e, 0xd6d81a4e, 0x2e815066, 0x46218186, 0x41682bb4, 0xa1ac315d, -0xb87fdc73, 0x378181ad, 0xe97f979a, 0xccb07981, 0xb10a7f38, 0x03488893, 0xfef78df3, 0x8145467c, -0x3b67b401, 0xb3cf34bc, 0x81476c00, 0xdd638b81, 0x5e43af81, 0x2bab7f6c, 0x6d7f7f6f, 0x7f657f70, -0xbc816e77, 0x8981c27f, 0x3e40b685, 0xd93d7256, 0xbd86c8c3, 0x817fdcce, 0x43899081, 0x817f1693, -0xc0db9a68, 0x7f57a5a8, 0xd14c817f, 0x8c4ab37a, 0x901081dd, 0x292a452b, 0x7f81e85a, 0x189ece81, -0xc10b9401, 0x81817f69, 0x358b3d7f, 0xa86bb1a9, 0xbd7f7f8a, 0x57fd7fe3, 0x81964506, 0x74295986, -0xab7fbc8d, 0x817f62e6, 0xab816277, 0x5737ab20, 0x9c7f6f50, 0x7f5781af, 0xe344ef7f, 0x98a695ca, -0x81d2a20e, 0xa77f6605, 0xc1d00398, 0x177a90d5, 0x7ff6db7f, 0x0221897f, 0x6c8105c6, 0x578981d7, -0x64ac81c3, 0x1d9381f9, 0x7f706e7f, 0xd5797f81, 0xf9567f81, 0x27ed81d0, 0x496f2d01, 0x48b8973b, -0xb34c1f32, 0x7f42139a, 0xeac95332, 0xf05f7783, 0x037f8145, 0xa98f3dbd, 0xc5ea24a8, 0x81417fc1, -0x81655e97, 0xcbc682df, 0xec10815a, 0x817f7fa5, 0xb8b54dff, 0x00003e84, 0xa7ece56d, 0x819d81c2, -0xd0ee6d81, 0x0e5e4db0, 0xe3818181, 0x7f4a2c13, 0xb13d46ac, 0xc181f081, 0xfe51c8ab, 0xa7747fb6, -0xc2506129, 0x9d98ce4a, 0x81627f81, 0x816d6481, 0x81576b7f, 0x817f814f, 0xc881cc8b, 0x686d098f, -0xae7fcb7f, 0x3b39a87f, 0x81888879, 0x47877f30, 0xd9bd9e9e, 0x061a0ee3, 0x7f3631a3, 0xbf5b227f, -0x7f7f837f, 0xc5d18162, 0xa3405318, 0xc3f27fac, 0x7f43c6f6, 0x927f7fad, 0x817f7fdd, 0x7f813b8b, -0x7fe59a65, 0x81fd87d7, 0xda54547f, 0x814d114a, 0x7e7f813d, 0xf47f077f, 0xa0869981, 0x38db7fea, -0xf61986b0, 0x7f9146cb, 0x81db9bb7, 0xfc3b8177, 0xbd7ff9a1, 0x7f33c5aa, 0x74335381, 0x815ca42b, -0x7f814a81, 0x49977342, 0xab9ed775, 0x9874db81, 0x6381227f, 0x1b81b27f, 0x817f3716, 0xd8e6bf07, -0x81030494, 0x56cedf81, 0x7f607f9a, 0x7f7f4f52, 0x3cb978f2, 0xd57fca81, 0xd7bc5c81, 0x3a2265b7, -0x7f7f98bf, 0xac068158, 0xa8851581, 0x1db9a67f, 0x7f24d44f, 0x57a34093, 0x7529b981, 0x50a3817f, -0x4c3f6381, 0xbd7f81ad, 0x2281a481, 0x1d2e7f81, 0x77b85621, 0x3f818105, 0x307f783f, 0x7f7fe0b2, -0x4d4a297f, 0x8d7f4d7f, 0x88818a7f, 0x129cf8b7, 0x9b817f7f, 0x7fe5ce65, 0xa48e7213, 0xf481a737, -0xb43d4fd4, 0x7fb182c3, 0xa18181ba, 0x077f8127, 0x4f4b468a, 0xe1bea062, 0xc34d0000, 0xc0f381ba, -0x8181817f, 0xbb2d9e7f, 0x7f216b7f, 0x868181ad, 0x7f7fcdf6, 0x810b3d55, 0x627f4c43, 0x81903e81, -0x54ea9a4d, 0x3181ae1e, 0x7f8116d0, 0x74b5c181, 0x607b431b, 0x5552d081, 0x7f818122, 0xe9449f4c, -0x6fb434b5, 0x1f1b9552, 0x54d7b178, 0x8b1b9e33, 0x4143cb33, 0x13b0817f, 0x7f51317f, 0x81247f65, -0xa6fd7b18, 0xb1d6550e, 0xaa6481c1, 0x81421f41, 0x50c0813c, 0x95ac7eec, 0x442a7981, 0xc39289ea, -0x667fcc5d, 0xf681817f, 0xd729c236, 0x5342819b, 0x813f457f, 0x819d2481, 0x817facd0, 0x7ff2dd9a, -0x81cafb81, 0x26c72930, 0x177ba325, 0x81015e07, 0xc5667f7f, 0x81fa497f, 0x7cb3505e, 0x85e3815d, -0x67596b53, 0x857f6696, 0xc97f7f66, 0x7a813978, 0x5f7f7f81, 0x043d9d81, 0x8c81a6a6, 0x0e8197f1, -0xd17664d1, 0x9f81814d, 0x7f4c4f3e, 0x5e7f756a, 0x8181815a, 0xe090817f, 0x81377f81, 0xaba9813d, -0x8985c047, 0x2106c97f, 0xc846f2b2, 0xb19a83ce, 0x64107f16, 0x7f792fde, 0x87516244, 0x9c81673e, -0x2f5c8187, 0x555a8181, 0x95d9f26a, 0x70408e9b, 0x7f81b57f, 0x8f0de19b, 0xd37f7a6e, 0x9ba9fa7f, -0x7f0b6568, 0x1a4f7f14, 0x3b4f5b71, 0x814e377f, 0x8125a7ec, 0x1d817f43, 0x811128dd, 0x66816435, -0x9de99e3e, 0x81b27f48, 0x7fc3783f, 0x69983781, 0x457a817f, 0xd4296caa, 0x0000b659, 0x723a92a9, -0x81860888, 0x8c81c44c, 0x7489b15c, 0x817310ed, 0x74a48e9c, 0xc6531a73, 0x7f7f64d0, 0x502d7fb9, -0x437f9f7f, 0xb1bfa444, 0x81df09f0, 0x0946ab9b, 0x7f21ca81, 0x9d818166, 0x81e8d281, 0x917f6791, -0x36ac811b, 0x9d817347, 0x344c02a7, 0xab36817f, 0x81818152, 0x32013a89, 0xd7ab3008, 0x6f608181, -0x817f7f7f, 0x153e0881, 0x81dfcaba, 0x6c5e577f, 0x2f7f6524, 0x817aa07c, 0xdd7f0175, 0x8b4b7fec, -0xbc81ead5, 0xae8b205d, 0xc9a9743e, 0xf33f14cf, 0x49ca7f58, 0x507f6976, 0x8cbe66d4, 0x9778a724, -0x6d8147e3, 0x81334092, 0x7f4c0101, 0x82d5ea73, 0xb59c6657, 0x1ab842f8, 0xbc1d8581, 0x4004d917, -0xe5eaaee2, 0x7fa9813b, 0x817fae58, 0xd77f1281, 0x10732f61, 0x836d137f, 0x7fbccb3b, 0x1a3a81d7, -0x81047fef, 0x790aa87f, 0xc19eaac6, 0x60667f07, 0xb7f1a97f, 0x39f39e7c, 0x057f7f7f, 0xaa7f81c8, -0x79bef7a0, 0xf3d3134d, 0x720f7fbd, 0xb4a5b69e, 0x716c817f, 0x9a817fdf, 0x347f817f, 0x4b995cb4, -0x876a4f7e, 0x8d92687f, 0x7f9e8181, 0x8172817f, 0x8ea21cc3, 0x61bd96b0, 0x81fba378, 0x6db77f7f, -0xdf307181, 0xda0f81c4, 0xa8e36d65, 0x70a7a559, 0x0be0f27f, 0xb56f4971, 0x35813a6d, 0x188130b5, -0x517ff881, 0xec54b6ff, 0x8183817f, 0x20ec2381, 0x3e7f9613, 0x878af66d, 0x81657f81, 0x7fb80000, -0x7cb38d5b, 0x817f7f45, 0x7f6352c1, 0x3881727e, 0x637f5ec2, 0x81437fc6, 0x7f7f90d2, 0xb1558699, -0x2b81904a, 0x7f84ad54, 0xedab2281, 0xbe9cbd81, 0x7f5001d1, 0xea2a206c, 0x813cf1ab, 0x81658221, -0x81a6817f, 0x8167929a, 0x726dd87f, 0x817f817f, 0x93b45a87, 0x7fa179e2, 0x7f4c7f81, 0x8157817f, -0xa2fd7e81, 0x44284a58, 0x3b98c224, 0x45008124, 0x16da978d, 0xb772ba81, 0x7a4f3481, 0xe97fb9c8, -0x7f49529e, 0xaa02580d, 0xa254adb3, 0xac0a817f, 0xdc532c32, 0x7fe6887f, 0x7f313d7d, 0x61d17f11, -0x81e1bf02, 0x7f62c97f, 0x348d5d50, 0x12ec7f7f, 0x8f7f2884, 0x7f3f371e, 0x021c8e81, 0x65a07fc7, -0x5e14b632, 0x817ff481, 0x6681de78, 0xba4f971c, 0x65c07f81, 0xac81d181, 0x7f11b17f, 0xdcc1011d, -0x7f7f23c1, 0xcc819b6a, 0x81a73d06, 0x5e943954, 0x09c8b87f, 0x43405fe8, 0x817f8d58, 0x550f4d1d, -0x82c27254, 0xd0408532, 0x4460477f, 0x8b7f9cec, 0x7fc9817f, 0x8181165f, 0x28d8817a, 0x0527752f, -0x8168813f, 0x7f48cc81, 0x7481c91e, 0x6881c481, 0x4b0a7f55, 0xcc81e624, 0xe57fac7f, 0x6f0f81a0, -0x417b5a81, 0x9381dd8c, 0xa881c4e5, 0x8c505264, 0x695ab14c, 0xecc99781, 0x3981c57f, 0x0c204553, -0x4a77d59c, 0xa2301c81, 0x5ba47f00, 0x451eb2f0, 0xb0459baf, 0x934bcc63, 0x5652c0a1, 0xb381b193, -0x68626b5b, 0x361741d5, 0x7fe281b3, 0x70ad7f7f, 0x8161f792, 0xbfda5b21, 0xed97ad84, 0x7f59cb7f, -0x8ed1ecf7, 0x75d784ac, 0x0f81b07f, 0x3ed5bb6b, 0x819122a9, 0x2257a06b, 0x81687fb1, 0xc008057f, -0x97812981, 0xcb2081cd, 0xd9bb6681, 0x407f7f7f, 0xc27f814e, 0x23a2527f, 0x767203ad, 0xed17ee7f, -0xd4b89558, 0x8195bc81, 0x817f7fe0, 0xe4b7997f, 0x081ca76d, 0xb87f817f, 0x006350bb, 0x812739de, -0x557f811e, 0x8d4387af, 0x98815781, 0x81818148, 0xb1bc8105, 0x04cf273e, 0x3f2b289b, 0xae96437e, -0x819281b9, 0x95cf7f82, 0x7bf77f81, 0xab7f0441, 0x81652854, 0x34de0d81, 0xac816081, 0x43b12e45, -0x91b75bdd, 0x7da27794, 0x9bbb727f, 0x301d812e, 0x7fa88120, 0x27a15075, 0x27c82cc1, 0xef1a813a, -0x8114c4d2, 0x817b7f2b, 0xff877f47, 0x7fd47fcd, 0xd08ceb35, 0xe07f4386, 0x67b3a47d, 0xad7fd64d, -0x817f7044, 0x537feabb, 0x8d3f36ec, 0x6c3883ce, 0x43b6909d, 0x81bcd181, 0xfa7fdae9, 0x3c7f5440, -0x3946347f, 0x7f22ac7f, 0x815dea81, 0xb6c6c8a1, 0xd57f81c9, 0x526fd581, 0xce3c3115, 0x3d41c54f, -0x5c5ac2b0, 0x7c948586, 0xa47f7f96, 0x8b7fc351, 0x309aadf9, 0xa0cfef81, 0xb081acd7, 0xd7413cb2, -0x7f4a6cc9, 0x5c3bb39f, 0x7fc7e581, 0x68cc8114, 0x0926a5fa, 0x82c37581, 0x8181e642, 0x57ab2ec6, -0x497f0000, 0x5fa07f9c, 0xa17fc405, 0xeaa0de7f, 0xa14a7fb3, 0xc4c12a81, 0xa3527d15, 0xa854d4d4, -0xf781a3db, 0xa07f26ae, 0x812c7f74, 0x1f7f2fc4, 0x3a9381d4, 0x17b6005d, 0xd414ee60, 0x18b49d68, -0x9cc77f9e, 0x30aa7f91, 0x7fb9207f, 0x64158b40, 0x81423c7f, 0xea2fa9cc, 0x7fa83381, 0xca647f8e, -0xd6b9657f, 0x81b26a7a, 0x4fb7b2f1, 0x1b7f9eda, 0xfb8181ab, 0x7f2557d7, 0x71e8701c, 0xa2817f81, -0x81817f9e, 0x04139d39, 0xc9f6533f, 0xa1f74db1, 0x814042db, 0xca6e8114, 0x7fb3f64a, 0x03f981a0, -0x7f9e0755, 0x7f7ba781, 0xd554d19a, 0xd81a5661, 0x7fb33f3a, 0x8f81c8bf, 0x012ff975, 0xb1a576ee, -0x81be6681, 0x818db381, 0xbd7f8151, 0x81b281ae, 0xddd2fbdc, 0x81bfa81c, 0xce818181, 0x774c9c28, -0x7fd05d59, 0x811a54ce, 0x2f7f727f, 0xbe816b81, 0x7fb03af2, 0xc44bfc7f, 0xcf6ba181, 0x14be8161, -0x6715a197, 0x76386d26, 0x07835f81, 0x817c818d, 0x81693281, 0x818118fa, 0x777c9e62, 0xccad6446, -0x769c5b8b, 0xdbd781b7, 0xe4b063f9, 0x2b568182, 0x8c7f8187, 0x7f7f677f, 0x6b7fa675, 0x6be85f61, -0xc36f7d32, 0x7f81005f, 0xd0d0997f, 0x3a818181, 0x7fa7b6b7, 0xc39ef17f, 0xcc7f437f, 0x3d51729d, -0x3eb72475, 0x1b069d81, 0x7fe8abee, 0x604c7df9, 0x7fb47f81, 0x3a263b75, 0x75a488e6, 0x7f68d47f, -0x00004e97, 0x7ffb0973, 0x7f53a009, 0x7f014834, 0x6f81022c, 0xf0b1405f, 0x06c84ca5, 0x4bcf7fc9, -0x4388ec9a, 0xf528fa74, 0x8e3b816f, 0x7f7f4c72, 0x817f5224, 0xbd998181, 0x81b181c6, 0xbd817f88, -0x1763f57f, 0x7a796e44, 0xe98e81a9, 0x5360a2fa, 0x97b39081, 0x707f1b65, 0x81c67f7f, 0x4e461c7f, -0x817f231b, 0xc2d08181, 0x366081c6, 0xd2e67f90, 0x13f1b87f, 0xd781819f, 0x7f347fa2, 0xb1147fc5, -0xe6b1fe4e, 0x3a1a96b2, 0x177f8191, 0x3e3d96fe, 0xd0d261a0, 0xb25e7fc9, 0x472b81ce, 0xbad6817f, -0x707b45ca, 0x81817f81, 0xc48fb7f8, 0x90373f82, 0xa681e0b5, 0x71419190, 0x6978f77f, 0xf4463125, -0x48f1937f, 0x4a45c611, 0x7f97e348, 0xf07f1e21, 0x81fbfc60, 0x8783a281, 0x00931cdd, 0x81e70f91, -0xe24e7f7f, 0x7f61817f, 0x81967c47, 0x6d9bc90e, 0xec58817f, 0x8157357f, 0x7f7fc674, 0x7f7e3c81, -0xaa8b7fbc, 0x7f3ba469, 0x7a22f57f, 0x7f7f7f27, 0x81c89e7f, 0x8145d9c8, 0x012f737f, 0xe91f15cc, -0x9b9cb749, 0x818142cd, 0x290a7f4a, 0x89cfc4b1, 0x8337ebe2, 0xd8224205, 0x8181a49e, 0x58b04ea1, -0x7fea95a7, 0x861681fb, 0xcea37f5f, 0x81309c8f, 0x6ded8145, 0xbd5be86e, 0xc2ce9402, 0x557f57be, -0x4ef830e9, 0x7f81f97f, 0xf804367a, 0x5de6817f, 0x156de096, 0x2c06df0c, 0x98b170d7, 0x817f81a9, -0x24597fd4, 0x81810000, 0x0e24a66a, 0x819e5681, 0x6f73e481, 0x054b532a, 0xc0814026, 0xb3a36181, -0x6da37f9a, 0x7f83574f, 0xe0a381c6, 0x2075bf7f, 0x28438181, 0xb1cd7f74, 0x7ffb497f, 0xd17f337f, -0x46085c73, 0xd57f5681, 0x704b7ff3, 0x449e3f7f, 0xeb6e09d6, 0xb37f4b02, 0x817f1cb9, 0x672edf7f, -0xd0c2c25b, 0x5ed0885b, 0x4676876b, 0x2bd8d970, 0x9a7fbbc6, 0x81095581, 0x81b27f6b, 0x753c7f7f, -0x7f812c7f, 0x7f477fbe, 0xdaa67f7e, 0x7f099859, 0x7b0fea70, 0x816b8186, 0xf0677f5c, 0x16455d9b, -0xa98170a9, 0xa181529b, 0x7f817f67, 0x8f72c351, 0x2a7f7f7f, 0x2f5f347f, 0x695c7f79, 0x282fbbe0, -0xb78581f0, 0x817f297f, 0x49818c81, 0x817fc78c, 0x3bd68181, 0x86d7deda, 0x7fa0d208, 0x1c7f3481, -0xf5be9a57, 0xb9ded881, 0x8ab88c81, 0x647ae23a, 0xb5571142, 0xe09d7fc1, 0xa5d9817f, 0xaca07f7f, -0x7f4d5286, 0xa57fde7f, 0x94d0917f, 0xb160442b, 0xacf47b2b, 0xd17f7f81, 0x2e37f976, 0xbe7f5d66, -0xc2815f28, 0x5c81487f, 0xc2026481, 0x81a194dd, 0xba7f2c91, 0xb7357f37, 0x81b25698, 0xd2818154, -0x45b78130, 0xc6bead58, 0x6f5a5656, 0xb181a6ae, 0x07c9a153, 0x75d681d3, 0x8c92817f, 0x81503520, -0xa66f812f, 0xa59b7a81, 0x17a09164, 0x17087fb2, 0xd0bb319b, 0x6d8153ae, 0x8af1a67f, 0x651c46b0, -0x4b637f1b, 0x00002981, 0x2c7f437f, 0xd9deb6ab, 0x9fba847f, 0x6f289b21, 0x015f811c, 0x8176f498, -0xeac003ae, 0x68818192, 0xb37fa6a6, 0xd07f4aa5, 0x83819472, 0xa5da41a0, 0xbc7fbe7f, 0xa67fccd9, -0x7f0c86c5, 0x116e7f15, 0x7f67b45a, 0x907fcf81, 0x81812c66, 0x05747283, 0xac962b7f, 0x2a7f81ea, -0x81c2b57f, 0xb1b4b868, 0x7f811ed1, 0x7f66c937, 0xc881e6ab, 0x740323fd, 0xcf765745, 0x3592d370, -0x5c81f3e5, 0x527f3efc, 0x818781d9, 0xf6819b53, 0x1c547f51, 0x4e29b37f, 0x36f1537f, 0xcb819758, -0x538f5b7f, 0xa5172c22, 0x52427f7f, 0x6b7f8128, 0x7186134a, 0xf67f1b62, 0x6081e015, 0x829abe81, -0xaa8a65fc, 0xd27fb70f, 0x7f0a0881, 0x3d7fc998, 0x443e78b0, 0x9443c354, 0x81266724, 0x9b81812b, -0x813181a0, 0x7fddca68, 0x7f260f81, 0x7a818181, 0x812681ca, 0xf48152e0, 0x817f8388, 0x81306c7f, -0x7f71d020, 0x81bd8481, 0x5234d5c2, 0x31be8136, 0x3403d432, 0x11286844, 0x81a57f1e, 0xe3b57fd4, -0x7aa88f52, 0xabc64c52, 0x977f8181, 0x7fe68ca6, 0x5dd6eac3, 0xd26a81a9, 0x017f8183, 0x902cc266, -0x7fba7f52, 0x617f81cf, 0x7f657ff0, 0x045d7f63, 0x3c04bb4e, 0xaa4e7f81, 0x847fe385, 0x67817f7f, -0x42f33d28, 0x61a5aa5a, 0x817f7f1e, 0xa3a715d7, 0x5da91c3a, 0x7f9f7f81, 0xc48281ce, 0x813081fa, -0x7f817e53, 0x6d227dbf, 0x6e7b0000, 0xf49b4091, 0xf6b3d8e9, 0x89fb29ae, 0x44289881, 0x3cc78181, -0xe58103b9, 0x535bffd3, 0x817fa81b, 0x469f82f0, 0x57837fe1, 0xe14af07f, 0x54bf19b2, 0x7482595d, -0x6781bbd2, 0x4b7b7fb7, 0xa4c45060, 0x380155c8, 0xb72aa381, 0x4530847f, 0xcb509581, 0x34818181, -0xb03cd87f, 0x90818122, 0x812a8181, 0x817f677f, 0x2c2a597f, 0x35f0c581, 0x81b11261, 0x4d678120, -0x816d7f5b, 0x448166d8, 0x0c567f61, 0x81189e21, 0xcf932f08, 0x4c5a917f, 0x687f9b7f, 0x257f81d2, -0xcc7f6220, 0x8c947f81, 0x24642d1f, 0x728155d3, 0x14ca75d2, 0x817d7f38, 0x7f818181, 0x7fb31f87, -0x13a581b3, 0xd9b5215f, 0xa8afdbf5, 0x147fe67f, 0x81caab97, 0xa96daa7f, 0xf88b897f, 0xe7937fc2, -0x5a8b7f4b, 0x7d59277f, 0x8d687f9d, 0x7f924b81, 0xd41c82c0, 0xa5119c7f, 0x4fcfeba1, 0x3e077f81, -0xaf65994c, 0x83d481a7, 0x81257fb0, 0xa481387f, 0x36d8a463, 0x8181811a, 0xc75643a7, 0x474c6c1a, -0x7fc0e8cf, 0x8cdc896e, 0x55830655, 0x7f81337f, 0x7f65db1d, 0xa881cd81, 0x7f812ec8, 0x7f76cdd4, -0x634a443d, 0xea7f3ed9, 0x90a8d093, 0xb05e819c, 0x7f7f5c4e, 0x811e5b81, 0x73a1b989, 0x8181717f, -0x927d7f09, 0xdeaf7fca, 0x528e302a, 0x81654681, 0x7fe92e81, 0x87d58110, 0x1ca86e20, 0x7291a4cc, -0xc76c7f81, 0x577f5136, 0x00005b6e, 0x817fe37f, 0xf7ac7f7f, 0xf258ee81, 0x81814c63, 0x2a97f57f, -0x5f7ca0a7, 0x7f2fa37f, 0x94360c7f, 0x7f23117d, 0x81343a7f, 0x55b0d9de, 0xbae0189e, 0xc77f228a, -0x817f7861, 0xa57f7fac, 0x878ede24, 0xb57fad5a, 0x5c907f93, 0x814e9b81, 0x7febf59c, 0x7724e1a9, -0x569d9281, 0x1b644699, 0x4d4e26bf, 0x397f7f6e, 0x8ac93027, 0xe6885974, 0x51a2c1a4, 0x7f7f5b7f, -0xaad8ac97, 0x122c8186, 0x97810a5b, 0x818581e2, 0xc77f7f35, 0x67611c60, 0x3f8178ea, 0xa47fa65e, -0x888f8132, 0x81817cd4, 0x1081b4bd, 0x817f7fb8, 0x449a3fcc, 0x7f9832de, 0x51e96f58, 0xcbde52c0, -0x6b515783, 0xbda3b297, 0xd64b6381, 0x7f693c81, 0x6d311abb, 0x73468e81, 0xde81817f, 0x4f811581, -0x90d6817f, 0x152c9d49, 0xad7f17d7, 0x7f834681, 0xa47fe6dc, 0x06817fb3, 0x7f817f69, 0xd18190b1, -0xca7f8183, 0x1881f381, 0xac50814a, 0x7f8dca7a, 0x71358131, 0x28783add, 0xd31b153b, 0x71919b97, -0x81877f07, 0x707fca4f, 0x57c6814b, 0xc0a17fbf, 0xff5bb344, 0x4a7fa99d, 0x7434c104, 0xaa7ff0a5, -0xb6ec6841, 0xb4917e1b, 0x5a81ab94, 0x81a3aab1, 0x257fce30, 0xe26b7fc7, 0x1d7a7fe5, 0xfc7ca6c0, -0x81437ff7, 0x7dc59e14, 0x7f0cf9e9, 0x90e37f7f, 0x7f6f12bc, 0x52d36381, 0xc15f88ac, 0x3536277f, -0x8d3e2a7f, 0xa18d7a7f, 0x48907f23, 0x7f810000, 0xfd813357, 0x6ed4520b, 0x843907e2, 0x66814378, -0x7f7f6bd8, 0x0e3381ad, 0x03847f90, 0x05814769, 0x8181c181, 0x1c7f7fac, 0xe83cbfb5, 0xb15c735c, -0x7f8f7f7f, 0x7f846b81, 0x81d2eb7e, 0xf7447f41, 0xa2b57f81, 0x2ba7f381, 0x817f75bc, 0x78553181, -0xc7b07f7f, 0x7f557a41, 0x46a83ddb, 0x9b447d13, 0xccfe7b81, 0x7f3ae281, 0x75464bfb, 0x7f4e5560, -0x7fad14ce, 0x98fd2a7f, 0x7f637f81, 0x4a22cf5c, 0xca81813e, 0x4ffc7347, 0x9d777fa5, 0x810585ff, -0x71e57f81, 0x3f7f8181, 0xfce8819c, 0xbb315486, 0xf1e5a974, 0xf1e061dc, 0xcd7f8181, 0x8181817f, -0x547fb97f, 0xa663c341, 0x9e5aab7f, 0x35768dad, 0x817f3b48, 0x46bc815f, 0x707f89b3, 0x860713c8, -0x4a7c6532, 0x541084e8, 0x5f77bb7f, 0x299dbebe, 0xd3f27f8c, 0x25096727, 0x81194cba, 0x7ceff409, -0x9c8c267f, 0x7f7b1fe0, 0x635c0fdd, 0x308132ac, 0x57330951, 0x7c257f81, 0x6266dd49, 0x7f89b481, -0x817f7fae, 0x7f81aebd, 0xc7fb7f7f, 0x4537e27f, 0x1d288b7f, 0x7f4a9b7f, 0x8150969f, 0xf533f121, -0x7f782217, 0xe428816e, 0x10ca6981, 0x6981b39f, 0xe35fdb7f, 0xc6814220, 0x79ba8158, 0x811e815d, -0x772d8184, 0xc784810c, 0xa91abf8f, 0x3c7f6f7f, 0x6d9981bf, 0x9b42dbe9, 0x42948181, 0x5681817f, -0xdba39bf2, 0xf77f7f37, 0x18eebbdb, 0x39c6b7b7, 0xdc2fb5b9, 0x99d00a7f, 0x02dbe492, 0x4481606e, -0x7f6f81a1, 0x7f2f557f, 0x2aee7f6d, 0xed2ad2ae, 0x6ce4ec0c, 0xdb4cae3a, 0x81646c83, 0x7fa3c1be, -0x7f383730, 0x81aeba9d, 0xc0528bdc, 0xd17f3982, 0x7fa47c7d, 0x81814e81, 0x813d81bc, 0x20816349, -0x857fdfe9, 0xe46aa581, 0xe8de53b5, 0x34471a81, 0x3b4f7feb, 0x8174c981, 0x2fc7c735, 0xc818ec81, -0xb28ed3df, 0x627f1100, 0x7f40067f, 0x7fd37fa8, 0x637c5b81, 0x113dd969, 0x81376881, 0x5d817f67, -0x7f7fda7f, 0x7f7f7f70, 0x77577fb4, 0x87bb3d7f, 0x5b817f93, 0x839b517f, 0x7f45818e, 0xe47f3381, -0x93c2b281, 0x944207f3, 0x36dc77b3, 0x50b86e4a, 0x8181e27f, 0x0b81a79b, 0xf9975950, 0x977b9e47, -0xea7f8181, 0x5547b549, 0x3da47f0d, 0x474b8e72, 0x7f7f9ce1, 0x7f2e2e42, 0x6f7f45c9, 0x08d56ede, -0x8524810b, 0x657fd15f, 0x7f8d0c14, 0x6c7fff7b, 0xd530f39d, 0x7fb4b023, 0x651d8a1b, 0x13817024, -0x7f850774, 0x1f219db3, 0xd8817f52, 0xd95c0feb, 0x9ef0e67f, 0xd9dd4c7f, 0x64b0819a, 0xbc60e997, -0x412fd0db, 0x817fa57f, 0xa3a47f81, 0x4d81815b, 0x81874e3a, 0x5f1e7c81, 0x7fc63b81, 0xbf817581, -0xb5b0a5ab, 0xde2c8145, 0x81789629, 0x097481b8, 0xad5bdca3, 0x212d81e5, 0x4d817f3c, 0x70813761, -0x5d6d0f40, 0x81a190eb, 0xc942c14d, 0x81b462d8, 0x81890000, 0x6586fbcf, 0x81cb3322, 0xa5c0b931, -0x7f78e98d, 0x2492625b, 0xaf81b981, 0x4e59817f, 0x677fb9d3, 0x2c3b817f, 0x920e5981, 0x7f2c7f5d, -0xc379d081, 0xdfbddf43, 0x85818172, 0x6781e442, 0xda9a7f14, 0xcac70881, 0x98818113, 0x0f817f6f, -0xeba852c8, 0x7fa6407a, 0x7fdc8188, 0x819fd349, 0xee738137, 0xe881417f, 0xb6777fea, 0xc6947f73, -0x8181240f, 0xa035c264, 0x7f419e81, 0x193f815f, 0xaedc812e, 0x7fb97f24, 0x924a81e6, 0x63f58183, -0x3e4ec808, 0x7f4fbe86, 0x5faba653, 0xf0c4f4d7, 0x69cf647f, 0xfb55c681, 0x7fe1e381, 0x7f817f6b, -0xc0410481, 0xc65d71b6, 0xba1f8135, 0x997f04cf, 0x49db5b1c, 0xbe817443, 0x817b812c, 0x36e18163, -0xd1893a47, 0x231df6f2, 0x816d045e, 0x3a568139, 0x81628181, 0x6588ffd2, 0x23603081, 0xf5b4817d, -0x8112b5bc, 0x7f9cfbae, 0xc02b8d40, 0xc7f20532, 0xce81487f, 0x0b1a6614, 0x7f17392f, 0x7f8f818c, -0x7f7f8388, 0x5492467a, 0xbf5e3081, 0x777f26bb, 0xae9c4a7f, 0xae81ba0e, 0x6c6281ae, 0x81238143, -0x7f997ffe, 0x798b949c, 0xc3d67f36, 0x38817ff9, 0x2f814ab6, 0x594bad4b, 0x7f6f7fd6, 0xab234181, -0xaf818581, 0x77865381, 0x9d7f8173, 0x27ac8181, 0xbdbd8daf, 0x7c7f7f7f, 0xc6817fd9, 0x34412181, -0x1fe7eb78, 0x7f38f49b, 0x81040b8f, 0x34ec8581, 0x0000907f, 0xd5818181, 0x7865c6d5, 0xada81975, -0x0447e955, 0x7f3d09b3, 0x2b8156e8, 0x976d81dd, 0x29cee57f, 0xa34f537f, 0xe9a981f6, 0x0c7fe841, -0x7f7eda7f, 0xd77f1881, 0x3f929481, 0x77e3c852, 0x0d817fc1, 0x7f4795ab, 0xd1337f4f, 0xdd4b077f, -0x97a4b3d8, 0x607ff155, 0x942b16c3, 0x113a723c, 0x52ce7882, 0x5e81f5e9, 0x81755669, 0x7fea4d5f, -0x5d6d7f81, 0x7f90e710, 0xe3817f6d, 0xe810299c, 0x4e814937, 0x3c269d81, 0x33a891aa, 0x81dd7ff3, -0xa9d1db0d, 0xfb2181eb, 0x7f817fa4, 0x75ec817c, 0xf17f8195, 0x81e18181, 0x44321c58, 0x35a62913, -0xcd5b0875, 0x397f8233, 0x797f7f81, 0x7f829cbc, 0x9a697f81, 0x07b7fea9, 0x7d2b0b7f, 0x8f984dce, -0x0c13b97f, 0xe9203f3c, 0xea473769, 0x7b7fdc81, 0x7f7885c1, 0xde7f5b39, 0x32bd81f1, 0x67b4917f, -0x443069cb, 0x6e972b83, 0xbc66829f, 0x7492817f, 0x7f4d7481, 0x7f25896f, 0x9ea0da7f, 0xceba7f81, -0x7f45d87f, 0x93dbf04c, 0x50814197, 0xb7167f81, 0x6d7fad19, 0x0f81bea5, 0xc57f8177, 0xca4c7f7f, -0x7d84e3f6, 0x7bc443d4, 0xd7b0ae81, 0xc8731f44, 0x06e481ac, 0x85b08181, 0x53cfe4be, 0x73761a3d, -0x707f9981, 0xa87ff27f, 0x68b5b87f, 0xb561c081, 0x7f660001, 0x7b81521e, 0x6093614b, 0xbc778748, -0x64400f81, 0x81d13281, 0x60475381, 0xbe768181, 0x21aad606, 0x81910000, 0x20b6a511, 0x5953d899, -0xdd7f7fba, 0x8181fabe, 0x81b8e77f, 0x817ff17f, 0x6757257f, 0x9c2cc933, 0x51813593, 0x7f7fadef, -0x8ec47f43, 0x348139d7, 0x7f5c82b7, 0x664419bc, 0x8d7b15a5, 0x8181a581, 0xd54d7f63, 0x7f0381b7, -0x81a17f68, 0x814a5e0d, 0x17813dc4, 0xbd94872d, 0xa25a8101, 0xa6810e54, 0xd8568fc4, 0x7f7f3a7f, -0x818478ba, 0x517f81c7, 0x70443b81, 0x7ce481b6, 0x7f817f7f, 0x81b27fe5, 0x4bc67f32, 0x81bbe681, -0xa1c8fe81, 0x857f1c0d, 0x7f81793a, 0x7fbfcf74, 0xadd47f5c, 0x7f8138b4, 0x6f63cd25, 0xd70e497f, -0x81aa7fc7, 0xbaa84f5a, 0x8197ccd3, 0x7f556b7e, 0xca815dff, 0xb9ba7f7f, 0x81747f7f, 0x7fdf967f, -0x65a98181, 0x81bc8181, 0x8e11bab7, 0xbbbf7ffd, 0x12b8457f, 0x59fe8481, 0xf25cdd81, 0x958f840c, -0x5e6a5f81, 0xe9008181, 0x7a68cb38, 0x76818914, 0xa3857fc7, 0xce98717f, 0x8126504d, 0x7fa48183, -0xfa60e14a, 0x7fb77f22, 0x5f3a7f28, 0x24910bde, 0x2fd07f4f, 0x64a6810b, 0x818181a4, 0x7a065fb8, -0x7fe69795, 0x45815e3b, 0x7fa98741, 0x52c581b8, 0x74bb2a22, 0x817a8166, 0xc2cb6581, 0x493c7f7f, -0x883e816b, 0x3c7f7f7f, 0x7f3381c1, 0xab767f6d, 0x81b4588c, 0xb2e24cb9, 0xd9bccba1, 0x70e0162c, -0xea1c810a, 0x907fdd49, 0x424aece8, 0xd90423b0, 0x22df1b28, 0x6b005d25, 0x113e61b3, 0xa2103bbe, -0x20d6c538, 0x17e6c841, 0xdc08e2c4, 0x2002b1ef, 0xc51a77e3, 0x8111f752, 0xea698110, 0x1849b6e8, -0xe6b006d2, 0xdc40b507, 0xc738b9ec, 0x42290a3f, 0x522355bc, 0x590736d3, 0xd9a340e5, 0xe30a19b5, -0x3de9eff9, 0x4437cc7f, 0xecfd0a7b, 0x34e4fcc7, 0x4afe1556, 0x1ecb301f, 0x0f511d1d, 0xf8ec40db, -0x4c07caf9, 0x59f73ebd, 0x45064328, 0x03c27f19, 0xd1661dcb, 0xe4e3ae17, 0x000fcd5b, 0xdd121ec8, -0x3adb1413, 0x112b9888, 0x1d3624fd, 0xa8a347f6, 0xfeb632d5, 0x1d28fc11, 0x21ac2b5f, 0x371fe9f7, -0x3d5ef435, 0xe84000a1, 0xaebebcc9, 0x34555ff0, 0x39a9ca2a, 0x580fc0e6, 0xcf7a5699, 0xf5e65242, -0x07ae3170, 0x06b223ea, 0x638e421b, 0xd8dc0cab, 0x66c44fb0, 0x954117d7, 0x9691a163, 0x415bc8a1, -0x0868d844, 0x9593f551, 0x364bec3b, 0x57460bfb, 0xdc310e3e, 0xe4dbef28, 0xc6443317, 0x81a02211, -0x450c2323, 0xefca9dcf, 0xfebf3fbf, 0xafef377c, 0x3f81ac26, 0x13b4e548, 0xf60a05a9, 0x03d4d840, -0x1970ecd3, 0x95019cfd, 0x8128341d, 0xc4d8d440, 0x16b80a75, 0xc2332b1d, 0x47e90e1b, 0x2e4eadcc, -0x0aa5f04b, 0x03302c42, 0x1a1ed437, 0x3b623efa, 0xc1cec834, 0x4442d130, 0xdce837f0, 0xc3f90934, -0x5ea50731, 0x257f1504, 0x2da5defd, 0x22d3dd34, 0xc429fa2b, 0xf2cc0a0b, 0x3e2e0000, 0x020f1c20, -0x2e962a1f, 0x06edf5f3, 0xceb5dfe4, 0x3b213d57, 0x08c24237, 0xf32ad940, 0x321768b0, 0xb133ebcd, -0xfca78110, 0xc03001db, 0xfca42f7f, 0x7071645f, 0x30bf8185, 0xd1f6d479, 0x02076839, 0x34cd900d, -0x500cda81, 0xe542b08e, 0x282afac6, 0x30a835ce, 0xbc710153, 0x574b009c, 0xe8b24309, 0x02d2cbc8, -0xaae1ea5a, 0x190eff7f, 0xbc656b07, 0xfdc8094e, 0xc0ee4452, 0x2a819969, 0xb79a0a0e, 0xe334a040, -0x12323acf, 0xd9617f3c, 0x3709af42, 0x8b67b338, 0xff00e313, 0x5046e8de, 0x45ec1107, 0x4e2618c9, -0xb40a62dd, 0x0da39629, 0x0a62a937, 0xc9d92e1d, 0xcf4daf81, 0x3f26a9a3, 0xd01e3f2b, 0xac294211, -0xd7c221e7, 0x15c928f2, 0xd79412cb, 0x110fb1fc, 0xddd3fa22, 0x4e7fa8ad, 0xd4a0ebf8, 0x5b144a01, -0x4cf90bdc, 0xb43366e7, 0x1cb8503e, 0xff152c3a, 0xae04fd5f, 0xd896041e, 0x1c2ca245, 0xd7adf0e3, -0x36ee2de1, 0xf0350023, 0x2e529db9, 0xba18d1bc, 0xbb2aba00, 0x52c7c4fb, 0x09df6147, 0x1102f72e, -0x13054b2f, 0xf9f9fced, 0x292a14c9, 0x60095adf, 0x8b43fec1, 0x3ca5a3c9, 0xe73665c7, 0x2f12b049, -0xb0fadecf, 0xd0e46081, 0x42532cf0, 0xe420e3fe, 0xaf5b0501, 0x27f0b481, 0x871c0ec6, 0xcd1c8cb7, -0xe4135816, 0x0a2aab7f, 0xbf732d1d, 0x613f1aee, 0xac09b927, 0x7d663532, 0x0000dee4, 0xfdeccc4a, -0x34b86af1, 0xf0bb16dd, 0x5829085f, 0x51ffdcc2, 0xd50c9f39, 0x64dfc723, 0x2cd52b2b, 0x083e0b2b, -0x224ae1b5, 0x0fd63733, 0xf081cef7, 0x7f73e3c4, 0x36cca9d4, 0xcc2600ae, 0x0757af1e, 0x21cc2ef7, -0xf175c93f, 0x59221d2d, 0xe6c7f468, 0xe3ea1fcb, 0xcd3d539a, 0x271e345c, 0x3555341c, 0xd2532b7f, -0x7fc8c57f, 0x4025dbe5, 0xf6926f3d, 0x264d39db, 0x2ed7c504, 0xde2a554b, 0x25aeb624, 0xd031a1dc, -0x47dbd918, 0xa0004941, 0x0202e11c, 0xd407fda2, 0xd9bd0fdb, 0x30f94d53, 0xd32b1cc6, 0xa6cb1947, -0x16fa1b49, 0xc70d1f56, 0xa7daec0d, 0x813d4649, 0x0f520200, 0x0d174704, 0x337f521a, 0x52c2cf34, -0x6b280539, 0x81da4508, 0x0ef2a91d, 0x07121df9, 0x031e410e, 0xf0180925, 0x055022b0, 0x2156f018, -0xa2e812c6, 0xfbe05cbb, 0x232e4462, 0xed378bca, 0xcd31afa7, 0x063a2e09, 0xe836ff1b, 0xefdeaf26, -0xfeef274a, 0xc9a1159d, 0x66db4731, 0x05a50ace, 0x1b4c58fd, 0x6b0ba273, 0x251319b8, 0xc7523041, -0xa20364b7, 0x34812fc4, 0x055f5d29, 0x5858fefa, 0xf809192d, 0x2f063981, 0xce056e8e, 0x1f7e68cc, -0xbbc07f8b, 0xcc1c1240, 0xf45c1452, 0xeb1deac8, 0xe3f9d3fe, 0x12bc2a12, 0x515bd8d4, 0xb3b361d6, -0x3304f1dc, 0x63060dbb, 0x41c8c73d, 0xce985d1d, 0xd2b2544b, 0x6d241fd4, 0xb6b8b1c5, 0x21830000, -0x15efc4c3, 0x2c430fc1, 0x14400bef, 0x2c33083e, 0xbe04fb07, 0xad42d311, 0x4ed2b731, 0x1627d2d2, -0x07aa0f34, 0xfe38df20, 0xe35bcd1b, 0xe13bfbcf, 0xcc3df1c9, 0x84355a1c, 0x55e602d2, 0x47c52a81, -0x16d85858, 0x0d11d8d2, 0x54f4b081, 0x303523ad, 0x2dbc16e3, 0xb9d6f0d7, 0x13f76190, 0xeec0133a, -0x81eccebc, 0x46202d2b, 0x86b52303, 0xa1f928ba, 0xe421b651, 0xb13cf63f, 0x3136c8e6, 0x4a8128b9, -0x2d7f231a, 0x262cf3e3, 0x9c35d3f9, 0xe9e6753a, 0xefeff441, 0xd4bcd301, 0x42700bd5, 0x29ab001b, -0x28bb6207, 0x01f537d1, 0xbc57fd38, 0x4999290e, 0x3e7f04fe, 0x36adb7fa, 0xdb0314ce, 0xa1d6524e, -0xeee5c994, 0x1d1ce32e, 0xee142708, 0x3bf9e663, 0x06521283, 0xe8c6e6a9, 0x53356ee3, 0xe2cd5d4e, -0x8e1bdacc, 0x382c18e2, 0xc5e2fe00, 0xcee2eaf8, 0xb7532ece, 0xfbea01bf, 0x3ecf7f2d, 0x06b2ffaf, -0x5acbfe35, 0x26c8eefc, 0x8e27d35b, 0x84291501, 0x32f82ffa, 0x9f3a10cc, 0xabcff198, 0x139a3da9, -0x3bd92af7, 0x264febe8, 0xbf48f81b, 0xa1df1aa2, 0x2c0a10ca, 0x04c00073, 0x5681e760, 0x411054e5, -0x88d8c5a0, 0xe3f6b6fd, 0x2a3030ea, 0x0f0ec8b9, 0xa827cbe8, 0x2a2c7f49, 0x51ef20d2, 0xa48c4a81, -0x2b8db1d9, 0xd150813e, 0xd7aab201, 0x36061afd, 0xeed80a8d, 0xcd9932d0, 0xedd3edbe, 0x38f4f017, -0x9853f907, 0xc964f464, 0xc68d40f0, 0x3f5bcc44, 0x975004ec, 0x102d467f, 0xf3f9451d, 0xcde706bb, -0xc87fa602, 0x3f5a88b0, 0x8119c002, 0x3cc14ac8, 0x607abeb7, 0xf95924cd, 0xfb1afa2c, 0xc4967f36, -0xf425dacb, 0xa32d09aa, 0x35106590, 0xad4e5b4d, 0xa1fda650, 0x0326e143, 0xfbf054e0, 0x589fe1bc, -0xc83249b4, 0xb0b81e1b, 0x7081fec8, 0x27530027, 0x84dc89ca, 0x76551d3a, 0x0bbcc3d9, 0x8108bade, -0xb534f6cc, 0x87833920, 0x07ec1b0e, 0x5fd30b29, 0xf124dd07, 0xc981b03d, 0x71b9417e, 0x476c76b6, -0x7fcb3662, 0xaec632e9, 0x2e6705dd, 0xaec5acf9, 0xc84cd6de, 0x5312d428, 0x12fc4738, 0xd31d5b1e, -0x61edd156, 0x60fdfddb, 0xff676a0c, 0x2a3baad6, 0x0d1f6eab, 0x0001dcce, 0x180a31ca, 0x1ba681ec, -0x90871091, 0xe2ef01f5, 0x35186658, 0x95cac76a, 0x1ae32a09, 0xebedc8df, 0x0da7c007, 0x274fc73f, -0xd62a1ff5, 0xd6d7403a, 0xc4921d32, 0xb5f6cadc, 0xdd34f021, 0xe9334bfe, 0x5c9256c1, 0xbecbfd00, -0x139acdb2, 0xe3913eab, 0xceed1c3b, 0xdd2c5aa6, 0xfb475d17, 0x4633f4e7, 0x373b4b4f, 0x72ee99f3, -0xb65542d3, 0x48eb1d39, 0xa6d32fae, 0xc20aabe4, 0x105f4c0d, 0x4848bb65, 0x3bd329d2, 0x470c4709, -0x43fb2438, 0x0620c0d7, 0x4f962821, 0xfd2f992c, 0x51f8aea5, 0x2521cfe9, 0xbf6e2f9d, 0x005e3653 - -hard_output0 = -0xb5bc6ac8, 0xf5373664, 0x1310345c, 0xd5bae4e7, 0x1fc9e83e, 0xebfdfded, 0x84bd86ab, 0xb7aabe00, -0x60b44fea, 0xb9067464, 0x30325378, 0xa9195955, 0xf70c6e5c, 0x90922632, 0xc90b1cdb, 0xf2f5fb69, -0x73056b63, 0x1a33bf3f, 0x17755b5c, 0xc58bff6d, 0x2f4390b2, 0x2869d508, 0xe7c7dfe8, 0x38552963, -0x21da5367, 0x07282b9b, 0xa4767105, 0x1e294251, 0xe350a940, 0xb8a6aa27, 0xed12d778, 0xf10d9ece, -0xab93527f, 0xcf2da7e7, 0x68f6d0b1, 0x811f4bca, 0x577b06b2, 0x3234f13e, 0x30bab7df, 0x8dc47655, -0xbb843bed, 0x86da3aba, 0x30950c97, 0xdd096d7a, 0xa871fd6c, 0x8bee4e6b, 0x8fea30d0, 0x6c05b4d2, -0xf3e144d3, 0xd24ebb1f, 0x065635e5, 0x8d3f2cf9, 0x536c6c6a, 0xfbb0a5d0, 0x3d707b42, 0xc44d5982, -0xa5f4ad8f, 0xf32c0970, 0x1bccf1a6, 0x05916020, 0xa64fb176, 0x5ede6a35, 0xaf4966da, 0x9df5e0e7, -0x75042abc, 0x9ef10481, 0x11ddcbc8, 0xa0f5518c, 0xd5c23418, 0x2393d558, 0xfbe7dfeb, 0xed1c64c2, -0x86a36508, 0xde2dfb1e, 0xb8d0fef9, 0x24505232, 0xc894e71c, 0xbcc752a0, 0x40b74e83, 0x90d23c8c, -0x728e4a61, 0x108f0b08, 0x66f522ee, 0xc258d851, 0x35a31c44, 0x11311b5b, 0xfd3d5be9, 0x5ae448ff, -0x4f64994b, 0x5b8247a9, 0x4021114d, 0x2f0b6e82, 0x5eaa9828, 0x50ac71c0, 0xfb86ee52, 0x0dc1ac9b, -0xbbd47645, 0x8f357115, 0x978ceea0, 0xd557db99, 0x99b30388, 0xfc9a8a1c, 0x0f75be1a, 0x50143e22, -0x8840989b, 0x738ec50e, 0xe6b2783d, 0xf67899c8, 0x27ebed69, 0x6c415a16, 0x3a6cc2dc, 0xcd4e4e5d, -0x6cb12b2e, 0xdb88d7c0, 0x79cd1582, 0xbc422413, 0xe72ad2f4, 0x8eaac30f, 0x0bd86747, 0x6d87f69d, -0x15d62038, 0x4b375630, 0x0d51b859, 0x16db2cb2, 0xf210603a, 0x0abeb833, 0x55c694d0, 0xe57ca43b, -0x0ba94428, 0x1398a406, 0xe47d3889, 0x5a20203d, 0x250d7a1a, 0xd930ffec, 0x03992e79, 0xf2759376, -0x024ec121, 0x91fc3a2c, 0xb7e11cc5, 0x4ff7d459, 0xb8700134, 0xd6e61758, 0x4eba0a32, 0xb747e3ec, -0x7073fad7, 0xded80f99, 0x331e2f1b, 0xfa1f1bed, 0x056424a2, 0x1d1d95e0, 0x550b9ec8, 0x51ee2a38, -0x19525153, 0xd70c4cd5, 0x0d6cd7ad, 0xe44d1cf2, 0x30dfecda, 0xdacd7fe8, 0x7321d795, 0xddf48ef4, -0xe271e6a4, 0x9c1feecb, 0x951fcd7b, 0x8acc5a03, 0x3fb83527, 0xe306de74, 0x7b9cd6ee, 0x8e140885, -0xd4c91e8d, 0xe8c39733, 0x0f02f87f, 0xfb06b1b9, 0x0dc9349c, 0xf76bae8e, 0x4f642a07, 0x3d48a9aa, -0xe3ea323a, 0xa1cd5c8a, 0x40aa0e70, 0x132042d3, 0xa9732f6c, 0xd15a00c4, 0x43d3b046, 0x9a51ebd4, -0xc46ee0ed, 0xe2a2148b, 0xf5c478f0, 0x1fb01cf3, 0xf4f321ec, 0xd973811f, 0x11ad11b9, 0x5c67adda - -soft_output0 = -0x81818181, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x817f817f, 0x81817f81, -0x7f817f81, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x817f8181, 0x81817f81, -0x7f7f7f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f7f8181, -0x81817f7f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, -0x7f818181, 0x8181817f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x817f817f, -0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, -0x8181817f, 0x817f7f81, 0x81818181, 0x817f8181, 0x7f7f817f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, -0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x7f81817f, -0x817f7f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, -0x81817f81, 0x81817f81, 0x81817f81, 0x817f817f, 0x7f817f7f, 0x7f81817f, 0x81818181, 0x8181817f, -0x7f817f7f, 0x817f7f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, 0x817f8181, 0x7f7f7f81, -0x7f817f81, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, -0x7f7f817f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x81817f81, 0x817f7f7f, 0x817f7f81, 0x7f81817f, -0x7f7f7f7f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f817f81, -0x817f7f81, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f817f, 0x81818181, 0x7f818181, 0x8181817f, -0x817f7f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x817f8181, 0x81817f7f, -0x7f7f8181, 0x81817f81, 0x7f7f817f, 0x817f817f, 0x81818181, 0x7f81817f, 0x817f817f, 0x81818181, -0x817f8181, 0x817f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f81, 0x7f7f8181, 0x7f817f7f, 0x7f7f817f, -0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, -0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x81817f81, -0x817f7f81, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f81, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, -0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, -0x8181817f, 0x817f8181, 0x81817f81, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x81817f81, 0x7f7f8181, -0x8181817f, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x8181817f, 0x81817f81, 0x817f8181, -0x81818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x8181817f, 0x817f8181, -0x817f7f81, 0x817f7f81, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f81817f, 0x81818181, 0x8181817f, -0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, -0x8181817f, 0x7f81817f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, -0x7f81817f, 0x81817f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, 0x7f7f7f7f, 0x81817f81, 0x81817f7f, -0x81817f7f, 0x81817f7f, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x7f7f8181, -0x817f7f7f, 0x81818181, 0x7f818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, -0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f817f, 0x81817f81, 0x817f8181, 0x7f7f817f, -0x81817f7f, 0x7f7f7f81, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x817f817f, 0x81817f7f, -0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, -0x7f81817f, 0x7f818181, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f81, -0x7f7f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f818181, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x8181817f, -0x817f817f, 0x7f7f7f81, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f817f, 0x81817f7f, -0x817f7f7f, 0x81818181, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x817f8181, 0x7f817f81, 0x817f8181, -0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f81817f, 0x817f817f, -0x7f817f7f, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f81, -0x81817f81, 0x817f7f7f, 0x81817f7f, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, -0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f8181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, -0x817f7f81, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x81818181, 0x7f81817f, 0x7f81817f, 0x817f8181, -0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, -0x8181817f, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x7f7f7f7f, 0x7f81817f, -0x8181817f, 0x8181817f, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f817f, 0x817f7f81, 0x81818181, -0x817f817f, 0x7f818181, 0x81817f81, 0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f817f, -0x817f7f7f, 0x817f8181, 0x81817f81, 0x81818181, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, -0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x81817f81, -0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x817f7f7f, 0x7f817f81, 0x8181817f, -0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f817f81, 0x81818181, 0x7f81817f, 0x7f81817f, 0x7f81817f, -0x7f7f817f, 0x7f817f7f, 0x7f81817f, 0x817f7f81, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x7f818181, -0x8181817f, 0x81818181, 0x8181817f, 0x817f817f, 0x7f81817f, 0x81817f7f, 0x7f81817f, 0x7f817f7f, -0x81817f81, 0x7f81817f, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f817f7f, -0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x81817f7f, 0x81817f7f, 0x7f7f7f7f, -0x7f818181, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x8181817f, 0x81817f7f, -0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x81818181, -0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x81817f81, 0x81817f7f, -0x7f818181, 0x817f7f81, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f817f81, 0x7f7f7f81, -0x7f818181, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x81817f7f, 0x8181817f, 0x817f8181, 0x8181817f, -0x7f818181, 0x7f817f81, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f7f, -0x817f8181, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x81817f7f, 0x7f7f8181, 0x81817f81, 0x7f7f7f7f, -0x7f818181, 0x7f818181, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, -0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x81818181, 0x817f8181, -0x7f7f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, -0x817f8181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x7f818181, 0x817f7f7f, 0x7f7f7f7f, -0x817f7f81, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x81817f81, 0x81817f81, 0x7f7f7f81, -0x8181817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, -0x7f817f81, 0x81818181, 0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x817f817f, 0x8181817f, 0x7f818181, -0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, -0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x8181817f, -0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, -0x817f817f, 0x7f81817f, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x81818181, 0x817f817f, 0x7f7f817f, -0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x7f7f7f81, -0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f817f, -0x7f7f8181, 0x7f7f7f81, 0x817f8181, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f7f817f, 0x7f817f81, -0x7f817f81, 0x7f817f81, 0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, -0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x81818181, 0x7f81817f, -0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, -0x81818181, 0x7f817f7f, 0x7f7f817f, 0x81818181, 0x8181817f, 0x81817f7f, 0x81818181, 0x817f817f, -0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x81817f7f, -0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x817f7f7f, 0x817f817f, -0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x7f817f81, -0x817f7f7f, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x81817f81, 0x81818181, 0x7f817f7f, -0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, -0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x7f7f817f, -0x817f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x81817f7f, 0x817f817f, -0x7f817f7f, 0x7f817f7f, 0x81817f7f, 0x817f7f7f, 0x81818181, 0x8181817f, 0x7f7f8181, 0x7f817f7f, -0x7f817f81, 0x7f7f8181, 0x81817f81, 0x817f7f81, 0x7f818181, 0x7f817f81, 0x7f7f7f81, 0x8181817f, -0x81817f7f, 0x817f7f7f, 0x7f818181, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f817f81, -0x81817f7f, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x81817f81, 0x817f7f81, -0x81818181, 0x817f7f7f, 0x7f818181, 0x81818181, 0x7f7f817f, 0x817f817f, 0x7f7f817f, 0x7f817f7f, -0x7f817f81, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x817f817f, 0x7f818181, -0x817f7f81, 0x817f7f7f, 0x81817f81, 0x81818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f8181, -0x7f818181, 0x81817f81, 0x7f817f7f, 0x7f7f7f81, 0x7f7f817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, -0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f81817f, 0x817f8181, 0x7f81817f, -0x8181817f, 0x81818181, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, -0x8181817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f7f817f, 0x7f81817f, -0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, 0x7f817f81, 0x7f817f81, 0x7f7f817f, -0x81818181, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f81817f, 0x7f7f8181, 0x7f7f8181, 0x81817f7f, -0x7f817f81, 0x817f817f, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x81817f7f, 0x7f817f81, 0x81817f81, -0x7f7f7f81, 0x81818181, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f7f81, 0x7f818181, 0x7f7f8181, -0x7f7f7f81, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x817f8181, 0x817f8181, 0x817f7f81, -0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, -0x81817f7f, 0x7f817f7f, 0x81817f7f, 0x81817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f7f, -0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x7f817f81, 0x81818181, 0x81817f81, 0x817f7f7f, 0x7f7f817f, -0x817f7f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f81, -0x8181817f, 0x8181817f, 0x7f7f7f81, 0x7f7f817f, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f817f, -0x7f7f7f81, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, -0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x7f818181, 0x7f817f81, -0x8181817f, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x817f817f, 0x81817f81, 0x7f7f8181, -0x7f7f7f7f, 0x7f81817f, 0x817f817f, 0x81817f81, 0x81817f81, 0x81817f7f, 0x81817f81, 0x81817f81, -0x7f7f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f8181, 0x817f7f7f, -0x7f7f7f81, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f817f7f, -0x81817f81, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x7f817f81, 0x7f817f7f, -0x81818181, 0x817f817f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x81818181, 0x8181817f, 0x7f817f81, -0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x7f817f81, -0x817f817f, 0x817f7f81, 0x81818181, 0x81817f7f, 0x817f7f81, 0x817f8181, 0x81817f7f, 0x81817f7f, -0x7f7f817f, 0x817f817f, 0x7f817f81, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f81, 0x81817f7f, -0x817f817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x817f7f81, 0x817f7f81, 0x817f8181, 0x8181817f, -0x81818181, 0x81817f7f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f817f, 0x7f7f7f7f, 0x7f817f81, -0x8181817f, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x81817f7f, -0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f7f, 0x7f7f817f, 0x7f818181, 0x81818181, 0x7f818181, -0x7f7f7f81, 0x81817f7f, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, -0x7f7f817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x81818181, 0x7f7f8181, 0x817f8181, 0x7f817f81, -0x7f817f81, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x817f7f7f, 0x7f81817f, 0x7f817f7f, -0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f7f817f, 0x7f817f7f, 0x817f817f, -0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f817f, 0x8181817f, -0x817f7f81, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, -0x817f817f, 0x81817f7f, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x81817f81, -0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f817f, 0x817f7f81, 0x817f7f81, 0x7f818181, -0x817f7f7f, 0x8181817f, 0x817f8181, 0x7f7f817f, 0x7f818181, 0x817f8181, 0x7f7f7f81, 0x817f8181, -0x8181817f, 0x7f817f81, 0x81817f7f, 0x817f8181, 0x817f817f, 0x817f7f81, 0x81818181, 0x81818181, -0x8181817f, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x817f8181, 0x7f7f817f, -0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f81817f, 0x81817f81, 0x7f818181, 0x7f7f8181, 0x7f817f7f, -0x8181817f, 0x7f817f7f, 0x817f7f81, 0x7f817f81, 0x8181817f, 0x81818181, 0x817f7f7f, 0x817f817f, -0x7f7f7f7f, 0x817f8181, 0x81818181, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x81817f81, -0x7f818181, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, -0x81817f81, 0x817f7f7f, 0x817f817f, 0x7f7f817f, 0x7f7f8181, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, -0x7f81817f, 0x7f81817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x817f7f81, 0x7f818181, -0x7f818181, 0x817f7f81, 0x7f817f81, 0x7f7f7f7f, 0x81817f81, 0x81818181, 0x7f818181, 0x7f81817f, -0x81817f81, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x7f7f8181, 0x81817f7f, -0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f817f81, 0x817f7f7f, -0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f817f81, 0x81818181, 0x817f817f, 0x7f7f7f7f, -0x81818181, 0x7f7f8181, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81817f7f, 0x817f817f, -0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x817f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f817f, -0x817f7f7f, 0x7f7f817f, 0x817f8181, 0x7f817f81, 0x7f818181, 0x7f81817f, 0x7f81817f, 0x81818181, -0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x81818181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x81818181, -0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x817f7f81, -0x7f81817f, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x81818181, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, -0x81817f81, 0x81817f81, 0x7f817f81, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f7f817f, 0x81817f81, -0x7f7f817f, 0x8181817f, 0x817f7f81, 0x81818181, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x817f7f7f, -0x8181817f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f81, 0x817f7f7f, 0x81818181, 0x817f7f7f, -0x81817f81, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x817f7f81, 0x817f817f, 0x7f81817f, 0x81818181, -0x81817f81, 0x81818181, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x81818181, -0x81818181, 0x81818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f7f81, 0x7f818181, -0x817f7f7f, 0x7f817f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x7f817f81, 0x817f7f7f, 0x81817f81, -0x7f7f7f7f, 0x817f7f81, 0x817f7f7f, 0x7f817f81, 0x81817f7f, 0x81817f81, 0x817f7f81, 0x81817f81, -0x817f817f, 0x7f817f81, 0x81817f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x7f81817f, -0x817f8181, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x7f818181, 0x81817f7f, -0x81817f7f, 0x8181817f, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f818181, 0x7f81817f, -0x817f7f7f, 0x7f817f7f, 0x81817f81, 0x8181817f, 0x8181817f, 0x7f817f81, 0x8181817f, 0x8181817f, -0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, -0x7f818181, 0x7f817f81, 0x81818181, 0x817f817f, 0x817f817f, 0x7f818181, 0x817f8181, 0x7f7f817f, -0x7f7f7f81, 0x817f7f7f, 0x7f81817f, 0x7f81817f, 0x7f81817f, 0x81817f81, 0x817f817f, 0x7f7f817f, -0x7f817f81, 0x817f817f, 0x7f817f7f, 0x7f81817f, 0x8181817f, 0x817f7f7f, 0x8181817f, 0x7f7f8181, -0x7f818181, 0x7f817f81, 0x7f7f817f, 0x817f8181, 0x817f817f, 0x817f7f81, 0x7f7f7f81, 0x81817f81, -0x817f8181, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, -0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x7f817f7f, 0x7f7f817f, 0x7f7f8181, 0x8181817f, -0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f81817f, 0x81817f81, 0x7f817f81, 0x817f8181, 0x817f817f, -0x817f7f7f, 0x81817f7f, 0x7f818181, 0x81818181, 0x817f7f81, 0x81817f7f, 0x817f8181, 0x817f8181, -0x81817f7f, 0x8181817f, 0x7f7f817f, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f7f7f7f, 0x817f8181, -0x81817f7f, 0x7f818181, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x7f817f81, 0x817f8181, -0x817f817f, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x81818181, 0x7f817f7f, 0x81818181, 0x7f81817f, -0x7f817f81, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x81817f81, -0x7f7f8181, 0x7f817f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x817f7f81, -0x817f7f7f, 0x7f817f81, 0x7f817f7f, 0x817f817f, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x8181817f, -0x7f817f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x81818181, -0x7f817f81, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x7f7f7f7f, -0x7f7f8181, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, -0x817f7f7f, 0x81817f81, 0x7f818181, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x7f817f81, -0x7f7f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, -0x7f817f7f, 0x817f8181, 0x7f818181, 0x81817f7f, 0x7f817f7f, 0x8181817f, 0x7f81817f, 0x7f7f7f7f, -0x7f81817f, 0x7f817f81, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f818181, 0x817f7f7f, 0x7f81817f, -0x81817f81, 0x7f7f7f81, 0x7f818181, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x817f8181, -0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x81817f81, -0x817f8181, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x8181817f, 0x7f817f7f, 0x8181817f, 0x7f81817f, -0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x817f7f81, 0x81817f7f, 0x817f7f81, 0x81817f81, 0x7f817f81, -0x817f8181, 0x7f818181, 0x7f817f81, 0x81817f81, 0x81817f81, 0x817f8181, 0x7f818181, 0x81818181, -0x817f7f81, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x8181817f, 0x81818181, 0x817f7f81, 0x7f818181, -0x81817f81, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x7f7f817f, 0x8181817f, -0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x81818181, 0x817f7f81, 0x7f7f8181, -0x7f7f8181, 0x8181817f, 0x7f7f8181, 0x817f8181, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, 0x81817f81, -0x817f7f81, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f81, 0x81817f7f, -0x817f817f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, -0x7f7f8181, 0x817f817f, 0x7f7f7f81, 0x7f7f817f, 0x817f8181, 0x7f81817f, 0x7f81817f, 0x817f7f7f, -0x7f817f7f, 0x817f817f, 0x817f7f81, 0x817f7f81, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f81817f, -0x7f7f8181, 0x7f818181, 0x7f818181, 0x817f817f, 0x7f81817f, 0x817f8181, 0x8181817f, 0x7f817f7f, -0x817f8181, 0x817f7f81, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, -0x7f817f7f, 0x7f7f8181, 0x81817f7f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x8181817f, 0x81817f81, -0x817f817f, 0x817f817f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x7f817f7f, 0x7f7f7f81, 0x817f817f, -0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f7f7f, 0x817f8181, -0x7f7f8181, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x81817f81, 0x817f8181, 0x817f7f7f, -0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x7f7f7f7f, 0x81817f7f, -0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f7f, -0x8181817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x7f817f7f, -0x7f818181, 0x817f7f7f, 0x81817f81, 0x817f8181, 0x7f818181, 0x81817f7f, 0x817f8181, 0x7f7f8181, -0x81817f7f, 0x7f7f7f7f, 0x81818181, 0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, -0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, -0x7f817f81, 0x817f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x7f817f81, 0x817f8181, -0x81818181, 0x7f818181, 0x7f7f7f7f, 0x7f818181, 0x7f81817f, 0x7f7f817f, 0x81817f81, 0x7f7f8181, -0x81818181, 0x817f7f81, 0x7f817f81, 0x7f7f8181, 0x817f7f81, 0x81817f81, 0x7f817f7f, 0x817f817f, -0x7f81817f, 0x7f818181, 0x817f8181, 0x81817f7f, 0x817f8181, 0x7f7f7f81, 0x7f818181, 0x7f7f817f, -0x817f8181, 0x817f8181, 0x7f817f81, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x817f817f, 0x81818181, -0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x81818181, -0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f818181, -0x7f7f7f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x81817f7f, 0x81817f81, -0x7f7f7f81, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, -0x7f817f7f, 0x81818181, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x81817f81, -0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x817f7f81, 0x7f81817f, -0x7f81817f, 0x7f7f8181, 0x7f818181, 0x7f818181, 0x7f817f7f, 0x8181817f, 0x81817f81, 0x817f7f81, -0x7f7f7f81, 0x7f81817f, 0x817f7f81, 0x817f8181, 0x7f81817f, 0x817f8181, 0x81817f7f, 0x7f817f81, -0x81818181, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x7f7f8181, 0x8181817f, 0x81818181, 0x81818181, -0x81818181, 0x817f8181, 0x81817f81, 0x817f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f81817f, -0x7f7f7f81, 0x7f7f7f7f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x817f7f7f, -0x7f817f7f, 0x81818181, 0x81818181, 0x7f7f817f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x817f7f81, -0x81818181, 0x7f817f7f, 0x81817f7f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x7f7f817f, -0x7f7f8181, 0x817f7f81, 0x7f81817f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f7f, 0x7f7f7f7f, -0x7f7f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x81817f81, -0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x817f8181, 0x817f7f7f, -0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x817f8181, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, -0x7f818181, 0x7f817f7f, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f817f, 0x7f7f7f7f, -0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x81818181, 0x817f817f, 0x817f7f7f, 0x81817f7f, -0x7f81817f, 0x817f817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x81818181, 0x817f7f7f, 0x817f7f81, -0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f81817f, 0x7f818181, 0x7f7f817f, 0x817f7f7f, 0x7f7f7f7f, -0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x81817f7f, -0x7f81817f, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x817f817f, 0x81817f81, -0x7f7f7f81, 0x817f7f81, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x81817f81, 0x7f817f7f, 0x7f818181, -0x7f818181, 0x81818181, 0x7f7f817f, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f7f817f, -0x81818181, 0x81817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x817f7f7f, -0x81817f7f, 0x7f81817f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x817f7f81, -0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x7f7f7f7f, 0x7f817f81, 0x7f7f7f81, 0x817f7f7f, 0x81817f81, -0x7f817f7f, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, -0x7f81817f, 0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f7f817f, -0x7f7f7f81, 0x7f818181, 0x7f818181, 0x7f818181, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x81818181, -0x7f81817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, -0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x81817f81, 0x7f818181, 0x81817f81, 0x7f7f7f7f, 0x7f81817f, -0x81817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x81818181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, -0x7f7f817f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x81817f81, 0x8181817f, 0x7f817f81, 0x81817f7f, -0x817f7f7f, 0x7f7f8181, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x817f817f, 0x817f7f81, 0x7f7f817f, -0x7f7f8181, 0x7f818181, 0x7f7f8181, 0x81817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f8181, 0x7f817f81, -0x817f817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x81818181, 0x81817f81, -0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, -0x7f81817f, 0x817f7f81, 0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x7f7f817f, -0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x81818181, 0x8181817f, 0x7f7f7f81, 0x7f818181, -0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f81817f, 0x817f7f81, -0x81818181, 0x7f7f7f81, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x8181817f, 0x7f817f7f, -0x7f7f8181, 0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f7f, 0x7f818181, -0x81817f81, 0x7f818181, 0x81817f81, 0x7f818181, 0x7f7f7f81, 0x817f817f, 0x81817f7f, 0x7f7f7f81, -0x817f817f, 0x7f817f81, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f81, 0x8181817f, 0x817f8181, -0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x7f818181, 0x81818181, 0x7f7f7f81, 0x817f817f, -0x81817f81, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x8181817f, 0x817f7f7f, -0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81817f81, 0x81817f7f, 0x8181817f, -0x817f817f, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f7f, -0x817f817f, 0x817f8181, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f818181, 0x7f7f8181, 0x817f817f, -0x81818181, 0x7f818181, 0x817f7f81, 0x817f8181, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, -0x7f7f7f7f, 0x7f817f7f, 0x817f817f, 0x817f817f, 0x7f817f81, 0x81818181, 0x7f817f7f, 0x7f7f8181, -0x7f7f8181, 0x81817f7f, 0x81817f7f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x81817f7f, 0x7f7f817f, -0x817f7f81, 0x8181817f, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f7f81, 0x81817f7f, 0x7f7f817f, -0x81817f81, 0x7f817f81, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f8181, 0x7f817f7f, 0x7f7f8181, -0x817f817f, 0x817f7f7f, 0x7f817f7f, 0x817f8181, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x817f817f, -0x7f7f8181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x7f817f81, 0x7f817f7f, -0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x81817f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f7f7f, -0x7f817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, 0x817f7f81, 0x817f817f, 0x8181817f, -0x817f7f7f, 0x817f8181, 0x8181817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x81817f7f, 0x7f7f8181, -0x81818181, 0x81818181, 0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x8181817f, 0x7f81817f, -0x7f7f817f, 0x7f818181, 0x81817f7f, 0x7f817f81, 0x817f8181, 0x7f7f7f81, 0x7f7f8181, 0x817f7f7f, -0x7f818181, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f818181, 0x81817f81, 0x817f7f7f, 0x7f818181, -0x7f817f81, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x817f817f, 0x81818181, 0x7f817f7f, 0x7f817f81, -0x817f7f81, 0x7f7f817f, 0x81817f81, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x817f817f, 0x81817f81, -0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x7f818181, 0x7f818181, 0x7f7f7f7f, 0x817f7f81, -0x817f7f81, 0x7f7f7f81, 0x8181817f, 0x7f7f7f7f, 0x817f817f, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, -0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x7f81817f, -0x7f817f7f, 0x81817f81, 0x8181817f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, -0x81817f81, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x7f818181, 0x7f818181, 0x7f818181, 0x7f81817f, -0x7f7f8181, 0x817f7f81, 0x817f8181, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x7f817f81, 0x81818181, -0x81817f7f, 0x81818181, 0x817f7f81, 0x81817f81, 0x81817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, -0x7f7f8181, 0x81818181, 0x7f7f7f7f, 0x7f7f8181, 0x81817f7f, 0x81817f81, 0x7f7f7f81, 0x8181817f, -0x8181817f, 0x7f7f817f, 0x81817f81, 0x817f817f, 0x817f7f7f, 0x817f817f, 0x817f817f, 0x7f81817f, -0x8181817f, 0x817f7f7f, 0x7f818181, 0x817f7f7f, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x817f817f, -0x817f7f81, 0x7f7f7f7f, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x7f7f8181, 0x7f81817f, 0x817f8181, -0x7f81817f, 0x7f7f8181, 0x8181817f, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x8181817f, 0x81817f81, -0x7f7f817f, 0x7f817f7f, 0x817f817f, 0x7f81817f, 0x7f817f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f7f, -0x7f7f7f81, 0x817f8181, 0x7f817f81, 0x817f7f81, 0x817f7f81, 0x81818181, 0x81818181, 0x81818181, -0x7f7f8181, 0x7f81817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, -0x7f817f81, 0x817f8181, 0x7f81817f, 0x81817f81, 0x7f7f7f81, 0x817f7f81, 0x817f7f7f, 0x817f8181, -0x7f7f8181, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x8181817f, 0x7f81817f, -0x7f817f81, 0x7f7f817f, 0x817f817f, 0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x817f7f81, 0x817f817f, -0x817f817f, 0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x817f817f, -0x8181817f, 0x81818181, 0x81817f81, 0x817f8181, 0x81818181, 0x81817f7f, 0x817f8181, 0x7f7f8181, -0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, -0x817f7f7f, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x7f817f7f, -0x7f81817f, 0x7f7f8181, 0x7f817f81, 0x817f7f7f, 0x7f7f817f, 0x7f818181, 0x7f7f817f, 0x81818181, -0x7f81817f, 0x817f8181, 0x81818181, 0x81817f81, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f7f81, -0x81817f7f, 0x7f817f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f8181, 0x817f7f7f, 0x7f81817f, 0x7f818181, -0x7f818181, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x817f7f81, 0x7f7f7f81, 0x817f7f81, -0x7f817f7f, 0x7f7f7f7f, 0x7f818181, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x81818181, -0x7f7f817f, 0x81817f81, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x81818181, 0x817f817f, -0x7f7f7f81, 0x7f81817f, 0x7f7f817f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x8181817f, -0x7f7f7f7f, 0x81817f81, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f7f, 0x7f817f81, 0x7f81817f, 0x81817f81, -0x817f817f, 0x81817f81, 0x81817f7f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x817f817f, -0x7f7f7f7f, 0x7f817f7f, 0x8181817f, 0x817f7f7f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x817f7f7f, -0x7f817f81, 0x7f7f8181, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x817f817f, -0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x7f81817f, -0x7f7f817f, 0x7f817f7f, 0x7f818181, 0x7f7f817f, 0x817f7f81, 0x7f818181, 0x817f8181, 0x7f817f81, -0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x81818181, 0x817f7f7f, -0x817f7f81, 0x817f7f7f, 0x817f7f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x817f7f81, 0x817f7f81, -0x7f817f7f, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x7f818181, 0x7f7f817f, 0x7f817f81, 0x7f7f817f, -0x7f817f7f, 0x7f817f81, 0x8181817f, 0x81818181, 0x7f7f7f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, -0x817f8181, 0x7f818181, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f7f7f7f, -0x8181817f, 0x81817f81, 0x817f7f81, 0x81818181, 0x81817f7f, 0x8181817f, 0x7f817f7f, 0x7f7f7f7f, -0x817f7f81, 0x817f7f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f817f, 0x81817f7f, 0x7f7f8181, 0x7f7f817f, -0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x7f818181, 0x817f817f, 0x7f7f7f81, -0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x8181817f, 0x7f81817f, 0x817f817f, 0x8181817f, 0x7f7f7f7f, -0x817f7f7f, 0x7f818181, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x8181817f, 0x817f8181, 0x8181817f, -0x81817f81, 0x817f8181, 0x817f7f81, 0x7f7f8181, 0x817f8181, 0x7f817f81, 0x7f7f7f81, 0x7f818181, -0x7f817f7f, 0x7f7f8181, 0x7f7f817f, 0x81817f81, 0x81817f7f, 0x81817f7f, 0x81817f7f, 0x817f817f, -0x7f81817f, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x7f817f81, 0x7f817f7f, 0x817f7f7f, 0x7f7f8181, -0x7f7f8181, 0x7f7f7f81, 0x7f818181, 0x81817f7f, 0x8181817f, 0x817f7f81, 0x7f7f7f7f, 0x7f81817f, -0x817f8181, 0x7f81817f, 0x8181817f, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, -0x81818181, 0x7f7f7f7f, 0x81818181, 0x81818181, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x817f8181, -0x81817f81, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x81817f81, 0x81817f81, -0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f7f8181, 0x7f818181, 0x81818181, 0x7f7f7f7f, -0x81817f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x817f8181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f7f, -0x7f7f7f81, 0x817f7f81, 0x7f81817f, 0x817f7f81, 0x817f817f, 0x7f7f7f7f, 0x81817f7f, 0x81817f81, -0x81818181, 0x7f817f7f, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, 0x81818181, 0x7f7f817f, 0x7f818181, -0x7f7f7f7f, 0x81818181, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x7f817f81, 0x7f7f7f7f, 0x7f817f81, -0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f817f, -0x7f7f7f81, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x81817f81, -0x817f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x817f7f81, 0x817f8181, 0x7f7f7f7f, -0x7f818181, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x7f7f8181, 0x7f7f817f, 0x817f7f81, 0x7f7f8181, -0x817f7f81, 0x81817f81, 0x817f8181, 0x817f817f, 0x81818181, 0x7f817f81, 0x81817f81, 0x7f7f8181, -0x7f7f7f81, 0x817f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81818181, 0x7f7f7f7f, 0x7f817f7f, 0x7f7f7f7f, -0x81818181, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x817f8181, 0x817f817f, 0x817f7f7f, 0x817f8181, -0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f81, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, -0x7f7f7f7f, 0x817f8181, 0x817f8181, 0x7f7f817f, 0x81817f81, 0x7f7f8181, 0x7f81817f, 0x81817f7f, -0x817f7f7f, 0x817f817f, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x7f81817f, -0x81817f7f, 0x817f7f7f, 0x7f817f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f7f817f, 0x7f817f81, -0x81817f81, 0x81818181, 0x7f7f8181, 0x817f7f7f, 0x7f7f7f81, 0x81817f7f, 0x81818181, 0x817f8181, -0x7f7f817f, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x7f7f817f, 0x7f818181, 0x7f817f81, 0x7f817f81, -0x7f818181, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x81817f7f, 0x7f817f81, 0x8181817f, -0x7f7f817f, 0x817f817f, 0x81817f81, 0x81817f81, 0x81817f7f, 0x7f818181, 0x817f7f81, 0x817f7f81, -0x7f7f7f7f, 0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f818181, 0x8181817f, 0x81817f81, 0x7f817f81, -0x7f81817f, 0x817f7f81, 0x7f818181, 0x817f817f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, -0x81817f7f, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x8181817f, 0x7f7f817f, 0x8181817f, 0x7f818181, -0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f7f817f, 0x7f7f7f81, -0x817f7f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f81817f, 0x81818181, -0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x817f7f81, 0x8181817f, -0x81818181, 0x8181817f, 0x8181817f, 0x817f7f81, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, 0x817f7f7f, -0x81818181, 0x81818181, 0x81817f7f, 0x7f81817f, 0x7f817f81, 0x81817f81, 0x7f7f7f7f, 0x817f817f, -0x7f7f7f7f, 0x7f817f7f, 0x817f8181, 0x7f7f7f81, 0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x8181817f, -0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x817f7f7f, -0x81818181, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x817f817f, 0x817f7f7f, 0x7f7f817f, 0x8181817f, -0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f81817f, 0x817f7f81, 0x7f7f7f7f, 0x817f7f7f, 0x817f817f, -0x81818181, 0x8181817f, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x8181817f, -0x7f818181, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x81817f7f, 0x7f818181, 0x81818181, 0x8181817f, -0x817f817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, 0x7f7f817f, 0x7f818181, 0x81818181, -0x81818181, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x81817f7f, 0x7f7f817f, 0x8181817f, 0x7f7f7f7f, -0x7f7f8181, 0x7f7f817f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x817f8181, 0x81818181, -0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f817f7f, 0x7f7f817f, 0x81818181, -0x7f817f7f, 0x817f8181, 0x817f7f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f8181, -0x81817f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x8181817f, 0x81818181, 0x81817f7f, -0x7f81817f, 0x81818181, 0x7f7f8181, 0x7f817f81, 0x7f817f81, 0x7f817f7f, 0x817f817f, 0x7f818181, -0x7f817f7f, 0x7f7f7f7f, 0x817f817f, 0x817f7f7f, 0x7f81817f, 0x817f7f81, 0x81818181, 0x7f7f817f, -0x817f817f, 0x81817f81, 0x817f7f81, 0x81817f7f, 0x7f81817f, 0x7f81817f, 0x7f817f81, 0x81817f81, -0x7f7f817f, 0x8181817f, 0x7f818181, 0x7f7f7f7f, 0x81818181, 0x8181817f, 0x7f817f81, 0x8181817f, -0x7f81817f, 0x7f7f8181, 0x817f817f, 0x817f7f81, 0x7f817f81, 0x81817f7f, 0x7f818181, 0x81818181, -0x81817f81, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x81817f81, 0x7f7f7f81, 0x7f818181, 0x81817f81, -0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f817f7f, 0x817f817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f817f, -0x817f817f, 0x817f817f, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x817f8181, 0x7f7f7f81, 0x8181817f, -0x81817f7f, 0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x817f817f, 0x81817f7f, 0x7f7f7f7f, 0x7f81817f, -0x7f817f7f, 0x81818181, 0x81818181, 0x7f7f7f81, 0x81817f7f, 0x8181817f, 0x7f818181, 0x7f817f7f, -0x81817f81, 0x817f7f7f, 0x7f7f8181, 0x7f817f7f, 0x81817f7f, 0x8181817f, 0x817f8181, 0x817f7f81, -0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x81818181, 0x81817f7f, 0x817f817f, 0x817f817f, 0x7f7f817f, -0x7f81817f, 0x81818181, 0x7f817f81, 0x7f7f8181, 0x7f7f817f, 0x7f7f7f81, 0x81817f7f, 0x817f8181, -0x7f817f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f81, 0x8181817f, 0x817f7f81, 0x7f817f81, -0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f817f7f, 0x7f7f7f81, 0x7f817f7f, 0x8181817f, -0x7f81817f, 0x817f817f, 0x7f817f81, 0x8181817f, 0x7f818181, 0x81817f81, 0x7f818181, 0x81818181, -0x7f7f7f81, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f7f81, -0x7f7f7f81, 0x7f7f7f81, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f817f7f, 0x7f817f81, 0x7f818181, -0x7f7f8181, 0x817f8181, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f81, 0x817f8181, 0x7f817f7f, 0x7f817f7f, -0x7f7f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f817f7f, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x81817f81, -0x7f7f8181, 0x7f818181, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x817f7f7f, 0x7f7f8181, 0x81817f7f, -0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81818181, 0x7f7f817f, 0x7f818181, 0x7f817f7f, 0x81817f81, -0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, 0x7f817f81, 0x7f81817f, -0x7f7f7f81, 0x7f7f7f81, 0x817f817f, 0x7f7f7f81, 0x81818181, 0x7f7f7f81, 0x8181817f, 0x817f7f81, -0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f7f8181, 0x81817f7f, 0x7f817f81, 0x8181817f, 0x7f81817f, -0x7f818181, 0x7f818181, 0x7f817f81, 0x7f7f7f7f, 0x7f81817f, 0x817f7f81, 0x7f7f7f81, 0x81818181, -0x7f7f7f81, 0x817f8181, 0x7f81817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f81817f, -0x81817f81, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, -0x7f81817f, 0x81818181, 0x81818181, 0x7f818181, 0x7f7f7f7f, 0x81817f81, 0x8181817f, 0x7f7f817f, -0x817f7f81, 0x817f7f81, 0x817f8181, 0x7f7f8181, 0x817f8181, 0x7f7f7f81, 0x817f7f81, 0x81818181, -0x8181817f, 0x81817f81, 0x7f7f8181, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x7f81817f, -0x81817f7f, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x7f7f7f81, 0x817f7f81, 0x81818181, 0x7f7f7f81, -0x7f7f8181, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x81817f81, 0x7f81817f, 0x81817f81, 0x7f7f8181, -0x817f817f, 0x7f817f81, 0x7f7f8181, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f81, 0x7f7f817f, -0x817f8181, 0x7f7f817f, 0x8181817f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x7f7f817f, 0x81817f7f, -0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f81, 0x8181817f, 0x7f817f7f, 0x81818181, 0x7f7f7f81, -0x7f7f7f7f, 0x81817f7f, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x8181817f, 0x81818181, 0x7f7f7f81, -0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x817f8181, -0x7f817f7f, 0x7f817f7f, 0x7f7f817f, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x7f818181, 0x817f7f81, -0x7f81817f, 0x7f817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f7f, 0x7f81817f, 0x81818181, -0x7f7f8181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81817f81, 0x8181817f, 0x7f818181, 0x81817f81, -0x817f7f81, 0x817f7f7f, 0x7f7f7f81, 0x7f7f7f7f, 0x7f7f8181, 0x7f81817f, 0x7f7f817f, 0x7f7f817f, -0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x817f817f, 0x817f817f, 0x7f81817f, 0x7f7f8181, -0x7f818181, 0x817f8181, 0x7f7f8181, 0x7f817f81, 0x81818181, 0x7f817f81, 0x817f7f7f, 0x7f817f7f, -0x7f7f8181, 0x817f8181, 0x7f818181, 0x81817f81, 0x7f818181, 0x8181817f, 0x8181817f, 0x7f818181, -0x8181817f, 0x7f7f7f7f, 0x7f7f817f, 0x7f818181, 0x7f7f7f81, 0x7f7f817f, 0x81818181, 0x817f7f7f, -0x8181817f, 0x817f817f, 0x7f7f8181, 0x7f7f7f81, 0x81818181, 0x8181817f, 0x817f817f, 0x817f817f, -0x7f818181, 0x7f7f8181, 0x8181817f, 0x817f817f, 0x81817f7f, 0x81818181, 0x7f81817f, 0x817f817f, -0x7f7f7f7f, 0x7f817f81, 0x7f818181, 0x817f7f7f, 0x817f7f81, 0x7f817f81, 0x7f7f817f, 0x7f7f7f7f, -0x81817f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f817f, 0x8181817f, 0x7f81817f, 0x7f818181, 0x7f7f7f7f, -0x7f7f7f7f, 0x7f7f7f81, 0x7f818181, 0x7f818181, 0x8181817f, 0x7f7f8181, 0x817f7f81, 0x7f817f7f, -0x817f7f7f, 0x7f7f7f81, 0x7f7f8181, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f81, -0x817f817f, 0x817f7f7f, 0x81818181, 0x7f818181, 0x81818181, 0x81818181, 0x7f7f7f81, 0x8181817f, -0x81818181, 0x7f817f7f, 0x817f7f81, 0x7f7f8181, 0x7f818181, 0x8181817f, 0x8181817f, 0x817f7f81, -0x7f817f7f, 0x81817f7f, 0x817f8181, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f817f7f, 0x817f7f7f, -0x817f7f7f, 0x7f817f81, 0x8181817f, 0x817f7f7f, 0x7f817f81, 0x81817f81, 0x817f817f, 0x7f7f7f81, -0x7f817f81, 0x7f817f7f, 0x817f817f, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f818181, 0x81817f81, -0x817f8181, 0x7f817f7f, 0x81817f81, 0x817f7f81, 0x7f7f7f7f, 0x81817f81, 0x81817f81, 0x81817f81, -0x81817f7f, 0x7f81817f, 0x81818181, 0x7f7f8181, 0x817f817f, 0x817f8181, 0x817f7f7f, 0x8181817f, -0x81817f7f, 0x8181817f, 0x7f817f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x817f817f, -0x81818181, 0x817f7f81, 0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f7f8181, 0x817f7f81, 0x8181817f, -0x7f818181, 0x7f817f81, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x81818181, 0x7f7f8181, 0x7f7f7f7f, -0x7f81817f, 0x817f8181, 0x817f817f, 0x7f81817f, 0x81818181, 0x7f817f7f, 0x7f7f7f7f, 0x7f7f7f7f, -0x7f7f8181, 0x817f8181, 0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x7f7f817f, 0x7f817f7f, 0x817f8181, -0x81817f81, 0x817f8181, 0x7f81817f, 0x817f8181, 0x817f8181, 0x817f7f81, 0x7f7f817f, 0x7f818181, -0x7f7f817f, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x8181817f, 0x817f8181, 0x81818181, 0x817f7f7f, -0x7f7f817f, 0x817f7f7f, 0x817f817f, 0x7f818181, 0x8181817f, 0x817f817f, 0x7f7f7f7f, 0x7f81817f, -0x7f817f81, 0x81818181, 0x7f817f7f, 0x817f817f, 0x7f7f7f7f, 0x817f7f81, 0x7f7f8181, 0x81817f81, -0x81818181, 0x81817f81, 0x7f7f817f, 0x81818181, 0x817f8181, 0x7f81817f, 0x81817f7f, 0x7f81817f, -0x817f8181, 0x81818181, 0x7f7f7f81, 0x81817f81, 0x817f7f7f, 0x817f8181, 0x7f7f817f, 0x7f7f8181, -0x7f81817f, 0x7f818181, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x7f7f7f81, 0x7f81817f, 0x817f8181, -0x81817f81, 0x81818181, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f7f8181, 0x7f81817f, 0x81817f81, -0x7f818181, 0x81818181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f81817f, 0x81818181, -0x81817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81817f81, 0x8181817f, -0x817f817f, 0x81817f7f, 0x7f817f7f, 0x817f817f, 0x817f7f7f, 0x8181817f, 0x7f7f7f7f, 0x817f817f, -0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, 0x7f7f8181, 0x7f7f7f7f, -0x7f81817f, 0x817f817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f81817f, 0x81818181, -0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x81818181, -0x81817f81, 0x817f817f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f81, 0x81817f81, 0x7f7f7f81, 0x817f7f7f, -0x817f817f, 0x817f8181, 0x7f817f81, 0x817f7f7f, 0x7f817f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f81, -0x7f817f7f, 0x7f81817f, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x7f7f817f, -0x7f7f7f7f, 0x7f817f7f, 0x7f7f817f, 0x7f817f81, 0x817f817f, 0x81817f7f, 0x7f81817f, 0x8181817f, -0x817f7f81, 0x7f7f7f81, 0x81818181, 0x7f817f81, 0x81818181, 0x7f818181, 0x817f7f7f, 0x81818181, -0x81818181, 0x7f7f7f7f, 0x8181817f, 0x7f7f7f81, 0x81818181, 0x7f7f817f, 0x817f7f81, 0x7f81817f, -0x817f817f, 0x7f7f7f81, 0x7f81817f, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81817f7f, 0x7f7f817f, -0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, -0x81817f7f, 0x7f7f7f7f, 0x7f81817f, 0x817f7f7f, 0x7f7f8181, 0x7f7f8181, 0x7f7f817f, 0x7f81817f, -0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, -0x7f7f7f7f, 0x81817f81, 0x817f817f, 0x81817f81, 0x7f7f7f7f, 0x817f817f, 0x817f7f81, 0x81817f81, -0x817f7f81, 0x817f7f7f, 0x81817f81, 0x817f7f81, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x8181817f, -0x7f7f7f81, 0x81817f81, 0x7f817f81, 0x81818181, 0x817f8181, 0x7f7f8181, 0x81818181, 0x817f7f81, -0x817f8181, 0x81817f7f, 0x8181817f, 0x817f817f, 0x8181817f, 0x7f818181, 0x81817f81, 0x81818181, -0x817f817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x8181817f, -0x817f7f81, 0x7f818181, 0x7f7f817f, 0x7f81817f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x817f8181, -0x7f7f8181, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f817f7f, 0x81817f81, -0x7f7f817f, 0x817f817f, 0x817f8181, 0x7f817f7f, 0x7f817f7f, 0x8181817f, 0x817f8181, 0x817f7f7f, -0x817f7f81, 0x817f8181, 0x8181817f, 0x7f818181, 0x7f818181, 0x7f7f7f81, 0x817f7f81, 0x7f817f81, -0x81817f81, 0x817f8181, 0x817f7f7f, 0x817f7f7f, 0x81818181, 0x7f7f7f81, 0x817f817f, 0x817f7f81, -0x81817f7f, 0x7f818181, 0x7f7f817f, 0x7f818181, 0x7f7f8181, 0x7f817f7f, 0x817f8181, 0x81817f81, -0x81818181, 0x7f817f7f, 0x81817f81, 0x7f817f81, 0x817f7f81, 0x7f7f7f81, 0x81817f7f, 0x7f817f7f, -0x7f7f8181, 0x817f8181, 0x7f818181, 0x8181817f, 0x81817f81, 0x817f7f7f, 0x7f817f81, 0x81818181, -0x817f817f, 0x81818181, 0x817f7f81, 0x817f7f7f, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x817f7f81, -0x7f818181, 0x817f7f7f, 0x7f81817f, 0x81817f7f, 0x817f8181, 0x817f8181, 0x81818181, 0x817f7f81, -0x7f7f817f, 0x81817f7f, 0x8181817f, 0x7f7f8181, 0x7f81817f, 0x8181817f, 0x817f7f81, 0x7f81817f, -0x817f817f, 0x7f7f817f, 0x817f7f7f, 0x8181817f, 0x7f7f817f, 0x7f81817f, 0x8181817f, 0x7f81817f, -0x81818181, 0x81818181, 0x7f81817f, 0x817f7f7f, 0x817f7f7f, 0x817f7f81, 0x7f818181, 0x817f7f7f, -0x817f7f7f, 0x81817f81, 0x7f817f81, 0x7f817f7f, 0x817f8181, 0x7f81817f, 0x7f7f817f, 0x81817f7f, -0x7f7f7f7f, 0x817f7f81, 0x81817f81, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x81818181, -0x7f7f7f81, 0x81817f7f, 0x817f7f81, 0x8181817f, 0x7f7f7f81, 0x817f7f7f, 0x81818181, 0x81817f7f, -0x7f817f7f, 0x817f7f7f, 0x81817f7f, 0x81817f7f, 0x817f7f7f, 0x81817f7f, 0x817f8181, 0x7f81817f, -0x7f7f7f7f, 0x817f817f, 0x817f7f81, 0x8181817f, 0x817f7f7f, 0x7f817f7f, 0x8181817f, 0x81817f81, -0x817f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f818181, 0x7f817f81, 0x81818181, 0x817f8181, 0x8181817f, -0x7f817f7f, 0x817f8181, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x7f7f8181, 0x817f817f, 0x817f8181, -0x7f81817f, 0x7f7f817f, 0x7f7f8181, 0x7f7f817f, 0x8181817f, 0x81817f81, 0x817f8181, 0x7f7f7f81, -0x8181817f, 0x8181817f, 0x8181817f, 0x7f7f7f81, 0x8181817f, 0x7f818181, 0x81818181, 0x7f7f7f81, -0x7f817f7f, 0x81818181, 0x817f8181, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, -0x81818181, 0x817f8181, 0x7f7f8181, 0x7f7f8181, 0x817f817f, 0x81817f7f, 0x7f7f8181, 0x817f8181, -0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f818181, 0x7f81817f, 0x81817f7f, 0x817f8181, -0x817f8181, 0x7f818181, 0x8181817f, 0x7f817f7f, 0x81817f81, 0x7f7f8181, 0x817f7f81, 0x817f8181, -0x7f7f7f7f, 0x817f7f7f, 0x7f817f81, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f81, 0x81818181, 0x81817f81, -0x7f817f7f, 0x7f818181, 0x817f7f81, 0x8181817f, 0x81817f7f, 0x8181817f, 0x7f81817f, 0x7f817f81, -0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f818181, 0x7f81817f, 0x7f7f8181, 0x7f7f7f81, -0x817f817f, 0x81817f7f, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x817f8181, 0x81818181, 0x8181817f, -0x81817f7f, 0x7f817f7f, 0x817f8181, 0x81817f7f, 0x7f7f7f7f, 0x7f7f7f7f, 0x81817f81, 0x817f817f, -0x817f8181, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f817f, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, -0x81817f81, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f817f7f, 0x7f7f817f, 0x81817f81, 0x817f8181, -0x81817f81, 0x8181817f, 0x7f7f7f81, 0x817f8181, 0x81817f7f, 0x81817f81, 0x817f8181, 0x817f8181, -0x817f817f, 0x817f7f7f, 0x81817f7f, 0x7f817f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f818181, 0x81817f81, -0x817f8181, 0x817f7f7f, 0x817f817f, 0x8181817f, 0x81818181, 0x7f817f81, 0x81817f7f, 0x81818181, -0x7f818181, 0x817f817f, 0x7f7f7f81, 0x817f817f, 0x7f7f817f, 0x817f817f, 0x7f7f7f7f, 0x817f7f7f, -0x817f7f7f, 0x7f817f81, 0x7f7f817f, 0x81817f7f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f817f, -0x817f817f, 0x7f817f81, 0x7f818181, 0x7f7f7f81, 0x7f817f81, 0x81817f81, 0x81818181, 0x7f817f7f, -0x7f7f7f81, 0x817f817f, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f817f, -0x81818181, 0x81818181, 0x8181817f, 0x81817f81, 0x81818181, 0x817f8181, 0x7f817f7f, 0x7f817f81, -0x817f8181, 0x7f818181, 0x817f7f81, 0x817f7f7f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, 0x7f817f7f, -0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f81817f, 0x81817f81, 0x817f8181, 0x7f817f81, 0x817f8181, -0x81818181, 0x817f817f, 0x81817f81, 0x817f817f, 0x817f8181, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f7f7f, -0x81817f81, 0x7f81817f, 0x817f7f81, 0x7f818181, 0x81817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f817f7f, -0x8181817f, 0x7f81817f, 0x8181817f, 0x81818181, 0x81817f7f, 0x7f7f817f, 0x81817f81, 0x8181817f, -0x7f81817f, 0x7f817f81, 0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x817f8181, 0x81817f81, 0x7f7f7f7f, -0x7f817f7f, 0x81817f7f, 0x7f7f7f7f, 0x817f817f, 0x7f7f7f81, 0x817f7f81, 0x7f818181, 0x7f7f8181, -0x7f817f81, 0x7f817f7f, 0x8181817f, 0x7f7f7f81, 0x7f7f8181, 0x81818181, 0x7f7f8181, 0x7f817f7f, -0x7f7f8181, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x7f817f7f, 0x7f7f8181, 0x7f817f7f, 0x8181817f, -0x7f817f7f, 0x817f7f7f, 0x81817f81, 0x7f817f81, 0x817f817f, 0x7f817f81, 0x7f817f7f, 0x81818181, -0x7f817f81, 0x7f7f8181, 0x7f81817f, 0x81818181, 0x7f7f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x7f817f81, -0x7f81817f, 0x817f7f7f, 0x817f8181, 0x7f817f7f, 0x817f7f81, 0x7f7f7f7f, 0x7f817f7f, 0x7f817f81, -0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f817f, 0x81818181, -0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x81817f81, 0x7f81817f, 0x7f7f7f81, 0x7f7f7f81, 0x81817f7f, -0x817f7f81, 0x817f7f81, 0x7f817f7f, 0x7f7f7f7f, 0x8181817f, 0x81817f7f, 0x7f7f7f7f, 0x7f818181, -0x7f818181, 0x81818181, 0x817f8181, 0x81817f7f, 0x7f7f8181, 0x817f817f, 0x7f818181, 0x7f7f8181, -0x7f7f817f, 0x7f7f8181, 0x7f7f7f7f, 0x8181817f, 0x81818181, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, -0x81817f7f, 0x7f7f8181, 0x81817f81, 0x817f7f7f, 0x817f7f7f, 0x7f817f81, 0x817f7f7f, 0x81817f7f, -0x817f817f, 0x7f7f7f81, 0x817f7f7f, 0x817f817f, 0x817f7f7f, 0x817f8181, 0x81818181, 0x7f81817f, -0x7f7f8181, 0x7f81817f, 0x81817f7f, 0x7f818181, 0x81817f81, 0x817f7f81, 0x7f7f8181, 0x7f817f81, -0x7f7f7f81, 0x7f7f7f81, 0x7f7f7f7f, 0x817f8181, 0x8181817f, 0x817f7f81, 0x817f7f81, 0x7f817f81, -0x7f7f817f, 0x7f817f81, 0x7f817f7f, 0x7f817f81, 0x81818181, 0x81818181, 0x7f7f7f7f, 0x81818181, -0x7f817f7f, 0x81818181, 0x7f81817f, 0x7f817f81, 0x81817f7f, 0x817f7f81, 0x7f7f817f, 0x7f817f7f, -0x7f818181, 0x7f7f817f, 0x7f817f7f, 0x7f7f7f7f, 0x817f8181, 0x81817f81, 0x817f7f81, 0x7f7f7f81, -0x81818181, 0x7f817f7f, 0x81818181, 0x7f818181, 0x817f7f81, 0x7f817f7f, 0x81818181, 0x81818181, -0x7f817f81, 0x7f7f7f7f, 0x81817f7f, 0x7f818181, 0x81817f7f, 0x81817f81, 0x8181817f, 0x817f817f, -0x817f817f, 0x817f7f81, 0x7f7f8181, 0x817f7f7f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f7f, 0x817f7f81, -0x817f7f7f, 0x7f7f8181, 0x7f817f81, 0x7f81817f, 0x817f7f7f, 0x7f7f7f7f, 0x7f7f8181, 0x7f7f817f, -0x817f7f7f, 0x81818181, 0x8181817f, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x7f81817f, 0x7f7f8181, -0x817f7f7f, 0x817f7f81, 0x7f81817f, 0x7f7f7f81, 0x7f817f81, 0x8181817f, 0x817f7f81, 0x7f817f81, -0x81817f81, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f81817f, 0x817f817f, 0x7f817f81, -0x817f7f81, 0x7f7f817f, 0x7f7f817f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f817f, 0x8181817f, 0x817f7f7f, -0x7f817f81, 0x7f817f7f, 0x7f81817f, 0x81817f81, 0x7f817f7f, 0x7f81817f, 0x81817f7f, 0x7f7f7f7f, -0x817f817f, 0x7f7f7f7f, 0x7f81817f, 0x817f8181, 0x81818181, 0x7f81817f, 0x7f817f7f, 0x8181817f, -0x817f817f, 0x81818181, 0x81817f81, 0x81817f81, 0x7f7f8181, 0x7f7f7f81, 0x7f7f7f7f, 0x8181817f, -0x7f817f81, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x81817f7f, 0x81818181, 0x7f81817f, 0x7f7f7f7f, -0x81818181, 0x7f81817f, 0x7f7f7f81, 0x8181817f, 0x7f7f7f81, 0x7f7f7f81, 0x7f7f8181, 0x81818181, -0x81818181, 0x7f7f8181, 0x7f817f81, 0x81817f7f, 0x7f7f817f, 0x817f7f81, 0x7f7f817f, 0x817f817f, -0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, 0x81817f81, 0x817f7f7f, 0x7f7f7f7f, 0x8181817f, 0x7f7f8181, -0x7f817f7f, 0x7f817f81, 0x817f8181, 0x817f7f7f, 0x7f818181, 0x7f81817f, 0x817f817f, 0x7f7f8181, -0x81817f7f, 0x7f7f7f7f, 0x817f7f81, 0x8181817f, 0x81818181, 0x7f817f81, 0x7f817f81, 0x7f81817f, -0x7f81817f, 0x7f7f817f, 0x817f7f7f, 0x7f817f7f, 0x817f7f81, 0x7f7f817f, 0x817f8181, 0x7f7f7f7f, -0x7f81817f, 0x7f7f817f, 0x817f817f, 0x817f817f, 0x7f817f7f, 0x7f7f7f7f, 0x7f81817f, 0x7f7f8181, -0x817f7f81, 0x7f7f7f81, 0x7f818181, 0x817f817f, 0x7f7f817f, 0x7f817f81, 0x817f7f81, 0x81818181, -0x81817f81, 0x7f7f7f81, 0x7f817f7f, 0x7f818181, 0x817f817f, 0x7f7f8181, 0x7f81817f, 0x7f81817f, -0x817f7f81, 0x81818181, 0x7f817f81, 0x7f7f7f81, 0x7f81817f, 0x7f818181, 0x7f817f7f, 0x81817f81, -0x81818181, 0x7f817f7f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x817f8181, 0x81818181, 0x7f81817f, -0x81817f81, 0x7f7f817f, 0x7f7f817f, 0x7f817f81, 0x817f7f7f, 0x8181817f, 0x81817f81, 0x81818181, -0x7f817f81, 0x7f7f7f7f, 0x81818181, 0x7f7f8181, 0x81817f81, 0x81817f7f, 0x7f7f817f, 0x7f7f7f7f, -0x7f7f7f81, 0x7f7f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f81, 0x817f8181, 0x7f7f817f, 0x7f7f7f7f, -0x817f817f, 0x8181817f, 0x817f8181, 0x7f7f7f7f, 0x7f7f7f81, 0x81817f7f, 0x7f7f7f7f, 0x7f7f817f, -0x7f81817f, 0x7f7f7f81, 0x817f8181, 0x81817f81, 0x817f7f81, 0x7f7f817f, 0x7f81817f, 0x7f7f7f7f, -0x81818181, 0x81817f81, 0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x81817f81, 0x8181817f, 0x7f81817f, -0x81818181, 0x7f818181, 0x817f7f81, 0x81817f7f, 0x81818181, 0x817f7f7f, 0x7f7f7f81, 0x817f7f7f, -0x817f817f, 0x817f7f81, 0x81818181, 0x81817f81, 0x7f818181, 0x81817f7f, 0x817f817f, 0x7f81817f, -0x817f7f81, 0x7f81817f, 0x8181817f, 0x7f7f7f7f, 0x8181817f, 0x7f7f817f, 0x7f817f7f, 0x817f7f7f, -0x7f818181, 0x817f8181, 0x7f7f817f, 0x817f7f81, 0x7f817f81, 0x81817f81, 0x7f7f8181, 0x7f81817f, -0x7f7f817f, 0x7f817f7f, 0x7f817f7f, 0x817f7f81, 0x817f817f, 0x817f7f81, 0x81818181, 0x7f7f817f, -0x817f8181, 0x7f81817f, 0x7f817f7f, 0x81817f81, 0x7f7f817f, 0x81817f81, 0x7f7f817f, 0x81818181, -0x81817f7f, 0x7f817f7f, 0x817f8181, 0x7f7f8181, 0x817f7f81, 0x81818181, 0x7f7f8181, 0x7f817f7f, -0x7f817f7f, 0x817f817f, 0x817f7f81, 0x81817f81, 0x7f7f8181, 0x817f7f7f, 0x7f7f8181, 0x81817f81, -0x7f817f7f, 0x817f8181, 0x817f817f, 0x81817f81, 0x81817f81, 0x7f7f817f, 0x7f7f8181, 0x7f7f7f81, -0x81817f81, 0x7f81817f, 0x7f7f8181, 0x81818181, 0x817f7f7f, 0x7f81817f, 0x7f7f817f, 0x7f817f7f, -0x7f818181, 0x7f81817f, 0x817f8181, 0x7f7f7f7f, 0x7f81817f, 0x7f818181, 0x817f817f, 0x81818181, -0x7f818181, 0x7f817f81, 0x7f81817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f81817f, 0x7f7f7f81, -0x7f818181, 0x7f817f7f, 0x7f7f8181, 0x7f7f8181, 0x7f818181, 0x81818181, 0x817f7f81, 0x817f8181, -0x7f7f7f7f, 0x7f818181, 0x7f7f7f7f, 0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x817f7f7f, 0x7f818181, -0x81818181, 0x7f7f817f, 0x81818181, 0x7f818181, 0x7f817f7f, 0x7f817f81, 0x7f7f8181, 0x81818181, -0x7f7f7f81, 0x817f8181, 0x7f7f7f7f, 0x81818181, 0x81817f7f, 0x7f817f7f, 0x7f817f7f, 0x817f817f, -0x7f817f81, 0x817f8181, 0x817f817f, 0x817f817f, 0x7f7f8181, 0x817f7f81, 0x7f7f8181, 0x7f7f7f81, -0x7f7f7f7f, 0x7f7f7f7f, 0x8181817f - -e = -34560 - -k = -6144 - -rv_index = -0 - -iter_max = -8 - -iter_min = -4 - -expected_iter_count = -8 - -ext_scale = -15 - -num_maps = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_SOFT_OUTPUT, RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_POS_LLR_1_BIT_IN, -RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT - -expected_status = -OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c2_k3136_r0_e4920_sbd_negllr_crc24b.data b/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c2_k3136_r0_e4920_sbd_negllr_crc24b.data deleted file mode 100644 index cfff56ad9a..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_dec_c2_k3136_r0_e4920_sbd_negllr_crc24b.data +++ /dev/null @@ -1,680 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_DEC - -input0 = -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0xD0000000, 0x33CDC8CE, 0x4FAEE4CC, 0xC7DC23C3, 0xC306D6CA, 0x2B360A24, 0xE91C423D, -0x1F323427, 0x4B1C33B6, 0x3EC9D0E7, 0x39204DD1, 0xCCD73C37, 0xC6F6D8E1, 0x1DF828F3, 0xDEE34025, -0xC41EC235, 0xD035E1D8, 0x3CC32843, 0x29B60C3C, 0xE92E122E, 0x454BD4C8, 0x35D02543, 0x33E4D0AC, -0x07AF2228, 0x38C62DD1, 0x233800C5, 0x3CC02DD1, 0x35E73B19, 0xDEBED026, 0x33C5EDD9, 0x33E51527, -0x1F21EA18, 0xCC3E3BD2, 0x013CC14C, 0x3724D23B, 0x23CDED2D, 0x21424630, 0xC5B0E64D, 0xCFC03BEF, -0x24294241, 0x46C526BC, 0xD82F334C, 0x1E283DCB, 0x3F3F33C7, 0x4A14D2A1, 0xD92F2AF3, 0xCFA820CC, -0xDD30C6CB, 0x2B3ACAB7, 0x4AFE29CD, 0x25BD3200, 0x2D293323, 0xD32A3B29, 0x29E64D0C, 0xBE4BFB3C, -0xB1DD242D, 0x0427F11D, 0x3046CFDA, 0xD633C0D5, 0xC0DDBE01, 0xDA3DD9B4, 0x3BCE3638, 0x23262CC6, -0x432BD2AE, 0x23A9E1C7, 0x1BE45609, 0x22CD35AA, 0x32D6371F, 0xCE27352A, 0xE2B73F40, 0xC2D0CE2C, -0xE72E3A3E, 0x2FF52147, 0xEFCF2E33, 0x003103CA, 0xC6C14A33, 0x45CAC0CF, 0x011E1FD3, 0x23D3C72B, -0x2EB644C4, 0x484BD930, 0x3AC22E1A, 0x1AB6DD42, 0xCEDDE232, 0x3ACCCC31, 0xB830CA2D, 0xC930D2D7, -0xD0E049BB, 0xE6243524, 0x3EF53914, 0xCB083BE3, 0x411EDBE9, 0x30C3C3E8, 0x3721F5E7, 0xBBDF3FD9, -0x2AD21F33, 0xEE402858, 0xD3AFD237, 0x3D39401D, 0x30003623, 0x4734DC46, 0x192ACD32, 0x3324CAC2, -0xD714D4B5, 0xDC2E21D0, 0x2327CDBA, 0x15B739C3, 0x31C9EEB8, 0xFAB5372E, 0xC239B5DA, 0xE628440F, -0x34D425C6, 0x293BE6FD, 0xBDC04BBC, 0xE0DDB7CF, 0xD627BC34, 0xA5422FCB, 0x13211ABC, 0x1708E51C, -0xCE33DAD1, 0x51AEC731, 0x2E383824, 0xC722D0D3, 0xCB32292B, 0xCECC402B, 0x1B312EF0, 0x34CF46CA, -0xE3BD252C, 0x0C21EC36, 0x4ADFECBE, 0xC4D2E62C, 0xADE5BAD3, 0xDDCC1D18, 0x521AC135, 0x3F302D37, -0x22CE2DCC, 0x262A1BCF, 0x4EE7D7CA, 0xD43D3526, 0x1840E020, 0xC3201F2F, 0x3ACB453E, 0x41EAD5B6, -0xB6C4CF17, 0x243A55D4, 0xC7501E28, 0x351DCD1C, 0xE3A8D502, 0x3235271C, 0xAC342F00, 0x34B4E3D8, -0x36473AE4, 0xAE403CEB, 0xBC3FDA3F, 0x552CDBEC, 0xE7C42B5C, 0xE743E13D, 0x18D44650, 0xBA2EDF31, -0xB5C3EC42, 0x432EBE2E, 0xADDE4F2A, 0x401BCAD6, 0x03D6EAEB, 0xD0DEB133, 0x153FC4D4, 0x30DA2FD3, -0xEE282FD9, 0x242ADC39, 0xD72B42D9, 0x44C7E0D5, 0xC72CB3C7, 0x27C9472B, 0x0036DFB6, 0xD9C53112, -0xC0360E0E, 0x4EEA0E27, 0xEDCF27C1, 0x1739D5DC, 0x22DE2CE1, 0xDCCAF633, 0x31D02417, 0xD7DCD0DA, -0xDE1DE0DC, 0xD827DD22, 0x1CDBD7EC, 0xCE171BCB, 0xEE2347CF, 0xC22C312D, 0xDBCC2A38, 0xBE0ADED4, -0xDC20CC2D, 0xD5380DB2, 0x2A32C701, 0x3EC7D41E, 0xCDD7D74C, 0xE83E2A44, 0xC12B26E6, 0xE70046D7, -0xD626D1EC, 0x35DDE41D, 0x303F27BD, 0xC94D4517, 0x31D1E229, 0xAD3529BF, 0x3AC5D21C, 0xCF1DB731, -0x2738DBEB, 0x1F382B33, 0x1ED52213, 0xFCE22CD2, 0x1330331E, 0x4A30BA0F, 0x1F38B42A, 0x2E34CB1F, -0xE3E125D5, 0x3AC72D17, 0xBD3C342C, 0x37272810, 0x1D34E4C7, 0xE5CC2EF8, 0x1E2FF1DF, 0xB9294236, -0x26F10017, 0xBDE3FBD1, 0xB7DB52D0, 0x2E3CB8E9, 0xB3343D3C, 0x3E3BDFDD, 0x1F46393A, 0x25FA20C1, -0x2D194CD1, 0xE9471D26, 0x34C3242E, 0xAE012034, 0xC8F3FED7, 0xB825362B, 0x322DC136, 0x42F41511, -0x181855C2, 0x4937D5EB, 0xE13CDC23, 0x08242A28, 0x2DCCDFC0, 0x13CEC64F, 0xB3E6F7ED, 0xD93401EE, -0x3D02DEE0, 0xCFC52300, 0xD2F1BE38, 0x2D092924, 0x253E2AF0, 0x37DACAD0, 0xDB1ECFE7, 0x40CED84D, -0x3706C42A, 0x4231D91A, 0xDD30471D, 0xBD272DC8, 0xCB1941D9, 0xC22FC7C5, 0x333F3C0C, 0x3F3D2518, -0xDDCCD143, 0xB3D834D5, 0xD231BEE4, 0x2BDB3B3D, 0x2F2754E7, 0xEAF3CE64, 0x3632E4C0, 0xD83324C2, -0x11A4D5CC, 0x00D627D3, 0xD51F2731, 0x17C92BE2, 0x1AD62E1E, 0x16DB2418, 0x16B83823, 0x2711D54B, -0xDFB02BDF, 0x28CDA600, 0x2AE9ED3E, 0xD314CD20, 0xD04F272D, 0xD0F9CD37, 0xCC1735E5, 0xD328EC37, -0xA7D31A26, 0x214BD9A5, 0xCFCB4226, 0x233C4AD5, 0x26EF37D8, 0xD83E3230, 0x3EC8C93C, 0x07B9282B, -0xD1E6DAF2, 0x31C52EDD, 0x3A0038A5, 0x56C1E0DF, 0x22E437C0, 0xDBC8143B, 0xCF1DB03F, 0x1D4BE636, -0xB8D3C23A, 0xBCC3372E, 0xAF284228, 0xDCE02F1E, 0xB9D4E3D4, 0x56D3D0D8, 0x494816C1, 0xFB1240C3, -0x23B1BDD2, 0x1236322E, 0xC2CBCB47, 0x102FE7C8, 0xBB0AE1D9, 0x3831BC29, 0x39AECBD9, 0xC7CF1ED2, -0x0AE43913, 0xDDD62F2C, 0x4FD522E6, 0x3CB90A55, 0x2101C8EC, 0x432604BD, 0x29E3E31E, 0xC25B3C29, -0x20E927D4, 0xD4300C41, 0xD9AECBD5, 0x48D8E143, 0x2CEE272F, 0xD2C11FBA, 0x2F2DB8D7, 0x1CF4DFE6, -0xCCDCCEBF, 0xE052D0EA, 0xDADDEB1E, 0xC72ACB3A, 0x332E2B1B, 0x2D26E827, 0x2A29E6A6, 0xE614D6D5, -0x221D1CC5, 0x51102031, 0x1735C248, 0x31D4DCD5, 0x3C20DC00, 0x2D231732, 0xE54AD9CD, 0x1D24D826, -0xE936373A, 0x20C0D3C9, 0x2B231520, 0xD6CED133, 0xDFC8C7B5, 0xDC2FE8B8, 0x3332249B, 0xC6E6E11F, -0xB7DA17AF, 0x1FD91321, 0xEE29CD41, 0xE1262FEF, 0xB6181DC6, 0x24F618C6, 0x3BE5DA2D, 0xFC2C35C8, -0x51C232CC, 0x36183EDF, 0x2B2CD6EF, 0x2F2DBDB9, 0x00D03413, 0xCDC9CBC4, 0xDB3309CC, 0x264EB22C, -0xCED1EAC9, 0x38D53F27, 0x2EE7D6F3, 0xC7232C23, 0xCCD42515, 0xC9C8C8E3, 0x231E3930, 0x5BBEDFCA, -0x34D7E5D7, 0x25CCE9A7, 0xCD4BF1E8, 0x5E2542E6, 0x38DCE43E, 0xDA34F0CA, 0x2EBFF841, 0xDA422D3E, -0x13CA2231, 0xD5C6DA27, 0xBAC0C6B6, 0xC82C49FF, 0x31312123, 0xBF00DFBF, 0xE8F23819, 0x2C34E81E, -0xDC4C2B0C, 0x3A5650F2, 0x2CCB0FD0, 0xC42D4C28, 0x4F19DA4B, 0xF63DE630, 0x29F51C1F, 0xD6BE14C4, -0xD2DDCDD6, 0xE0D02825, 0x2FE0E3D1, 0x41342FE8, 0x25D547ED, 0xC5A732B5, 0x19BD503F, 0x4CD9DA3D, -0x24D013BF, 0x4FE93FCA, 0x12DBE8B9, 0x33DF151F, 0x1E24AECD, 0x2E2E3656, 0x133500AD, 0x3641403C, -0xBDDF2BD4, 0xE33130E0, 0x3DC02726, 0x18390C3C, 0x26C04DC9, 0xDBF22D35, 0xC3E1EC45, 0xCED12623, -0x1CE92E39, 0xCF2FD222, 0xD8DE31E6, 0x1EE916D1, 0x35DCB621, 0x19C2EB54, 0x41B34ED4, 0xD9373BDF, -0x203ED6D8, 0x2CD4A8C8, 0x14E0C6C6, 0xDF242131, 0xCDD921CF, 0x33AACBCC, 0x2AD1A5C6, 0x3ED42B00, -0xBF181FD0, 0xC0CC2329, 0x1BD1EDC9, 0x3A2D47CB, 0xDD27D8CB, 0xD8E8BAE6, 0xD5DE3FF5, 0x2C30D641, -0xDCDCDF26, 0xC2C34433, 0x2837F53D, 0x29D8E12D, 0xBF3FEBD0, 0x34CACC45, 0x30E1DA21, 0x39DDDCB3, -0x30193518, 0xC0132E19, 0x313D3736, 0xB2D4FF34, 0xF4D92945, 0xC70D3AEA, 0x3E3034F0, 0x00DA2F07, -0x1DD415EB, 0xCC1AC4B2, 0x232EB21C, 0xD7431E16, 0x2FCE0835, 0xCF39242C, 0x1BCA2CD4, 0xD8B6D0FA, -0x18C3262F, 0x2CE3BDCB, 0xD839DC38, 0x26161D24, 0x1223B3DC, 0xD6D63515, 0xCFBABFC6, 0xC1BF18C7, -0x2637C715, 0x264020EA, 0xD024D3C4, 0x4126A11D, 0x2E34442D, 0x32BB1CC9, 0x36E7DD40, 0x3113C3C5, -0xD100C8CE, 0xD21651E8, 0xC3CFCDD9, 0x403139F1, 0xD3D02119, 0x32171AC8, 0xD2F9B62E, 0xB5B335D4, -0xC1462835, 0x1F1C2C35, 0xD8DDBF35, 0x422D2DDA, 0x38ED19D7, 0x3326BD2F, 0x4534DFCE, 0x46403132, -0x19CDD51E, 0xCBC3CBC0, 0xE3CF2139, 0xC646ECD8, 0x29E7C7DD, 0xE94CCAF8, 0xB8C6EA37, 0xEC2B09DA, -0xC8C82738, 0xC6CCDDFB, 0x3FCA3B4D, 0xC6482BD1, 0x2DE1D333, 0x3530BB3A, 0xBF4838EA, 0xE4411ACB, -0x3514D939, 0xCD372B27, 0x4BEC1C39, 0xAB21C221, 0xD8D83F37, 0xCCE0512D, 0xDA4640C2, 0x36AE1CD6, -0xBC2F303B, 0x20C3B8CD, 0xBFE6D4E0, 0xBECCC4EB, 0xC7CC1E4E, 0xCC2BD03C, 0x3738C518, 0x23B824CC, -0x2BECD0BC, 0x2107B945, 0x2AC21B00, 0xBE49F2EB, 0x31D2E3DC, 0xDAD23F11, 0xCDED3137, 0x3ABADA3A, -0xD9C0C12C, 0x36CEE8CF, 0xD0D5BDD3, 0x2AC9CFCC, 0xE61FD747, 0xC7B7B12A, 0x2BD520DF, 0xD5BC1D31, -0xE6D8423B, 0xCC21EB43, 0x1F46292D, 0x171EE038, 0xDFA5E244, 0x1BD5C4AD, 0xC622C2B5, 0x4E33CFD3, -0x3F263F30, 0x34E4CF15, 0x0041CC36, 0x4021DB29, 0xD62E2231, 0x2C22AE21, 0x1A201F44, 0xC6D7C100, -0x3A335125, 0x42473A2A, 0xDF32DA1F, 0xE5D8B51F, 0x3049E832, 0xE6DED531, 0x315DD01E, 0xDDD92034, -0x2EBF0AEB, 0x4B4639DD, 0xBED6C8DA, 0xDABA3714, 0xDD133BD7, 0xC934EACF, 0x0D35C3E2, 0xB4CCC213, -0x37EE202B, 0x0AD21AD9, 0x28D2C9CD, 0xD800DB2D, 0xD34B274A, 0xBDD33644, 0x38EFF1CC, 0xBDABD734, -0xB11E3E32, 0x2F1C23DC, 0xE80BD7DE, 0xDBE7D6F7, 0x240248BF, 0x23CEF1F6, 0x1F56E634, 0x33CD2230, -0xB4DB182F, 0xD338BA36, 0x33392B24, 0xBB3B3649, 0x282F30E7, 0x45CC35B1, 0x46261B30, 0x1FD9A722, -0x3BE3E1C3, 0x25334FF0, 0xB8BB28C0, 0xD751E2CC, 0x403600E1, 0x461FC3ED, 0xCB30C202, 0xD8D2B92A, -0x2923D71B, 0xB9DDE6CC, 0xB935CB0A, 0xEF37D723, 0xD1DA06CD, 0x303CE928, 0xF8B9BA27, 0x37370A1F, -0xD6C1DDD9, 0x18B6463F, 0x28C71FC3, 0x38D8B53A, 0xD22DE9A1, 0x18DDB236, 0x0A28D515, 0x363B263D, -0x1F3A122D, 0x202AE323, 0xC72337E8, 0x32ED08CC, 0x2658C347, 0xC6F4E200, 0x45D1C2C3, 0xF92D343A, -0x3EBE1E65, 0x10EB2FD3, 0xC64FD5E5, 0xC5D3F521, 0xE9CA1A37, 0xD736CDD6, 0xDCC7C233, 0xC9C8E2D4, -0x2B99D60A, 0x1EE3DA0D, 0x30BDD8E1, 0x16D3BE1F, 0x1C4524D4, 0xC8D5D432, 0x19AEDA3D, 0xCDD4CAD5, -0xD835332E, 0x2412DA1B, 0xD0CBEBD7, 0xC3CEF425, 0xD1D743E3, 0x000A163B, 0x23DC3129, 0x202332D1, -0x322F2216, 0x28F5131A, 0xD316CF0D, 0xD0344C30, 0x423325D7, 0x37204237, 0xEEDDC721, 0x2038E805, -0xD525C522, 0xBEDDE327, 0x3AC8BCC5, 0x45402E27, 0x34DFC1D9, 0x2DB0D049, 0x322F2ACF, 0xDB3AC3C5, -0xD8D0EB4F, 0x2A1DCCCC, 0xD0D33DC2, 0x1349DC45, 0x39CBBC32, 0x30301EBF, 0x2C00DFC0, 0x5DD0CA11, -0xD0220C3A, 0xC527CD1A, 0x31CD372C, 0x2E0ED7DC, 0xC6F92338, 0xF537E8D0, 0x3626DBBF, 0xC9C3C6C3, -0x30DDBE17, 0x50394C39, 0x3A11343B, 0x27E8DC2E, 0x0DDB303F, 0x1818BCF0, 0xC5DC17DB, 0x24C53A26, -0xECB0E7E2, 0xC21B1928, 0x15D7C920, 0x4126AACE, 0xE214D8C7, 0xD40BCD42, 0xB2CBD018, 0x554436DB, -0x3C2D25D9, 0x21CEC0DC, 0xE9251919, 0xE41ACDC3, 0xDECF67C3, 0xEDDE3225, 0xCA30EEDD, 0xCFE01E37, -0xD231BF41, 0x34DF1EBD, 0x1DD2CC2C, 0x21142E29, 0xEA322B37, 0xCEC311DE, 0xF0F738DD, 0xEBED1A40, -0xDCE640E8, 0xD0D1BA2B, 0xE906D6DB, 0xC71938B1, 0x13C59F39, 0x1ED6DBB6, 0x231BD3A9, 0x2C2B30DC, -0x0ED50000, 0x2DD4EED6, 0xD9D21BEE, 0xE1442E36, 0x38CEC4AE, 0xC626CCF4, 0xC2CD3F36, 0xD71F2BD9, -0x2F421837, 0x31B11A23, 0xD4D5282D, 0xD0E6BED7, 0x30D737CB, 0xC8142A09, 0xD8D2CFDC, 0xC22D3C44, -0xF62DF1C9, 0x3D38DBC9, 0xBFC2E5D3, 0xDCE42128, 0x3A304038, 0xDBE6D626, 0x28250FE0, 0x27B52BCF, -0xE0D8DC3C, 0xC8DA09DA, 0x2DF02FD4, 0xE539D7D1, 0xCDE729C2, 0x4816E313, 0x4E392AC5, 0x112CF50F, -0x3AD94924, 0x4B22273A, 0x43D2DE9E, 0xDA22DE30, 0x3FE324DB, 0xD9CC2811, 0x29D253D4, 0xE2BC353C, -0x0CC92147, 0xB8F0C6F5, 0x3D35DEBF, 0xED4ACBEB, 0xAC34E532, 0xEA2AC526, 0xEAC0BFC8, 0x4431D9DD, -0xC0CE4E21, 0x0000F2DD, 0xE0D8C7BA, 0xDDDC2E36, 0xDA42C22B, 0x2B312614, 0xDC391EF4, 0xCC2E31D8, -0x3DF4D630, 0xC72C21D9, 0xDB2BD531, 0xD916DB3C, 0xBEC11DD2, 0xD1D5CEA4, 0xBA072ED7, 0x402F2829, -0xE3C0F627, 0xC7CC3CBD, 0xF41D3345, 0xD706DB14, 0xB2DF36AC, 0xEBC4551F, 0x32B01929, 0xC5B6DDEC, -0xD91DE130, 0xE1213222, 0x4126D927, 0xAF52300D, 0x291B301C, 0x241A1843, 0xE43C1FDC, 0xBBCC191C, -0x2C25E011, 0xBD3EE9DB, 0xC9BF1345, 0x2F333AD2, 0x1CD822DB, 0x23BE43EA, 0x2527EADC, 0xB52E1C1E, -0x391CCF17, 0xD2C82C0C, 0x242E3830, 0xD328D808, 0x35CEF4CD, 0xD81BE035, 0xD0DF38DA, 0xD1D3C42E, -0x3A2C1EEA, 0xC6D03AD2, 0x1E362E4E, 0xE6080000, 0xD018C312, 0xEFAA323B, 0xD1294BD2, 0xBAD52C3B, -0xE0373E10, 0x260CDDE2, 0xC902E040, 0x30472BD5, 0x534BE7D2, 0x20CCB523, 0x21CCD843, 0x2259E24E, -0xDE35FDD1, 0xD4D91D3E, 0xCFCA11D5, 0x35D724BD, 0x3C3F0CB8, 0x3EC447CB, 0xE835DDC4, 0xC3C73E31, -0xDD432B2F, 0x2FDCBDC2, 0x2D3CCE17, 0x25B8AB31, 0x2ACCFFE5, 0x40E03C2B, 0xE7DA1841, 0x17E53020, -0xD44E0B2F, 0x46DA22EC, 0x33422425, 0x211840C5, 0x23C1CFD5, 0xC8350BE5, 0xD833CDD0, 0xE63DC528, -0x292ADC17, 0xD8BCD3C1, 0xCD39F02E, 0xA71EC343, 0xD6CC3A3E, 0x2E12D2CF, 0xC40B1FB1, 0x37DCDC33, -0x20E52EEA, 0x271629E5, 0xC4BEE0C2, 0x1B3CDBD6, 0x00004934, 0x18E145C7, 0x4BE93522, 0x3029C309, -0x31D1D50F, 0x3DB42C1A, 0x21A643B2, 0x3E26D8C2, 0xCDDE28D1, 0x44E835E1, 0xEDC4DED1, 0xC4F9C9ED, -0xC5E1BBCC, 0x4426C1D4, 0xD9BB372B, 0x37232E0D, 0xE5D0D0AE, 0xC9D23CC5, 0xF638E2C7, 0x2DB6E6D9, -0xC0C9B72D, 0xDF28E6D0, 0x11E2DCC8, 0xD8E2F31C, 0xEA3937DE, 0x2741B953, 0x19D5CEE6, 0x33DDC22D, -0x2BF72326, 0x2143363C, 0x13CA1A1F, 0xB9D7DAC9, 0x22C6B72E, 0xC5DA2631, 0xCB32ECCF, 0x032D15D4, -0xBB1EE613, 0x38C42452, 0xDBCD2726, 0x1AF44039, 0x22CF2EC6, 0xCAEDE6B4, 0x2823D423, 0xDCC61C39, -0xC12D19BF, 0xC612C31B, 0x31F1D32D, 0x3E1C09E4, 0xD824C5E7, 0xDFFC2839, 0x2AD40000, 0xDFCCBBBC, -0x3FC9CC12, 0xEF2626E1, 0x0FCDEA2A, 0xEBD735CF, 0x4E1A2834, 0xCDEDE1D5, 0x31CCCD29, 0x2F4618DF, -0x48C11936, 0x29DADE41, 0xD71C1AE0, 0xDDD2285A, 0xB13DCDC8, 0xF020B8DB, 0xD0B837C2, 0xDC3B48E8, -0x18C3C530, 0x192C2940, 0x2ADA3AE4, 0xEA34C55A, 0xDAB2BED4, 0x1A51E838, 0xC832AEBE, 0x10DE2DE2, -0x3B2408CC, 0x22CEBD1E, 0xC919D6BE, 0x21D2D128, 0xCFE03A2A, 0xB7DEDC3B, 0x33C630ED, 0x5A0EEAD1, -0x3CB03FCE, 0x24EC15E4, 0xD0385BBF, 0x20CB4E4B, 0x30E0C535, 0x301BCD3C, 0x3642DDD3, 0xD90FDC50, -0xCA35BBCC, 0x393B3B2F, 0xE2BE352D, 0x362BE3BF, 0x1922B73D, 0xDE3448BD, 0xF7C0C02D, 0x00002F43, -0x2FCAD0E4, 0xDE412A34, 0xFBF339DA, 0x2BB94330, 0x39B521D5, 0x2DE31F43, 0x382C4F23, 0x35314C2D, -0x2DE3DBDC, 0x3A18EAB9, 0xD0DF131C, 0x45EA41E0, 0x48BBC1BF, 0x2220D7E4, 0x29C8D0C5, 0x3C0527CA, -0xC1ED061C, 0xCB48CA3E, 0xE846E633, 0x0EB2D7CF, 0x44C42335, 0x27F0D440, 0x332FD847, 0xD72F2CE3, -0xD7ECD6C9, 0x4026D51F, 0xD334BEE6, 0xE01B40C5, 0xD62BDA2F, 0xDEEA36AF, 0xABD039C7, 0x2E123FCE, -0xFD3924A8, 0xD0C6D529, 0xD52AEED4, 0x211D2A35, 0x1EE9C5F1, 0xCECAF921, 0x38C92740, 0x3E4E2A1A, -0xB8FAC7C3, 0xF11F1C36, 0xD4DA163A, 0x2701DC38, 0x0E3019D5, 0x57DB23E1, 0x43CD26D0, 0xADCC4934, -0xE0D3D706, 0x403A0000, 0xDECED5E1, 0xDAE6CF1D, 0xD5E33C40, 0x35B3D038, 0x24D73231, 0x2EC01D40, -0xC2D23CDC, 0x44C20BC6, 0x44C1D7A8, 0xE9D1C745, 0x36E5C2C6, 0xB81B2D42, 0x413917CC, 0xD8E031BA, -0xCE3CC1C4, 0x3EC91AC5, 0x0DE406CE, 0x35D1DA27, 0xC8E5CAE3, 0x313EC127, 0xB61631CA, 0xD73B3444, -0xD834C850, 0x37D31DE2, 0xCCC9153D, 0xBF41E9CA, 0xD649F9DC, 0x3A31D501, 0x50CD1DE3, 0xC8E54012, -0x4432D4D5, 0xCBB93023, 0xE8FCD6C2, 0xCEE0CAD1, 0xE41B2E39, 0x28CC0E40, 0xDFEAEFFD, 0xB3EA2723, -0x3534B935, 0x42D12A09, 0xED3DCA0A, 0x263C352B, 0xAD224EDF, 0x2CDF2A10, 0xF0BE4CAD, 0xBD45D8D5, -0x263F27D4, 0xE2372FB4, 0xC35240DF, 0x1EF3DCDA, 0x3AD0D224, 0x27DAD527, 0x303A2CBE, 0xCDDCC829, -0xE22B35C9, 0xD5DC222F, 0xEEBDCB63, 0x2042DAD8, 0x06CC3524, 0xD11BBB3E, 0xAE2229E6, 0x1FC81E1F, -0xEF4B12DA, 0xE1D846DD, 0xBA3B1CDA, 0xE154C801, 0xD6092CD2, 0xD0F132CB, 0x3A40D027, 0x123530BB, -0x1EC5B4DC, 0xD11825CB, 0xC603DECC, 0x28BCC5ED, 0x2C03E1CD, 0xE9AA12A5, 0xDB2DD53A, 0xCA32D01E, -0x2F4A09C5, 0xFE411E26, 0x1354CEC8, 0x3736C5F4, 0xC62F3C3B, 0x252DDFB9, 0xD0353723, 0xD8DDC21E, -0xE3DF21ED, 0xDAE33AC0, 0x2ADA323E, 0xDC43E1D9, 0x3A23463E, 0xD71934F8, 0xDB1037C8, 0x38B7BCCC, -0xDA2C1CC1, 0x3EEEE349, 0x2ACB2A26, 0xD4BCBCD8, 0x4AB50000, 0x9EC941D8, 0x3824C9D0, 0x203CCD36, -0x0DCDEDD8, 0x5B333036, 0x3125C7DD, 0xD7383F30, 0xD6C72617, 0xE1C245DD, 0xBDD3E818, 0x3210422F, -0xD00ECF2E, 0x44411A3A, 0x02E72E22, 0xF106D24C, 0xCFC847CF, 0x0421AFCF, 0xD2C525A9, 0x3CBCE63A, -0xE02A1E36, 0xE036E3E4, 0xDDC22B25, 0x2EC7452E, 0xE1E3EFE3, 0xD82ED6CE, 0x36C1E115, 0xD129E026, -0x251E1C44, 0xE8E5D7CA, 0xDDE7D40F, 0xC5D8D9D8, 0xA1C52550, 0x3ACDDA25, 0x3548C4E1, 0x2913D9C8, -0x1E28243A, 0xCA3324E2, 0xD0D7D1C0, 0xBDE9D0C4, 0x35BF4FE0, 0xCA42E33C, 0xBBFA33DA, 0xD753C9CD, -0xDA2CE11D, 0xD9BEE407, 0xE31DD4C1, 0xCBCCD51B, 0x3BB8D6C9, 0x0000DDDD, 0x28D3CDDC, 0xD62445B5, -0xB3211F13, 0xD7B9BF29, 0xD429D5E5, 0xB9C23CCE, 0xC219EDC1, 0x211E0B34, 0xB8F0E1C1, 0x33C0EF4C, -0xD8D6C7D0, 0x30E8D3D8, 0xB06514D1, 0x21B9D915, 0xE2323DCD, 0xDA41311F, 0xE24AB11F, 0xE9B92BE7, -0x33EA23C3, 0x04C430C0, 0xE849EF0D, 0xD1232C2C, 0x260FD13E, 0x002DCBDD, 0xEB3129E2, 0x20B4C7C6, -0x25D32335, 0x2CCB39D0, 0xEA13DAC6, 0xCDEE2E14, 0xCDAA2CD0, 0xE1D339E6, 0x36DCD03B, 0xF5453114, -0x34D428ED, 0xEAEDF458, 0xD226CC2D, 0xEDD03AD8, 0xEE1CC83D, 0x10DBB5E5, 0xF018CBDB, 0x5E33E31E, -0xC6D9232B, 0x1A373130, 0xDFE7DDCB, 0xB21FC5C6, 0xC1CDB1B7, 0x3F2DF128, 0x482BB426, 0x323E0000, -0xF5D43741, 0xCC1C1FB9, 0x00004E2E, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x13000000, 0xC9112F26, 0xE3DF1FED, 0x284020CF, 0xC6ED13CA, 0x38B1E217, 0xD90FE8DB, -0xD7C0C3B7, 0x341336CE, 0x45E2D239, 0x3E22F0D8, 0x461D2C29, 0x3825D628, 0xD733E5F1, 0xD7B6C532, -0xC62B28C7, 0xD0BF3024, 0xF0BA3A26, 0x2D1D2836, 0x1BCF2DDE, 0xD02B251A, 0xB938CD2C, 0x34E220D9, -0xC2BEC23B, 0xCC2908CD, 0x1D080039, 0x42BB25C5, 0x32EB3206, 0x36D3D1E0, 0xC32E10C3, 0x243B13E6, -0xC02A1FF0, 0xC325D6DD, 0x23E33D2C, 0xDCD7DED5, 0x9C23C21D, 0x32E62056, 0x06314421, 0xE9E4ED24, -0xC0C9C233, 0x44BE3FDD, 0xD25134E5, 0x292EE2E7, 0x4EE0D1DF, 0x29C82E3A, 0xF5392A22, 0x4BE2D133, -0x58C2C4C8, 0xD2212920, 0x2935D4DB, 0xDECF4400, 0x31D7CCC9, 0x12DCFB2D, 0x2B2F0723, 0x2DE7B54E, -0x2AD24ADA, 0x261E2931, 0xD538CEDF, 0xE12A1C2C, 0x33DDEDE9, 0x2FFC36C4, 0xE61823CE, 0xC225E1DF, -0xC2102FEF, 0xCFD22617, 0x3EFBDA37, 0xDAD6BCD8, 0x110623E7, 0x3320E2D1, 0x1932B8D5, 0xCCEBBFC9, -0x47234011, 0x0A2B45D8, 0x25C11244, 0x00EF3221, 0xC634CC38, 0x0F34D0E6, 0x1A3F40EA, 0x2DEDC82D, -0xFFD2C8BD, 0x40E321CD, 0x24441BD3, 0xD932EDDD, 0x48362127, 0x1230EADE, 0x39E632F9, 0xD0D451DC, -0x18DD2DC0, 0xC22AC72E, 0xD71E172E, 0xAFDED12B, 0x1DBAA948, 0xF927B647, 0xD7C31C23, 0x3328E73B, -0xDBD72DD9, 0x3E23D424, 0xCB09E025, 0x16BA21CF, 0xDD00B9CB, 0x29E3CAD7, 0x3A19D011, 0xEA0EC4E0, -0xD51CDDBF, 0x2AD1C640, 0x2CD6CBD3, 0x36D6D43C, 0xA72851C2, 0xE7EE3C3F, 0x432A4721, 0x46C726E5, -0x253FD426, 0xD03B2C27, 0x1AEC343B, 0x5A2BC735, 0xCE31D2D2, 0xCFEDF30D, 0x492B4141, 0x20DC1BAD, -0xDAF81CD9, 0xD6EAD21D, 0x2339CD25, 0xA31546BB, 0xD0C0F63F, 0x382BE719, 0xDA34BFDB, 0x1EDBBADF, -0x5151E646, 0xC164D5E2, 0xD8292FCA, 0x33CF1F3B, 0x3FF531F4, 0xD3EB3453, 0xD433E236, 0x1B102B1C, -0xC6C320E8, 0xD8393C2E, 0x17EAB7EB, 0xE0C42CE5, 0x313720CC, 0x3F39C42D, 0x33374AD5, 0xCE1ED41E, -0xF7D2BE0D, 0xF114311E, 0xE22CD6EB, 0x4E23CA2A, 0xCDCF36D3, 0x463B1EC4, 0x312DE400, 0x1A1219CE, -0x0CD1E2C3, 0x3850CBEA, 0x31D7CCCD, 0x3F2D3936, 0xC518E33E, 0xC31F31B7, 0xC0AED6C9, 0x2AC6E5D9, -0xC334B8BF, 0x35EFD72E, 0xD72B3AD8, 0x31073AD7, 0x25E22D38, 0xF0CD4A64, 0x28DFDB2D, 0x22D9E714, -0xB8E43935, 0x35FCBFEC, 0x1DC1391E, 0xD6E731A5, 0xBBC8B837, 0xBD3FBE3A, 0x00BADC53, 0x28C43F33, -0x1CE0BAC2, 0xE0E125D9, 0x3BD6CB3D, 0x313230BE, 0xC4243D34, 0x1F24D2B1, 0x2058384C, 0x2AE9192D, -0x302CCCEE, 0xD435C4C7, 0xB0D53217, 0xE52D32D9, 0xE0AF2127, 0x3E47D0CA, 0x4112BFCA, 0x27D0D0BD, -0xE81E5CF9, 0xD50CBCE5, 0x2DC9B4F7, 0x3FBA33BC, 0xCBCC2821, 0xDFD51326, 0xD20ADA3A, 0x2000C3BB, -0xC4DC4BE5, 0xCD39D7A7, 0xC40FF54F, 0xCC3BD1CC, 0x2C19EACC, 0xCD2E2129, 0x44D9F0DB, 0x2B40E11C, -0x31343F4C, 0x0E142817, 0xD0104135, 0xE304CAC7, 0x259A1FD4, 0xC3EAED3C, 0x1A311AD7, 0xD8242BEE, -0x20BF4EFD, 0x3FCA16C5, 0xDDEED03A, 0x0A22C52E, 0xD53B2D3A, 0xE22A2CB5, 0x291D3228, 0x2CCC2E45, -0x48BA00D5, 0x4FE12D1D, 0xD8D91DD1, 0xCEDBEC31, 0xFBD526B9, 0x3C1DE845, 0xAFDCE91C, 0xD622D31E, -0xCF2620D9, 0x28D63427, 0x362C3DDF, 0xD72C2530, 0xD6A7C203, 0x442C3233, 0x29B24E3F, 0xDD21412C, -0x400BD6D0, 0xC8D4B831, 0x171EF12A, 0x34FFC9D0, 0x3B3ED02D, 0x0BC7E2CB, 0xC43D28C6, 0x42F6C948, -0xD24AD429, 0xCB2C2A00, 0x43E2A236, 0xBC353312, 0xD91324B5, 0x30B4D013, 0xC92FDE2F, 0xBFD6D432, -0xC82DCABC, 0xC032DC1D, 0x30C9D2CB, 0xE0341DC5, 0xDDCEBE39, 0x2CC41D58, 0xE213BF14, 0xDFCDCBD9, -0x2E3C36DD, 0xE5262833, 0xF841291D, 0x15E324F5, 0x0315D732, 0xD1C5C5CA, 0xD73144D3, 0x2ABEBA1A, -0xBCF42E2C, 0x00E1E53B, 0x4423AD2C, 0xB021CF20, 0xD8D5EEB6, 0xBD35BCCD, 0xE6D85334, 0xD549DF2D, -0x35C74D19, 0x3F4BBE3D, 0x1F3FA3EB, 0xCEB2B335, 0x35D0BCBA, 0xD5D8CF27, 0xB11DCFC4, 0x24D3D408, -0x183B35D0, 0x1C14D619, 0x35D445BB, 0xDE452444, 0xC83315C5, 0x3F2122D0, 0xB623C737, 0x33321DD0, -0xD6DF33DE, 0xDE39AA20, 0xCF00F239, 0x412410D5, 0xC5DC2339, 0x1D3BD1B6, 0xC0E3481E, 0x1030451A, -0x30EA30D1, 0xC6DCB9C7, 0x2C36DC17, 0xCBB0ED30, 0x26C20FBE, 0x35D6D528, 0xD6CC2242, 0xEDE4241E, -0xC036DED9, 0x26303627, 0xB6B6371B, 0x26E3D6DF, 0x0D36C729, 0xBEEE4FD7, 0xE3C839D1, 0xC0313031, -0xAEAD2828, 0x36323D23, 0x13342728, 0x2904EE20, 0x261DDCD6, 0x0CBCE1E1, 0xD2CBD5C3, 0xFD1C4B2C, -0x1CD8CDDB, 0xD4BE53B1, 0x2BD6CDDE, 0xC61A01E1, 0x3D41BED3, 0xE0333BD0, 0x4040E821, 0xC4A32449, -0xD3D3A8BF, 0x36E11C2C, 0x3CC1321B, 0xC5D03E1C, 0xB813D9DD, 0xD6C51838, 0xCEBED141, 0x1FEA3813, -0x3611CAC0, 0xD12EE2C6, 0xE1BFD22D, 0xD0DAE9CC, 0x0E03DB00, 0xBC37393F, 0x422BC916, 0x49C4D72A, -0xBFC0243B, 0xC1C2F1C3, 0xDF36CC32, 0x49E53EE4, 0xBFC02CDF, 0x2BEE2BE1, 0xC23224C5, 0xD63F16DA, -0x15DBC21F, 0x49E4CC57, 0xBE272CC7, 0x274E0643, 0x5C1DDBE7, 0x34B73DF0, 0xCD2D2EB9, 0x1AD43BCD, -0xFD3047D3, 0xDAC53936, 0x1328DCC8, 0xBC32331D, 0x001F2634, 0xC845410F, 0xDBDB1C2B, 0xD1D819D0, -0xEBDDE12D, 0x37E335D7, 0xCDA84635, 0x0F362FBE, 0x30C229C4, 0xBC1DC43E, 0x3CD02F3D, 0x2EF5F5F4, -0x462D15E6, 0x362F1FC5, 0xC0C9CD49, 0x14C92639, 0x2BD135D0, 0x49C6B8DA, 0xDBC7E1D9, 0xC6382328, -0xEDC217BC, 0xE4D1331C, 0xDCC741CF, 0x283A341C, 0x38B93420, 0x46001BE7, 0x3E1030C4, 0x42A8C1CD, -0xBB3339C5, 0xE538DD20, 0xDF3F2602, 0xE52BE5C1, 0xBE2B41BA, 0x3BD4D337, 0x2D39C3DB, 0xC3BB36F0, -0xD12CCF17, 0x4130B93A, 0xE31DEAEC, 0xF9DEF52D, 0xADD35231, 0xD62ED0EF, 0xBE303521, 0x1E2ADB41, -0x310AC62F, 0x22DA2DC5, 0x26E1D9D0, 0x1F4D2AC1, 0xC8E6DCE1, 0xC6B3D62E, 0xD6D20019, 0x4EDC2D39, -0x342AE224, 0x07CBD4CB, 0xE43FB3BE, 0x1BE53748, 0xDD44C8A2, 0xBC34B7BA, 0xA1DD1D43, 0x23D31827, -0x3519E93F, 0xC83B3720, 0x1BF0B72A, 0xEAC7DCC0, 0xCA4B28EC, 0xD54D242F, 0xF35435D1, 0x3DDEC824, -0xC31128CE, 0x0B0FD136, 0x442D1E2B, 0xCBD1C3EC, 0xD635341B, 0xDD1F2931, 0x3442CDD0, 0xDADD3600, -0xC31E40E3, 0xB0BD1B22, 0x38CA1F0D, 0xD42D3043, 0xE65127E4, 0x2F15C9D6, 0x3E360B30, 0xB2CB1524, -0xC7BBC4DF, 0x38D244C7, 0x483B31C0, 0xDB43C8D1, 0x43DCDBBC, 0xDCC7571D, 0x24BAC2C6, 0x3B4ED6DC, -0x3AE03245, 0x0C40E1E2, 0x493724C0, 0xD4ECC537, 0x36CC30BA, 0x1C303FC6, 0xD12F27D5, 0x00C4272F, -0xFFFD061D, 0xC2D9251D, 0xC1D7D625, 0xBFCD3AD3, 0xB42E11D4, 0xC7230E1E, 0x24CD2C21, 0x0BD436F9, -0xCECCD331, 0xE6BDE0D5, 0xD2C6C941, 0xE1D1D3EF, 0xEB4123CD, 0xDA1755E5, 0xCEE4C529, 0xDC43C5D1, -0xD8FDDFEA, 0x1AC9C317, 0x22E13DCE, 0x01D7BA29, 0x1551E449, 0x43CD363E, 0xC6281B24, 0xCBD23725, -0x3200D61C, 0x35D6CCBC, 0x262CB22C, 0xE2E43DB1, 0x26493335, 0x3AD72ACA, 0xC4244430, 0x3AD7C9C3, -0xC91ED8D1, 0x40EAD2AC, 0x38C9CDAC, 0x413BC137, 0xCD304B1F, 0xEFCA2323, 0xAC3FE4CD, 0x3616F6E0, -0x41C2272A, 0xDCD7B2E2, 0x27D9E018, 0xDEE2D943, 0xD5C01F22, 0xB0D93540, 0xB411C13D, 0xDE39CBE0, -0xE2C6F126, 0x31450828, 0xD2BC2927, 0xBACA1DD1, 0x34DDCDC3, 0xD8302AD5, 0xE2D02824, 0x0B2BE03E, -0x3BCAFD2C, 0x2E461D45, 0xBBF6F32E, 0x31E5DED2, 0x2ED4E847, 0x3BDDCD29, 0x231331D8, 0xF521CF2E, -0xD024C718, 0x20D91011, 0xDB1E0F34, 0xD931C0BB, 0xBB310837, 0x29B7C5CB, 0x3B31DEE0, 0x0836B926, -0x28CB1FD4, 0x31072A30, 0xEE41F300, 0x35CB501E, 0x603A2B47, 0x2C2739CE, 0xC0CFC4D9, 0xE0CED43C, -0x22BDC9CA, 0xBAEC122D, 0x4D16F2C5, 0xB6E5C3DA, 0x19D5C9D0, 0x1D1DDFC2, 0x223A23FB, 0xCD382B09, -0x3025C2E6, 0x3918BDD5, 0x33DFEF0E, 0x291A302B, 0x14184930, 0xD414D233, 0x473CCED7, 0xD2D318B7, -0x3E2738D2, 0x2928D537, 0x002E14BB, 0xE2E03734, 0x1B1EDFD1, 0xCF483FD8, 0x3D043844, 0xD52E1C4C, -0x2823EAD6, 0x1F2D241A, 0xBC4B22E6, 0x2EE7DFB8, 0x3424E2F0, 0xD41BD7CB, 0x2BBCDF1E, 0x155B5033, -0xB527D543, 0xE3C5E9F4, 0xD9B5C92B, 0xD3CAE0DF, 0x31C4CED7, 0x0BD33B25, 0xCF3B111D, 0xE62F241F, -0x22D93D22, 0xCF27EF43, 0xDAD2C5DD, 0xC60019BE, 0x2935D5C3, 0x2D0BCD22, 0x224714EA, 0xE7CAB817, -0xD1282222, 0x3C25EBD0, 0x45F0A8DC, 0x3ACFB92D, 0x34B4E7E6, 0xE93523E0, 0x2C292FCA, 0x44D4C7AC, -0xEA22C3FE, 0xEF37E524, 0x313ADCDA, 0x2212D846, 0x1BE0FF4B, 0x1CBC2E34, 0x174AF041, 0xD245223E, -0xE1DB2BDC, 0xF2E9A515, 0xE3C33BCC, 0x43DBD5CE, 0xF11700DB, 0xDE44DD36, 0x26E1D604, 0xC2ACE419, -0xB9D8C7D4, 0x37EFE21E, 0xE2BAC2D1, 0x3926E91A, 0xD013E8BC, 0x2C43ECD9, 0x232B30F8, 0xD6C9E0BD, -0x26A718BC, 0xEFF6C840, 0xC13332C2, 0xC4B9BD36, 0x1B4921BD, 0xD0EBECE0, 0xBCE4D647, 0x35D4DCD5, -0x1BBE4C27, 0xECC1B7CB, 0xD820284D, 0x0BC33DBF, 0x34D03140, 0x38EC3900, 0x29EBDBC9, 0xD43A3041, -0x3AE0DD0C, 0x09CFCFDB, 0x44E0C7CE, 0x20DBC4E3, 0x26DC41DE, 0xBA3AD2E5, 0x2ABA34E1, 0xD70FBEB7, -0x40E03FE2, 0xF8D62041, 0xBD47B7EA, 0xD2E03E34, 0x1FC6D2DE, 0xCF1CD155, 0x32D52630, 0x3C463D2C, -0x253130E3, 0x1ED8BB4A, 0x411BDFDD, 0x3FD8EE35, 0x33D02BBB, 0x002ECAAE, 0xDF1FDFEB, 0x2CD8DA3C, -0xB6352D59, 0xD5BDD3B9, 0x1946630D, 0xD9181731, 0xD419D31F, 0xCE2FB7D0, 0x32EFE3C3, 0xCDDB2FD3, -0xD247BB3E, 0xBA41DECA, 0x23244AD2, 0xDEAAF2B2, 0xB8D525F2, 0xD327A4D0, 0x3718C0E2, 0x2D3E20D9, -0x24CFDF12, 0x26D0BE1C, 0xC8D9282E, 0xEB54CADF, 0x44DB1AED, 0xC927BF29, 0x2E002B39, 0xBB2625E4, -0xBB4421D2, 0x18CBAA3A, 0x213ECD37, 0x0F33163C, 0x3622E432, 0xE5C7C62B, 0xDE39E7C7, 0xF3151CCA, -0x2ACED6D2, 0x2ADADFC4, 0xD6241ACC, 0xB92F0622, 0x1BC639E4, 0x33D92BC4, 0xAF14E0DD, 0xE6EEC2C9, -0x16BDCAE3, 0x272E1AC3, 0x292E1EBE, 0xDCE439B1, 0x4225E1C6, 0xCD372420, 0x27D716B1, 0xD83EE339, -0xDBCAD4B3, 0x26385033, 0xC5373528, 0x2DD2C936, 0xF9D5BAE6, 0x2E2DC7C2, 0xCD4BD045, 0x1DDF2DE8, -0x0E3740CE, 0xE5D82C36, 0x29D1360A, 0xCD03C8C6, 0x37CCCCD8, 0xD83AD330, 0xBFD619CD, 0xDEDDC432, -0xD0DADAEC, 0xD3E14F26, 0xA8CD35D9, 0xA3F325BD, 0xBC1626D7, 0x3AB81BD5, 0xBBFF1832, 0xC9DB2126, -0x16250000, 0xE003BB39, 0x35D533CE, 0x1801C610, 0xD9D44644, 0x474BD3C3, 0x1C30C51E, 0x2E3342C6, -0xB7D6B3E9, 0x5AE44BD2, 0x46D62830, 0xDBDD4B0C, 0x38CF2F1D, 0x2D331ACB, 0x36CCDED6, 0x10D7DA10, -0xD42246E0, 0x0FC73FC0, 0x2C3E1E37, 0x2CF0D1B8, 0x17412EDD, 0x2630D0DD, 0xDBD535E4, 0xD927DA43, -0xB636C11E, 0x25CBE2D8, 0x4711F64B, 0xBC2C2029, 0xD0E3F538, 0xB92C27DF, 0x272DE2D2, 0x0CC5BCEB, -0xC0BC2EDF, 0x26D131C9, 0x1F092FEE, 0x2D342B34, 0x31B825D5, 0xC6BBC9C1, 0x38F1D0E4, 0xCBF7FDC7, -0xC3CAC9B6, 0xDBC436C6, 0x19DC1FD8, 0x28CCAED1, 0x1921BDB4, 0x24BCBF33, 0x301EE244, 0x36BDBDE1, -0x31C5B724, 0x00003ECD, 0x220B1EE7, 0xDEBAD3DC, 0x21CAB942, 0xC9193B33, 0xE3CD3A0A, 0x0DC22CC3, -0x3EC0C7CB, 0x43F2BFE4, 0x0ECFE9C6, 0x3ECA2FD5, 0xCB492DD9, 0x23E7BDC9, 0xD33DC151, 0xFCBE2933, -0x5ACEC51E, 0xF2172E1C, 0x3C24DE23, 0x3320D4D5, 0x2AB53C20, 0xC328323A, 0x45EA4133, 0x24391A32, -0xC7D8DA2B, 0xF4EAAF39, 0xDFCA36E3, 0xDEBED5C8, 0x36252C36, 0x04D7DBC7, 0x30CAC23D, 0xB60BF73D, -0xEACA2A30, 0x34C12ABE, 0xE2D747D8, 0x19D21FE3, 0x1DFD24EC, 0xB6B5D9C4, 0xBF2C1DD2, 0xD2B442E0, -0x37CCE1BD, 0x2AD1E1CC, 0x18DAC6BD, 0x213AD93E, 0x2031D8CB, 0xD82F2D12, 0xD112D2F2, 0x19CD43F1, -0x36BCB9CA, 0xD7C5DDFC, 0x34011D28, 0x3BDB0000, 0xCD00E1AA, 0x5228252C, 0x3512CA34, 0x0EE53A41, -0x242CD2C2, 0xF425DD2A, 0xF02FDDF8, 0xD82026D3, 0x4ABEE7B8, 0x2DC9DDDC, 0x3BEECD3C, 0x2ED1442A, -0xC713E92A, 0x310CC12B, 0xE128D520, 0x48E5C1CF, 0xC91CE3ED, 0xCCCBC72F, 0x0B23E3E9, 0xC1D2C8B6, -0x511ED534, 0x2AC7D4C3, 0xCFDCE335, 0xD4C9F643, 0xD433EBF1, 0x1BF8DA31, 0x223FC515, 0xCC2F13C2, -0xF825FFC8, 0x35E51633, 0x36293C4A, 0xC72ACA36, 0x4544E736, 0x1BD9315C, 0xCF16DFD4, 0xD0AFEFC3, -0xCECBBDE2, 0x05D6AA32, 0xD851F045, 0x240FD948, 0x3D35B2E6, 0x17D7C7EE, 0x0B22DACE, 0xF53AD637, -0xB2372DDB, 0xF6DF14CB, 0xBED95B24, 0xD4D5190B, 0x0000CB29, 0x3DC1ECF5, 0x30C6B34F, 0x1D2629B6, -0xD429D1CC, 0xD50716E3, 0xD0C3C2CC, 0xC82CC7D4, 0x5F27C718, 0xE6201BE4, 0xDACFD42F, 0x2E2EE9D4, -0x3AD036C0, 0x3828DB20, 0x27D63439, 0xD21026DE, 0xD60710BC, 0x13AEB9E9, 0x28C41944, 0x49D5E3D7, -0x27163429, 0x1BBAD528, 0xB12A14BC, 0xC72FD9E2, 0x1F43213A, 0x133B3EE5, 0x3622FE21, 0xD438DCBE, -0x41CB25E8, 0xD0D83E2C, 0x32BFC2CE, 0x362BE1DA, 0xC3CBCE24, 0x22DECDC2, 0x30CBD5CD, 0xD42DBC26, -0xDDF6AAD0, 0xCADC0EC8, 0xDC333434, 0x333114F5, 0xCE24361A, 0xB1C5D123, 0x4B25380B, 0x2FEC3634, -0x3EE2A610, 0xB4CEE72F, 0x29BCC721, 0xB23850CD, 0xA51AE4DD, 0xC81BBC2F, 0xD4DF0000, 0x2DE5D1E8, -0x2E0A28D0, 0x29E3C1E1, 0x56F62DD6, 0x3828DD4B, 0xC41ACFDF, 0xD2390A3A, 0xDF3028CC, 0xE8C5E22B, -0xD11CDCC1, 0x44D1CBEC, 0x33C73DDC, 0x1D25B7DC, 0xE7DD0525, 0x2743C41A, 0x2AE2D3DC, 0x21D6E82A, -0x133CBAC7, 0x593F34B0, 0xDA5FE339, 0x5206252C, 0x394FD5BD, 0x21D2C92C, 0x292426E0, 0x48E0362B, -0xCC272DE4, 0xC815C4DE, 0x49BD5D37, 0x1912342F, 0x2CE9E01B, 0x30D8D2D9, 0xDEBF46E8, 0x392F473A, -0x3A18D324, 0x2FE31FD0, 0x2B2B2710, 0xB53B2AC7, 0xB3481CFF, 0x2DD7CFBC, 0x2232351A, 0xD7C91C16, -0x1CB4DA16, 0x1BCBDF3C, 0xD2213822, 0x2121DB1F, 0xDBD1C02A, 0x27DA33C7, 0x351FC4CD, 0x0000B9D8, -0xC2142C29, 0x38B9DD31, 0x54E60CDF, 0x2A4A42DB, 0x35CF2BB5, 0x0CEA3323, 0xC2D8BEE2, 0xC61F3B33, -0x10CE11D0, 0x3336CE2E, 0x303ADD25, 0x3347B7D9, 0x33222C1A, 0x1A43E4C1, 0x4326E019, 0x2AE2E92E, -0xD2C5DC40, 0xBA45D7D6, 0xDF341BDC, 0x3A361925, 0xD4FEF4D2, 0x3018DA31, 0xDDC12817, 0x3038DE24, -0xEDC0292B, 0x3E3E3336, 0xCB1BEF17, 0xE10B2EBF, 0x2B20BABF, 0xC80C421B, 0xC2411D21, 0xECD8C7D6, -0xC824E4AD, 0x65B53DD7, 0x304325D4, 0xDD1DEAE6, 0xD33131CF, 0x2F36452B, 0x23B219E9, 0xC1C23529, -0x21DC3836, 0xD618E933, 0x393E2C14, 0x362ACA3A, 0xD6E2C237, 0xD6085111, 0xD721FCB1, 0xCCE6DEBC, -0xD1DCD920, 0xC3320000, 0xEA26CB19, 0x18BB26B7, 0x233BDF4F, 0xDE23FD3F, 0x2ADA1ECB, 0x3122E839, -0xEF42D7D7, 0xCAC7202D, 0xCD4CDED1, 0x2633C824, 0xD0123E4E, 0x104429B6, 0xC8CD4B00, 0x5136B738, -0xCFC8202B, 0x163135DD, 0x2C3821E8, 0x29314CE0, 0x0F3CE4EC, 0xE5432DAF, 0xC63AE340, 0x4639DB18, -0xDF282511, 0x25B5CBD3, 0xCAF50F37, 0x1E443B33, 0xE32CD32D, 0x10DA47B9, 0xDA410526, 0x34F0E4EA, -0xCEED3134, 0xC0B31AA7, 0xD12B1AD3, 0xC722C743, 0xBFBEDD1F, 0xD328D52B, 0xCC384024, 0x18B43FB8, -0x281742BB, 0xD8322FD2, 0xB5D628C6, 0xE420C0CB, 0xC9EB391D, 0x41E6B419, 0xBCC543E1, 0x2C37DDEF, -0x1F2D41E9, 0xD0F0D205, 0x1FEAE5C5, 0x15DF14B8, 0x47E327D9, 0xD328CE25, 0x36DB2E24, 0xD92E1EBF, -0x2B3230F4, 0xD1EAD5D9, 0xC7212ADA, 0xCD1235DC, 0xC519D5DB, 0xBFC631DF, 0xD5222B35, 0x35B6DEC6, -0x153C4428, 0xC5C3E42F, 0x1B2E2D2A, 0x3CD422A6, 0xC22842CC, 0xCADAC43D, 0x2C10DAD2, 0x18C708B5, -0x36D636BD, 0xCD29C5D3, 0xBFED433A, 0xE0384939, 0x005629F2, 0x36E2C425, 0x2830DF1C, 0xC9CB351C, -0xB0D7D3E6, 0xF3CEC214, 0xDC25D1C7, 0x1BD5CBCC, 0x19DD21C9, 0xC854EE30, 0x4FE14EE3, 0x38D5D3E8, -0xC9D126E4, 0x2FDD2130, 0xCE2130D1, 0xCFCAB0C9, 0xC71F0E1A, 0x2627D4DE, 0xCBE9DACD, 0xE7121F22, -0x2CC8E435, 0x3838391D, 0xDD37242E, 0xEBBE2F10, 0x233C0000, 0xAFC91CE7, 0xCE3536F6, 0x0F25D248, -0x2D04EBE4, 0x3FF634E5, 0xE929CE26, 0x24E0BABE, 0x302CD52B, 0xD1E2073F, 0x4333D11C, 0xDA48C2D1, -0x2D33F315, 0x29B2C8C3, 0x3B26E3EB, 0x3821C6DA, 0x32163DD6, 0x1DC737BC, 0x463CCD24, 0x19D63DDD, -0x200BDDB7, 0xBDD41E22, 0xC40A444F, 0x34BF49ED, 0xD4C0C0F4, 0xA41FB721, 0xBEDF51E8, 0x15D82A17, -0x383FDF21, 0x2B2918D0, 0xE6EB4718, 0x244530DB, 0x25DD3919, 0x3BA819BE, 0xDAEFBE38, 0xEB3FCCD9, -0xD1DF2E1C, 0x2520C3E3, 0x32D0BFD5, 0x37312BD5, 0xDC29D0C9, 0xBED02432, 0x310C3A18, 0x411ED8D7, -0xA4E5CE22, 0x163CBD30, 0xC3E2BE45, 0xCFBBAAC3, 0xC8C0E4CF, 0x0000CEFC, 0xE8CC2433, 0x39ED223F, -0x243AD83B, 0xD44D39C6, 0xCABF24DE, 0x252050EB, 0x29C73B40, 0xD4F434CF, 0xCAE4D5DF, 0xC5F2EEF1, -0x2919C8D2, 0x2FC4D20B, 0x1CBF5528, 0x3DBBD52D, 0xE03AD031, 0x3D2CCA17, 0xBE23BDB8, 0xE7DA3B30, -0xD1D2D331, 0xCC1825EA, 0x2F2D39D2, 0xF9313526, 0xCFBCC2E1, 0xE5BE3AD4, 0xBF59BE1C, 0x22FFC8B5, -0x32B14015, 0x31D6BEE6, 0x46DF3843, 0xDCD1D8B2, 0xE728C8BE, 0xEA1E2A28, 0xD1D8C7D2, 0x30CAF134, -0xEDD0EADA, 0x13C1E3D0, 0xB9D7DC29, 0xEAB93624, 0x24E49F38, 0x2E3FDEDC, 0xE6D0D23D, 0x1FBB3ED2, -0x23D540DD, 0xD727D92B, 0x251E33E6, 0x4BA7EECE, 0xC1CD203C, 0xC5CFED32, 0xB9CF35C3, 0x29710000, -0x29D7C636, 0x3A3ED1D0, 0xCC1B271F, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, -0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 - -hard_output0 = -0x42441F44, 0x006DFAE9, 0xDBB63AC2, 0xA3365CB3, 0xFA44372B, 0xC2603862, 0xA6C86E09, 0x416F0BF7, -0x8E58011D, 0x47C54B99, 0x269AD14C, 0x0B286902, 0x093E4C64, 0x8D84D8E1, 0xB8AE0993, 0x49567118, -0x8CEAABD2, 0x12D33409, 0xE3358237, 0x130176F6, 0x0986718F, 0xA18C83B5, 0x04EEF058, 0x59704040, -0x7478FE81, 0x01D27193, 0xEA1AD7F3, 0x21E6C2B9, 0x6478A1FF, 0xED9959AD, 0xE39E57BE, 0x4D859105, -0x056EF72D, 0xBD170BB7, 0xF01F9ADD, 0x99BF0C05, 0x44BAD09F, 0xF6ABDD61, 0xC0F8F116, 0x2972B53C, -0x0FEC944B, 0xD1675432, 0x0025F563, 0xF42B2EA8, 0x808E5C37, 0xB6E79AD5, 0x3706284D, 0xB9C0AFA5, -0xFF0E7E28, 0x5FA45C6F, 0x9CD5244E, 0xA013DDEA, 0x0D27D1A2, 0x2AE414AD, 0x41614379, 0xE6B68872, -0x5585D926, 0x5098D45B, 0xF8980ABD, 0x65821418, 0xEF8968A3, 0x301DEC3A, 0x57EF2A7F, 0xC17BE446, -0x94B65D62, 0xC9E6F350, 0x2E6130BC, 0x235F2E5E, 0xF1C13241, 0x94B291D6, 0x8C342458, 0x175B1FCA, -0xE07310FD, 0xD24934DD, 0x3CE8D053, 0x5C8F243D, 0x945B0AB3, 0x50EB8CC1, 0x8EF499D4, 0xA67801BF, -0x1680F061, 0x283FE705, 0xB8D7E773, 0x13AD3D2F, 0x4A6C305B, 0x1C1E5B12, 0x6F57D880, 0x8A666E5E, -0x26511296, 0xFFC09750, 0xFF91760A, 0xAC26795C, 0x75F321FD, 0x4221B9CB, 0x2E119188, 0x0772A832, -0x74D6036B, 0x505D6D64, 0x16A001B7, 0xF5F0D728, 0x48CBE119, 0x91C5D6B2, 0x8E1BBAB0, 0xB11BBE51, -0x52C647DC, 0x65240CE2, 0xAB3F8AAE, 0x62E0CDEA, 0x6CBE7240, 0x7F572063, 0x7FC816E6, 0xB38E5A6C, -0xDF9E2738, 0x752419CB, 0xC3A6BF9B, 0x8D48B21F, 0xA88C4AED, 0xE3C1D8BC, 0x8501353D, 0x20A99D7D, -0x8D9C6DDD, 0x77A65039, 0x834E7E57, 0x1F623FA1, 0x6CF02B26, 0x1FF0BBA6, 0x9035AC70, 0xBED818E5, -0x437CA713, 0x91011537, 0x3CD1302B, 0x7755459E, 0x5963FDA6, 0x49ECF937, 0xDEBBE0E3, 0xE873FD4F, -0x735C48C9, 0x7C70F46F, 0xA00B1543, 0x789F4159, 0xE17C343E, 0x51B3D085, 0xD9042663, 0x771933DA, -0xE183AF8C, 0xF62AC11B, 0xF776C25C, 0x22083E6C, 0x8400DDBA, 0x6D6AD2F2, 0x5DF87DBC, 0xBD7D40B4, -0x356EBF21, 0xD8972E85, 0x3A632B51, 0x4D5BFBA2, 0x58CDF1D4, 0xD1117491, 0x5906DC45, 0xF793D63A, -0x8F9D0552, 0xD261C804, 0x70BFDE9F, 0xDC77827B, 0xE9FFB130, 0x4FF18BBC, 0x17D50C32, 0xC315521E, -0x4C7D2470, 0xAB5EE34C, 0x692AC0C8, 0x15B22832, 0xD34107FE, 0xA7E6DA1E, 0x2966A2A3, 0xD0B204B4, -0x500E02F9, 0x02E5A455, 0x81EAF941, 0x6818F57A, 0x978EEC9C, 0xBFD575F3, 0x3FFC1BE8, 0x97104E07, -0x4ADF219F, 0x182EC93D, 0x386033EE, 0x87C1351A, 0x31420C6A, 0xE20B5DC8, 0x83D90D23, 0x3C13B9E8, -0xCCCD65BE, 0x7EDB17A9, 0x81C73C2A, 0xE202E332 - -c = -2 - -cab = -1 - -ea = -4918 - -eb = -4920 - -c_neg = -0 - -k_neg = -3072 - -k_pos = -3136 - -rv_index = -0 - -iter_max = -8 - -iter_min = -4 - -expected_iter_count = -8 - -ext_scale = -15 - -num_maps = -0 - -r = -0 - -code_block_mode = -0 - -op_flags = -RTE_BBDEV_TURBO_SUBBLOCK_DEINTERLEAVE, RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN, -RTE_BBDEV_TURBO_CRC_TYPE_24B, RTE_BBDEV_TURBO_DEC_TB_CRC_24B_KEEP - -expected_status = -OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1190_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1190_rm.data deleted file mode 100644 index 6221756ae5..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1190_rm.data +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_ENC - -input0 = -0x11D2BCAC, 0x4D - -output0 = -0xD2399179, 0x640EB999, 0x2CBAF577, 0xAF224AE2, 0x9D139927, 0xE6909B29, 0xA25B7F47, 0x2AA224CE, -0x399179F2, 0x0EB999D2, 0xBAF57764, 0x224AE22C, 0x139927AF, 0x909B299D, 0x5B7F47E6, 0xA224CEA2, -0x9179F22A, 0xB999D239, 0xF577640E, 0x4AE22CBA, 0x9927AF22, 0x9B299D13, 0x7F47E690, 0x24CEA25B, -0x79F22AA2, 0x99D23991, 0x77640EB9, 0xE22CBAF5, 0x27AF224A, 0x299D1399, 0x47E6909B, 0xCEA25B7F, -0xF22AA224, 0xD2399179, 0x640EB999, 0x2CBAF577, 0xAF224AE2, 0x24 - -e = -1190 - -k = -40 - -ncb = -192 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_RATE_MATCH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1194_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1194_rm.data deleted file mode 100644 index c569abd78b..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1194_rm.data +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_ENC - -input0 = -0x11D2BCAC, 0x4D - -output0 = -0xB3E8D6DF, 0xBC8A2889, 0x744E649E, 0x99436EA6, 0x8B6EFD1D, 0xAB889238, 0xE744E6C9, 0x39E4664A, -0xE8D6DF91, 0x8A2889B3, 0x4E649EBC, 0x436EA674, 0x6EFD1D99, 0x8892388B, 0x44E6C9AB, 0xE4664AE7, -0xD6DF9139, 0x2889B3E8, 0x649EBC8A, 0x6EA6744E, 0xFD1D9943, 0x92388B6E, 0xE6C9AB88, 0x664AE744, -0xDF9139E4, 0x89B3E8D6, 0x9EBC8A28, 0xA6744E64, 0x1D99436E, 0x388B6EFD, 0xC9AB8892, 0x4AE744E6, -0x9139E466, 0xB3E8D6DF, 0xBC8A2889, 0x744E649E, 0x99436EA6, 0xC01D - -e = -1194 - -k = -40 - -ncb = -192 - -rv_index = -2 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_RATE_MATCH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1196_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1196_rm.data deleted file mode 100644 index 72be6f5d37..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e1196_rm.data +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_ENC - -input0 = -0x11D2BCAC, 0x4D - -output0 = -0xBC8A2889, 0x744E649E, 0x99436EA6, 0x8B6EFD1D, 0xAB889238, 0xE744E6C9, 0x39E4664A, 0xE8D6DF91, -0x8A2889B3, 0x4E649EBC, 0x436EA674, 0x6EFD1D99, 0x8892388B, 0x44E6C9AB, 0xE4664AE7, 0xD6DF9139, -0x2889B3E8, 0x649EBC8A, 0x6EA6744E, 0xFD1D9943, 0x92388B6E, 0xE6C9AB88, 0x664AE744, 0xDF9139E4, -0x89B3E8D6, 0x9EBC8A28, 0xA6744E64, 0x1D99436E, 0x388B6EFD, 0xC9AB8892, 0x4AE744E6, 0x9139E466, -0xB3E8D6DF, 0xBC8A2889, 0x744E649E, 0x99436EA6, 0x8B6EFD1D, 0x9038 - -e = -1196 - -k = -40 - -ncb = -192 - -rv_index = -3 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_RATE_MATCH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e272_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e272_rm.data deleted file mode 100644 index 883a76cf8a..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k40_r0_e272_rm.data +++ /dev/null @@ -1,33 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_ENC - -input0 = -0x11d2bcac, 0x4d - -output0 = -0xd2399179, 0x640eb999, 0x2cbaf577, 0xaf224ae2, 0x9d139927, 0xe6909b29, 0xa25b7f47, 0x2aa224ce, -0x79f2 - -e = -272 - -k = -40 - -ncb = -192 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_RATE_MATCH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e120_rm_rvidx.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e120_rm_rvidx.data deleted file mode 100644 index b3867f35f2..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e120_rm_rvidx.data +++ /dev/null @@ -1,63 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_ENC - -input0 = -0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, -0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, -0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, -0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, -0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, -0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, -0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, -0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, -0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, -0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, -0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, -0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, -0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, -0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, -0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, -0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, -0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, -0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, -0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, -0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, -0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, -0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, -0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, -0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, -0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, -0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, -0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, -0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, -0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, -0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, -0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, -0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0xfaa42c5f - -output0 = -0xd0d936d6, 0x870c26f3, 0x3f12805d, 0x4a6016 - -e = -120 - -k = -6144 - -ncb = -18528 - -rv_index = -1 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_RATE_MATCH, RTE_BBDEV_TURBO_RV_INDEX_BYPASS - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18444.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18444.data deleted file mode 100644 index dcad558788..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18444.data +++ /dev/null @@ -1,156 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_ENC - -input0 = -0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, -0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, -0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, -0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, -0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, -0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, -0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, -0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, -0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, -0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, -0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, -0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, -0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, -0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, -0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, -0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, -0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, -0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, -0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, -0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, -0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, -0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, -0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, -0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, -0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, -0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, -0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, -0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, -0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, -0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, -0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, -0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0xfaa42c5f - -output0 = -0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, -0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, -0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, -0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, -0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, -0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, -0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, -0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, -0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, -0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, -0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, -0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, -0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, -0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, -0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, -0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, -0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, -0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, -0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, -0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, -0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, -0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, -0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, -0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, -0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, -0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, -0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, -0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, -0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, -0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, -0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, -0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0xfaa42c5f, -0x4fde636c, 0x10ea20a0, 0xe6da8721, 0xbfde5b08, 0x9c3739da, 0xb6dc015a, -0x427db088, 0xdfdb8e6f, 0x756be6c1, 0x21f5297b, 0x06135665, 0xc1602b7d, -0x049536c5, 0xbbb3b801, 0x0cdb0c19, 0x7b2ad622, 0xfee8218f, 0xc5c7f123, -0x8abd3301, 0xa15b534d, 0x29dd2053, 0xd409abf9, 0x3ef19d6b, 0x70a3cbc2, -0x7a51423a, 0x4505b2ad, 0xdc74c75e, 0x068751a9, 0xb0b56437, 0x14a10371, -0x76af806f, 0xa8a47e19, 0x7c97a26e, 0x7998a3d6, 0xdc1ad1e2, 0xb532a301, -0xca8a3e7d, 0xd0aef374, 0x204990c0, 0xc7011aec, 0xa69151ea, 0x53390026, -0x7bf0d762, 0x735c2202, 0x64159e54, 0x5a3b1a56, 0x9ef1def2, 0x0ab8a961, -0x587b0886, 0xb8cc5975, 0x2a5a0f23, 0x069d05be, 0x9cc3c207, 0x40ef1a02, -0x4fae3f5b, 0x1f127aae, 0xd4e6d411, 0x17ac43ef, 0xe4bf891b, 0xfbb21765, -0x2c560c7e, 0x8561988c, 0x73a01032, 0x0cfef73a, 0x694c4991, 0x885d7a3f, -0x4218d1ff, 0xc2efaffb, 0xaf9d9715, 0xf76de6b2, 0xcce8e8ff, 0x370e3800, -0x493675eb, 0xd8fbcbda, 0xa5b382c2, 0x86c8f1ea, 0x3d724ea4, 0xb067034c, -0x6491d87e, 0x1a745ce4, 0xbb27180b, 0x1a2f0acc, 0xac4b7b3b, 0xe324578b, -0xc87928df, 0x9c1de566, 0x0ce2a17d, 0xaf2e13ce, 0x146a8659, 0x8727f6ae, -0xe2df7d03, 0x1a8e4cb4, 0xfa590976, 0x13a7c236, 0xc07489d0, 0xbe905e17, -0xafeb3d4b, 0x201e73f2, 0x5bdca12e, 0x3e15a852, 0xbcfc3271, 0x5d398410, -0x6bfacc15, 0x011fc61f, 0x43e43fd7, 0x0640717c, 0x96bfb3ff, 0x158eac19, -0x3b852e91, 0x74f9ceda, 0xcac71326, 0xfc0e312a, 0x20e8137b, 0xa1162611, -0x239ac7fe, 0xb9d00f8a, 0xea0b5241, 0x019f0d25, 0xc5153264, 0xb48a5547, -0xe54e339f, 0x17a6cca5, 0x5065af0d, 0x5ce648b9, 0xb457b342, 0xc1cb3f0e, -0x28d03c8b, 0x5144ed7a, 0xdb80779f, 0x53ce1b87, 0xbc071147, 0xbfe46c11, -0x7296785e, 0x83e4a63e, 0xc58982e9, 0x9538c5b9, 0xf14abaaa, 0xd915124c, -0x73540cd6, 0xe333696b, 0x58f9e00a, 0xd4dad10f, 0xc0de1420, 0x355e2bdc, -0xb2faa8fd, 0xbe6a12f1, 0x45d415cc, 0x47f5aed9, 0x4754e770, 0x2bb07385, -0x41374352, 0xf80beb47, 0xef02f35c, 0xc9c1b86e, 0x94b5785b, 0xba33123f, -0x7e39f0c9, 0x028a9286, 0x7d52c9f1, 0x06f04da6, 0xbc6a68d1, 0xfc70bace, -0x95b6a129, 0xfff224bb, 0x701ef3fb, 0x3309286f, 0x544ae8c1, 0xdca62c4a, -0xf8862ee2, 0xf9e3cd29, 0x2c07cce2, 0x8d93652a, 0xf47e4611, 0x4635f586, -0x1c03e0f4, 0x819724c7, 0x96b2a3f0, 0xeeb1ad95, 0xff08e517, 0xbd4ba6ed, -0x49ddb12d, 0x365734b5, 0x5edf7459, 0x2ee117a9, 0x067b9462, 0xb703685f, -0x72499876, 0xb71dd772, 0x5d02b478, 0x4b6fed1d, 0x2df232c1, 0x733eaaff, -0x1618c029, 0x0adda94b, 0xd271e560, 0xd120ba30, 0x6dfecc73, 0x4e751af7, -0x0e7a6b63, 0xa1ad5dad, 0xb41201b1, 0x245f3e86, 0x3a5114ac, 0x5cd532c9, -0x27ff9c3a, 0x7a847392, 0x6b2d0514, 0x82d0cc45, 0x0c779ba2, 0x8690f3ef, -0x0c058474, 0x47a8ee9a, 0xac4c2475, 0x496b67a5, 0x033f43f5, 0x6e6ce3c9, -0x644f5163, 0x8f4b92d9, 0x217798ee, 0x4b8e5368, 0xce751989, 0x7ab05365, -0xe227cee3, 0xf35e2851, 0x6f304c87, 0x1389c81d, 0x6ebc3989, 0x2b32ac3e, -0x59c5d111, 0xa8e8699c, 0xa5b15150, 0x8cacebe8, 0x40c2ede6, 0x71ea78c9, -0xa9e40f49, 0x58309eab, 0xd2eb879c, 0x54b9086f, 0xce206d93, 0x47e7087a, -0xac1e1dd9, 0x1d3a7bf1, 0x07d21fd4, 0x3a84a2a7, 0xe3ce33de, 0x55c94ddf, -0xd827c1ea, 0x3b4dcf5a, 0x7d5fbeb6, 0xd71ccdae, 0x516a9035, 0x33b3bee0, -0x61201364, 0xcf344f8d, 0x8c887934, 0x1998c127, 0xe24f1190, 0x75e8ea20, -0x8a379eda, 0x8a894b14, 0xa3d7c264, 0xa62b0119, 0x87f4d316, 0xecdc5f2b, -0xbc2424ec, 0x71169a71, 0x61aa2d5d, 0xb5f5f160, 0xc15a4969, 0xc5419315, -0xbf84483e, 0x2b1687c1, 0xd1aa06df, 0x22d5befd, 0x8b09b15f, 0xa88ffc01, -0xbb33617f, 0xb01a3e2e, 0x912a939c, 0xc649d802, 0xeba14b11, 0x3c902b57, -0xbcf35a8d, 0x45a964a1, 0x0c9416ef, 0xec9ae2d1, 0xc5e56fee, 0x88bfa336, -0x653cfe85, 0x92d21037, 0x96bc60e4, 0xf5317c1e, 0x5e7118f4, 0x91a9e04b, -0x43f0cfec, 0xb763dc3c, 0xad6bac40, 0x21685f69, 0x5e4d6f70, 0xd8d5a4c4, -0x15ed5efe, 0x3bbefa38, 0xbf7cf912, 0xb1427ffd, 0x652235ff, 0x927a7046, -0x8806625f, 0x56967b59, 0x6ec3dba6, 0x0ee31e0f, 0x25111a51, 0x091c763e, -0x1867732b, 0x28365594, 0xa589c975, 0x585b906f, 0xb85c4f20, 0xced98475, -0x52f29d16, 0x1ca0de39, 0xede3c4c8, 0xda808e91, 0x449784ab, 0xe3caf590, -0xabf23939, 0xe97f259a, 0x0a879f81, 0x5c6268ac, 0x0a4f1b62, 0xfe15825e, -0xbea5e6f9, 0x0d2db98f, 0xeec8cd64, 0x1747ddf5, 0x8b4f161c, 0xd236c9f6, -0x1a5b5a2f, 0x08918e6d, 0xdde43ad9, 0x8c316d0f, 0x7f1b3342, 0x3e385cee, -0x55ff6f87, 0x89bbe534, 0x67c23afe, 0x250dc97a, 0x06b3b332, 0x61a03930, -0x2ca17159, 0x3260c4f6, 0x3c810bde, 0x28d94372, 0xa9701f5a, 0x3880475b, -0x352ff389, 0x2bf653e0, 0xa4a6cc35, 0x4d211cfc, 0xeda0b37d, 0x14c0e6d8, -0xe457aaea, 0x1c6ed15f, 0x155d3b90, 0x7f43aed4, 0x289a98f9, 0x42246910, -0x62d047f5, 0x75714462, 0xe2c2a4df, 0x9dfc0f13, 0x03361f4c, 0xc55b5ca7, -0x9dd89720, 0x17376073, 0xfb6ee849, 0x280e697e, 0x57b24f3a, 0x2089b956, -0xa8baa602, 0x5b7ab88c, 0xd69f8b56, 0x64f80d52, 0x223427b9, 0xfd393c95, -0xb074 - -e = -18444 - -k = -6144 - -ncb = -18528 - -rv_index = -0 - -code_block_mode = -1 - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18448_crc24a.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18448_crc24a.data deleted file mode 100644 index 345d1410f3..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e18448_crc24a.data +++ /dev/null @@ -1,159 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_ENC - -input0 = -0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, -0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, -0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, -0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, -0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, -0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, -0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, -0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, -0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, -0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, -0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, -0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, -0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, -0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, -0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, -0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, -0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, -0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, -0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, -0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, -0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, -0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, -0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, -0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, -0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, -0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, -0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, -0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, -0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, -0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, -0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, -0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0x5f - -output0 = -0x11d2bcac, 0x7715ae4d, 0xc9f4dbc6, 0x2fda3c1a, 0x09349b16, 0x2cd3c189, -0xe5650429, 0xc73c42c1, 0xe7336bb7, 0xbb7de593, 0x83f986aa, 0xc0ade12e, -0x6730b095, 0x78f7c059, 0xaa907199, 0x75c323d1, 0x7061f9ba, 0x97e067bf, -0xc155cd55, 0x6a4cb08d, 0x4260e2fa, 0xff35e496, 0x37f251d3, 0x02fd9f9e, -0x6f53345c, 0x790cda6d, 0x3b8549e4, 0x56d0c6ea, 0x70a38006, 0xfff18223, -0x6f2035b5, 0x6cf508d3, 0x98a0a308, 0x432353fc, 0x0eb818eb, 0xdd9a128b, -0xf92431b2, 0xad788286, 0xda07d5de, 0x44b4b3a8, 0xbe62fd67, 0x61a4eb54, -0x90d7ac9f, 0xc4d9a930, 0xfddc3c24, 0xf5e3b1c8, 0x38143538, 0xcb1d3062, -0xcae36df3, 0x50a73437, 0x542dcab7, 0x875973a0, 0x34690309, 0x49cb1ddb, -0xf8a62b92, 0x82af6103, 0xc9f8c928, 0x3835b822, 0x16b044a6, 0xdae89096, -0xa5be47d4, 0xaf61189e, 0x5cd70faf, 0x037331cf, 0xef7fa5f6, 0xb2f2b41a, -0xa6f222c6, 0xdb60fe4c, 0x2a857a9a, 0x0b821f9d, 0x348afd17, 0x7eecbaeb, -0x92bb9509, 0x8a3cec24, 0xd02549a2, 0x155ffa81, 0x2b7feac6, 0x3ee461e7, -0xc981f936, 0x89b544c7, 0x9a431e36, 0x62511734, 0x769f9647, 0x211a747e, -0x567abef4, 0xad87e2b4, 0xa3e0c3bf, 0x6d325dd5, 0xf561cc46, 0x39925735, -0x3d8abbfd, 0xc3724c88, 0x8bdf03c9, 0x1b02a12a, 0x4f233a0c, 0x9ca9444a, -0xc5d1f7e6, 0x4d995f37, 0xd9aefb32, 0xd0465248, 0x0f3a3b21, 0x62ea8c0c, -0x91f8d54e, 0x5cf75514, 0x14618a01, 0x8fe9b87e, 0xf2b424f9, 0x49724ce2, -0xa1464587, 0x5e00dc83, 0x59475455, 0x444119b1, 0x4fb9f036, 0x65fcbc1a, -0x1c63a990, 0x767a6114, 0xb0ede06a, 0xcfb91ae3, 0x7874af5f, 0xf78772a3, -0xa2932c81, 0x77f2759d, 0x930dc8f1, 0x95ce14a5, 0x134363ee, 0x61ee143f, -0xf0034b35, 0xfdc75fce, 0x3be2dcf3, 0xff3a07eb, 0xdc43f0eb, 0x23ba73bb, -0x45f7649e, 0xcacc297c, 0xa3dd98db, 0x058d46a9, 0x6bcfc154, 0x7be8e1e6, -0x618a4754, 0x8d193c46, 0xba39e1ce, 0xc3b85cfc, 0xd80d853b, 0x38d6440d, -0x9c1a6185, 0x90c9dfcb, 0x01c6e841, 0xeedfe6ac, 0x7b61a3ae, 0xad3924dd, -0x514bc1a8, 0x6ed60d7e, 0x1b74b79b, 0xea295947, 0x5f9a5d33, 0xcd24311f, -0x0bd3d10c, 0xd214ecfe, 0xcb37035d, 0x8ce95168, 0x7020cb52, 0xe432107d, -0x042d63ac, 0x6201c8dd, 0x4bea65a2, 0x1a3cf453, 0x5b8e868d, 0x3d653bb0, -0x24c1967e, 0x37f183a9, 0x3700e703, 0xb168a02b, 0x2592cd82, 0x5c0cdb66, -0x70b64ebd, 0xf8dcb9a7, 0x634a8335, 0x06642398, 0xfe2f4497, 0x2e775256, -0x30f85cbe, 0xf4d2fdaf, 0x46ca6c9d, 0x022097d6, 0xcedeb03e, 0x3d8353bc, -0x0d005559, 0xd457eb38, 0xb1931313, 0xd4f12824, 0xcc444f1b, 0xa533d85f, -0x4fde63ac, 0x10ea20a0, 0xe6da8721, 0xbfde5b08, 0x9c3739da, 0xb6dc015a, -0x427db088, 0xdfdb8e6f, 0x756be6c1, 0x21f5297b, 0x06135665, 0xc1602b7d, -0x049536c5, 0xbbb3b801, 0x0cdb0c19, 0x7b2ad622, 0xfee8218f, 0xc5c7f123, -0x8abd3301, 0xa15b534d, 0x29dd2053, 0xd409abf9, 0x3ef19d6b, 0x70a3cbc2, -0x7a51423a, 0x4505b2ad, 0xdc74c75e, 0x068751a9, 0xb0b56437, 0x14a10371, -0x76af806f, 0xa8a47e19, 0x7c97a26e, 0x7998a3d6, 0xdc1ad1e2, 0xb532a301, -0xca8a3e7d, 0xd0aef374, 0x204990c0, 0xc7011aec, 0xa69151ea, 0x53390026, -0x7bf0d762, 0x735c2202, 0x64159e54, 0x5a3b1a56, 0x9ef1def2, 0x0ab8a961, -0x587b0886, 0xb8cc5975, 0x2a5a0f23, 0x069d05be, 0x9cc3c207, 0x40ef1a02, -0x4fae3f5b, 0x1f127aae, 0xd4e6d411, 0x17ac43ef, 0xe4bf891b, 0xfbb21765, -0x2c560c7e, 0x8561988c, 0x73a01032, 0x0cfef73a, 0x694c4991, 0x885d7a3f, -0x4218d1ff, 0xc2efaffb, 0xaf9d9715, 0xf76de6b2, 0xcce8e8ff, 0x370e3800, -0x493675eb, 0xd8fbcbda, 0xa5b382c2, 0x86c8f1ea, 0x3d724ea4, 0xb067034c, -0x6491d87e, 0x1a745ce4, 0xbb27180b, 0x1a2f0acc, 0xac4b7b3b, 0xe324578b, -0xc87928df, 0x9c1de566, 0x0ce2a17d, 0xaf2e13ce, 0x146a8659, 0x8727f6ae, -0xe2df7d03, 0x1a8e4cb4, 0xfa590976, 0x13a7c236, 0xc07489d0, 0xbe905e17, -0xafeb3d4b, 0x201e73f2, 0x5bdca12e, 0x3e15a852, 0xbcfc3271, 0x5d398410, -0x6bfacc15, 0x011fc61f, 0x43e43fd7, 0x0640717c, 0x96bfb3ff, 0x158eac19, -0x3b852e91, 0x74f9ceda, 0xcac71326, 0xfc0e312a, 0x20e8137b, 0xa1162611, -0x239ac7fe, 0xb9d00f8a, 0xea0b5241, 0x019f0d25, 0xc5153264, 0xb48a5547, -0xe54e339f, 0x17a6cca5, 0x5065af0d, 0x5ce648b9, 0xb457b342, 0xc1cb3f0e, -0x28d03c8b, 0x5144ed7a, 0xdb80779f, 0x53ce1b87, 0xbc071147, 0xbfe46c11, -0x7296785e, 0x83e4a63e, 0xc58982e9, 0x9538c5b9, 0xf14abaaa, 0xd915124c, -0x73540cd6, 0xe333696b, 0x58f9e00a, 0xd4dad10f, 0xc0de1420, 0x355e2bdc, -0xb2faa8fd, 0xbe6a12f1, 0x45d415cc, 0x47f5aed9, 0x4754e770, 0x2bb07385, -0x41374352, 0xf80beb47, 0xef02f35c, 0xc9c1b86e, 0x94b5785b, 0xba33123f, -0x7e39f0c9, 0x028a9286, 0x7d52c9f1, 0x06f04da6, 0xbc6a68d1, 0xfc70bace, -0x95b6a129, 0xfff224bb, 0x701ef3fb, 0x3309286f, 0x544ae8c1, 0xdca62c4a, -0xf8862ee2, 0xf9e3cd29, 0x2c07cce2, 0x8d93652a, 0xf47e4611, 0x4635f586, -0x1c03e0f4, 0x819724c7, 0x96b2a3f0, 0xeeb1ad95, 0xff08e517, 0xbd4ba6ed, -0x49ddb12d, 0x365734b5, 0x5edf7459, 0x2ee117a9, 0x067b9462, 0xb703685f, -0x72499876, 0xb71dd772, 0x5d02b478, 0x4b6fed1d, 0x2df232c1, 0xb9dea0ff, -0x1618c046, 0x0adda94b, 0xd271e560, 0xd120ba30, 0x6dfecc73, 0x4e751af7, -0x0e7a6b63, 0xa1ad5dad, 0xb41201b1, 0x245f3e86, 0x3a5114ac, 0x5cd532c9, -0x27ff9c3a, 0x7a847392, 0x6b2d0514, 0x82d0cc45, 0x30779ba2, 0x3f0c8156, -0x9bce6106, 0x3511b2b4, 0x82dbef90, 0xac19def9, 0x5f11d43e, 0xa5899170, -0xdd137ff4, 0x188077ab, 0x53cec4c0, 0x6519988d, 0x2b07a0d5, 0x269ec4ae, -0x29c2bc5a, 0x4a0206c6, 0xf8fba9f5, 0x61309433, 0x402bf26c, 0xce401562, -0xf7eb46da, 0x4d9ad0c0, 0xf99fc69b, 0x1b670e56, 0x327bb1c8, 0x5f7db32c, -0x4c96b615, 0x041e0960, 0x190ef525, 0xede526f8, 0x59eb88e1, 0x355e5454, -0x8289d63c, 0xf848c2ad, 0x5bfc881f, 0xf161d01e, 0x5a921d49, 0xc202a8ad, -0xaa9e9dc4, 0x8211e14d, 0xea945bc4, 0xa5a59180, 0x7ffd5bd0, 0xd6c107bc, -0x3d0e84af, 0x04d13d34, 0xa21f54a3, 0xfcea787b, 0xbe61865b, 0xbe0d9899, -0x336bb04d, 0xf843ae66, 0x8d400981, 0x4359b845, 0xdbda44dd, 0x27392d92, -0x05780a7b, 0xe6dd7f03, 0x13137173, 0x9b623a85, 0x2428f035, 0x996f04de, -0x74613a87, 0x924aa956, 0x4661e3ad, 0x506ce2d3, 0xa59e7aba, 0x34fd455d, -0x70d613c6, 0x094610b9, 0x06e176ee, 0xb4f0842c, 0xc53680f4, 0xd9e2920b, -0xe0ddcd46, 0x8e4c1618, 0xb5c83878, 0x7b5107a3, 0xb75c33c0, 0xa62868d3, -0x804e47d9, 0xcefc87fc, 0xca5e125d, 0x3ed40ea7, 0xe72d3663, 0x06620539, -0x314993c2, 0x99f417d9, 0x4819151c, 0x7d46c8a2, 0x95a81dc9, 0x61898a53, -0x8226bb8c, 0x4907a616, 0x91eb32f7, 0x5430c6a1, 0x390ca234, 0x599f02ff, -0x315a4cc8, 0xc15d9e2b, 0x1c7a8788, 0x2074d5ea, 0xc063a30d, 0x5532e1f5, -0xd3820192, 0x916a7b03, 0x32422c07, 0x2ae2cc41, 0x96cb84c5, 0x2bab3d29, -0x0edc0add, 0x408e4981, 0x2606b671, 0x63dca006, 0x8f4261d9, 0xbfe4623b, -0x60174b80, 0x50230b0d, 0x9d4c7af3, 0x2edb3482, 0x24d8d087, 0x1b673b02, -0xe28b7132, 0xc6c8cb36, 0x5794e3f3, 0x808c3887, 0xf9f64a32, 0xfca10213, -0xff29e373, 0x54bf19a6, 0x16014860, 0x356d4398, 0xe8d0d630, 0x4c8100c0, -0x7b68a462, 0x6cc95c68, 0x3becad35, 0xb2c6b4c3, 0x740aef1c, 0x4f37f2d5, -0xc9d3c805, 0x6e4e533d, 0xf7647967, 0x91856de5, 0x87e7e428, 0xddf2fe07, -0x69016442, 0xe0132159, 0x1afae2a2, 0x63b6d719, 0x08d20a21, 0x48ee7113, -0x2fb2d853, 0xa532ffc8, 0x8296dee2, 0x0dfaf2fa, 0x060d531c, 0xa756d04c, -0x3efed03e, 0xbe9436db, 0x5b9e8a48, 0x0a37ea61, 0x718f4362, 0xebcc9742, -0x78aa2e7c, 0x4b19f7b8, 0x308b9af0, 0x915247e9, 0xc079aa48, 0x5230e578, -0x862d6de7, 0xbe0801d0, 0x8ab11c9d, 0xaf1d7feb, 0xe9d15530, 0x44651202, -0xc006 - -e = -18448 - -k = -6144 - -ncb = -18528 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_CRC_24A_ATTACH - -expected_status = -OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e32256_crc24b_rm.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e32256_crc24b_rm.data deleted file mode 100644 index 9ce68b7231..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c1_k6144_r0_e32256_crc24b_rm.data +++ /dev/null @@ -1,180 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_ENC - -input0 = -0xe5e0a392, 0x6f5468f1, 0xc8f1c505, 0x4502caf2, 0x23df5578, 0xc2f29afe, 0x06838d34, 0x264eab9b, -0x1e97c133, 0xabad27aa, 0x684fa9b4, 0x0fed735e, 0x6ab6bcad, 0x9c3e401a, 0x66a63035, 0xa72f7f6b, -0x509d2953, 0xf03c574a, 0x48f12185, 0x27318395, 0x008fc1ce, 0x7efcf19d, 0x0120de12, 0x6ed28bff, -0x2044547a, 0x04d95124, 0x6baf2e1e, 0x60d93509, 0x299aa27f, 0x8b67d93a, 0xc33d9631, 0xe468dbe1, -0x1a82d0b6, 0x8ee2ff7b, 0x39298170, 0x33a90b6a, 0x273d17f7, 0xb4368615, 0x60c390b8, 0x24696570, -0xa1f4abcc, 0x08b68dd0, 0x91f8c883, 0xc9ceed85, 0x6467da9b, 0x48dfae24, 0xf4ff4992, 0x8c8200cf, -0xaac02792, 0xf506f71d, 0x096df98a, 0x3074be38, 0x9b675626, 0x4ccace33, 0x50f0f60d, 0xf4b59cc4, -0x748a8799, 0x9032c151, 0x1fb945f6, 0x01bd098a, 0x90a7907b, 0xe086172c, 0x7ed3dc8d, 0xea0dd126, -0xf9b35bc1, 0x8ad4e233, 0x37b5e1a1, 0x95bf8c3a, 0x9d288b43, 0x23a860f1, 0x4e993fc3, 0x3c774bd4, -0xe411be48, 0x22ab80c7, 0x9dd09a47, 0xc9e6988e, 0xb4cbf0b2, 0xb9e2a389, 0xf1494438, 0x2c87638b, -0x892468ec, 0x7915d1aa, 0x4d9cb9c4, 0x643a388e, 0x48c4358f, 0x937ad5a1, 0xdae53508, 0xa1305607, -0xbfb63a5c, 0xb4bb9324, 0x71daab0b, 0xa582346b, 0x0e5402e1, 0x75af83e7, 0x2b241b17, 0xfa17aca1, -0x9637cb2e, 0xc61fe511, 0x093934f7, 0x4b703b44, 0x992ab229, 0x4ddc99b5, 0xe2be6b60, 0xa2217861, -0x8f621931, 0x272c0ec6, 0x23a4d5b2, 0xc6f4e002, 0xb76397c0, 0xc00e3c01, 0xb89d29b3, 0x5e9bc984, -0x00391d56, 0x55fae02f, 0x4bc4bc9d, 0x9a147b22, 0x0fb492ed, 0x753dc9a6, 0x9f493eec, 0x6e135dc2, -0x0eeca515, 0x1c1512f9, 0xb88075e3, 0x326a97f0, 0xc755faf5, 0x06b7961b, 0xbd50fd69, 0x5f071c92, -0x2806c099, 0xe364f4ab, 0x2c4a114a, 0x7655b100, 0xf5e66750, 0xf9212705, 0x245e3b8d, 0xb0f1fb0d, -0xd7be9558, 0x27030e24, 0x9ea9b62e, 0xbde9be45, 0xce0adae6, 0xc28780a4, 0x1664ccde, 0xa7a62e3f, -0xa4f8ec00, 0x964e813c, 0x108c95e0, 0x097fe10b, 0x08da3505, 0xde413158, 0x046a31c0, 0xd9cdd804, -0xdfbdff9a, 0xfd77493f, 0xdffb2388, 0xe2ffa111, 0x29eb6ac7, 0xf9e1ac68, 0xc2ed68c7, 0x34d65405, -0x25f187ba, 0x3df23a2c, 0x96a2a5a9, 0x2bef4b26, 0x28d1c41d, 0xf380c0f1, 0xc4d5456e, 0x6b699c28, -0x0aafd6b3, 0xf88f3078, 0x114438d0, 0x93836544, 0xebd5767d, 0x9185b5c2, 0x593e4fe7, 0x29d3348c, -0x881f16c4, 0x77e33d03, 0x6794bbf5, 0x6b6c38f3, 0xa860673a, 0xb1d2d152, 0x08f9f310, 0x82c37500, -0xce0ae34c, 0xd5478e86, 0xcfe1adfc, 0xfaf06d37, 0xf7e21bfc, 0x3b077287, 0x45b33c08, 0x41 - -output0 = -0x25832957, 0x1235fe50, 0xa3b0b09b, 0x0bb7c797, 0xce815b03, 0x7b702251, 0x2c25fc60, 0x23ac55e0, -0x8bea35cb, 0xe33b833c, 0xec1d38a4, 0xb59acb59, 0x0f1fa8b7, 0xcb77fce6, 0x6564fc78, 0x9e6c39cc, -0x94f1bed1, 0xe02684ad, 0x074045a4, 0x4dc9b344, 0xd187bed8, 0x2a129ecb, 0xf6c5bd4d, 0xf98d5c26, -0x78addaae, 0xbe87f7d2, 0xf42a7df6, 0xa4683306, 0xbfa9b509, 0x3a67ddfe, 0x013d68d5, 0xb2a1fb8a, -0x0dfc5da7, 0x792f6b24, 0xaa220ec2, 0x6cb0a7a4, 0xd6e5ea4a, 0x1cd6156c, 0x9bac3cad, 0x926a3950, -0x658815b0, 0x2a2e4349, 0x9684d70f, 0x67a62f63, 0x7a8aae48, 0x8aa046e5, 0x3cad66d5, 0xe7e269b8, -0x95a9a8ca, 0x426f46ae, 0xf780d265, 0x2e0d244d, 0x5480bc07, 0x66554568, 0x938aeda7, 0x1144006c, -0x450320b3, 0xce9dfce9, 0x59a277a8, 0xde38cc1a, 0x1cd2bd60, 0x0079ca20, 0x58dd4633, 0x55398bbd, -0x5fcf982f, 0xdbbd3e30, 0xdcaab5e4, 0xc368c59f, 0xfba8e7d2, 0x9902b581, 0x2ec0a87f, 0x0ebea4ee, -0x13bb2fd2, 0xbc1df5be, 0xe34baa5e, 0x4a66fc5d, 0x7fc9d926, 0x1d2dc178, 0xe780752f, 0x160e82fd, -0x2e6205ba, 0x3d2fd1d7, 0x22b03620, 0x1c1ce57b, 0x5a8f8e09, 0xc9522523, 0x712e5cc0, 0xa27b10ad, -0x52d2df01, 0x3fe886d6, 0x29f37f12, 0x479e3783, 0xa37a445c, 0x338f9df1, 0x74dca176, 0x11acbbc4, -0xac50920a, 0xe9375593, 0xc483a084, 0xed281b58, 0x21ea3cd3, 0x5cf2e76a, 0x50c5e5f4, 0x68d14253, -0x374cea8e, 0xf3533631, 0xb8f1bece, 0x3a188078, 0xb15325de, 0x989b4e70, 0x40f142f9, 0x4a55cc30, -0x72a442b2, 0xe583a6c7, 0x4cb90a7d, 0xe19187c0, 0x899ea4e0, 0x42598555, 0x7d012357, 0x3e9cd281, -0x75094cbb, 0x80afef50, 0x8a834f90, 0xa6182605, 0xdfb7c49e, 0xde57caf6, 0x62720457, 0x5a40705e, -0x2728f823, 0xde22d20c, 0x8389268a, 0x2aad9f81, 0xa376314c, 0xd9288769, 0xa7a1cc5d, 0x1dcdb0ed, -0x0b23e2d8, 0x024e9165, 0x0e375ea5, 0x27c561c7, 0x48687976, 0xe97021bc, 0xbf82aea2, 0x6cb87bd3, -0xaa3f7ed5, 0x1e5c3aaf, 0xccad60b5, 0xb672d5da, 0xde0ff047, 0xf7cd4216, 0x45220a3b, 0x060d16c7, -0xb6dc8617, 0xc10d9dc7, 0x3d229a69, 0x8deea79a, 0xda6883e1, 0x610f41f9, 0xfa0f57f0, 0x6f97b547, -0xf00577ee, 0xe1be3d28, 0x809810e0, 0x7d4b8416, 0xdcc82557, 0xce6a01b1, 0xbc4cb663, 0x8bc88eac, -0xab9e918d, 0x6ec29c41, 0xbd0e745e, 0xa97bc23e, 0x1e1370c2, 0xc2744139, 0xf5d2f67b, 0x9d5ae9dd, -0x1040a10a, 0x1b54944c, 0x9a6810b1, 0xc7079d11, 0x8c89d60d, 0xc9523c76, 0x304b7adc, 0x2fd915eb, -0x076192e8, 0x8cbd3bc1, 0x90440a9c, 0x81961a26, 0x6a53f026, 0xd2b07ce5, 0xc72e767a, 0x9d47c3d9, -0xab2b7cb3, 0xf4b3aeec, 0x18441c12, 0x56b3007f, 0x81c3cfff, 0x128b72ed, 0x214dee41, 0xc735baeb, -0x89cf54e7, 0xcdfce851, 0x77cc0a00, 0x57cc6e0a, 0x7ffc8dad, 0xb036445b, 0x0699a9f7, 0x8781d7b5, -0xdd0f9d01, 0x43f01de8, 0x6a2e7dee, 0xf802d6b3, 0x10094fc1, 0x954cf6ad, 0xd7aee91a, 0x1e3369c8, -0x2acd8c15, 0x3303a61d, 0x79344e4d, 0x1253cd91, 0x34c34c77, 0xbd075dce, 0xe0fdd1cc, 0xf9015c56, -0x931b9096, 0x604f4bbf, 0x3b1d991a, 0x24007891, 0x7c0c1709, 0xe0d43230, 0x11821166, 0xf21e2558, -0x2c37009d, 0x98718786, 0xa9a112e6, 0xd7e20b10, 0xfe917f72, 0xb76101ff, 0x42a8d327, 0x9039f71b, -0x6d1628cb, 0xfd01251c, 0x6f0572a2, 0xb36a7e7a, 0x2b1a4556, 0xe679b027, 0x313573d0, 0xb5f7c20c, -0xc8d1530a, 0x338e756e, 0xe6befc47, 0xfe12dccd, 0x6ad1e5b7, 0x40b078ff, 0x96aaacba, 0xedfdeb8f, -0x8da3673a, 0xc965882e, 0xa4dec6e9, 0x7bace08f, 0xf144852a, 0xd5d787d0, 0x204d32e6, 0x733098aa, -0x12f3a53a, 0xe060086d, 0x3ab1739a, 0xd391e860, 0xc23d9687, 0x0d3a84e0, 0x855ea4cf, 0x0d0ea5b7, -0xfd082430, 0x70df7cb4, 0xe712f026, 0x84ce32ac, 0x67b04602, 0xac0b1faa, 0xed119dcd, 0x184afb0b, -0x9abbefd2, 0x41b3e2f9, 0xe18d5703, 0x6e5f4de7, 0xb47380a2, 0x239a3714, 0x810bb522, 0x5ad95c77, -0xe4b37e0c, 0x1cc200a6, 0x404c4390, 0x90533af1, 0xb49f2403, 0x1dada65f, 0x96f86d1b, 0x58f679a9, -0x1fe3c66d, 0xcc5eb28d, 0x504b7aff, 0x7c18a397, 0x47ad4d5f, 0x348f12c5, 0x80bac6e0, 0x47bb3c74, -0xccf16f02, 0xa932a5af, 0x51ebb452, 0x25808fcc, 0x47d14a43, 0xf0c2a0af, 0x30f938b5, 0x428420c7, -0x61a66d9c, 0x082caa4f, 0xd9c74e3d, 0xb4d161b9, 0xb409f331, 0x14245a44, 0xddb67f1e, 0x1018c62c, -0xc1e58e6d, 0x4ba86bd6, 0xf4a282aa, 0x4a85f90d, 0xbf0efb7b, 0x03706f08, 0xbe06a5f2, 0xe37f45f1, -0xcbc4001c, 0x14decb05, 0xf3c6050f, 0xd1df33d7, 0xdab729c7, 0x8898dad3, 0x4a44a313, 0x30bee51e, -0xd67b07ef, 0xf233eb19, 0x4c52bca3, 0x5d824a4b, 0x275faf2b, 0x428f8a95, 0x03f70c8b, 0x609e4036, -0x59ce2147, 0xc7eecc6b, 0xa22d21c2, 0xc5764d9a, 0xb4524bc6, 0x6d9bdfc9, 0x0918b4f7, 0x62bb8022, -0x7a98bdcc, 0xc963131d, 0x949036b8, 0x649ae51d, 0x93038d33, 0xe26cb45e, 0x4813516a, 0xc06c759c, -0xfa6a9793, 0xdd59c686, 0x37b4b5b0, 0x66a02fac, 0xde159ecf, 0x90cdb66e, 0x1c9f7f94, 0x3a31f69e, -0xcd93bc45, 0x32744ee0, 0x0f6ae2b1, 0x3bc9e963, 0x8cddbae4, 0x8f9517ff, 0x7d304ec1, 0x344e0357, -0x7cd2ed30, 0x1f9fa3a4, 0x9dbeb67b, 0x59253b51, 0x41b6911a, 0x12b574af, 0x62a777da, 0x9a6c834a, -0xaa16081d, 0x3f105c37, 0x6eac5dc0, 0x76e56fd1, 0x67bffbfb, 0xce069b80, 0x8fe970b1, 0x61945ee0, -0xaf9d44c2, 0xf2cd16cc, 0x07a768c5, 0xd6eecaa6, 0x6e8ce063, 0x4b30b443, 0x360822c9, 0xa6442b33, -0xf02d09a0, 0x22056421, 0xc552aa94, 0x1346ea1a, 0xab6c54a1, 0x35a69bdf, 0xfc6095ea, 0xbde0d55a, -0x1b433ec0, 0x137483a0, 0x8c1cb29d, 0xf2bc4e17, 0x45df6882, 0xbd702bc9, 0xabbead61, 0xc97ef61d, -0x01b68438, 0xbdd10231, 0x2e046323, 0x80e619bd, 0xa5126a2a, 0x74106e0d, 0x9e57b499, 0xcb275127, -0x9e01f21e, 0xbaf4a744, 0x38604f7e, 0xa85493d6, 0x9a4b4541, 0x3f397269, 0xdde71734, 0x157dfe98, -0x40334ad9, 0xc889f52f, 0xbddf4d23, 0xd2200018, 0x2a4b7180, 0x8a1a357f, 0xcd6af7e4, 0x1426b52b, -0x2a45481f, 0xfc38394c, 0x05123e4e, 0xa0215834, 0xe2c2306e, 0x4ee9fe1a, 0x6bbbf30c, 0x19a39072, -0x846b0bdf, 0xde4ef7f9, 0x47f1d67c, 0xf507e9e8, 0x14c1f617, 0xaa756ccf, 0xececc02a, 0x183cd616, -0x9d4bac81, 0xd959d1ea, 0xefb81e2b, 0xd8ca27fc, 0x5c7e9eb4, 0x64d5d550, 0x32ed3c41, 0x8f62e8a8, -0x5e2b65c5, 0x0a7e5e1b, 0x88abb657, 0x781ee74a, 0x840c27fd, 0xec83df4c, 0x163acaf0, 0xb2649960, -0x2a706f9a, 0x5226c811, 0x5bcb501c, 0xb87caa99, 0xecb4a37e, 0x8927c424, 0xfea9ac62, 0x17da41d1, -0x571c5987, 0x4217ea55, 0x5043b664, 0x18fb3ece, 0xfb2d13b9, 0xb6599d4b, 0xbb8a536d, 0xa719683f, -0x81cc2d0f, 0xc888f1d3, 0xccb0a428, 0xd2cdff48, 0x0b3440e6, 0x45700619, 0xcea80987, 0xa5ad1cc3, -0xd29deaf7, 0x4a8c95af, 0x9ac63a98, 0xf46d26b0, 0xf9a09352, 0x5f8b3fb7, 0x367c8da1, 0x3244b6a2, -0x9634b973, 0x27292ae5, 0xc4f7ae33, 0x9b73a4f7, 0x086a8bb4, 0x616cd17b, 0x74fdb210, 0x5f483d60, -0xf7666630, 0x107cd026, 0xfa2a4a07, 0x171b319e, 0x509d50c8, 0xf2d15061, 0x981d5759, 0xf23bc5c6, -0xe9befe22, 0x1e784009, 0x7cda3751, 0x1c5b2b69, 0x3ba09115, 0x756f1ef5, 0x2b47353b, 0x553a33d9, -0x1f029262, 0x6393d0ee, 0x97e01180, 0x0c53980c, 0x5da79e34, 0x1e0b53c4, 0x06a9f2ba, 0x622181b0, -0x4898ac50, 0x874c780e, 0xf8cc5072, 0x4a5a63ca, 0xf6dea6a2, 0xc3134004, 0x4505bae6, 0xc3f4b638, -0x0dda8e07, 0x0c4135bf, 0x61e80f25, 0x4b31a76c, 0xd91f0d09, 0x4ba0d577, 0xc95d0086, 0x21a61725, -0x16862c1f, 0x9588795d, 0x6ecde7c4, 0x353288cd, 0x94e4647e, 0xeceaba51, 0x7c602ff8, 0xbba48cef, -0x6556c6bf, 0xde912190, 0x86602d55, 0xf549554a, 0xd4d52081, 0x9728c5db, 0x7d09e129, 0x068008ab, -0x353a6ea4, 0x90b44e4e, 0x5c97a08a, 0x6293b3c7, 0xa3e4114b, 0x7ce44646, 0x8f2b0269, 0x291ca1bb, -0x98721528, 0xe30f5532, 0x0bbb2951, 0x7b7c390a, 0xb835b070, 0x2712e51c, 0xc20fb607, 0x5a05ce52, -0x5eb33cc2, 0x33c8b3a8, 0x81433abe, 0xb99cc5de, 0x817a5bab, 0xc76ffef0, 0xc68fb77c, 0x96c35c46, -0xef1bedc9, 0x42d84a19, 0x54440a6e, 0x3c4b7400, 0xe88bdd94, 0xe1b91c7d, 0xdcdba422, 0xc865625f, -0xaaed9adf, 0x782f8dd7, 0xd267ef7b, 0x366340af, 0x5a9b408a, 0xd6edff9b, 0x8356ad73, 0xbaaf18d0, -0xdf752a1b, 0xb246d2c0, 0xe2209cf7, 0x7b4aaa2a, 0xaeaec406, 0x5dc1665d, 0xcad3ca61, 0x9603b5c9, -0x58012ba9, 0x32945486, 0x78fda0e2, 0xfa326649, 0xe88a7466, 0x6a54aea7, 0x6a56ad08, 0x9e86cbd3, -0x8aaa7c2e, 0x66e45a99, 0x285d26f4, 0x40d2740f, 0xc87be0d2, 0x55844605, 0xd87e6a56, 0x04c036a9, -0x00321b41, 0xc99f5e34, 0x7a87eadc, 0xc3ac9125, 0xdd0be68d, 0xa70cc221, 0x6d340390, 0xb3d88bd5, -0x8cf95295, 0xeb03f3f5, 0x5a4bbedd, 0x56fcc9ad, 0x7a2e3d8c, 0x501bb88f, 0x8cfa9729, 0x4beaee02, -0xfb22ede0, 0x51ef3bb1, 0xa4eac5db, 0xc6df35be, 0x9c6da264, 0x128cf797, 0x58f7d2d1, 0x20d87f0e, -0x56a06be1, 0x127ded22, 0x6b03d2f3, 0x51be2702, 0xe898c0c1, 0x5532a2f5, 0xc2059c2c, 0x07d11ae7, -0xfd1d20ba, 0x6e682d25, 0xff27f183, 0x79339832, 0x47c475e4, 0xd8193faa, 0x1d6a37f3, 0xba4b4cc7, -0x25a910c1, 0x5335c90a, 0x084a987e, 0xb281453c, 0xce33dd8e, 0x7fae16a2, 0x5c4ecf25, 0x2d340555, -0xa4ee8816, 0x651373c3, 0xefeb3c3f, 0x0188871b, 0x55e2ad83, 0xe904173b, 0x2f948fb9, 0xc50c0314, -0x2a24ab54, 0x687a2c47, 0xabd0573e, 0x7908cc94, 0x490a1e1e, 0x555895e8, 0x30722594, 0x291dd817, -0xc0b4ebc3, 0xfa0e5597, 0xf80409f8, 0x6152a038, 0x4bec698a, 0xa56cff7d, 0x4770e57d, 0x04e72526, -0x823fa205, 0x22cd7082, 0x68a2e82d, 0xfa193898, 0x17c3a4d2, 0x7298366a, 0xcadc958d, 0x0cdb7e1a, -0x228eddd1, 0x1459b630, 0xe3552ae0, 0x1c76ec70, 0x96677752, 0x17c28b84, 0xe82a9a0e, 0xbb37fd2b, -0xe357cd86, 0xa5f3aafa, 0x0a56ebc1, 0x57adcddc, 0x007f642b, 0x2c64e1fd, 0xa2b073df, 0x60715c24, -0x6d7861d0, 0xd0796ccb, 0xa29916dc, 0x7eaad923, 0x3618dee8, 0x1094af8d, 0x70051ff6, 0x597ba4ff, -0x70e7fe76, 0xdb83025f, 0x09011eee, 0x44680188, 0x5c72d5b7, 0x1610cb8d, 0x643be6ac, 0xecc8cacb, -0x19d9b888, 0xcc19b4ea, 0x40e7e526, 0x27ecd3eb, 0x01279cba, 0x1794e331, 0x6dbf274c, 0x95de5d2f, -0x14aad0a9, 0x45c90401, 0x0611bb41, 0xd019a189, 0x68dd707c, 0xc563c798, 0xa4c79d2c, 0x5db10eb3, -0x2689fe92, 0xbb137c10, 0xa4c0c9d8, 0xa9610249, 0x056f1268, 0xcb57ae36, 0x62a7270d, 0x349c7dec, -0xc237db79, 0xebcabeba, 0xc421413f, 0x0bf08741, 0xfcfc6f35, 0x28d71e38, 0xe41e24b1, 0xa3bb1ed2, -0x4c757e5c, 0x8f1e95f8, 0xac00d0cc, 0xeca670c7, 0xdfd87ac5, 0x43b4f5c7, 0x997a0f6b, 0x785d6b90, -0xd0197018, 0xdf81defd, 0xd2e73e04, 0x603dabe6, 0xf0148c2f, 0x64df0a91, 0x9aae51c9, 0x93867ced, -0xcc58e131, 0x60daa1d2, 0xe3d43433, 0xd51c9947, 0xcc742731, 0xd0e54c33, 0x1fcddc7b, 0xc06505de, -0x0169991f, 0xb4f43bb9, 0x91a901f6, 0x8017b9d3, 0x70914002, 0x2d03c3c7, 0x1861064e, 0x51821521, -0x03d029ef, 0x7768c872, 0x2a618e19, 0xbe00911a, 0xf927772d, 0x16f0ef1f, 0x3a7d721b, 0x73bf2184, -0x81b20c99, 0x50c2d166, 0x2027da1f, 0xe6a7f756, 0x516435ab, 0x077bb2a2, 0x33076d9e, 0x2fcc1053, -0x3da5507b, 0x58e7861c, 0xcb7f34e3, 0xc1dd6cee, 0x5d7eeb2f, 0x8bf7af16, 0xcaaa0b04, 0xbffe68a9, -0x7aa6d3de, 0x86e8d238, 0x6d9c9e5c, 0x0afe48ea, 0x54a8b2c7, 0x7d081d4f, 0x24635e7d, 0x83a90ad2, -0x5faa3307, 0x86d02631, 0x3ba7090e, 0x890ea613, 0x6379381d, 0x43082edc, 0x45fadca0, 0x507a5be8, -0x4002d3e0, 0xcd47db8f, 0x016f02f7, 0x2cc37a2e, 0x6b2440e8, 0xf0a17a06, 0xd1d9ccba, 0xb4bfd01e, -0xfb2e8da1, 0x2b9eafb9, 0x78351034, 0xd5741ede, 0x0728eaf6, 0x7943413b, 0x502b32a2, 0xcd7517b8, -0xebc7a095, 0x0c604a3e, 0x3404c921, 0xa5130fc4, 0x49320039, 0x6afa45fb, 0xdfb6d1d1, 0x9f976a89, -0x6edc8665, 0x25dbf831, 0xa4f7cfec, 0x317a09b5, 0xdaf4c587, 0x28517cd4, 0x6b0c4ef3, 0xcb4307a8, -0xff2670b4, 0x53faca1c, 0x4e2b952a, 0xf8c81cb5, 0xad345402, 0x0cfa7a14, 0x8f530b2f, 0x08720c93, -0xdac62944, 0xa2fa1466, 0xecd483c0, 0x1d969b7d, 0x301f431b, 0xa245449b, 0xfbe74141, 0x61ccd26d, -0xeed80681, 0xba661d5c, 0x2aa8ba84, 0x98df402f, 0xb0bfa754, 0xf786f0eb, 0x502a3f00, 0x5714ef6b, -0x0cc031fe, 0xbd5cb04c, 0x5cf040e1, 0x3d733d6f, 0x9b721cfd, 0xa93dad7d, 0x343a8188, 0x5beea144, -0x77f00ee3, 0xb39e61bd, 0xc53b2a3f, 0xa8b4c424, 0xf5bad225, 0xa85879f2, 0xcfb028f4, 0x09643370, -0x1c7204e6, 0xcebc96e5, 0x12227cec, 0xd7a429da, 0xb5645c6c, 0xf99d4c2b, 0x417bdfb6, 0x0b289280, -0xd9cb2cb6, 0x36d1a187, 0x69839b3c, 0x59de4109, 0xd03843a6, 0x46eb3539, 0x11a526ce, 0x56c78934, -0x763909cc, 0x656ca8af, 0x5b0bdb9d, 0xfac27a43, 0xe1f96c06, 0x6cebe65d, 0xf94709d9, 0x63efc9f1, -0xc95ba413, 0xe704de3c, 0x261e2b43, 0x9c3ef6a0, 0xad4bbe93, 0x79f1cfd8, 0xe314fc58, 0x3470d507, -0xdd0e43e3, 0x394aca27, 0x6bbbf7f1, 0xb213d5e9, 0x1ba99155, 0x4bf71a64, 0x7aa72d51, 0x36a82476, -0x81d0a1c9, 0xc175a36a, 0xda05fc03, 0xfe16edc6, 0xbbbf6f57, 0xb00978f6, 0x0e17eb6c, 0xe905fe98, -0x49241c46, 0x6cc1fcda, 0x8a562cdf, 0xae6c7a70, 0x083e66ed, 0x433be4c6, 0x2092bc04, 0xb4326383, -0x92006a4a, 0x401602df, 0xa54a2952, 0xa4ae512c, 0x46153a61, 0xbaf9bdca, 0x56a95e63, 0x5eadc50f, -0xe403dc0b, 0x3708ba31, 0x21db3941, 0xeb74c1c8, 0x8d2628cf, 0xb7925cf4, 0xdb1ad60b, 0x67dfb1ea, -0x4b8893ec, 0x2d101360, 0x3036d21b, 0x9ed1eb42, 0xa1a60268, 0xe1d6502a, 0x459b4907, 0x1275e279, -0x20efb17c, 0x7f4ae419, 0xf6e4a74b, 0x35698d03, 0x5414844a, 0x2397a6b9, 0x7e41f393, 0xe78fd97d - -e = -32256 - -k = -6144 - -ncb = -18528 - -rv_index = -0 - -code_block_mode = -1 - -op_flags = -RTE_BBDEV_TURBO_RATE_MATCH, RTE_BBDEV_TURBO_CRC_24B_ATTACH - -expected_status = -OK diff --git a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c3_k4800_r2_e14412_crc24b.data b/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c3_k4800_r2_e14412_crc24b.data deleted file mode 100644 index 9e17429d3e..0000000000 --- a/targets/ARCH/test-bbdev/test_vectors/turbo_enc_c3_k4800_r2_e14412_crc24b.data +++ /dev/null @@ -1,153 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(c) 2017 Intel Corporation - -op_type = -RTE_BBDEV_OP_TURBO_ENC - -input0 = -0xb0fe86aa, 0xffbf2968, 0x4f55a631, 0xf2152dbc, 0x195a49a5, 0xa4aa7c6c, -0x48a7be38, 0xd32c84f2, 0xb040da60, 0xb39eb07c, 0x3443aad6, 0x19f52e13, -0xb2914341, 0x0d5dfdb3, 0x1ba8aec0, 0x62d0c7be, 0x1d55475c, 0x10f7dd79, -0x967e5333, 0xc0d524c1, 0xdca8da87, 0x1146ecf7, 0xfa09a85c, 0x83be800f, -0x11b814cc, 0x362a4704, 0x4f22e7ce, 0x9985a0e2, 0x9de4be72, 0x488a45b3, -0x6996ade2, 0xdb18c09a, 0x487d62a3, 0x94f82d13, 0xa0743f83, 0x75d2f5dd, -0x0e470346, 0x6e2ec2e5, 0x1a67fe5f, 0xc369330d, 0x860e8766, 0x42c110f6, -0x804a9985, 0x55db02b4, 0xb899fc5c, 0x57811d20, 0xda4f1f9d, 0x2a2efc30, -0x953e7487, 0x4b0c3065, 0x247d5d47, 0xdde382e7, 0x1d6d2ad7, 0x4358ac24, -0x2d0fd97f, 0x1483821e, 0xf6c74ee5, 0x23b5c2f4, 0x95d4a5fc, 0x486f370b, -0x8dbae43d, 0x248f17d5, 0x2df76099, 0xd19ec872, 0xf592aa0e, 0x8de04c3c, -0x3ada94fb, 0x9dd001a3, 0x2b4db6d1, 0x791cf495, 0x57dc764b, 0x21789f1f, -0x0d38adf5, 0xd8cefdc2, 0xed98f8bf, 0x024bc4ed, 0x4f9d3062, 0x332d27c5, -0xde70ad4e, 0xd85872d2, 0x5d0e29c0, 0xa4fd1887, 0x3fa67ba1, 0x46b9b008, -0x055bbf61, 0xf78e59f0, 0x287d2e3b, 0x5b473fe7, 0xd7ad6e04, 0x9cdf4986, -0x830432ae, 0xffded1ba, 0x35c00f77, 0xcf0a6648, 0x196c03aa, 0xba4e2dd3, -0xdaf70fe4, 0x883de2cd, 0xedc3b52e, 0x14e638c1, 0xe607103a, 0xc4cfb700, -0x4ed9843d, 0xc442a0cb, 0xc0d3bba2, 0x36789ba8, 0x9c9b7a24, 0xb943b6a4, -0x8f2c6879, 0x0fb16a0c, 0x2677bada, 0xd14f2f7e, 0x662ec398, 0x1e37b7ae, -0x8ad0312d, 0x21adb6a1, 0x072a11fd, 0x7ae828d1, 0xb510655f, 0x09f7b477, -0x10a175fc, 0xb7086f51, 0x24546af3, 0xfae81b50, 0xcb328832, 0x63693615, -0xa37c3678, 0x15fb6364, 0xb5f75a78, 0xfa9aa5f6, 0x03804a0e, 0x1d245890, -0x06d6cdcd, 0x7485a3c7, 0x35a008ae, 0x1abeaf1c, 0xd9c55966, 0x2b694666, -0x5341f2df, 0xcb647280, 0xfb88d81e, 0xf99a44d0, 0xb0585534, 0x0877b530, -0x752ab39a, 0xd493d8bc, 0xfaa6a57a, 0xccb7c008, 0x9c35994b, 0xb8 - -output0 = -0xb0fe86aa, 0xffbf2968, 0x4f55a631, 0xf2152dbc, 0x195a49a5, 0xa4aa7c6c, -0x48a7be38, 0xd32c84f2, 0xb040da60, 0xb39eb07c, 0x3443aad6, 0x19f52e13, -0xb2914341, 0x0d5dfdb3, 0x1ba8aec0, 0x62d0c7be, 0x1d55475c, 0x10f7dd79, -0x967e5333, 0xc0d524c1, 0xdca8da87, 0x1146ecf7, 0xfa09a85c, 0x83be800f, -0x11b814cc, 0x362a4704, 0x4f22e7ce, 0x9985a0e2, 0x9de4be72, 0x488a45b3, -0x6996ade2, 0xdb18c09a, 0x487d62a3, 0x94f82d13, 0xa0743f83, 0x75d2f5dd, -0x0e470346, 0x6e2ec2e5, 0x1a67fe5f, 0xc369330d, 0x860e8766, 0x42c110f6, -0x804a9985, 0x55db02b4, 0xb899fc5c, 0x57811d20, 0xda4f1f9d, 0x2a2efc30, -0x953e7487, 0x4b0c3065, 0x247d5d47, 0xdde382e7, 0x1d6d2ad7, 0x4358ac24, -0x2d0fd97f, 0x1483821e, 0xf6c74ee5, 0x23b5c2f4, 0x95d4a5fc, 0x486f370b, -0x8dbae43d, 0x248f17d5, 0x2df76099, 0xd19ec872, 0xf592aa0e, 0x8de04c3c, -0x3ada94fb, 0x9dd001a3, 0x2b4db6d1, 0x791cf495, 0x57dc764b, 0x21789f1f, -0x0d38adf5, 0xd8cefdc2, 0xed98f8bf, 0x024bc4ed, 0x4f9d3062, 0x332d27c5, -0xde70ad4e, 0xd85872d2, 0x5d0e29c0, 0xa4fd1887, 0x3fa67ba1, 0x46b9b008, -0x055bbf61, 0xf78e59f0, 0x287d2e3b, 0x5b473fe7, 0xd7ad6e04, 0x9cdf4986, -0x830432ae, 0xffded1ba, 0x35c00f77, 0xcf0a6648, 0x196c03aa, 0xba4e2dd3, -0xdaf70fe4, 0x883de2cd, 0xedc3b52e, 0x14e638c1, 0xe607103a, 0xc4cfb700, -0x4ed9843d, 0xc442a0cb, 0xc0d3bba2, 0x36789ba8, 0x9c9b7a24, 0xb943b6a4, -0x8f2c6879, 0x0fb16a0c, 0x2677bada, 0xd14f2f7e, 0x662ec398, 0x1e37b7ae, -0x8ad0312d, 0x21adb6a1, 0x072a11fd, 0x7ae828d1, 0xb510655f, 0x09f7b477, -0x10a175fc, 0xb7086f51, 0x24546af3, 0xfae81b50, 0xcb328832, 0x63693615, -0xa37c3678, 0x15fb6364, 0xb5f75a78, 0xfa9aa5f6, 0x03804a0e, 0x1d245890, -0x06d6cdcd, 0x7485a3c7, 0x35a008ae, 0x1abeaf1c, 0xd9c55966, 0x2b694666, -0x5341f2df, 0xcb647280, 0xfb88d81e, 0xf99a44d0, 0xb0585534, 0x0877b530, -0x752ab39a, 0xd493d8bc, 0xfaa6a57a, 0xccb7c008, 0x9c35994b, 0x47ee26b8, -0x94f624ac, 0xa3bd4876, 0xf7d4854e, 0x8871d433, 0x9321d942, 0x7b626be8, -0x72c934b0, 0x3b7af8a4, 0x5102c29f, 0x710e4dbc, 0x99708292, 0x1458c4c1, -0x61026bc5, 0xe776e388, 0x4a0222b3, 0x760e5aaf, 0x662f3583, 0x5ab1005b, -0xe527ef70, 0x4170d611, 0x307bebc4, 0xfdd00caf, 0xbaae1044, 0xcab4d459, -0x38281dcf, 0x90580c89, 0x49cf5986, 0xa27da769, 0xceced49b, 0x5ea37953, -0x8a7e6c1c, 0x1e01b4e2, 0xe08026ae, 0x3754534a, 0x903b0ecf, 0x65f97a55, -0x90798ed9, 0x9d1133bc, 0xe356a39f, 0xe47acbce, 0x01ccf326, 0x1954fd3d, -0x240e69f8, 0x1da20bb4, 0xe1ab1684, 0x44c65d48, 0xd265e6c2, 0x51d4ef07, -0x000970ef, 0xfeb939f4, 0x5dcc0132, 0x2bd27ae5, 0xba5dbd25, 0xa9d190e4, -0x61556bec, 0x7fd6caba, 0x7fe312cb, 0xdd319413, 0x92a5dbbf, 0x17e61915, -0x56067b67, 0x3dc348c0, 0x58c17fe0, 0xbe6bffcc, 0xd379026c, 0xc4174780, -0xcce7f026, 0xb74b7eb0, 0xe4d5f625, 0x6bc16d3b, 0xff3e300e, 0x83f0d55a, -0xf2e537df, 0x75c18f78, 0xa5458d1a, 0x47c778b0, 0x92eb8716, 0xcb5816fd, -0xc2cc7079, 0xa7f1dc75, 0xed9e5ffa, 0xb7d6747f, 0xa2dc6907, 0x99b4d187, -0x69f3138a, 0xbd285a1f, 0xb8ee18e0, 0x734b77a5, 0xc0700f69, 0x6c72a77a, -0x76609ba9, 0xcfae9b73, 0x2cd329f0, 0x0d45aa12, 0x419fbcd7, 0x03e00f00, -0x0effee99, 0x7f879eb4, 0x29a4c8df, 0x4432400a, 0x22b9cf55, 0xa1c4c645, -0x200251b0, 0xff293906, 0xe11288e2, 0xde1e8ec7, 0x675752d1, 0x9630743e, -0xd848c67e, 0x1eedfda9, 0x58b954fc, 0xa0dc7f1c, 0x0aea313e, 0x062b9449, -0x0f17e57f, 0x96def6ec, 0x2ba45f14, 0xd9a5f8c5, 0x231483c8, 0x29b8783e, -0xa6d24594, 0x1a62ffcd, 0x54c87a7f, 0x6fa9ca9a, 0xfff0f890, 0x51d6ae46, -0xa96e82b0, 0x68cd9808, 0x56214df5, 0x2169defa, 0x72c1ecce, 0x2448e3c9, -0x8eb2b3b3, 0x62c89c11, 0xbba20ee2, 0xea33f53a, 0x8b96a6b8, 0x9d33d551, -0x363bd14e, 0x5fdd2b5f, 0xf8187546, 0xb692beab, 0x8df6b4c0, 0x753e2302, -0xb90f7a37, 0x2b6bac6a, 0x13a07bc5, 0xb67f6d2b, 0x47b21569, 0xc2ab143f, -0xf86ce30a, 0xde2dab70, 0x6f258860, 0x2878735c, 0x2aaeac20, 0xda80fb3e, -0xe7a8ccf6, 0xbf011844, 0x40a610f8, 0x82f3fdf7, 0xadc4ec2c, 0xb8551030, -0x76004380, 0xa384ff18, 0x080cf587, 0x6c4991d3, 0x2daea9aa, 0xa92d0c4f, -0x4a9d117e, 0x2761f025, 0x96b40443, 0x57a82be4, 0x62374c44, 0x55dc64ae, -0x28aa9f0c, 0x03a3b963, 0x41dbaa26, 0xb3c23735, 0x971cbd31, 0x939a9f80, -0x76439fdc, 0xa9df79d6, 0x926ae3e2, 0x5ee75745, 0xf2396e52, 0xe18bd816, -0x3f9834b9, 0x816a07bc, 0x8f873310, 0x45cf9b96, 0x0ce634dd, 0xe64a16d9, -0x2733775a, 0x2b648c7e, 0xe600ee8e, 0xd99d8ae3, 0x10dadf2a, 0x904d3f87, -0x3963e9e7, 0x47fcce89, 0xc256c898, 0x7db6cb66, 0xe1611a8b, 0xed81b10d, -0x75eff974, 0x8a0a3d67, 0xa44311ff, 0x6f876783, 0x43dc93ce, 0x88616a33, -0xa8706e8f, 0x33a2cbed, 0x3a6d20c3, 0x55175086, 0x39680945, 0x2d779a7b, -0x0818a4ce, 0x55558918, 0xf7c08d35, 0x980a3038, 0x9cf068db, 0x3385d333, -0xd81b33fb, 0x188018d5, 0x47c57bd3, 0x9ec2324f, 0x6901cd77, 0xc3bac44f, -0x4d96aba8, 0x9094da5b, 0xa67a1353, 0x1fdfc4db, 0xa2fbeefa, 0xab4828e3, -0x37d1db45, 0x0d33b3e9, 0x1ad72bb9, 0x7257bf9c, 0x2ec35167, 0xa4488b7f, -0xf9dae588, 0x1038905a, 0x88ddf410, 0xaac11693, 0x24ac025d, 0x56cefbb5, -0x6afe7f59, 0xc7f989e8, 0x15872570, 0x1bf16cdb, 0xfe9c93ce, 0x1fc9a076, -0x85d37185, 0x1078cd31, 0xe1cd0327, 0x6d5315bc, 0x298cd836, 0xc8e21f06, -0xe561c32d, 0x8ec404b4, 0x4d39bfbb, 0x24ede8c8, 0x451d6034, 0x3bafeea2, -0x202f0ccf, 0x1fad37ce, 0xf04b5693, 0xeee57cd9, 0x5ef70007, 0x018e8a4f, -0xfa61c9a9, 0x09989fcf, 0xe66b558b, 0x966efd48, 0x7525021d, 0xe7978b5e, -0x7eb1d6dc, 0xa10c5e5b, 0xb7815e69, 0x7d486cfb, 0xcffdeb2a, 0x7375cb32, -0x599008dc, 0xff91c796, 0x560ed4ad, 0x14e9a876, 0xfccf6a66, 0xa58be028, -0xea9d408b, 0x3afc373b, 0xee008458, 0x19b6042e, 0x84806314, 0x431a4ba4, -0x009ad6a1, 0xd7c62bf4, 0x1bebecba, 0x5c662f69, 0x83bfdea1, 0x45872a9a, -0x00c9 - - -ea = -14412 - -eb = -14412 - -cab = -4 - -c = -4 - -c_neg = -0 - -k_pos = -4800 - -k_neg = -4736 - -ncb_pos = -14496 - -ncb_neg = -14304 - -r = -2 - -rv_index = -0 - -code_block_mode = -0 - -op_flags = -RTE_BBDEV_TURBO_CRC_24B_ATTACH - -expected_status = -OK \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/turbo_dec_default.data b/targets/ARCH/test-bbdev/turbo_dec_default.data deleted file mode 120000 index 371cbc692d..0000000000 --- a/targets/ARCH/test-bbdev/turbo_dec_default.data +++ /dev/null @@ -1 +0,0 @@ -test_vectors/turbo_dec_c1_k6144_r0_e10376_crc24b_sbd_negllr_high_snr.data \ No newline at end of file diff --git a/targets/ARCH/test-bbdev/turbo_enc_default.data b/targets/ARCH/test-bbdev/turbo_enc_default.data deleted file mode 120000 index a2bc833c12..0000000000 --- a/targets/ARCH/test-bbdev/turbo_enc_default.data +++ /dev/null @@ -1 +0,0 @@ -test_vectors/turbo_enc_c1_k6144_r0_e18444.data \ No newline at end of file From b6b7bbbdd7b0765bea633c65bf1ea6cf2ee5ba66 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 19 Nov 2021 10:24:27 +0100 Subject: [PATCH 023/136] adding dependency condition for ldpc offload --- cmake_targets/CMakeLists.txt | 106 +++++++++++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 6 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 54e38fd682..2c13d732bc 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -187,6 +187,93 @@ else (CUDA_FOUND) message ("No CUDA tool installed") endif () +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(dpdk DEFAULT_MSG) + +########################################### +# macros to define options as there is numerous options in oai +################################################ +macro(add_option name val helpstr) + if(DEFINED ${name}) + set(value ${${name}}) + else(DEFINED ${name}) + set(value ${val}) + endif() + set(${name} ${value} CACHE STRING "${helpstr}") + add_definitions("-D${name}=${value}") +endmacro(add_option) + +macro(add_boolean_option name val helpstr) + if(DEFINED ${name}) + set(value ${${name}}) + else(DEFINED ${name}) + set(value ${val}) + endif() + set(${name} ${value} CACHE STRING "${helpstr}") + set_property(CACHE ${name} PROPERTY TYPE BOOL) + if (${value}) + add_definitions("-D${name}") + endif (${value}) +endmacro(add_boolean_option) + +macro(add_integer_option name val helpstr) + if(DEFINED ${name}) + set(value ${${name}}) + else(DEFINED ${name}) + set(value ${val}) + endif() + set(${name} ${value} CACHE STRING "${helpstr}") + add_definitions("-D${name}=${value}") +endmacro(add_integer_option) + +macro(add_list1_option name val helpstr) + if(DEFINED ${name}) + set(value ${${name}}) + else(DEFINED ${name}) + set(value ${val}) + endif() + set(${name} ${value} CACHE STRING "${helpstr}") + set_property(CACHE ${name} PROPERTY STRINGS ${ARGN}) + if(NOT "${value}" STREQUAL "False") + add_definitions("-D${name}=${value}") + endif() +endmacro(add_list1_option) + +macro(add_list2_option name val helpstr) + if(DEFINED ${name}) + set(value ${${name}}) + else(DEFINED ${name}) + set(value ${val}) + endif() + set(${name} ${value} CACHE STRING "${helpstr}") + set_property(CACHE ${name} PROPERTY STRINGS ${ARGN}) + if(NOT "${value}" STREQUAL "False") + add_definitions("-D${value}=1") + endif() +endmacro(add_list2_option) + +macro(add_list_string_option name val helpstr) + if(DEFINED ${name}) + set(value ${${name}}) + else(DEFINED ${name}) + set(value ${val}) + endif() + set(${name} ${value} CACHE STRING "${helpstr}") + set_property(CACHE ${name} PROPERTY STRINGS ${ARGN}) + if(NOT "${value}" STREQUAL "False") + add_definitions("-D${name}=\"${value}\"") + endif() +endmacro(add_list_string_option) + +# this function should produce the same value as the macro MAKE_VERSION defined in the C code (file types.h) +function(make_version VERSION_VALUE) + math(EXPR RESULT "0") + foreach (ARG ${ARGN}) + math(EXPR RESULT "${RESULT} * 16 + ${ARG}") + endforeach() + set(${VERSION_VALUE} "${RESULT}" PARENT_SCOPE) +endfunction() +>>>>>>> 3c20b0c660 (adding dependency condition for ldpc offload) #################################################### # compilation flags ############################################# @@ -824,11 +911,9 @@ include_directories ("/usr/local/include") set(HWLIB_LDPC_OFFLOAD_SOURCE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c -# ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev.c -# ${OPENAIR_TARGETS}/ARCH/test-bbdev/main.c -# ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_perf.c -# ${OPENAIR_TARGETS}/ARCH/test-bbdev/test_bbdev_vector.c ) + +if (DPDK_FOUND) add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include -DALLOW_EXPERIMENTAL_API") @@ -836,6 +921,7 @@ set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config SET(T1_DPDK_LIBS "-Wl,-rpath /usr/local/lib64 -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_fpga_5gnr_fec -lrte_pmd_hpac_sdfec_pmd -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") TARGET_LINK_LIBRARIES(ldpc_offload ${T1_DPDK_LIBS}) TARGET_LINK_LIBRARIES(ldpc_offload pthread dl rt m numa) +endif (DPDK_FOUND) ########################################################## @@ -2773,7 +2859,11 @@ target_link_libraries (nr-softmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRA target_link_libraries (nr-softmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (nr-softmodem ${T_LIB}) -add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc ldpc_offload) +add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc) + +if (DPDK_FOUND) +add_dependencies( nr-softmodem ldpc_offload) +endif (DPDK_FOUND) # nr-uesoftmodem is UE implementation ####################################### @@ -2981,7 +3071,11 @@ add_executable(nr_ulsim ${SHLIB_LOADER_SOURCES} ) -add_dependencies( nr_ulsim ldpc_orig ldpc_optim ldpc_optim8seg ldpc ldpc_offload) +add_dependencies( nr_ulsim ldpc_orig ldpc_optim ldpc_optim8seg ldpc) + +if (DPDK_FOUND) +add_dependencies( nr_ulsim ldpc_offload) +endif (DPDK_FOUND) target_link_libraries(nr_ulsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -lz -Wl,--end-group From 4f68b5aeb698a4b015bd681e29f0ce3a12b34be8 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 19 Nov 2021 16:55:49 +0100 Subject: [PATCH 024/136] Adding a dependency condition for offload --- cmake_targets/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 2c13d732bc..9340ceedb3 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -913,7 +913,7 @@ set(HWLIB_LDPC_OFFLOAD_SOURCE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c ) -if (DPDK_FOUND) +if (DPDK_FOUND AND EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include -DALLOW_EXPERIMENTAL_API") From 6cd313f545b3e3cda4acf2b53a9c56ce7ec06b21 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Sat, 20 Nov 2021 00:05:45 +0100 Subject: [PATCH 025/136] add missing dependency condition --- cmake_targets/CMakeLists.txt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 9340ceedb3..63614804c6 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -913,7 +913,8 @@ set(HWLIB_LDPC_OFFLOAD_SOURCE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c ) -if (DPDK_FOUND AND EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") +if (DPDK_FOUND) +if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include -DALLOW_EXPERIMENTAL_API") @@ -921,7 +922,8 @@ set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config SET(T1_DPDK_LIBS "-Wl,-rpath /usr/local/lib64 -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_fpga_5gnr_fec -lrte_pmd_hpac_sdfec_pmd -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") TARGET_LINK_LIBRARIES(ldpc_offload ${T1_DPDK_LIBS}) TARGET_LINK_LIBRARIES(ldpc_offload pthread dl rt m numa) -endif (DPDK_FOUND) +endif() +endif(DPDK_FOUND) ########################################################## @@ -2862,7 +2864,9 @@ target_link_libraries (nr-softmodem ${T_LIB}) add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc) if (DPDK_FOUND) +if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") add_dependencies( nr-softmodem ldpc_offload) +endif () endif (DPDK_FOUND) # nr-uesoftmodem is UE implementation @@ -3074,7 +3078,9 @@ add_executable(nr_ulsim add_dependencies( nr_ulsim ldpc_orig ldpc_optim ldpc_optim8seg ldpc) if (DPDK_FOUND) +if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") add_dependencies( nr_ulsim ldpc_offload) +endif () endif (DPDK_FOUND) target_link_libraries(nr_ulsim From 02048ff3c4722bf0b68e160363c90b858afa24b0 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 8 Dec 2021 11:16:34 +0100 Subject: [PATCH 026/136] using one l1tx thread and changing ul parameters for testing --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 121 +++++++++++++----- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 4 +- 2 files changed, 91 insertions(+), 34 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 10eed12776..a6e1af015d 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -36,7 +36,7 @@ #include "nrLDPC_mPass.h" #include "nrLDPC_cnProc.h" #include "nrLDPC_bnProc.h" - +#include #define NR_LDPC_ENABLE_PARITY_CHECK #ifdef NR_LDPC_DEBUG_MODE @@ -976,7 +976,7 @@ create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op, t_nrLDPCoffload_params -/*static uint32_t +static uint32_t calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) { uint8_t i; @@ -997,7 +997,7 @@ calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) } return tb_size; } -*/ + static int init_test_op_params(struct test_op_params *op_params, @@ -1035,7 +1035,7 @@ pmd_lcore_ldpc_dec(void *arg) { struct thread_params *tp = arg; uint16_t enq, deq; - //uint64_t total_time = 0, start_time; + uint64_t total_time = 0, start_time; const uint16_t queue_id = tp->queue_id; const uint16_t burst_sz = tp->op_params->burst_sz; const uint16_t num_ops = tp->op_params->num_to_process; @@ -1054,11 +1054,12 @@ pmd_lcore_ldpc_dec(void *arg) //bool extDdr = check_bit(ldpc_cap_flags, // RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); + start_time = rte_rdtsc_precise(); bool loopback = check_bit(ref_op->ldpc_dec.op_flags, RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); - + TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), "BURST_SIZE should be <= %u", MAX_BURST); @@ -1101,7 +1102,7 @@ pmd_lcore_ldpc_dec(void *arg) mbuf_reset( ops_enq[j]->ldpc_dec.harq_combined_output.data); } - //start_time = rte_rdtsc_precise(); + // start_time = rte_rdtsc_precise(); for (enq = 0, deq = 0; enq < num_ops;) { num_to_enq = burst_sz; @@ -1132,9 +1133,9 @@ pmd_lcore_ldpc_dec(void *arg) }*/ } -// total_time += rte_rdtsc_precise() - start_time; + //total_time += rte_rdtsc_precise() - start_time; } - + //total_time = rte_rdtsc_precise() - start_time; if (deq==enq) { tp->iter_count = 0; /* get the max of iter_count for all dequeued ops */ @@ -1153,14 +1154,20 @@ pmd_lcore_ldpc_dec(void *arg) rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); - /*double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); + /*total_time = rte_rdtsc_precise() - start_time; - tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / - ((double)total_time / (double)rte_get_tsc_hz()); + if (total_time > 10*3000) + LOG_E(PHY," pmd lcore: %u\n",(uint) (total_time/3000)); + */ + double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); + + tp->ops_per_sec = ((double)total_time / (double)rte_get_tsc_hz()); + //tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / + // ((double)total_time / (double)rte_get_tsc_hz()); tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / 1000000.0) / ((double)total_time / (double)rte_get_tsc_hz()); - */ + return ret; } @@ -1197,19 +1204,21 @@ print_dec_throughput(struct thread_params *t_params, unsigned int used_cores) */ int start_pmd_dec(struct active_device *ad, - struct test_op_params *op_params, + struct test_op_params *op_params, + struct thread_params *t_params, t_nrLDPCoffload_params *p_offloadParams, uint8_t r, int8_t* p_out) { int ret; unsigned int lcore_id, used_cores = 0; - struct thread_params *t_params, *tp; + struct thread_params *tp; //struct rte_bbdev_info info; uint16_t num_lcores; - + uint64_t start_time, start_time1 ; //= rte_rdtsc_precise(); + uint64_t total_time=0, total_time1=0; //rte_bbdev_info_get(ad->dev_id, &info); - + start_time = rte_rdtsc_precise(); /*printf("+ ------------------------------------------------------- +\n"); printf("== start pmd dec\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, itr mode: %s, GHz: %lg\n", info.dev_name, ad->nb_queues, op_params->burst_sz, @@ -1223,12 +1232,13 @@ start_pmd_dec(struct active_device *ad, : op_params->num_lcores; /* Allocate memory for thread parameters structure */ - t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), + /*t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), RTE_CACHE_LINE_SIZE); TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", RTE_ALIGN(sizeof(struct thread_params) * num_lcores, RTE_CACHE_LINE_SIZE)); - + */ + total_time = rte_rdtsc_precise() - start_time; rte_atomic16_set(&op_params->sync, SYNC_WAIT); /* Master core is set at first entry */ @@ -1256,13 +1266,20 @@ start_pmd_dec(struct active_device *ad, rte_eal_remote_launch(pmd_lcore_ldpc_dec, &t_params[used_cores++], lcore_id); } - + rte_atomic16_set(&op_params->sync, SYNC_START); + + //total_time = rte_rdtsc_precise() - start_time; + + //if (total_time > 100*3000) + //LOG_E(PHY," start pmd 1st: %u\n",(uint) (total_time/3000)); + ret = pmd_lcore_ldpc_dec(&t_params[0]); + //start_time1 = rte_rdtsc_precise(); /* Master core is always used */ - for (used_cores = 1; used_cores < num_lcores; used_cores++) - ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); + //for (used_cores = 1; used_cores < num_lcores; used_cores++) + // ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); /* Return if test failed */ if (ret) { @@ -1272,11 +1289,15 @@ start_pmd_dec(struct active_device *ad, /* Print throughput if interrupts are disabled and test passed */ if (!intr_enabled) { - //print_dec_throughput(t_params, num_lcores); - rte_free(t_params); + // print_dec_throughput(t_params, num_lcores); + //rte_free(t_params); + // total_time1 = rte_rdtsc_precise() - start_time1; + + // if (total_time1 > 10*3000) + // LOG_E(PHY," start pmd 2nd: %u\n",(uint) (total_time1/3000)); + // rte_free(t_params); return ret; } - /* In interrupt TC we need to wait for the interrupt callback to deqeue * all pending operations. Skip waiting for queues which reported an * error using processing_status variable. @@ -1313,6 +1334,7 @@ start_pmd_dec(struct active_device *ad, } rte_free(t_params); + return ret; } @@ -1371,20 +1393,35 @@ struct test_op_params *op_params = &op_params_e; struct rte_mbuf *m_head[DATA_NUM_TYPES]; +struct thread_params *t_params; + int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint16_t F, uint32_t E, uint8_t Qm, int8_t* p_llr, int8_t* p_out, uint8_t mode) { t_nrLDPCoffload_params offloadParams; t_nrLDPCoffload_params* p_offloadParams = &offloadParams; - + uint64_t start=rte_rdtsc_precise(); + uint64_t start_time=rte_rdtsc_precise(); + uint64_t start_time1; //=rte_rdtsc_precise(); + uint64_t total_time=0, total_time1=0; uint32_t numIter = 0; int ret; - + /* int argc_re=2; char *argv_re[2]; argv_re[0] = "/home/wang/dpdk2005/dpdk-20.05/build/app/testbbdev"; - argv_re[1] = "--"; + argv_re[1] = "--"; + */ + int argc_re=7; + char *argv_re[7]; + argv_re[0] = "/home/wang/dpdk2005/dpdk-20.05/build/app/testbbdev"; + argv_re[1] = "-l"; + argv_re[2] = "35"; + argv_re[3] = "-w"; + argv_re[4] = "b0:00.0"; + argv_re[5] = "--file-prefix=b6"; + argv_re[6] = "--"; test_params.num_ops=1; test_params.burst_sz=1; @@ -1507,11 +1544,19 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ mbuf_pools[type]->size); } + + /* Allocate memory for thread parameters structure */ + t_params = rte_zmalloc(NULL, sizeof(struct thread_params), + RTE_CACHE_LINE_SIZE); + TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", + RTE_ALIGN(sizeof(struct thread_params), + RTE_CACHE_LINE_SIZE)); } break; case 1: //printf("offload param E %d BG %d F %d Z %d Qm %d\n", E,p_decParams->BG, F,p_decParams->Z, Qm); + //start_time = rte_rdtsc_precise(); p_offloadParams->E = E; p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); p_offloadParams->BG = p_decParams->BG; @@ -1547,7 +1592,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ &op_params->q_bufs[socket_id][queue_id].harq_inputs, &op_params->q_bufs[socket_id][queue_id].harq_outputs, }; - + //start_time1 = rte_rdtsc_precise(); for (type = DATA_INPUT; type < 3; type+=2) { ret = init_op_data_objs(*queue_ops[type], p_llr, p_offloadParams->E, @@ -1556,18 +1601,26 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ "Couldn't init rte_bbdev_op_data structs"); } - - ret = start_pmd_dec(ad, op_params, p_offloadParams, C, p_out); + /*total_time = rte_rdtsc_precise() - start_time; + + if (total_time > 100*3000) + LOG_E(PHY," ldpc decoder mode 1 first: %u\n",(uint) (total_time/3000)); + + start_time1 = rte_rdtsc_precise();*/ + ret = start_pmd_dec(ad, op_params, t_params, p_offloadParams, C, p_out); if (ret<0) { printf("Couldn't start pmd dec"); return(-1); } - + /*total_time1 = rte_rdtsc_precise() - start_time; + if (total_time1 > 100*3000) + LOG_E(PHY," ldpc decoder mode 1 second: %u\n",(uint) (total_time1/3000));*/ break; case 2: free_buffers(ad, op_params); rte_free(op_params); + rte_free(t_params); ut_teardown(); testsuite_teardown(); break; @@ -1575,7 +1628,11 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ printf("Unknown mode: %d\n", mode); return(-1); } - + /*uint64_t end=rte_rdtsc_precise(); + + if (end - start > 200*3000) + LOG_E(PHY," ldpc decode: %u\n",(uint) ((end - start)/3000)); + */ return numIter; } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index f93d41028d..7d9da86b18 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1239,7 +1239,7 @@ void pf_ul(module_id_t module_id, sched_ctrl->update_pusch_ps = false; } NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; - sched_pusch->mcs = 12; + sched_pusch->mcs = 22; update_ul_ue_R_Qm(sched_pusch, ps); sched_pusch->rbStart = rbStart; sched_pusch->rbSize = min_rb; @@ -1265,7 +1265,7 @@ void pf_ul(module_id_t module_id, add_tail_nr_list(&UE_sched, UE_id); /* Calculate coefficient*/ - sched_pusch->mcs = 12; + sched_pusch->mcs = 22; const uint32_t tbs = ul_pf_tbs[ps->mcs_table][sched_pusch->mcs]; coeff_ue[UE_id] = (float) tbs / ul_thr_ue[UE_id]; LOG_D(NR_MAC,"b %d, ul_thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n", From e20df48b02913461b27e3fb6c4ade21cd8e822bd Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 10 Jan 2022 11:19:17 +0100 Subject: [PATCH 027/136] bug fix on calling nr_fill_indications --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 8 ++++---- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 90c466ae84..4f23b788a1 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -720,7 +720,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ulsch->harq_mask &= ~(1 << harq_pid); LOG_D(PHY, "ULSCH received ok \n"); - nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 0); + nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 0,0); } else { LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n", @@ -735,10 +735,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, harq_process->handled = 1; no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); - nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 1); + nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 1,0); } - //ulsch->last_iteration_cnt = no_iteration_ldpc; - } + ulsch->last_iteration_cnt = no_iteration_ldpc; + } } } else { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 7d9da86b18..3a8fa01605 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -681,7 +681,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, } else{ LOG_D(NR_MAC,"[UE %d] Detected DTX : increasing UE TX power\n",UE_id); - UE_scheduling_control->tpc0 = 3; + //UE_scheduling_control->tpc0 = 3; } #if defined(ENABLE_MAC_PAYLOAD_DEBUG) @@ -1239,7 +1239,7 @@ void pf_ul(module_id_t module_id, sched_ctrl->update_pusch_ps = false; } NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; - sched_pusch->mcs = 22; + sched_pusch->mcs = 20; update_ul_ue_R_Qm(sched_pusch, ps); sched_pusch->rbStart = rbStart; sched_pusch->rbSize = min_rb; @@ -1265,7 +1265,7 @@ void pf_ul(module_id_t module_id, add_tail_nr_list(&UE_sched, UE_id); /* Calculate coefficient*/ - sched_pusch->mcs = 22; + sched_pusch->mcs = 20; const uint32_t tbs = ul_pf_tbs[ps->mcs_table][sched_pusch->mcs]; coeff_ue[UE_id] = (float) tbs / ul_thr_ue[UE_id]; LOG_D(NR_MAC,"b %d, ul_thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n", From 6e3a87a60a204365a90b0fc701754f089f1c058a Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 12 Jan 2022 16:15:11 +0100 Subject: [PATCH 028/136] Temporiraly fix for centos --- cmake_targets/CMakeLists.txt | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 63614804c6..7f1a4a3a46 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -913,17 +913,16 @@ set(HWLIB_LDPC_OFFLOAD_SOURCE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c ) -if (DPDK_FOUND) if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include -DALLOW_EXPERIMENTAL_API") SET(T1_DPDK_LIBS "-Wl,-rpath /usr/local/lib64 -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_fpga_5gnr_fec -lrte_pmd_hpac_sdfec_pmd -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") -TARGET_LINK_LIBRARIES(ldpc_offload ${T1_DPDK_LIBS}) -TARGET_LINK_LIBRARIES(ldpc_offload pthread dl rt m numa) -endif() -endif(DPDK_FOUND) + +target_link_libraries(ldpc_offload ${T1_DPDK_LIBS}) +target_link_libraries(ldpc_offload pthread dl rt m numa) +endif () ########################################################## @@ -2861,13 +2860,11 @@ target_link_libraries (nr-softmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRA target_link_libraries (nr-softmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (nr-softmodem ${T_LIB}) -add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc) +add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc ldpc_offload) -if (DPDK_FOUND) if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") add_dependencies( nr-softmodem ldpc_offload) endif () -endif (DPDK_FOUND) # nr-uesoftmodem is UE implementation ####################################### @@ -3075,13 +3072,11 @@ add_executable(nr_ulsim ${SHLIB_LOADER_SOURCES} ) -add_dependencies( nr_ulsim ldpc_orig ldpc_optim ldpc_optim8seg ldpc) +add_dependencies( nr_ulsim ldpc_orig ldpc_optim ldpc_optim8seg ldpc ldpc_offload) -if (DPDK_FOUND) if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") add_dependencies( nr_ulsim ldpc_offload) endif () -endif (DPDK_FOUND) target_link_libraries(nr_ulsim -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -lz -Wl,--end-group From fe4e1bdb936b4bddafb26f6f4e15697dc0500d9a Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 28 Jan 2022 09:20:52 +0100 Subject: [PATCH 029/136] adding harq pid to harq buffer offset --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 92 ++++++++++++------- openair1/PHY/CODING/nrLDPC_defs.h | 2 +- openair1/PHY/CODING/nrLDPC_load.c | 4 +- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 12 ++- 4 files changed, 72 insertions(+), 38 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index a6e1af015d..884eae1adb 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -166,6 +166,7 @@ struct thread_params { struct nrLDPCoffload_params *p_offloadParams; int8_t* p_out; uint8_t r; + uint8_t harq_pid; rte_atomic16_t nb_dequeued; rte_atomic16_t processing_status; rte_atomic16_t burst_sz; @@ -636,6 +637,9 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, unsigned int i, j; bool large_input = false; uint8_t nb_segments = 1; + uint64_t start_time=rte_rdtsc_precise(); + uint64_t start_time1; //=rte_rdtsc_precise(); + uint64_t total_time=0, total_time1=0; for (i = 0; i < n; ++i) { char *data; @@ -663,8 +667,17 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, m_head->data_off = 0; m_head->data_len = data_len; } else { + rte_pktmbuf_reset(m_head); data = rte_pktmbuf_append(m_head, data_len); + + total_time = rte_rdtsc_precise() - start_time; + + if (total_time > 10*3000) + LOG_E(PHY," init op first: %u\n",(uint) (total_time/3000)); + + start_time1 = rte_rdtsc_precise(); + TEST_ASSERT_NOT_NULL(data, "Couldn't append %u bytes to mbuf from %d data type mbuf pool", @@ -675,6 +688,9 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", data, min_alignment); rte_memcpy(data, p_llr, data_len); + total_time1 = rte_rdtsc_precise() - start_time; + if (total_time1 > 10*3000) + LOG_E(PHY,"init op second: %u\n",(uint) (total_time1/3000)); } bufs[i].length += data_len; @@ -709,7 +725,7 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, } else { /* allocate chained-mbuf for output buffer */ - for (j = 1; j < nb_segments; ++j) { + /*for (j = 1; j < nb_segments; ++j) { struct rte_mbuf *m_tail = rte_pktmbuf_alloc(mbuf_pool); TEST_ASSERT_NOT_NULL(m_tail, @@ -722,7 +738,7 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, TEST_ASSERT_SUCCESS(ret, "Couldn't chain mbufs from %d data type mbuf pool", op_type); - } + }*/ } } @@ -796,6 +812,7 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, struct rte_bbdev_op_data *harq_outputs, struct rte_bbdev_dec_op *ref_op, uint8_t r, + uint8_t harq_pid, t_nrLDPCoffload_params *p_offloadParams) { unsigned int i; @@ -827,8 +844,8 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; //|RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP; ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; - ops[i]->ldpc_dec.harq_combined_input.offset =r*1024*32; - ops[i]->ldpc_dec.harq_combined_output.offset =r*1024*32; + ops[i]->ldpc_dec.harq_combined_input.offset = harq_pid*1024*32*32+r*1024*32; + ops[i]->ldpc_dec.harq_combined_output.offset = harq_pid*1024*32*32+r*1024*32; if (hard_outputs != NULL) @@ -1043,6 +1060,7 @@ pmd_lcore_ldpc_dec(void *arg) struct rte_bbdev_dec_op *ops_deq[num_ops]; struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; uint8_t r= tp->r; + uint8_t harq_pid = tp->harq_pid; struct test_buffers *bufs = NULL; int i, j, ret; struct rte_bbdev_info info; @@ -1087,7 +1105,7 @@ pmd_lcore_ldpc_dec(void *arg) set_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op, r, p_offloadParams); + bufs->harq_inputs, bufs->harq_outputs, ref_op, r, harq_pid, p_offloadParams); /* Set counter to validate the ordering */ for (j = 0; j < num_ops; ++j) @@ -1154,11 +1172,11 @@ pmd_lcore_ldpc_dec(void *arg) rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); - /*total_time = rte_rdtsc_precise() - start_time; + total_time = rte_rdtsc_precise() - start_time; - if (total_time > 10*3000) + if (total_time > 100*3000) LOG_E(PHY," pmd lcore: %u\n",(uint) (total_time/3000)); - */ + double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); tp->ops_per_sec = ((double)total_time / (double)rte_get_tsc_hz()); @@ -1208,6 +1226,7 @@ start_pmd_dec(struct active_device *ad, struct thread_params *t_params, t_nrLDPCoffload_params *p_offloadParams, uint8_t r, + uint8_t harq_pid, int8_t* p_out) { int ret; @@ -1250,6 +1269,7 @@ start_pmd_dec(struct active_device *ad, t_params[0].p_out = p_out; t_params[0].p_offloadParams = p_offloadParams; t_params[0].r = r; + t_params[0].harq_pid = harq_pid; RTE_LCORE_FOREACH_SLAVE(lcore_id) { if (used_cores >= num_lcores) @@ -1262,6 +1282,7 @@ start_pmd_dec(struct active_device *ad, t_params[used_cores].p_out = p_out; t_params[used_cores].p_offloadParams = p_offloadParams; t_params[used_cores].r = r; + t_params[used_cores].harq_pid = harq_pid; rte_eal_remote_launch(pmd_lcore_ldpc_dec, &t_params[used_cores++], lcore_id); @@ -1289,7 +1310,7 @@ start_pmd_dec(struct active_device *ad, /* Print throughput if interrupts are disabled and test passed */ if (!intr_enabled) { - // print_dec_throughput(t_params, num_lcores); + ///print_dec_throughput(t_params, num_lcores); //rte_free(t_params); // total_time1 = rte_rdtsc_precise() - start_time1; @@ -1396,33 +1417,37 @@ struct rte_mbuf *m_head[DATA_NUM_TYPES]; struct thread_params *t_params; -int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_t rv, uint16_t F, +int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t harq_pid, uint8_t C, uint8_t rv, uint16_t F, uint32_t E, uint8_t Qm, int8_t* p_llr, int8_t* p_out, uint8_t mode) { t_nrLDPCoffload_params offloadParams; t_nrLDPCoffload_params* p_offloadParams = &offloadParams; uint64_t start=rte_rdtsc_precise(); - uint64_t start_time=rte_rdtsc_precise(); + uint64_t start_time;//=rte_rdtsc_precise(); uint64_t start_time1; //=rte_rdtsc_precise(); uint64_t total_time=0, total_time1=0; uint32_t numIter = 0; int ret; + uint64_t start_time_init; + uint64_t total_time_init=0; + /* int argc_re=2; char *argv_re[2]; - argv_re[0] = "/home/wang/dpdk2005/dpdk-20.05/build/app/testbbdev"; + argv_re[0] = "/home/eurecom/hongzhi/dpdk-20.05orig/build/app/testbbdev"; argv_re[1] = "--"; */ - int argc_re=7; - char *argv_re[7]; - argv_re[0] = "/home/wang/dpdk2005/dpdk-20.05/build/app/testbbdev"; - argv_re[1] = "-l"; - argv_re[2] = "35"; - argv_re[3] = "-w"; - argv_re[4] = "b0:00.0"; - argv_re[5] = "--file-prefix=b6"; - argv_re[6] = "--"; - + + int argc_re=7; + char *argv_re[7]; + argv_re[0] = "/home/eurecom/hongzhi/dpdk-20.05orig/build/app/testbbdev"; + argv_re[1] = "-l"; + argv_re[2] = "31"; + argv_re[3] = "-w"; + argv_re[4] = "81:00.0"; + argv_re[5] = "--file-prefix=b6"; + argv_re[6] = "--"; + test_params.num_ops=1; test_params.burst_sz=1; test_params.num_lcores=1; @@ -1555,8 +1580,11 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ break; case 1: - //printf("offload param E %d BG %d F %d Z %d Qm %d\n", E,p_decParams->BG, F,p_decParams->Z, Qm); - //start_time = rte_rdtsc_precise(); + //printf("offload param E %d BG %d F %d Z %d Qm %d rv %d\n", E,p_decParams->BG, F,p_decParams->Z, Qm,rv); + //uint64_t start_time_init; + //uint64_t total_time_init=0; + + start_time_init = rte_rdtsc_precise(); p_offloadParams->E = E; p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); p_offloadParams->BG = p_decParams->BG; @@ -1601,20 +1629,20 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t C, uint8_ "Couldn't init rte_bbdev_op_data structs"); } - /*total_time = rte_rdtsc_precise() - start_time; + total_time_init = rte_rdtsc_precise() - start_time_init; - if (total_time > 100*3000) - LOG_E(PHY," ldpc decoder mode 1 first: %u\n",(uint) (total_time/3000)); - - start_time1 = rte_rdtsc_precise();*/ - ret = start_pmd_dec(ad, op_params, t_params, p_offloadParams, C, p_out); + if (total_time_init > 100*3000) + LOG_E(PHY," ldpc decoder mode 1 first: %u\n",(uint) (total_time_init/3000)); + + start_time1 = rte_rdtsc_precise(); + ret = start_pmd_dec(ad, op_params, t_params, p_offloadParams, C, harq_pid, p_out); if (ret<0) { printf("Couldn't start pmd dec"); return(-1); } - /*total_time1 = rte_rdtsc_precise() - start_time; + total_time1 = rte_rdtsc_precise() - start_time1; if (total_time1 > 100*3000) - LOG_E(PHY," ldpc decoder mode 1 second: %u\n",(uint) (total_time1/3000));*/ + LOG_E(PHY," ldpc decoder mode 1 second: %u\n",(uint) (total_time1/3000)); break; case 2: diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h index d3d0d5c652..b76f1ff3cc 100644 --- a/openair1/PHY/CODING/nrLDPC_defs.h +++ b/openair1/PHY/CODING/nrLDPC_defs.h @@ -74,7 +74,7 @@ typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,sho */ typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); -typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t , uint8_t, uint16_t, uint32_t, uint8_t, int8_t*, int8_t* ,uint8_t); +typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , int8_t, uint8_t , uint8_t, uint16_t, uint32_t, uint8_t, int8_t*, int8_t* ,uint8_t); typedef int32_t(*nrLDPC_dectopfunc_t)(void); #endif diff --git a/openair1/PHY/CODING/nrLDPC_load.c b/openair1/PHY/CODING/nrLDPC_load.c index 71187b6a6b..14ca0514ed 100644 --- a/openair1/PHY/CODING/nrLDPC_load.c +++ b/openair1/PHY/CODING/nrLDPC_load.c @@ -87,7 +87,7 @@ int load_nrLDPClib_offload(void) { p_decParams->Z = 384; p_decParams->BG = 1; - AssertFatal(nrLDPC_decoder_offload(p_decParams, + AssertFatal(nrLDPC_decoder_offload(p_decParams,0, 1, 0, 0, @@ -110,7 +110,7 @@ t_nrLDPC_dec_params decParams; p_decParams->Z = 384; p_decParams->BG = 1; - nrLDPC_decoder_offload(p_decParams, + nrLDPC_decoder_offload(p_decParams,0, 1, 0, 0, diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 4f23b788a1..28a15a0b13 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -431,7 +431,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, LOG_E(PHY,"ulsch_decoding.c: NULL harq_process pointer\n"); return 1; } - + uint8_t dtx_det = 0; t_nrLDPC_dec_params decParams; t_nrLDPC_dec_params* p_decParams = &decParams; @@ -470,6 +470,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, if (harq_process->ndi != pusch_pdu->pusch_data.new_data_indicator) { harq_process->new_rx = true; harq_process->ndi = pusch_pdu->pusch_data.new_data_indicator; + dtx_det = 1; LOG_E(PHY,"Missed ULSCH detection. NDI toggled but rv %d does not correspond to first reception\n",pusch_pdu->pusch_data.rv_index); } @@ -601,6 +602,8 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, E = nr_get_E(G, harq_process->C, Qm, n_layers, r); memset(harq_process->c[r],0,Kr_bytes); + if ((dtx_det==0)&&(pusch_pdu->pusch_data.rv_index==0)){ + //if (dtx_det==0){ if (mcs >9){ memcpy((&z_ol[0]),ulsch_llr+r_offset,E*sizeof(short)); @@ -609,7 +612,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, pl_ol128[j] = _mm_packs_epi16(pv_ol128[i],pv_ol128[i+1]); } - ret = nrLDPC_decoder_offload(p_decParams, + ret = nrLDPC_decoder_offload(p_decParams, harq_pid, r, pusch_pdu->pusch_data.rv_index, harq_process->F, @@ -698,7 +701,10 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); } */ - + } + else{ + no_iteration_ldpc = ulsch->max_ldpc_iterations+1; + } bool decodeSuccess = (no_iteration_ldpc <= ulsch->max_ldpc_iterations); if (decodeSuccess) { memcpy(harq_process->b+offset, From 65b0e7a8ea3052a8afa7deda937014f38f001bcf Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 10 Feb 2022 15:26:52 +0100 Subject: [PATCH 030/136] reducing some logs and fixing some vcd traces --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 8 +++++--- openair2/LAYER2/NR_MAC_gNB/main.c | 2 ++ targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 4 ++-- targets/ARCH/rfsimulator/simulator.c | 12 ++++++------ 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index b38b79afb6..4f5da672a8 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -505,6 +505,7 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id, gNB->UL_INFO.rx_ind.number_of_pdus++; pthread_mutex_unlock(&gNB->UL_INFO_mutex); + } // Function to fill UL RB mask to be used for N0 measurements @@ -758,8 +759,11 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { pusch_decode_done = 1; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RX_PUSCH,1); - start_meas(&gNB->rx_pusch_stats); + start_meas(&gNB->rx_pusch_stats); no_sig = nr_rx_pusch(gNB, ULSCH_id, frame_rx, slot_rx, harq_pid); + stop_meas(&gNB->rx_pusch_stats); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RX_PUSCH,0); + if (no_sig) { LOG_D(PHY, "PUSCH not detected in frame %d, slot %d\n", frame_rx, slot_rx); nr_fill_indication(gNB, frame_rx, slot_rx, ULSCH_id, harq_pid, 1,1); @@ -787,8 +791,6 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { return 1; } else gNB->pusch_vars[ULSCH_id]->DTX=0; - stop_meas(&gNB->rx_pusch_stats); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RX_PUSCH,0); //LOG_M("rxdataF_comp.m","rxF_comp",gNB->pusch_vars[0]->rxdataF_comp[0],6900,1,1); //LOG_M("rxdataF_ext.m","rxF_ext",gNB->pusch_vars[0]->rxdataF_ext[0],6900,1,1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_ULSCH_PROCEDURES_RX,1); diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c index b9da84ead2..df4e24a22b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/main.c +++ b/openair2/LAYER2/NR_MAC_gNB/main.c @@ -128,10 +128,12 @@ void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp } } } + /* print_meas(&gNB->eNB_scheduler, "DL & UL scheduling timing stats", NULL, NULL); print_meas(&gNB->schedule_dlsch,"dlsch scheduler",NULL,NULL); print_meas(&gNB->rlc_data_req, "rlc_data_req",NULL,NULL); print_meas(&gNB->rlc_status_ind,"rlc_status_ind",NULL,NULL); + */ } diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index e3b06a6438..d468cfa2cd 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -464,7 +464,7 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI write_package[end].buff[i] = buff[i]; write_thread->count_write++; write_thread->end = (write_thread->end + 1)% MAX_WRITE_THREAD_PACKAGE; - LOG_D(HW,"Signaling TX TS %llu\n",(unsigned long long)timestamp); + // LOG_D(HW,"Signaling TX TS %llu\n",(unsigned long long)timestamp); pthread_cond_signal(&write_thread->cond_write); pthread_mutex_unlock(&write_thread->mutex_write); return 0; @@ -555,7 +555,7 @@ void *trx_usrp_write_thread(void * arg){ s->tx_md.start_of_burst = (s->tx_count==0) ? true : first_packet; s->tx_md.end_of_burst = last_packet; s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); - LOG_D(PHY,"usrp_tx_write: tx_count %llu SoB %d, EoB %d, TS %llu\n",(unsigned long long)s->tx_count,s->tx_md.start_of_burst,s->tx_md.end_of_burst,(unsigned long long)timestamp); + // LOG_D(PHY,"usrp_tx_write: tx_count %llu SoB %d, EoB %d, TS %llu\n",(unsigned long long)s->tx_count,s->tx_md.start_of_burst,s->tx_md.end_of_burst,(unsigned long long)timestamp); s->tx_count++; // bit 3 enables gpio (for backward compatibility) diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c index 013e542689..5e2015c496 100644 --- a/targets/ARCH/rfsimulator/simulator.c +++ b/targets/ARCH/rfsimulator/simulator.c @@ -429,7 +429,7 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t, openair0_timestamp if (!alreadyLocked) pthread_mutex_lock(&Sockmutex); - LOG_D(HW,"sending %d samples at time: %ld\n", nsamps, timestamp); + //LOG_D(HW,"sending %d samples at time: %ld\n", nsamps, timestamp); for (int i=0; ibuf[i]; @@ -464,8 +464,8 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t, openair0_timestamp if (!alreadyLocked) pthread_mutex_unlock(&Sockmutex); - LOG_D(HW,"sent %d samples at time: %ld->%ld, energy in first antenna: %d\n", - nsamps, timestamp, timestamp+nsamps, signal_energy(samplesVoid[0], nsamps) ); + //LOG_D(HW,"sent %d samples at time: %ld->%ld, energy in first antenna: %d\n", + // nsamps, timestamp, timestamp+nsamps, signal_energy(samplesVoid[0], nsamps) ); return nsamps; } @@ -536,7 +536,7 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi } else if ( sz == 0 ) continue; - LOG_D(HW, "Socket rcv %zd bytes\n", sz); + //LOG_D(HW, "Socket rcv %zd bytes\n", sz); AssertFatal((b->remainToTransfer-=sz) >= 0, ""); b->transferPtr+=sz; @@ -599,11 +599,11 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi if ( b->headerMode==false ) { if ( ! b->trashingPacket ) { b->lastReceivedTS=b->th.timestamp+b->th.size-byteToSample(b->remainToTransfer,b->th.nbAnt); - LOG_D(HW,"UEsock: %d Set b->lastReceivedTS %ld\n", fd, b->lastReceivedTS); + //LOG_D(HW,"UEsock: %d Set b->lastReceivedTS %ld\n", fd, b->lastReceivedTS); } if ( b->remainToTransfer==0) { - LOG_D(HW,"UEsock: %d Completed block reception: %ld\n", fd, b->lastReceivedTS); + //LOG_D(HW,"UEsock: %d Completed block reception: %ld\n", fd, b->lastReceivedTS); b->headerMode=true; b->transferPtr=(char *)&b->th; b->remainToTransfer=sizeof(samplesBlockHeader_t); From 3df0b895253f82f819fc6d2afc3bf9ee88bc2c06 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 10 Feb 2022 15:27:47 +0100 Subject: [PATCH 031/136] re-activating HARQ for UL. break loop when one segment is in error --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 28a15a0b13..2fe086d256 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -602,8 +602,8 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, E = nr_get_E(G, harq_process->C, Qm, n_layers, r); memset(harq_process->c[r],0,Kr_bytes); - if ((dtx_det==0)&&(pusch_pdu->pusch_data.rv_index==0)){ - //if (dtx_det==0){ + //if ((dtx_det==0)&&(pusch_pdu->pusch_data.rv_index==0)){ + if (dtx_det==0){ if (mcs >9){ memcpy((&z_ol[0]),ulsch_llr+r_offset,E*sizeof(short)); @@ -705,6 +705,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, else{ no_iteration_ldpc = ulsch->max_ldpc_iterations+1; } + bool decodeSuccess = (no_iteration_ldpc <= ulsch->max_ldpc_iterations); if (decodeSuccess) { memcpy(harq_process->b+offset, @@ -716,37 +717,40 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, else { LOG_D(PHY,"uplink segment error %d/%d\n",r,harq_process->C); LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); + break; //don't even attempt to decode other segments } - if (r==(harq_process->C-1)){ - if ((decodeSuccess)&&(harq_process->processedSegments==(harq_process->C))) { - LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n", - phy_vars_gNB->Mod_id,harq_process->slot,harq_process->TBS); - harq_process->status = SCH_IDLE; - harq_process->round = 0; - ulsch->harq_mask &= ~(1 << harq_pid); + } - LOG_D(PHY, "ULSCH received ok \n"); - nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 0,0); - - } else { - LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n", - phy_vars_gNB->Mod_id, harq_process->frame, harq_process->slot, - harq_pid,harq_process->status, harq_process->round,harq_process->TBS,r); - if (harq_process->round >= ulsch->Mlimit) { - harq_process->status = SCH_IDLE; - harq_process->round = 0; - harq_process->handled = 0; - ulsch->harq_mask &= ~(1 << harq_pid); - } - harq_process->handled = 1; - no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; - LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); - nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 1,0); - } - ulsch->last_iteration_cnt = no_iteration_ldpc; - } - } + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_ULSCH_DECODING,0); + + if ((harq_process->processedSegments==(harq_process->C))) { + LOG_D(PHY,"[gNB %d] ULSCH: Setting ACK for slot %d TBS %d\n", + phy_vars_gNB->Mod_id,harq_process->slot,harq_process->TBS); + harq_process->status = SCH_IDLE; + harq_process->round = 0; + ulsch->harq_mask &= ~(1 << harq_pid); + + LOG_D(PHY, "ULSCH received ok \n"); + nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 0,0); + + } else { + LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n", + phy_vars_gNB->Mod_id, harq_process->frame, harq_process->slot, + harq_pid,harq_process->status, harq_process->round,harq_process->TBS,r); + if (harq_process->round >= ulsch->Mlimit) { + harq_process->status = SCH_IDLE; + harq_process->round = 0; + harq_process->handled = 0; + ulsch->harq_mask &= ~(1 << harq_pid); + } + harq_process->handled = 1; + no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; + LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); + nr_fill_indication(phy_vars_gNB,harq_process->frame, harq_process->slot, ULSCH_id, harq_pid, 1,0); } + ulsch->last_iteration_cnt = no_iteration_ldpc; + } + else { void (*nr_processULSegment_ptr)(void*) = &nr_processULSegment; From 638b5f7f2adeec9d900317f263fb5d7710a6abf7 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 14 Feb 2022 13:37:08 +0100 Subject: [PATCH 032/136] adding ulsch id to offload harq buffer offset for multiple users --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 18 ++++++++++++------ openair1/PHY/CODING/nrLDPC_defs.h | 2 +- openair1/PHY/CODING/nrLDPC_load.c | 4 ++-- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 884eae1adb..f3a59725ed 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -167,6 +167,7 @@ struct thread_params { int8_t* p_out; uint8_t r; uint8_t harq_pid; + uint8_t ulsch_id; rte_atomic16_t nb_dequeued; rte_atomic16_t processing_status; rte_atomic16_t burst_sz; @@ -813,6 +814,7 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, struct rte_bbdev_dec_op *ref_op, uint8_t r, uint8_t harq_pid, + uint8_t ulsch_id, t_nrLDPCoffload_params *p_offloadParams) { unsigned int i; @@ -843,9 +845,9 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ops[i]->ldpc_dec.rv_index = p_offloadParams->rv; ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; //|RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP; ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; - - ops[i]->ldpc_dec.harq_combined_input.offset = harq_pid*1024*32*32+r*1024*32; - ops[i]->ldpc_dec.harq_combined_output.offset = harq_pid*1024*32*32+r*1024*32; + //printf("set ldpc ulsch_id %d\n",ulsch_id); + ops[i]->ldpc_dec.harq_combined_input.offset = ulsch_id*1024*32*32*16+harq_pid*1024*32*32+r*1024*32; + ops[i]->ldpc_dec.harq_combined_output.offset = ulsch_id*1024*32*32*16+harq_pid*1024*32*32+r*1024*32; if (hard_outputs != NULL) @@ -1061,6 +1063,7 @@ pmd_lcore_ldpc_dec(void *arg) struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; uint8_t r= tp->r; uint8_t harq_pid = tp->harq_pid; + uint8_t ulsch_id = tp->ulsch_id; struct test_buffers *bufs = NULL; int i, j, ret; struct rte_bbdev_info info; @@ -1105,7 +1108,7 @@ pmd_lcore_ldpc_dec(void *arg) set_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, bufs->hard_outputs, bufs->soft_outputs, - bufs->harq_inputs, bufs->harq_outputs, ref_op, r, harq_pid, p_offloadParams); + bufs->harq_inputs, bufs->harq_outputs, ref_op, r, harq_pid, ulsch_id, p_offloadParams); /* Set counter to validate the ordering */ for (j = 0; j < num_ops; ++j) @@ -1227,6 +1230,7 @@ start_pmd_dec(struct active_device *ad, t_nrLDPCoffload_params *p_offloadParams, uint8_t r, uint8_t harq_pid, + uint8_t ulsch_id, int8_t* p_out) { int ret; @@ -1270,6 +1274,7 @@ start_pmd_dec(struct active_device *ad, t_params[0].p_offloadParams = p_offloadParams; t_params[0].r = r; t_params[0].harq_pid = harq_pid; + t_params[0].ulsch_id = ulsch_id; RTE_LCORE_FOREACH_SLAVE(lcore_id) { if (used_cores >= num_lcores) @@ -1283,6 +1288,7 @@ start_pmd_dec(struct active_device *ad, t_params[used_cores].p_offloadParams = p_offloadParams; t_params[used_cores].r = r; t_params[used_cores].harq_pid = harq_pid; + t_params[used_cores].ulsch_id = ulsch_id; rte_eal_remote_launch(pmd_lcore_ldpc_dec, &t_params[used_cores++], lcore_id); @@ -1417,7 +1423,7 @@ struct rte_mbuf *m_head[DATA_NUM_TYPES]; struct thread_params *t_params; -int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t harq_pid, uint8_t C, uint8_t rv, uint16_t F, +int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t harq_pid, uint8_t ulsch_id, uint8_t C, uint8_t rv, uint16_t F, uint32_t E, uint8_t Qm, int8_t* p_llr, int8_t* p_out, uint8_t mode) { t_nrLDPCoffload_params offloadParams; @@ -1635,7 +1641,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t harq_pid, LOG_E(PHY," ldpc decoder mode 1 first: %u\n",(uint) (total_time_init/3000)); start_time1 = rte_rdtsc_precise(); - ret = start_pmd_dec(ad, op_params, t_params, p_offloadParams, C, harq_pid, p_out); + ret = start_pmd_dec(ad, op_params, t_params, p_offloadParams, C, harq_pid, ulsch_id, p_out); if (ret<0) { printf("Couldn't start pmd dec"); return(-1); diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h index b76f1ff3cc..9a9ad1dd50 100644 --- a/openair1/PHY/CODING/nrLDPC_defs.h +++ b/openair1/PHY/CODING/nrLDPC_defs.h @@ -74,7 +74,7 @@ typedef int(*nrLDPC_encoderfunc_t)(unsigned char **,unsigned char **,int,int,sho */ typedef int32_t(*nrLDPC_decoderfunc_t)(t_nrLDPC_dec_params* , int8_t*, int8_t* , t_nrLDPC_procBuf* , t_nrLDPC_time_stats* ); -typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , int8_t, uint8_t , uint8_t, uint16_t, uint32_t, uint8_t, int8_t*, int8_t* ,uint8_t); +typedef int32_t(*nrLDPC_decoffloadfunc_t)(t_nrLDPC_dec_params* , uint8_t, uint8_t, uint8_t , uint8_t, uint16_t, uint32_t, uint8_t, int8_t*, int8_t* ,uint8_t); typedef int32_t(*nrLDPC_dectopfunc_t)(void); #endif diff --git a/openair1/PHY/CODING/nrLDPC_load.c b/openair1/PHY/CODING/nrLDPC_load.c index 14ca0514ed..4539be2f67 100644 --- a/openair1/PHY/CODING/nrLDPC_load.c +++ b/openair1/PHY/CODING/nrLDPC_load.c @@ -87,7 +87,7 @@ int load_nrLDPClib_offload(void) { p_decParams->Z = 384; p_decParams->BG = 1; - AssertFatal(nrLDPC_decoder_offload(p_decParams,0, + AssertFatal(nrLDPC_decoder_offload(p_decParams,0, 0, 1, 0, 0, @@ -110,7 +110,7 @@ t_nrLDPC_dec_params decParams; p_decParams->Z = 384; p_decParams->BG = 1; - nrLDPC_decoder_offload(p_decParams,0, + nrLDPC_decoder_offload(p_decParams,0,0, 1, 0, 0, diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 2fe086d256..c00398cffb 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -613,7 +613,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, } ret = nrLDPC_decoder_offload(p_decParams, harq_pid, - r, + ULSCH_id,r, pusch_pdu->pusch_data.rv_index, harq_process->F, E, From 1d0a7b386076c8d16ace8218c1aa4c0e52018602 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 15 Feb 2022 09:49:12 +0100 Subject: [PATCH 033/136] removing some log prints --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index f3a59725ed..c9875e9614 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -638,9 +638,9 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, unsigned int i, j; bool large_input = false; uint8_t nb_segments = 1; - uint64_t start_time=rte_rdtsc_precise(); - uint64_t start_time1; //=rte_rdtsc_precise(); - uint64_t total_time=0, total_time1=0; + //uint64_t start_time=rte_rdtsc_precise(); + //uint64_t start_time1; //=rte_rdtsc_precise(); + //uint64_t total_time=0, total_time1=0; for (i = 0; i < n; ++i) { char *data; @@ -672,14 +672,14 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, rte_pktmbuf_reset(m_head); data = rte_pktmbuf_append(m_head, data_len); - total_time = rte_rdtsc_precise() - start_time; + /*total_time = rte_rdtsc_precise() - start_time; if (total_time > 10*3000) LOG_E(PHY," init op first: %u\n",(uint) (total_time/3000)); start_time1 = rte_rdtsc_precise(); - + */ TEST_ASSERT_NOT_NULL(data, "Couldn't append %u bytes to mbuf from %d data type mbuf pool", data_len, op_type); @@ -689,9 +689,9 @@ init_op_data_objs(struct rte_bbdev_op_data *bufs, "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", data, min_alignment); rte_memcpy(data, p_llr, data_len); - total_time1 = rte_rdtsc_precise() - start_time; + /*total_time1 = rte_rdtsc_precise() - start_time; if (total_time1 > 10*3000) - LOG_E(PHY,"init op second: %u\n",(uint) (total_time1/3000)); + LOG_E(PHY,"init op second: %u\n",(uint) (total_time1/3000));*/ } bufs[i].length += data_len; @@ -994,7 +994,7 @@ create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op, t_nrLDPCoffload_params - +/* static uint32_t calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) { @@ -1016,7 +1016,7 @@ calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) } return tb_size; } - +*/ static int init_test_op_params(struct test_op_params *op_params, @@ -1054,7 +1054,7 @@ pmd_lcore_ldpc_dec(void *arg) { struct thread_params *tp = arg; uint16_t enq, deq; - uint64_t total_time = 0, start_time; + //uint64_t total_time = 0, start_time; const uint16_t queue_id = tp->queue_id; const uint16_t burst_sz = tp->op_params->burst_sz; const uint16_t num_ops = tp->op_params->num_to_process; @@ -1075,7 +1075,7 @@ pmd_lcore_ldpc_dec(void *arg) //bool extDdr = check_bit(ldpc_cap_flags, // RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); - start_time = rte_rdtsc_precise(); + //start_time = rte_rdtsc_precise(); bool loopback = check_bit(ref_op->ldpc_dec.op_flags, RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, @@ -1175,7 +1175,7 @@ pmd_lcore_ldpc_dec(void *arg) rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); - total_time = rte_rdtsc_precise() - start_time; + /*total_time = rte_rdtsc_precise() - start_time; if (total_time > 100*3000) LOG_E(PHY," pmd lcore: %u\n",(uint) (total_time/3000)); @@ -1188,7 +1188,7 @@ pmd_lcore_ldpc_dec(void *arg) tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / 1000000.0) / ((double)total_time / (double)rte_get_tsc_hz()); - + */ return ret; } @@ -1238,10 +1238,10 @@ start_pmd_dec(struct active_device *ad, struct thread_params *tp; //struct rte_bbdev_info info; uint16_t num_lcores; - uint64_t start_time, start_time1 ; //= rte_rdtsc_precise(); - uint64_t total_time=0, total_time1=0; + //uint64_t start_time, start_time1 ; //= rte_rdtsc_precise(); + //uint64_t total_time=0, total_time1=0; //rte_bbdev_info_get(ad->dev_id, &info); - start_time = rte_rdtsc_precise(); + //start_time = rte_rdtsc_precise(); /*printf("+ ------------------------------------------------------- +\n"); printf("== start pmd dec\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, itr mode: %s, GHz: %lg\n", info.dev_name, ad->nb_queues, op_params->burst_sz, @@ -1261,7 +1261,7 @@ start_pmd_dec(struct active_device *ad, RTE_ALIGN(sizeof(struct thread_params) * num_lcores, RTE_CACHE_LINE_SIZE)); */ - total_time = rte_rdtsc_precise() - start_time; + //total_time = rte_rdtsc_precise() - start_time; rte_atomic16_set(&op_params->sync, SYNC_WAIT); /* Master core is set at first entry */ @@ -1429,13 +1429,13 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t harq_pid, t_nrLDPCoffload_params offloadParams; t_nrLDPCoffload_params* p_offloadParams = &offloadParams; uint64_t start=rte_rdtsc_precise(); - uint64_t start_time;//=rte_rdtsc_precise(); + /*uint64_t start_time;//=rte_rdtsc_precise(); uint64_t start_time1; //=rte_rdtsc_precise(); - uint64_t total_time=0, total_time1=0; + uint64_t total_time=0, total_time1=0;*/ uint32_t numIter = 0; int ret; - uint64_t start_time_init; - uint64_t total_time_init=0; + /*uint64_t start_time_init; + uint64_t total_time_init=0;*/ /* int argc_re=2; @@ -1590,7 +1590,7 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t harq_pid, //uint64_t start_time_init; //uint64_t total_time_init=0; - start_time_init = rte_rdtsc_precise(); + //start_time_init = rte_rdtsc_precise(); p_offloadParams->E = E; p_offloadParams->n_cb = (p_decParams->BG==1)?(66*p_decParams->Z):(50*p_decParams->Z); p_offloadParams->BG = p_decParams->BG; @@ -1635,20 +1635,20 @@ int32_t nrLDPC_decod_offload(t_nrLDPC_dec_params* p_decParams, uint8_t harq_pid, "Couldn't init rte_bbdev_op_data structs"); } - total_time_init = rte_rdtsc_precise() - start_time_init; + /*total_time_init = rte_rdtsc_precise() - start_time_init; if (total_time_init > 100*3000) LOG_E(PHY," ldpc decoder mode 1 first: %u\n",(uint) (total_time_init/3000)); - start_time1 = rte_rdtsc_precise(); + start_time1 = rte_rdtsc_precise();*/ ret = start_pmd_dec(ad, op_params, t_params, p_offloadParams, C, harq_pid, ulsch_id, p_out); if (ret<0) { printf("Couldn't start pmd dec"); return(-1); } - total_time1 = rte_rdtsc_precise() - start_time1; + /*total_time1 = rte_rdtsc_precise() - start_time1; if (total_time1 > 100*3000) - LOG_E(PHY," ldpc decoder mode 1 second: %u\n",(uint) (total_time1/3000)); + LOG_E(PHY," ldpc decoder mode 1 second: %u\n",(uint) (total_time1/3000));*/ break; case 2: From 380a2a555f5bb86eaaf8064a14da50f4593def4a Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 15 Feb 2022 14:45:58 +0100 Subject: [PATCH 034/136] bug fix for dtx detected --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index c00398cffb..11f0ddcc6a 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -461,6 +461,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, harq_process->round = nr_rv_to_round(pusch_pdu->pusch_data.rv_index); harq_process->new_rx = false; // flag to indicate if this is a new reception for this harq (initialized to false) + dtx_det = 0; if (harq_process->round == 0) { harq_process->new_rx = true; harq_process->ndi = pusch_pdu->pusch_data.new_data_indicator; @@ -583,7 +584,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, Kr_bytes = Kr>>3; offset = 0; - if (enable_ldpc_offload) { + if ((enable_ldpc_offload)&& (dtx_det==0)) { if (harq_process->C == 1) { if (A > 3824) @@ -603,7 +604,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, memset(harq_process->c[r],0,Kr_bytes); //if ((dtx_det==0)&&(pusch_pdu->pusch_data.rv_index==0)){ - if (dtx_det==0){ + //if (dtx_det==0){ if (mcs >9){ memcpy((&z_ol[0]),ulsch_llr+r_offset,E*sizeof(short)); @@ -701,10 +702,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); } */ - } + /*} else{ + dtx_det = 0; no_iteration_ldpc = ulsch->max_ldpc_iterations+1; - } + }*/ bool decodeSuccess = (no_iteration_ldpc <= ulsch->max_ldpc_iterations); if (decodeSuccess) { @@ -751,7 +753,8 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, ulsch->last_iteration_cnt = no_iteration_ldpc; } - else { + else { + dtx_det = 0; void (*nr_processULSegment_ptr)(void*) = &nr_processULSegment; for (r=0; rC; r++) { From a95ffb87de0fd28474a364905d958df3f5dce7a6 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Tue, 15 Feb 2022 16:50:18 +0100 Subject: [PATCH 035/136] bug fix offload harq round --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 1 + 1 file changed, 1 insertion(+) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 11f0ddcc6a..0f871cf678 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -739,6 +739,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n", phy_vars_gNB->Mod_id, harq_process->frame, harq_process->slot, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,r); + harq_process->round++; if (harq_process->round >= ulsch->Mlimit) { harq_process->status = SCH_IDLE; harq_process->round = 0; From 5254d1d91d266c1650a5e58347346ba2ec0d86ef Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 17 Feb 2022 11:15:29 +0100 Subject: [PATCH 036/136] update offload harq buffer offset --- openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index c9875e9614..08824ec0d0 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -846,8 +846,8 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, ops[i]->ldpc_dec.op_flags = RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE|RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; //|RTE_BBDEV_LDPC_CRC_TYPE_24B_DROP; ops[i]->ldpc_dec.code_block_mode = 1; //ldpc_dec->code_block_mode; //printf("set ldpc ulsch_id %d\n",ulsch_id); - ops[i]->ldpc_dec.harq_combined_input.offset = ulsch_id*1024*32*32*16+harq_pid*1024*32*32+r*1024*32; - ops[i]->ldpc_dec.harq_combined_output.offset = ulsch_id*1024*32*32*16+harq_pid*1024*32*32+r*1024*32; + ops[i]->ldpc_dec.harq_combined_input.offset = ulsch_id*(32*1024*1024)+harq_pid*(2*1024*1024)+r*(1024*32); + ops[i]->ldpc_dec.harq_combined_output.offset = ulsch_id*(32*1024*1024)+harq_pid*(2*1024*1024)+r*(1024*32); if (hard_outputs != NULL) From fc78d01508776e483be65718306ba4a5e9037906 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 17 Feb 2022 11:16:24 +0100 Subject: [PATCH 037/136] adding sa n310 config file --- ...gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf | 313 +++++++++++++++++ ...gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf | 316 ++++++++++++++++++ 2 files changed, 629 insertions(+) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf new file mode 100644 index 0000000000..500f2be93e --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf @@ -0,0 +1,313 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_CU_ID = 0xe00; + +# cell_type = "CELL_MACRO_GNB"; + + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x010203; // 0 false, else true + }, + { + sst = 1; + sd = 0x000001; // 0 false, else true + } + ); + }); + + nr_cellid = 12345678L + +# tr_s_preference = "local_mac" + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 2; + min_rxtxtime_pdsch = 5; + ul_prbblacklist = "51,52,53,54" + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 11; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6 + #absoluteFrequencySSB = 620640; + # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68 + absoluteFrequencySSB = 621312; + # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2 + #absoluteFrequencySSB = 634080; + # this is 3600.48 MHz + #absoluteFrequencySSB = 640032; + #dl_frequencyBand = 78; + # this is 3301.68 MHz + #dl_absoluteFrequencyPointA = 620112; + # this is 3300.60 MHz + dl_absoluteFrequencyPointA = 620040; + # this is 3502.56 MHz + #dl_absoluteFrequencyPointA = 633552; + # this is 3600.48 MHz + #dl_absoluteFrequencyPointA = 640032; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 106; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=106 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPsearchSpaceZero = 0; + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 106; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 28875; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -104; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; +# pusch_TargetSNRx10 = 200; +# pucch_TargetSNRx10 = 150; + ulsch_max_frame_inactivity = 0; + } +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + thread_pool_size = 4; +# pucch0_dtx_threshold = 150; +} +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 2 + nb_rx = 2 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + ##beamforming 1x4 matrix: 1 layer x 4 antennas + #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000]; + ## beamforming 2x2 matrix: + # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff]; + ## beamforming 4x4 matrix: + #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; + + sf_extension = 0 + sdr_addrs = "addr=192.168.82.52,second_addr=192.168.83.52,clock_source=internal,time_source=internal" + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_RU_L1_SPLIT"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + f1ap_log_level ="debug"; + f1ap_log_verbosity ="medium"; + }; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf new file mode 100644 index 0000000000..fa3960aec8 --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf @@ -0,0 +1,316 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_CU_ID = 0xe00; + +# cell_type = "CELL_MACRO_GNB"; + + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x010203; // 0 false, else true + }, + { + sst = 1; + sd = 0x000001; // 0 false, else true + } + ); + }); + + nr_cellid = 12345678L + +# tr_s_preference = "local_mac" + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 2; + #pusch_TargetSNRx10 = 200; + #pucch_TargetSNRx10 = 200; + ul_prbblacklist = "79,80,81,82" + min_rxtxtime = 6; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 11; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6 + #absoluteFrequencySSB = 620640; + # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68 + absoluteFrequencySSB = 621312; + # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2 + #absoluteFrequencySSB = 634080; + # this is 3600.48 MHz + #absoluteFrequencySSB = 640032; + #dl_frequencyBand = 78; + # this is 3301.68 MHz + #dl_absoluteFrequencyPointA = 620112; + # this is 3300.60 MHz + dl_absoluteFrequencyPointA = 620040; + # this is 3502.56 MHz + #dl_absoluteFrequencyPointA = 633552; + # this is 3600.48 MHz + #dl_absoluteFrequencyPointA = 640032; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 162; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=106 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 31899; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPsearchSpaceZero = 0; + + + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 162; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 31899; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -104; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + #pusch_TargetSNRx10 = 200; + #pucch_TargetSNRx10 = 200; + ulsch_max_frame_inactivity = 1; + } +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + thread_pool_size = 8; +# pucch0_dtx_threshold = 150; +} +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 2 + nb_rx = 2 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + ##beamforming 1x4 matrix: 1 layer x 4 antennas + #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000]; + ## beamforming 2x2 matrix: + # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff]; + ## beamforming 4x4 matrix: + #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; + sf_extension = 0 + sdr_addrs = "addr=192.168.82.52,second_addr=192.168.83.52,clock_source=internal,time_source=internal" + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_RU_L1_SPLIT"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + f1ap_log_level ="debug"; + f1ap_log_verbosity ="medium"; + }; From c4cfbfc84560b97d8fcd7b2d56b0b6c9f44bcb0c Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Mon, 28 Feb 2022 17:06:19 +0100 Subject: [PATCH 038/136] config file working for mwc --- ....band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf | 314 ++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf new file mode 100644 index 0000000000..ae43581e0b --- /dev/null +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf @@ -0,0 +1,314 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = +( + { + ////////// Identification parameters: + gNB_CU_ID = 0xe00; + +# cell_type = "CELL_MACRO_GNB"; + + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + + plmn_list = ({ + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ( + { + sst = 1; + sd = 0x010203; // 0 false, else true + }, + { + sst = 1; + sd = 0x000001; // 0 false, else true + } + ); + }); + + nr_cellid = 12345678L + +# tr_s_preference = "local_mac" + + ////////// Physical parameters: + + ssb_SubcarrierOffset = 0; + pdsch_AntennaPorts = 1; + pusch_AntennaPorts = 2; + ul_prbblacklist = "79,80,81,82" + min_rxtxtime = 2; + + pdcch_ConfigSIB1 = ( + { + controlResourceSetZero = 11; + searchSpaceZero = 0; + } + ); + + servingCellConfigCommon = ( + { + #spCellConfigCommon + + physCellId = 0; + +# downlinkConfigCommon + #frequencyInfoDL + # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6 + #absoluteFrequencySSB = 620640; + # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68 + absoluteFrequencySSB = 621312; + # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2 + #absoluteFrequencySSB = 634080; + # this is 3600.48 MHz + #absoluteFrequencySSB = 640032; + #dl_frequencyBand = 78; + # this is 3301.68 MHz + #dl_absoluteFrequencyPointA = 620112; + # this is 3300.60 MHz + dl_absoluteFrequencyPointA = 620040; + # this is 3502.56 MHz + #dl_absoluteFrequencyPointA = 633552; + # this is 3600.48 MHz + #dl_absoluteFrequencyPointA = 640032; + #scs-SpecificCarrierList + dl_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 162; + #initialDownlinkBWP + #genericParameters + # this is RBstart=0,L=106 (275*(L-1))+RBstart + initialDLBWPlocationAndBandwidth = 31899; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + #pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 11; + initialDLBWPsearchSpaceZero = 0; + + + + #uplinkConfigCommon + #frequencyInfoUL + ul_frequencyBand = 78; + #scs-SpecificCarrierList + ul_offstToCarrier = 0; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 162; + pMax = 20; + #initialUplinkBWP + #genericParameters + initialULBWPlocationAndBandwidth = 31899; +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + #rach-ConfigCommon + #rach-ConfigGeneric + prach_ConfigurationIndex = 98; +#prach_msg1_FDM +#0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -104; +#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; +#powerRampingStep +# 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; +#ra_ReponseWindow +#1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; +#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR +#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; +#oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; +#ra_ContentionResolutionTimer +#(0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; +#prach-RootSequenceIndex_PR +#1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + # + msg1_SubcarrierSpacing = 1, +# restrictedSetConfig +# 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + +# pucch-ConfigCommon setup : +# pucchGroupHopping +# 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -90; +# ssb_PositionsInBurs_BitmapPR +# 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + +# ssb_periodicityServingCell +# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + +# dmrs_TypeA_position +# 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + #tdd-UL-DL-ConfigurationCommon +# subcarrierSpacing +# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 6; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 3; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + + ); + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + ////////// AMF parameters: + amf_ip_address = ( { ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + }; + + } +); + +MACRLCs = ( + { + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 220; + pucch_TargetSNRx10 = 220; + ulsch_max_frame_inactivity = 1; + } +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + thread_pool_size = 8; +# pucch0_dtx_threshold = 150; +} +); + +RUs = ( + { + local_rf = "yes" + nb_tx = 2 + nb_rx = 2 + att_tx = 0 + att_rx = 0; + bands = [78]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + ##beamforming 1x4 matrix: 1 layer x 4 antennas + #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000]; + ## beamforming 2x2 matrix: + # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff]; + ## beamforming 4x4 matrix: + #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; + sf_extension = 0 + sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" + } +); + +THREAD_STRUCT = ( + { + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_RU_L1_SPLIT"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; + } +); + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + + log_config : + { + global_log_level ="info"; + global_log_verbosity ="medium"; + hw_log_level ="info"; + hw_log_verbosity ="medium"; + phy_log_level ="info"; + phy_log_verbosity ="medium"; + mac_log_level ="info"; + mac_log_verbosity ="high"; + rlc_log_level ="info"; + rlc_log_verbosity ="medium"; + pdcp_log_level ="info"; + pdcp_log_verbosity ="medium"; + rrc_log_level ="info"; + rrc_log_verbosity ="medium"; + f1ap_log_level ="debug"; + f1ap_log_verbosity ="medium"; + }; From 168edeaf73d63579e80ce0e72fc29c41dbdb4c8f Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 23 Feb 2022 13:11:53 +0100 Subject: [PATCH 039/136] setting reordering to infinity and max rb 50 --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 1 + openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c | 1 + openair2/RRC/NR/rrc_gNB.c | 1 + openair2/RRC/NR/rrc_gNB_reconfig.c | 1 + 4 files changed, 4 insertions(+) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 3a8fa01605..df26680e53 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1336,6 +1336,7 @@ void pf_ul(module_id_t module_id, uint16_t max_rbSize = 1; while (rbStart + max_rbSize < bwpSize && rballoc_mask[rbStart + max_rbSize]) max_rbSize++; + max_rbSize=50; if (rbStart + min_rb >= bwpSize) { LOG_W(NR_MAC, "cannot allocate UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index 1f66400af1..59965f9cc9 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -1162,6 +1162,7 @@ void nr_DRB_preconfiguration(uint16_t crnti) drb_ToAddMod->pdcp_Config->t_Reordering = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->t_Reordering)); *drb_ToAddMod->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0; + drb_ToAddMod->pdcp_Config->t_Reordering = NULL; drb_ToAddMod->pdcp_Config->ext1 = NULL; ASN_SEQUENCE_ADD(&rbconfig->drb_ToAddModList->list,drb_ToAddMod); diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index d6c658f01d..ffd7fcb9e5 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -907,6 +907,7 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering)); *DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0; + DRB_config->pdcp_Config->t_Reordering = NULL; DRB_config->pdcp_Config->ext1 = NULL; if (rrc->security.do_drb_integrity) { diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 1de34804df..e562ac89f5 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -1416,6 +1416,7 @@ void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig, drb_ToAddMod->pdcp_Config->t_Reordering = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->t_Reordering)); *drb_ToAddMod->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0; + drb_ToAddMod->pdcp_Config->t_Reordering = NULL; drb_ToAddMod->pdcp_Config->ext1 = NULL; ASN_SEQUENCE_ADD(&rbconfig->drb_ToAddModList->list,drb_ToAddMod); From 5c1ab827f450d3ba1fd0b895d8ff40a862d71565 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 10 Mar 2022 11:34:24 +0100 Subject: [PATCH 040/136] bugfix after cherry-pick --- cmake_targets/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 7f1a4a3a46..08ecacabfd 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -273,7 +273,7 @@ function(make_version VERSION_VALUE) endforeach() set(${VERSION_VALUE} "${RESULT}" PARENT_SCOPE) endfunction() ->>>>>>> 3c20b0c660 (adding dependency condition for ldpc offload) + #################################################### # compilation flags ############################################# @@ -2860,7 +2860,7 @@ target_link_libraries (nr-softmodem pthread m CONFIG_LIB rt crypt ${CRYPTO_LIBRA target_link_libraries (nr-softmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (nr-softmodem ${T_LIB}) -add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc ldpc_offload) +add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc) if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") add_dependencies( nr-softmodem ldpc_offload) @@ -3072,9 +3072,9 @@ add_executable(nr_ulsim ${SHLIB_LOADER_SOURCES} ) -add_dependencies( nr_ulsim ldpc_orig ldpc_optim ldpc_optim8seg ldpc ldpc_offload) +add_dependencies( nr_ulsim ldpc_orig ldpc_optim ldpc_optim8seg ldpc) -if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") +if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd1.so") add_dependencies( nr_ulsim ldpc_offload) endif () From 51251fe0555e40cb22fbe594dd3dc471de2ec9b9 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 10 Mar 2022 11:55:17 +0100 Subject: [PATCH 041/136] fix for loading ldpc_offload --- openair1/PHY/CODING/nrLDPC_load.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/CODING/nrLDPC_load.c b/openair1/PHY/CODING/nrLDPC_load.c index 4539be2f67..49ca9bf0de 100644 --- a/openair1/PHY/CODING/nrLDPC_load.c +++ b/openair1/PHY/CODING/nrLDPC_load.c @@ -94,7 +94,7 @@ int load_nrLDPClib_offload(void) { 25344, 8, l, - llrProcBuf, 0)>0, + llrProcBuf, 0)>=0, "error loading LDPC decoder offload library\n"); From 22d387e25f38c93877e633e13d2503f962c8feb1 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 10 Mar 2022 11:53:02 +0100 Subject: [PATCH 042/136] bugfix dtx for offload --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 0f871cf678..f3457cb27c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -584,7 +584,9 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, Kr_bytes = Kr>>3; offset = 0; - if ((enable_ldpc_offload)&& (dtx_det==0)) { + //if ((enable_ldpc_offload)&& (dtx_det==0)) + if (enable_ldpc_offload){ + // if (dtx_det==0) { if (harq_process->C == 1) { if (A > 3824) @@ -603,7 +605,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, E = nr_get_E(G, harq_process->C, Qm, n_layers, r); memset(harq_process->c[r],0,Kr_bytes); - //if ((dtx_det==0)&&(pusch_pdu->pusch_data.rv_index==0)){ + if ((dtx_det==0)&&(pusch_pdu->pusch_data.rv_index==0)){ //if (dtx_det==0){ if (mcs >9){ memcpy((&z_ol[0]),ulsch_llr+r_offset,E*sizeof(short)); @@ -702,11 +704,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, printf("llrprocbuf [%d] = %x adr %p\n", k, llrProcBuf[k], llrProcBuf+k); } */ - /*} + } else{ dtx_det = 0; no_iteration_ldpc = ulsch->max_ldpc_iterations+1; - }*/ + } bool decodeSuccess = (no_iteration_ldpc <= ulsch->max_ldpc_iterations); if (decodeSuccess) { @@ -721,7 +723,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); break; //don't even attempt to decode other segments } - } + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_ULSCH_DECODING,0); From bf889968f7dbf5fc9ab21c594d70ed2218175590 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 10 Mar 2022 19:18:59 +0100 Subject: [PATCH 043/136] set default ul mcs to 9 --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index df26680e53..c0b1e534b2 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1239,7 +1239,7 @@ void pf_ul(module_id_t module_id, sched_ctrl->update_pusch_ps = false; } NR_sched_pusch_t *sched_pusch = &sched_ctrl->sched_pusch; - sched_pusch->mcs = 20; + sched_pusch->mcs = 9; update_ul_ue_R_Qm(sched_pusch, ps); sched_pusch->rbStart = rbStart; sched_pusch->rbSize = min_rb; @@ -1265,7 +1265,7 @@ void pf_ul(module_id_t module_id, add_tail_nr_list(&UE_sched, UE_id); /* Calculate coefficient*/ - sched_pusch->mcs = 20; + sched_pusch->mcs = 9; const uint32_t tbs = ul_pf_tbs[ps->mcs_table][sched_pusch->mcs]; coeff_ue[UE_id] = (float) tbs / ul_thr_ue[UE_id]; LOG_D(NR_MAC,"b %d, ul_thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n", From 457ee6c049f5bbc1d25e42478a492a588d502b02 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 10 Mar 2022 21:43:28 +0100 Subject: [PATCH 044/136] bugfix build issue --- cmake_targets/CMakeLists.txt | 94 ++------------------------- openair1/SIMULATION/NR_PHY/dlschsim.c | 3 +- openair1/SIMULATION/NR_PHY/pucchsim.c | 3 +- openair1/SIMULATION/NR_PHY/ulschsim.c | 3 +- 4 files changed, 10 insertions(+), 93 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 08ecacabfd..054e231857 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -187,92 +187,8 @@ else (CUDA_FOUND) message ("No CUDA tool installed") endif () -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(dpdk DEFAULT_MSG) - -########################################### -# macros to define options as there is numerous options in oai -################################################ -macro(add_option name val helpstr) - if(DEFINED ${name}) - set(value ${${name}}) - else(DEFINED ${name}) - set(value ${val}) - endif() - set(${name} ${value} CACHE STRING "${helpstr}") - add_definitions("-D${name}=${value}") -endmacro(add_option) - -macro(add_boolean_option name val helpstr) - if(DEFINED ${name}) - set(value ${${name}}) - else(DEFINED ${name}) - set(value ${val}) - endif() - set(${name} ${value} CACHE STRING "${helpstr}") - set_property(CACHE ${name} PROPERTY TYPE BOOL) - if (${value}) - add_definitions("-D${name}") - endif (${value}) -endmacro(add_boolean_option) - -macro(add_integer_option name val helpstr) - if(DEFINED ${name}) - set(value ${${name}}) - else(DEFINED ${name}) - set(value ${val}) - endif() - set(${name} ${value} CACHE STRING "${helpstr}") - add_definitions("-D${name}=${value}") -endmacro(add_integer_option) - -macro(add_list1_option name val helpstr) - if(DEFINED ${name}) - set(value ${${name}}) - else(DEFINED ${name}) - set(value ${val}) - endif() - set(${name} ${value} CACHE STRING "${helpstr}") - set_property(CACHE ${name} PROPERTY STRINGS ${ARGN}) - if(NOT "${value}" STREQUAL "False") - add_definitions("-D${name}=${value}") - endif() -endmacro(add_list1_option) - -macro(add_list2_option name val helpstr) - if(DEFINED ${name}) - set(value ${${name}}) - else(DEFINED ${name}) - set(value ${val}) - endif() - set(${name} ${value} CACHE STRING "${helpstr}") - set_property(CACHE ${name} PROPERTY STRINGS ${ARGN}) - if(NOT "${value}" STREQUAL "False") - add_definitions("-D${value}=1") - endif() -endmacro(add_list2_option) - -macro(add_list_string_option name val helpstr) - if(DEFINED ${name}) - set(value ${${name}}) - else(DEFINED ${name}) - set(value ${val}) - endif() - set(${name} ${value} CACHE STRING "${helpstr}") - set_property(CACHE ${name} PROPERTY STRINGS ${ARGN}) - if(NOT "${value}" STREQUAL "False") - add_definitions("-D${name}=\"${value}\"") - endif() -endmacro(add_list_string_option) - -# this function should produce the same value as the macro MAKE_VERSION defined in the C code (file types.h) -function(make_version VERSION_VALUE) - math(EXPR RESULT "0") - foreach (ARG ${ARGN}) - math(EXPR RESULT "${RESULT} * 16 + ${ARG}") - endforeach() - set(${VERSION_VALUE} "${RESULT}" PARENT_SCOPE) -endfunction() +#INCLUDE(FindPackageHandleStandardArgs) +#FIND_PACKAGE_HANDLE_STANDARD_ARGS(dpdk DEFAULT_MSG) #################################################### # compilation flags @@ -867,7 +783,7 @@ set_target_properties(tcp_bridge_oai PROPERTIES COMPILE_FLAGS "-fvisibility=hidd ###################################################################### -#include_directories ("/usr/include/dpdk") +include_directories ("/usr/include/dpdk") set(HWLIB_BENETEL_4G_SOURCE ${OPENAIR_TARGETS}/ARCH/ETHERNET/benetel/4g/benetel.c @@ -3072,9 +2988,7 @@ add_executable(nr_ulsim ${SHLIB_LOADER_SOURCES} ) -add_dependencies( nr_ulsim ldpc_orig ldpc_optim ldpc_optim8seg ldpc) - -if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd1.so") +if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") add_dependencies( nr_ulsim ldpc_offload) endif () diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index f3aae9a3f7..d3ee3fc10e 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -61,7 +61,8 @@ double cpuf; uint16_t NB_UE_INST = 1; uint8_t const nr_rv_round_map[4] = {0, 2, 3, 1}; - +const short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1}; +const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; // needed for some functions PHY_VARS_NR_UE *PHY_vars_UE_g[1][1] = { { NULL } }; uint16_t n_rnti = 0x1234; diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index 151d51d726..514e2f52a7 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -58,7 +58,8 @@ double cpuf; //uint8_t nfapi_mode = 0; uint16_t NB_UE_INST = 1; uint8_t const nr_rv_round_map[4] = {0, 2, 3, 1}; - +const short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1}; +const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; // needed for some functions PHY_VARS_NR_UE * PHY_vars_UE_g[1][1]={{NULL}}; diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index 6cdf0b90cd..3d756ca86a 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -58,7 +58,8 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {} uint8_t const nr_rv_round_map[4] = {0, 2, 3, 1}; - +const short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1}; +const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; double cpuf; //uint8_t nfapi_mode = 0; uint16_t NB_UE_INST = 1; From 91e9f930f4d2d0ea88f9c4da4f02b20841a41f98 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 11 Mar 2022 00:33:12 +0100 Subject: [PATCH 045/136] revert max_rbsize and tpc default value --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index c0b1e534b2..879626c876 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -681,7 +681,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, } else{ LOG_D(NR_MAC,"[UE %d] Detected DTX : increasing UE TX power\n",UE_id); - //UE_scheduling_control->tpc0 = 3; + UE_scheduling_control->tpc0 = 3; } #if defined(ENABLE_MAC_PAYLOAD_DEBUG) @@ -1336,8 +1336,7 @@ void pf_ul(module_id_t module_id, uint16_t max_rbSize = 1; while (rbStart + max_rbSize < bwpSize && rballoc_mask[rbStart + max_rbSize]) max_rbSize++; - max_rbSize=50; - + if (rbStart + min_rb >= bwpSize) { LOG_W(NR_MAC, "cannot allocate UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); From a289d6e2ab50b77ed6c4c3f831fe5ac1e039e6d8 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 11 Mar 2022 10:21:44 +0100 Subject: [PATCH 046/136] Revert "setting reordering to infinity and max rb 50" This reverts commit 168edeaf73d63579e80ce0e72fc29c41dbdb4c8f. Conflicts: openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 2 +- openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c | 1 - openair2/RRC/NR/rrc_gNB.c | 1 - openair2/RRC/NR/rrc_gNB_reconfig.c | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 879626c876..a49154f20d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1336,7 +1336,7 @@ void pf_ul(module_id_t module_id, uint16_t max_rbSize = 1; while (rbStart + max_rbSize < bwpSize && rballoc_mask[rbStart + max_rbSize]) max_rbSize++; - + if (rbStart + min_rb >= bwpSize) { LOG_W(NR_MAC, "cannot allocate UL data for UE %d/RNTI %04x: no resources (rbStart %d, min_rb %d, bwpSize %d\n", UE_id, UE_info->rnti[UE_id],rbStart,min_rb,bwpSize); diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c index 59965f9cc9..1f66400af1 100644 --- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c +++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c @@ -1162,7 +1162,6 @@ void nr_DRB_preconfiguration(uint16_t crnti) drb_ToAddMod->pdcp_Config->t_Reordering = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->t_Reordering)); *drb_ToAddMod->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0; - drb_ToAddMod->pdcp_Config->t_Reordering = NULL; drb_ToAddMod->pdcp_Config->ext1 = NULL; ASN_SEQUENCE_ADD(&rbconfig->drb_ToAddModList->list,drb_ToAddMod); diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index ffd7fcb9e5..d6c658f01d 100755 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -907,7 +907,6 @@ rrc_gNB_generate_dedicatedRRCReconfiguration( DRB_config->pdcp_Config->t_Reordering = calloc(1, sizeof(*DRB_config->pdcp_Config->t_Reordering)); *DRB_config->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0; - DRB_config->pdcp_Config->t_Reordering = NULL; DRB_config->pdcp_Config->ext1 = NULL; if (rrc->security.do_drb_integrity) { diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index e562ac89f5..1de34804df 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -1416,7 +1416,6 @@ void fill_default_rbconfig(NR_RadioBearerConfig_t *rbconfig, drb_ToAddMod->pdcp_Config->t_Reordering = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->t_Reordering)); *drb_ToAddMod->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0; - drb_ToAddMod->pdcp_Config->t_Reordering = NULL; drb_ToAddMod->pdcp_Config->ext1 = NULL; ASN_SEQUENCE_ADD(&rbconfig->drb_ToAddModList->list,drb_ToAddMod); From 89ac71ef25e9ad1e39e1ff19af4b6bf9a81f4eab Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 11 Mar 2022 11:31:33 +0100 Subject: [PATCH 047/136] fix warnings and revert commented logs --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 19 ++++++++++--------- targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 4 ++-- targets/ARCH/rfsimulator/simulator.c | 12 ++++++------ 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index f3457cb27c..8a7b1dbdd8 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -42,6 +42,7 @@ #include "PHY/NR_TRANSPORT/nr_ulsch.h" #include "PHY/NR_TRANSPORT/nr_dlsch.h" #include "SCHED_NR/sched_nr.h" +#include "SCHED_NR/fapi_nr_l1.h" #include "defs.h" #include "common/utils/LOG/vcd_signal_dumper.h" #include "common/utils/LOG/log.h" @@ -408,7 +409,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, int8_t l_ol [68*384]; __m128i *pv_ol128 = (__m128i*)&z_ol; __m128i *pl_ol128 = (__m128i*)&l_ol; - int no_iteration_ldpc; + int no_iteration_ldpc = 2; int length_dec; uint8_t crc_type; int K_bits_F; @@ -623,6 +624,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, Qm, (int8_t*)&pl_ol128[0], llrProcBuf, 1); + if (ret<0) { + LOG_E(PHY,"ulsch_decoding.c: Problem in LDPC decoder offload\n"); + no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; + return 1; + } } else{ K_bits_F = Kr-harq_process->F; @@ -650,7 +656,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, LOG_E(PHY,"ulsch_decoding.c: Problem in rate_matching\n"); no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; - return; + return 1; } //set first 2*Z_c bits to zeros @@ -674,10 +680,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, p_procTime); } - /*if (ret<0) { - no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; - } - else {*/ for (int m=0; m < Kr>>3; m ++) { harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; @@ -708,8 +710,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, else{ dtx_det = 0; no_iteration_ldpc = ulsch->max_ldpc_iterations+1; - } - + } bool decodeSuccess = (no_iteration_ldpc <= ulsch->max_ldpc_iterations); if (decodeSuccess) { memcpy(harq_process->b+offset, @@ -723,7 +724,7 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); break; //don't even attempt to decode other segments } - } + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_ULSCH_DECODING,0); diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index d468cfa2cd..e3b06a6438 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -464,7 +464,7 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_BEAM_SWITCHI write_package[end].buff[i] = buff[i]; write_thread->count_write++; write_thread->end = (write_thread->end + 1)% MAX_WRITE_THREAD_PACKAGE; - // LOG_D(HW,"Signaling TX TS %llu\n",(unsigned long long)timestamp); + LOG_D(HW,"Signaling TX TS %llu\n",(unsigned long long)timestamp); pthread_cond_signal(&write_thread->cond_write); pthread_mutex_unlock(&write_thread->mutex_write); return 0; @@ -555,7 +555,7 @@ void *trx_usrp_write_thread(void * arg){ s->tx_md.start_of_burst = (s->tx_count==0) ? true : first_packet; s->tx_md.end_of_burst = last_packet; s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate); - // LOG_D(PHY,"usrp_tx_write: tx_count %llu SoB %d, EoB %d, TS %llu\n",(unsigned long long)s->tx_count,s->tx_md.start_of_burst,s->tx_md.end_of_burst,(unsigned long long)timestamp); + LOG_D(PHY,"usrp_tx_write: tx_count %llu SoB %d, EoB %d, TS %llu\n",(unsigned long long)s->tx_count,s->tx_md.start_of_burst,s->tx_md.end_of_burst,(unsigned long long)timestamp); s->tx_count++; // bit 3 enables gpio (for backward compatibility) diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c index 5e2015c496..75f77fd706 100644 --- a/targets/ARCH/rfsimulator/simulator.c +++ b/targets/ARCH/rfsimulator/simulator.c @@ -429,7 +429,7 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t, openair0_timestamp if (!alreadyLocked) pthread_mutex_lock(&Sockmutex); - //LOG_D(HW,"sending %d samples at time: %ld\n", nsamps, timestamp); + LOG_D(HW,"sending %d samples at time: %ld\n", nsamps, timestamp); for (int i=0; ibuf[i]; @@ -464,8 +464,8 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t, openair0_timestamp if (!alreadyLocked) pthread_mutex_unlock(&Sockmutex); - //LOG_D(HW,"sent %d samples at time: %ld->%ld, energy in first antenna: %d\n", - // nsamps, timestamp, timestamp+nsamps, signal_energy(samplesVoid[0], nsamps) ); + LOG_D(HW,"sent %d samples at time: %ld->%ld, energy in first antenna: %d\n", + nsamps, timestamp, timestamp+nsamps, signal_energy(samplesVoid[0], nsamps) ); return nsamps; } @@ -536,7 +536,7 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi } else if ( sz == 0 ) continue; - //LOG_D(HW, "Socket rcv %zd bytes\n", sz); + LOG_D(HW, "Socket rcv %zd bytes\n", sz); AssertFatal((b->remainToTransfer-=sz) >= 0, ""); b->transferPtr+=sz; @@ -599,11 +599,11 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi if ( b->headerMode==false ) { if ( ! b->trashingPacket ) { b->lastReceivedTS=b->th.timestamp+b->th.size-byteToSample(b->remainToTransfer,b->th.nbAnt); - //LOG_D(HW,"UEsock: %d Set b->lastReceivedTS %ld\n", fd, b->lastReceivedTS); + LOG_D(HW,"UEsock: %d Set b->lastReceivedTS %ld\n", fd, b->lastReceivedTS); } if ( b->remainToTransfer==0) { - //LOG_D(HW,"UEsock: %d Completed block reception: %ld\n", fd, b->lastReceivedTS); + LOG_D(HW,"UEsock: %d Completed block reception: %ld\n", fd, b->lastReceivedTS); b->headerMode=true; b->transferPtr=(char *)&b->th; b->remainToTransfer=sizeof(samplesBlockHeader_t); From a39c9726116dc000a05aada538057bb539f25f6b Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 11 Mar 2022 11:36:51 +0100 Subject: [PATCH 048/136] revert commented stats --- openair2/LAYER2/NR_MAC_gNB/main.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c index df4e24a22b..b9da84ead2 100644 --- a/openair2/LAYER2/NR_MAC_gNB/main.c +++ b/openair2/LAYER2/NR_MAC_gNB/main.c @@ -128,12 +128,10 @@ void dump_mac_stats(gNB_MAC_INST *gNB, char *output, int strlen, bool reset_rsrp } } } - /* print_meas(&gNB->eNB_scheduler, "DL & UL scheduling timing stats", NULL, NULL); print_meas(&gNB->schedule_dlsch,"dlsch scheduler",NULL,NULL); print_meas(&gNB->rlc_data_req, "rlc_data_req",NULL,NULL); print_meas(&gNB->rlc_status_ind,"rlc_status_ind",NULL,NULL); - */ } From 32de2215538b2e2ec1a42fd39ca552c979878f49 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Wed, 11 May 2022 19:54:35 +0100 Subject: [PATCH 049/136] Fix SRS mapping for multiple ports --- openair1/PHY/INIT/nr_init.c | 8 +++++++- openair1/PHY/INIT/nr_init_ue.c | 2 -- .../PHY/NR_UE_TRANSPORT/srs_modulation_nr.c | 19 +++++++++---------- .../PHY/NR_UE_TRANSPORT/srs_modulation_nr.h | 4 +++- openair1/PHY/defs_nr_common.h | 3 ++- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 4 ++-- 6 files changed, 23 insertions(+), 17 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 87d8c2e89d..635a232228 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -617,7 +617,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, for (int id=0; idnr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); gNB->nr_srs_info[id]->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t)); - gNB->nr_srs_info[id]->srs_generated_signal = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); gNB->nr_srs_info[id]->signal_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); gNB->nr_srs_info[id]->noise_power_per_rb = (uint32_t*)malloc16_clear(fp->N_RB_UL*sizeof(uint32_t)); gNB->nr_srs_info[id]->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); @@ -628,6 +628,9 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, gNB->nr_srs_info[id]->srs_estimated_channel_freq = (int32_t **)malloc16(Prx*sizeof(int32_t*)); gNB->nr_srs_info[id]->srs_estimated_channel_time = (int32_t **)malloc16(Prx*sizeof(int32_t*)); gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted = (int32_t **)malloc16(Prx*sizeof(int32_t*)); + for(i=0; inr_srs_info[id]->srs_generated_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + } for (i=0;inr_srs_info[id]->srs_received_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); gNB->nr_srs_info[id]->srs_ls_estimated_channel[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); @@ -797,6 +800,9 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time[i]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i]); } + for(int i=0; inr_srs_info[id]->srs_generated_signal[i]); + } free_and_zero(gNB->nr_srs_info[id]->sc_list); free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal); free_and_zero(gNB->nr_srs_info[id]->signal_power); diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 238016460c..c717d5011a 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -344,7 +344,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) srs_vars[gNB_id]->active = false; ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); ue->nr_srs_info->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t)); - ue->nr_srs_info->srs_generated_signal = (int32_t *) malloc16_clear( (2*(fp->samples_per_frame)+2048)*sizeof(int32_t) ); ue->nr_srs_info->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); ue->nr_srs_info->srs_received_signal = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); ue->nr_srs_info->srs_ls_estimated_channel = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); @@ -468,7 +467,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted[i]); } free_and_zero(ue->nr_srs_info->sc_list); - free_and_zero(ue->nr_srs_info->srs_generated_signal); free_and_zero(ue->nr_srs_info->noise_power); free_and_zero(ue->nr_srs_info->srs_received_signal); free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel); diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c index f3a953c9a8..30b7e39818 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c @@ -76,12 +76,13 @@ *********************************************************************/ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, NR_DL_FRAME_PARMS *frame_parms, - int32_t *txptr, + int32_t **txdataF, + uint16_t symbol_offset, nr_srs_info_t *nr_srs_info, int16_t amp, int frame_number, - int slot_number) -{ + int slot_number) { + uint8_t n_SRS_cs_max; uint8_t u; uint8_t v_nu; @@ -144,10 +145,6 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, LOG_I(NR_PHY,"l0 = %i\n", l0); #endif - if (N_ap != port1) { - LOG_E(NR_PHY, "generate_srs: this number of antenna ports %d is not yet supported!\n", N_ap); - return (-1); - } if (N_symb_SRS != 1) { LOG_E(NR_PHY, "generate_srs: this number of srs symbol %d is not yet supported!\n", N_symb_SRS); return (-1); @@ -203,7 +200,9 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, /* for each antenna ports for transmission */ for (int p_index = 0; p_index < N_ap; p_index++) { - /* see TS 38.211 6.4.1.4.2 Sequence generation */ + int32_t *txptr = &txdataF[p_index][symbol_offset]; + + /* see TS 38.211 6.4.1.4.2 Sequence generation */ n_SRS_cs_i = (n_SRS_cs + (n_SRS_cs_max * (SRS_antenna_port[p_index] - 1000)/N_ap))%n_SRS_cs_max; alpha_i = 2 * M_PI * ((double)n_SRS_cs_i / (double)n_SRS_cs_max); @@ -373,7 +372,7 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, txptr[subcarrier] = (real_amp & 0xFFFF) + ((imag_amp<<16)&0xFFFF0000); - if(nr_srs_info) { + if(nr_srs_info && p_index==0) { nr_srs_info->sc_list[nr_srs_info->sc_list_length] = subcarrier; nr_srs_info->sc_list_length++; } @@ -457,7 +456,7 @@ int ue_srs_procedures_nr(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gN NR_DL_FRAME_PARMS *frame_parms = &(ue->frame_parms); uint16_t symbol_offset = (frame_parms->symbols_per_slot - 1 - srs_config_pdu->time_start_position)*frame_parms->ofdm_symbol_size; - if (generate_srs_nr(srs_config_pdu, frame_parms, &ue->common_vars.txdataF[gNB_id][symbol_offset], ue->nr_srs_info, + if (generate_srs_nr(srs_config_pdu, frame_parms, ue->common_vars.txdataF, symbol_offset, ue->nr_srs_info, AMP, proc->frame_tx, proc->nr_slot_tx) == 0) { return 0; } else { diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h index e43bbe4934..56144e8de7 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h @@ -136,6 +136,7 @@ EXTERN const uint16_t srs_periodicity[SRS_PERIODICITY] /** \brief This function generates the sounding reference symbol (SRS) for the uplink according to 38.211 6.4.1.4 Sounding reference signal @param frame_parms NR DL Frame parameters @param txdataF pointer to the frequency domain TX signal + @param symbol_offset symbol offset added in txdataF @param nr_srs_info pointer to the srs info structure @param amp amplitude of generated signal @param frame_number frame number @@ -144,7 +145,8 @@ EXTERN const uint16_t srs_periodicity[SRS_PERIODICITY] int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, NR_DL_FRAME_PARMS *frame_parms, - int32_t *txptr, + int32_t **txdataF, + uint16_t symbol_offset, nr_srs_info_t *nr_srs_info, int16_t amp, int frame_number, diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index d93e23db47..2bb626bcfd 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -95,6 +95,7 @@ #define MAX_NUM_NR_RE (4*14*273*12) #define MAX_NUM_NR_SRS_SYMBOLS 4 +#define MAX_NUM_NR_SRS_AP 4 #define NR_RX_NB_TH 1 #define NR_NB_TH_SLOT 2 @@ -242,7 +243,7 @@ typedef struct { uint16_t sc_list_length; uint16_t *sc_list; uint8_t srs_generated_signal_bits; - int32_t *srs_generated_signal; + int32_t **srs_generated_signal; int32_t **srs_received_signal; int32_t **srs_ls_estimated_channel; int32_t **srs_estimated_channel_freq; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 84370f2509..5b3c4ac26d 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -855,14 +855,14 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { // At least currently, the configuration is constant, so it is enough to generate the sequence just once. if(gNB->nr_srs_info[i]->sc_list_length == 0) { - generate_srs_nr(srs_pdu, &gNB->frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx); + generate_srs_nr(srs_pdu, &gNB->frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, 0, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx); } nr_get_srs_signal(gNB,frame_rx,slot_rx,srs_pdu, gNB->nr_srs_info[i], gNB->nr_srs_info[i]->srs_received_signal); nr_srs_channel_estimation(gNB,frame_rx,slot_rx,srs_pdu, gNB->nr_srs_info[i], - gNB->nr_srs_info[i]->srs_generated_signal, + gNB->nr_srs_info[i]->srs_generated_signal[0], gNB->nr_srs_info[i]->srs_received_signal, gNB->nr_srs_info[i]->srs_estimated_channel_freq, gNB->nr_srs_info[i]->srs_estimated_channel_time, From f6bc787d1ee1b1a1e6776eeadc2e9944a267fa09 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Sat, 14 May 2022 00:38:00 +0100 Subject: [PATCH 050/136] Add comments in nfapi_nr_srs_pdu_t --- .../nfapi/public_inc/nfapi_nr_interface_scf.h | 59 ++++++++----------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h index a44a7f2a0c..d228132981 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h @@ -1298,42 +1298,33 @@ typedef struct } nfapi_nr_pucch_pdu_t; -//for srs_pdu: - -typedef struct -{ - uint16_t rnti;//UE RNTI - uint32_t handle;//An opaque handling returned in the SRS.indication - //BWP - uint16_t bwp_size; - uint16_t bwp_start; - uint8_t subcarrier_spacing; - uint8_t cyclic_prefix; - - uint8_t num_ant_ports; - uint8_t num_symbols; - uint8_t num_repetitions; - uint8_t time_start_position;//Starting position in the time domain l0; Note: the MAC undertakes the translation from startPosition to 𝑙0 - uint8_t config_index; - uint16_t sequence_id; - uint8_t bandwidth_index; - uint8_t comb_size; - uint8_t comb_offset;//Transmission comb offset 𝑘 ̄ TC [TS38.211, Sec 6.4.1.4.3] Value: 0 → 1 (combSize = 0) Value: 0 → 3 (combSize = 1) - uint8_t cyclic_shift; - uint8_t frequency_position; - uint16_t frequency_shift; - uint8_t frequency_hopping; - uint8_t group_or_sequence_hopping;//Group or sequence hopping configuration (RRC parameter groupOrSequenceHopping in SRS-Resource - uint8_t resource_type;//Type of SRS resource allocation - uint16_t t_srs;//SRS-Periodicity in slots [TS38.211 Sec 6.4.1.4.4] Value: 1,2,3,4,5,8,10,16,20,32,40,64,80,160,320,640,1280,2560 - uint16_t t_offset;//Slot offset value [TS38.211, Sec 6.4.1.4.3] Value:0->2559 - - nfapi_nr_ul_beamforming_t beamforming; - +typedef struct { + uint16_t rnti; // UE RNTI, Value: 1->65535 + uint32_t handle; // An opaque handling returned in the SRS.indication + uint16_t bwp_size; // Bandwidth part size [3GPP TS 38.213, sec 12]. Number of contiguous PRBs allocated to the BWP, Value: 1->275 + uint16_t bwp_start; // Bandwidth part start RB index from reference CRB [3GPP TS 38.213, sec 12], Value: 0->274 + uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4 + uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended + uint8_t num_ant_ports; // Number of antenna ports N_SRS_ap [3GPP TS 38.211, Sec 6.4.1.4.1], Value: 0 = 1 port, 1 = 2 ports, 2 = 4 ports + uint8_t num_symbols; // Number of symbols N_SRS_symb [3GPP TS 38.211, Sec 6.4.1.4.1], Value: 0 = 1 symbol, 1 = 2 symbols, 2 = 4 symbols + uint8_t num_repetitions; // Repetition factor R [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 = 1, 1 = 2, 2 = 4 + uint8_t time_start_position; // Starting position in the time domain l_0 [3GPP TS 38.211, Sec 6.4.1.4.1], Note: the MAC undertakes the translation from startPosition to l_0, Value: 0 --> 13 + uint8_t config_index; // SRS bandwidth config index C_SRS [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 63 + uint16_t sequence_id; // SRS sequence ID n_SRS_ID [3GPP TS 38.211, Sec 6.4.1.4.2], Value: 0 --> 1023 + uint8_t bandwidth_index; // SRS bandwidth index B_SRS [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 3 + uint8_t comb_size; // Transmission comb size K_TC [3GPP TS 38.211, Sec 6.4.1.4.2], Value: 0 = comb size 2, 1 = comb size 4, 2 = comb size 8 (Rel16) + uint8_t comb_offset; // Transmission comb offset K'_TC[3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 1 (combSize = 0), Value: 0 --> 3 (combSize = 1), Value: 0 --> 7 (combSize = 2) + uint8_t cyclic_shift; // Cyclic shift n_CS_SRS [3GPP TS 38.211, Sec 6.4.1.4.2], Value: 0 --> 7 (combSize = 0), Value: 0 --> 11 (combSize = 1), Value: 0 --> 5 (combSize = 2) + uint8_t frequency_position; // Frequency domain position n_RRC [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 67 + uint16_t frequency_shift; // Frequency domain shift n_shift [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 268 + uint8_t frequency_hopping; // Frequency hopping b_hop [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 3 + uint8_t group_or_sequence_hopping; // Group or sequence hopping configuration (RRC parameter groupOrSequenceHopping in SRSResource IE), Value: 0 = No hopping, 1 = Group hopping groupOrSequenceHopping, 2 = Sequence hopping + uint8_t resource_type; // Type of SRS resource allocation [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0: aperiodic, 1: semi-persistent, 2: periodic + uint16_t t_srs; // SRS-Periodicity in slots [3GPP TS 38.211, Sec 6.4.1.4.4], Value: 1,2,3,4,5,8,10,16,20,32,40,64,80,160,320,640,1280,2560 + uint16_t t_offset; // Slot offset value [3GPP TS 38.211, Sec 6.4.1.4.3], Value:0->2559 + nfapi_nr_ul_beamforming_t beamforming; } nfapi_nr_srs_pdu_t; -// - typedef enum { NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE = 0, NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE = 1, From 52bc76d9046c69f605cd2703dbe0e0b379fa5324 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Sat, 14 May 2022 21:01:42 +0100 Subject: [PATCH 051/136] Fixes and improvements in generate_srs_nr function --- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 2 +- .../PHY/NR_UE_TRANSPORT/srs_modulation_nr.c | 547 +++++++++--------- .../PHY/NR_UE_TRANSPORT/srs_modulation_nr.h | 7 + 3 files changed, 290 insertions(+), 266 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index be2d03d0db..b91f603f3c 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -1144,7 +1144,7 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, *snr = dB_fixed((int32_t)((*signal_power<first_carrier_offset + srs_pdu->bwp_start*12; + subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12; uint8_t R = srs_pdu->comb_size == 0 ? 2 : 4; for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c index 30b7e39818..c4fe9cd120 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c @@ -48,9 +48,129 @@ //#define SRS_DEBUG -/******************************************************************* + +uint16_t group_number_hopping(int slot_number, + uint8_t n_ID_SRS, + uint8_t l0, + uint8_t l_line) { + + // Pseudo-random sequence c(i) defined by TS 38.211 - Section 5.2.1 + uint32_t cinit = n_ID_SRS; + uint8_t c_last_index = 8 * (slot_number * N_SYMB_SLOT + l0 + l_line) + 7; + uint32_t *c_sequence = calloc(c_last_index+1, sizeof(uint32_t)); + pseudo_random_sequence(c_last_index+1, c_sequence, cinit); + + // TS 38.211 - 6.4.1.4.2 Sequence generation + uint32_t f_gh = 0; + for (int m = 0; m <= 7; m++) { + f_gh += c_sequence[8 * (slot_number * N_SYMB_SLOT + l0 + l_line) + m] << m; + } + f_gh = f_gh%30; + uint8_t u = (f_gh + n_ID_SRS)%U_GROUP_NUMBER; + + free(c_sequence); + return u; +} + +uint16_t sequence_number_hopping(int slot_number, + uint8_t n_ID_SRS, + uint16_t M_sc_b_SRS, + uint8_t l0, + uint8_t l_line) { + uint16_t v = 0; + if (M_sc_b_SRS > 6 * N_SC_RB) { + // Pseudo-random sequence c(i) defined by TS 38.211 - Section 5.2.1 + uint32_t cinit = n_ID_SRS; + uint8_t c_last_index = (slot_number * N_SYMB_SLOT + l0 + l_line); + uint32_t *c_sequence = calloc(c_last_index+1, sizeof(uint32_t)); + pseudo_random_sequence(c_last_index+1, c_sequence, cinit); + // TS 38.211 - 6.4.1.4.2 Sequence generation + v = c_sequence[c_last_index]; + free(c_sequence); + } + return v; +} + +uint16_t compute_F_b(int frame_number, + int slot_number, + uint16_t slots_per_frame, + uint8_t N_symb_SRS, + uint8_t B_SRS, + uint8_t C_SRS, + uint8_t b_hop, + uint8_t R, + uint16_t T_offset, + uint16_t T_SRS, + uint8_t resource_type, + uint8_t l_line, + uint8_t b) { + + // Compute the number of SRS transmissions + uint16_t n_SRS = 0; + if (resource_type == aperiodic) { + n_SRS = l_line / R; + } else { + n_SRS = ((slots_per_frame*frame_number + slot_number - T_offset)/T_SRS)*(N_symb_SRS/R)+(l_line / R); + } + + uint16_t product_N_b = 1; + for (unsigned int b_prime = b_hop; b_prime < B_SRS; b_prime++) { + if (b_prime != b_hop) { + product_N_b *= srs_bandwidth_config[C_SRS][b_prime][1]; + } + } + + uint16_t F_b = 0; + uint8_t N_b = srs_bandwidth_config[C_SRS][b][1]; + if (N_b & 1) { // Nb odd + F_b = (N_b/2)*(n_SRS/product_N_b); + } else { // Nb even + uint16_t product_N_b_B_SRS = product_N_b; + product_N_b_B_SRS *= srs_bandwidth_config[C_SRS][B_SRS][1]; /* product for b_hop to b */ + F_b = (N_b/2)*((n_SRS%product_N_b_B_SRS)/product_N_b) + ((n_SRS%product_N_b_B_SRS)/2*product_N_b); + } + + return F_b; +} + +uint16_t compute_n_b(int frame_number, + int slot_number, + uint16_t slots_per_frame, + uint8_t N_symb_SRS, + uint8_t B_SRS, + uint8_t C_SRS, + uint8_t b_hop, + uint8_t n_RRC, + uint8_t R, + uint16_t T_offset, + uint16_t T_SRS, + uint8_t resource_type, + uint8_t l_line, + uint8_t b) { + + uint8_t N_b = srs_bandwidth_config[C_SRS][b][1]; + uint16_t m_SRS_b = srs_bandwidth_config[C_SRS][B_SRS][0]; + + uint16_t n_b = 0; + if (b_hop >= B_SRS) { + n_b = (4 * n_RRC/m_SRS_b)%N_b; + } else { + if (b <= b_hop) { + n_b = (4 * n_RRC/m_SRS_b)%N_b; + } else { + // Compute the hopping offset Fb + uint16_t F_b = compute_F_b(frame_number, slot_number, slots_per_frame, N_symb_SRS, B_SRS, C_SRS, b_hop, R, + T_offset, T_SRS, resource_type, l_line, b); + n_b = (F_b + (4 * n_RRC/m_SRS_b))%N_b; + } + } + + return n_b; +} + +/************************************************************************* * -* NAME : generate_srs +* NAME : generate_srs_nr * * PARAMETERS : pointer to srs config pdu * pointer to transmit buffer @@ -60,20 +180,9 @@ * -1 if sequence can not be properly generated * * DESCRIPTION : generate/map srs symbol into transmit buffer -* see TS 38211 6.4.1.4 Sounding reference signal +* See TS 38.211 - Section 6.4.1.4 Sounding reference signal * -* FFS_TODO_NR -* Current supported configuration: -* - single resource per resource set -* - single port antenna -* - 1 symbol for SRS -* - no symbol offset -* - periodic mode -* - no hopping -* - no carrier switching -* - no antenna switching* -* -*********************************************************************/ +***************************************************************************/ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, NR_DL_FRAME_PARMS *frame_parms, int32_t **txdataF, @@ -83,46 +192,27 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, int frame_number, int slot_number) { - uint8_t n_SRS_cs_max; - uint8_t u; - uint8_t v_nu; - uint32_t f_gh = 0; - uint16_t n_SRS; - uint16_t n_SRS_cs_i; - double alpha_i; - uint8_t K_TC_p; - uint16_t n_b[B_SRS_NUMBER]; - uint16_t F_b; - uint16_t subcarrier; - uint8_t N_b; - uint8_t k_0_overbar_p; - - // get parameters from srs_config_pdu - uint8_t B_SRS = srs_config_pdu->bandwidth_index; - uint8_t C_SRS = srs_config_pdu->config_index; + // SRS config parameters + uint8_t B_SRS = srs_config_pdu->bandwidth_index; + uint8_t C_SRS = srs_config_pdu->config_index; uint8_t b_hop = srs_config_pdu->frequency_hopping; uint8_t K_TC = 2<comb_size; - uint8_t K_TC_overbar = srs_config_pdu->comb_offset; // FFS_TODO_NR is this parameter for K_TC_overbar ?? + uint8_t K_TC_overbar = srs_config_pdu->comb_offset; uint8_t n_SRS_cs = srs_config_pdu->cyclic_shift; uint8_t n_ID_SRS = srs_config_pdu->sequence_id; - uint8_t n_shift = srs_config_pdu->frequency_position; // it adjusts the SRS allocation to align with the common resource block grid in multiples of four + uint8_t n_shift = srs_config_pdu->frequency_position; // It adjusts the SRS allocation to align with the common resource block grid in multiples of four uint8_t n_RRC = srs_config_pdu->frequency_shift; uint8_t groupOrSequenceHopping = srs_config_pdu->group_or_sequence_hopping; uint8_t l_offset = srs_config_pdu->time_start_position; uint16_t T_SRS = srs_config_pdu->t_srs; - uint16_t T_offset = srs_config_pdu->t_offset; // FFS_TODO_NR to check interface with RRC + uint16_t T_offset = srs_config_pdu->t_offset; uint8_t R = 1<num_repetitions; - uint8_t N_ap = 1<num_ant_ports; // antenna port for transmission - uint8_t N_symb_SRS = 1<num_symbols; // consecutive OFDM symbols - uint8_t l0 = frame_parms->symbols_per_slot - 1 - l_offset; // starting position in the time domain - uint8_t k_0_p; // frequency domain starting position - - uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_config_pdu->bwp_start*N_SC_RB; - - if(nr_srs_info) { - nr_srs_info->sc_list_length = 0; - nr_srs_info->srs_generated_signal_bits = log2_approx(amp); - } + uint8_t N_ap = 1<num_ant_ports; // Number of antenna port for transmission + uint8_t N_symb_SRS = 1<num_symbols; // Number of consecutive OFDM symbols + uint8_t l0 = frame_parms->symbols_per_slot - 1 - l_offset; // Starting symbol position in the time domain + uint8_t n_SRS_cs_max = srs_max_number_cs[srs_config_pdu->comb_size]; + uint16_t m_SRS_b = srs_bandwidth_config[C_SRS][B_SRS][0]; // Number of resource blocks + uint16_t M_sc_b_SRS = m_SRS_b * N_SC_RB/K_TC; // Length of the SRS sequence #ifdef SRS_DEBUG LOG_I(NR_PHY,"Frame = %i, slot = %i\n", frame_number, slot_number); @@ -143,263 +233,190 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, LOG_I(NR_PHY,"N_ap = %i\n", N_ap); LOG_I(NR_PHY,"N_symb_SRS = %i\n", N_symb_SRS); LOG_I(NR_PHY,"l0 = %i\n", l0); + LOG_I(NR_PHY,"n_SRS_cs_max = %i\n", n_SRS_cs_max); + LOG_I(NR_PHY,"m_SRS_b = %i\n", m_SRS_b); + LOG_I(NR_PHY,"M_sc_b_SRS = %i\n", M_sc_b_SRS); #endif - if (N_symb_SRS != 1) { - LOG_E(NR_PHY, "generate_srs: this number of srs symbol %d is not yet supported!\n", N_symb_SRS); - return (-1); - } - if (groupOrSequenceHopping != neitherHopping) { - LOG_E(NR_PHY, "generate_srs: sequence hopping is not yet supported!\n"); - return (-1); - } + // Validation of SRS config parameters + if (R == 0) { LOG_E(NR_PHY, "generate_srs: this parameter repetition factor %d is not consistent !\n", R); - return (-1); - } - else if (R > N_symb_SRS) { + return -1; + } else if (R > N_symb_SRS) { LOG_E(NR_PHY, "generate_srs: R %d can not be greater than N_symb_SRS %d !\n", R, N_symb_SRS); - return (-1); - } - /* see 38211 6.4.1.4.2 Sequence generation */ - if (K_TC == 4) { - n_SRS_cs_max = 12; - // delta = 2; /* delta = log2(K_TC) */ - } - else if (K_TC == 2) { - n_SRS_cs_max = 8; - // delta = 1; /* delta = log2(K_TC) */ - } - else { - LOG_E(NR_PHY, "generate_srs: SRS unknown value for K_TC %d !\n", K_TC); - return (-1); + return -1; } + if (n_SRS_cs >= n_SRS_cs_max) { LOG_E(NR_PHY, "generate_srs: inconsistent parameter n_SRS_cs %d >= n_SRS_cs_max %d !\n", n_SRS_cs, n_SRS_cs_max); - return (-1); + return -1; } + if (T_SRS == 0) { LOG_E(NR_PHY, "generate_srs: inconsistent parameter T_SRS %d can not be equal to zero !\n", T_SRS); - return (-1); - } - else - { + return -1; + } else { int index = 0; while (srs_periodicity[index] != T_SRS) { index++; if (index == SRS_PERIODICITY) { LOG_E(NR_PHY, "generate_srs: inconsistent parameter T_SRS %d not specified !\n", T_SRS); - return (-1); + return -1; } } } - uint16_t m_SRS_b = srs_bandwidth_config[C_SRS][B_SRS][0]; /* m_SRS_b is given by TS 38211 clause 6.4.1.4.3 */ - uint16_t M_sc_b_SRS = m_SRS_b * N_SC_RB/K_TC; /* length of the sounding reference signal sequence */ + // Variable initialization + if(nr_srs_info) { + nr_srs_info->sc_list_length = 0; + nr_srs_info->srs_generated_signal_bits = log2_approx(amp); + } + uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_config_pdu->bwp_start*N_SC_RB; + double sqrt_N_ap = sqrt(N_ap); + uint16_t n_b[B_SRS_NUMBER]; - /* for each antenna ports for transmission */ + // Find index of table which is for this SRS length + uint16_t M_sc_b_SRS_index = 0; + while((ul_allocated_re[M_sc_b_SRS_index] != M_sc_b_SRS) && (M_sc_b_SRS_index < SRS_SB_CONF)){ + M_sc_b_SRS_index++; + } + + // SRS sequence generation and mapping, TS 38.211 - Section 6.4.1.4 for (int p_index = 0; p_index < N_ap; p_index++) { - int32_t *txptr = &txdataF[p_index][symbol_offset]; - - /* see TS 38.211 6.4.1.4.2 Sequence generation */ - - n_SRS_cs_i = (n_SRS_cs + (n_SRS_cs_max * (SRS_antenna_port[p_index] - 1000)/N_ap))%n_SRS_cs_max; - alpha_i = 2 * M_PI * ((double)n_SRS_cs_i / (double)n_SRS_cs_max); - - /* for each SRS symbol which should be managed by SRS configuration */ - /* from TS 38.214 6.2.1.1 UE SRS frequency hopping procedure */ - /* A UE may be configured to transmit an SRS resource on adjacent symbols within the last six symbols of a slot, */ - /* where all antenna ports of the SRS resource are mapped to each symbol of the resource */ - - uint8_t l = p_index; - if (l >= N_symb_SRS) { - LOG_E(NR_PHY, "generate_srs: number of antenna ports %d and number of srs symbols %d are different !\n", N_ap, N_symb_SRS); - } - - switch(groupOrSequenceHopping) { - case neitherHopping: - { - f_gh = 0; - v_nu = 0; - break; - } - case groupHopping: - { - uint8_t c_last_index = 8 * (slot_number * N_SYMB_SLOT + l0 + l) + 7; /* compute maximum value of the random sequence */ - uint32_t *c_sequence = calloc(c_last_index+1, sizeof(uint32_t)); - uint32_t cinit = n_ID_SRS/30; - pseudo_random_sequence(c_last_index+1, c_sequence, cinit); - for (int m = 0; m < 8; m++) { - f_gh += c_sequence[8 * (slot_number * N_SYMB_SLOT + l0 + l) + m]< 6 * N_SC_RB) { - uint8_t c_last_index = (slot_number * N_SYMB_SLOT + l0 + l); /* compute maximum value of the random sequence */ - uint32_t *c_sequence = calloc(c_last_index+1, sizeof(uint32_t)); - uint32_t cinit = n_ID_SRS; - pseudo_random_sequence(c_last_index+1, c_sequence, cinit); - v_nu = c_sequence[c_last_index]; - free(c_sequence); - } - else { - v_nu = 0; - } - break; - } - default: - { - LOG_E(NR_PHY, "generate_srs: unknown hopping setting %d !\n", groupOrSequenceHopping); - return (-1); - } - } - - /* u is the sequence-group number defined in section 6.4.1.4.1 */ - u = (f_gh + n_ID_SRS)%U_GROUP_NUMBER; /* 30 */ - - /* TS 38.211 6.4.1.4.3 Mapping to physical resources */ - - if((n_SRS_cs >= n_SRS_cs_max/2)&&(n_SRS_cs < n_SRS_cs_max)&&(N_ap == 4) && ((SRS_antenna_port[p_index] == 1001) || (SRS_antenna_port[p_index] == 1003))) { - K_TC_p = (K_TC_overbar + K_TC/2)%K_TC; - } - else { - K_TC_p = K_TC_overbar; - } - - for (int b = 0; b <= B_SRS; b++) { - N_b = srs_bandwidth_config[C_SRS][b][1]; - if (b_hop >= B_SRS) { - n_b[b] = (4 * n_RRC/m_SRS_b)%N_b; /* frequency hopping is disabled and the frequency position index n_b remains constant */ - } - else { - if (b == b_hop) { - N_b = 1; - } - /* periodicity and offset */ - if (srs_config_pdu->resource_type == aperiodic) { - n_SRS = l/R; - } - else { - int8_t N_slot_frame = frame_parms->slots_per_frame; - n_SRS = ((N_slot_frame*frame_number + slot_number - T_offset)/T_SRS)*(N_symb_SRS/R)+(l/R); - } - - uint16_t product_N_b = 1; /* for b_hop to b-1 */ - for (unsigned int b_prime = b_hop; b_prime < B_SRS; b_prime++) { /* product for b_hop to b-1 */ - if (b_prime != b_hop) { - product_N_b *= srs_bandwidth_config[C_SRS][b_prime][1]; - } - } - - if (N_b & 1) { /* Nb odd */ - F_b = (N_b/2)*(n_SRS/product_N_b); - } - else { /* Nb even */ - uint16_t product_N_b_B_SRS = product_N_b; - product_N_b_B_SRS *= srs_bandwidth_config[C_SRS][B_SRS][1]; /* product for b_hop to b */ - F_b = (N_b/2)*((n_SRS%product_N_b_B_SRS)/product_N_b) + ((n_SRS%product_N_b_B_SRS)/2*product_N_b); - } - - if (b <= b_hop) { - n_b[b] = (4 * n_RRC/m_SRS_b)%N_b; - } - else { - n_b[b] = (F_b + (4 * n_RRC/m_SRS_b))%N_b; - } - } - } - - k_0_overbar_p = n_shift * N_SC_RB + K_TC_p; - - k_0_p = k_0_overbar_p; /* it is the frequency-domain starting position */ - - for (int b = 0; b <= B_SRS; b++) { - k_0_p += K_TC * M_sc_b_SRS * n_b[b]; - } - - subcarrier = subcarrier_offset + k_0_p; - if (subcarrier>frame_parms->ofdm_symbol_size) { - subcarrier -= frame_parms->ofdm_symbol_size; - } - - /* find index of table which is for this srs length */ - unsigned int M_sc_b_SRS_index = 0; - while((ul_allocated_re[M_sc_b_SRS_index] != M_sc_b_SRS) && (M_sc_b_SRS_index < SRS_SB_CONF)){ - M_sc_b_SRS_index++; - } - - if (ul_allocated_re[M_sc_b_SRS_index] != M_sc_b_SRS) { - LOG_E(NR_PHY, "generate_srs: srs uplink allocation %d can not be found! \n", M_sc_b_SRS); - return (-1); - } - -#if 0 - - char output_file[255]; - char sequence_name[255]; - sprintf(output_file, "rv_seq_%d_%d_%d.m", u, v_nu, ul_allocated_re[M_sc_b_SRS_index]); - sprintf(sequence_name, "rv_seq_%d_%d_%d", u, v_nu, ul_allocated_re[M_sc_b_SRS_index]); - write_output(output_file, sequence_name, rv_ul_ref_sig[u][v_nu][M_sc_b_SRS_index], ul_allocated_re[M_sc_b_SRS_index], 1, 1); - +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"============ port %d ============\n", p_index); #endif - for (int k=0; k < M_sc_b_SRS; k++) { + uint16_t n_SRS_cs_i = (n_SRS_cs + (n_SRS_cs_max * (SRS_antenna_port[p_index] - 1000)/N_ap))%n_SRS_cs_max; + double alpha_i = 2 * M_PI * ((double)n_SRS_cs_i / (double)n_SRS_cs_max); - double real_shift = cos(alpha_i*k); - double imag_shift = sin(alpha_i*k); - - /* cos(x + y) = cos(x)cos(y) - sin(x)sin(y) */ - double real = ((real_shift*rv_ul_ref_sig[u][v_nu][M_sc_b_SRS_index][2*k]) - (imag_shift*rv_ul_ref_sig[u][v_nu][M_sc_b_SRS_index][2*k+1]))/sqrt(N_ap); - /* sin(x + y) = sin(x)cos(y) + cos(x)sin(y) */ - double imag = ((imag_shift*rv_ul_ref_sig[u][v_nu][M_sc_b_SRS_index][2*k]) + (real_shift*rv_ul_ref_sig[u][v_nu][M_sc_b_SRS_index][2*k+1]))/sqrt(N_ap); - - int32_t real_amp = ((int32_t)round((double) amp * real)) >> 15; - int32_t imag_amp = ((int32_t)round((double) amp * imag)) >> 15; - -#if 0 - printf("subcarrier %5d srs[%3d] r: %4d i: %4d reference[%d][%d][%d] r: %6d i: %6d\n", subcarrier, k, real_amp, imag_amp, - u, v_nu, M_sc_b_SRS_index, - rv_ul_ref_sig[u][v_nu][M_sc_b_SRS_index][2*k], - rv_ul_ref_sig[u][v_nu][M_sc_b_SRS_index][2*k+1]); +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"n_SRS_cs_i = %i\n", n_SRS_cs_i); + LOG_I(NR_PHY,"alpha_i = %f\n", alpha_i); #endif - txptr[subcarrier] = (real_amp & 0xFFFF) + ((imag_amp<<16)&0xFFFF0000); + for (int l_line = 0; l_line < N_symb_SRS; l_line++) { - if(nr_srs_info && p_index==0) { - nr_srs_info->sc_list[nr_srs_info->sc_list_length] = subcarrier; - nr_srs_info->sc_list_length++; +#ifdef SRS_DEBUG + LOG_I(NR_PHY,":::::::: OFDM symbol %d ::::::::\n", l0+l_line); +#endif + + // Set group and sequence numbers (u,v) per OFDM symbol + uint16_t u = 0; + uint16_t v = 0; + switch(groupOrSequenceHopping) { + case neitherHopping: + u = n_ID_SRS%U_GROUP_NUMBER; + v = 0; + break; + case groupHopping: + u = group_number_hopping(slot_number, n_ID_SRS, l0, l_line); + v = 0; + break; + case sequenceHopping: + u = n_ID_SRS%U_GROUP_NUMBER; + v = sequence_number_hopping(slot_number, n_ID_SRS, M_sc_b_SRS, l0, l_line); + break; + default: + LOG_E(NR_PHY, "generate_srs: unknown hopping setting %d !\n", groupOrSequenceHopping); + return -1; } #ifdef SRS_DEBUG - int subcarrier_log = subcarrier-subcarrier_offset; - if(subcarrier_log < 0) { - subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size; - } - if( subcarrier_log%12 == 0 ) { - LOG_I(NR_PHY,"------------ %d ------------\n", subcarrier_log/12); - } - LOG_I(NR_PHY,"(%d) \t%i\t%i\n", subcarrier_log, (int16_t)(real_amp&0xFFFF), (int16_t)(imag_amp&0xFFFF)); + LOG_I(NR_PHY,"u = %i\n", u); + LOG_I(NR_PHY,"v = %i\n", v); #endif - subcarrier += (K_TC); /* subcarrier increment */ + // Compute the frequency position index n_b + uint16_t sum_n_b = 0; + for (int b = 0; b <= B_SRS; b++) { + n_b[b] = compute_n_b(frame_number, slot_number, frame_parms->slots_per_frame, N_symb_SRS, B_SRS, + C_SRS, b_hop, n_RRC, R, T_offset, T_SRS, srs_config_pdu->resource_type, l_line, b); + + sum_n_b += n_b[b]; + +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"n_b[%i] = %i\n", b, n_b[b]); +#endif - if (subcarrier >= frame_parms->ofdm_symbol_size) { - subcarrier=subcarrier-frame_parms->ofdm_symbol_size; } - } - /* process next symbol */ - //txptr = txptr + frame_parms->ofdm_symbol_size; - } +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"sum_n_b = %i\n", sum_n_b); +#endif - return (0); + // Compute the frequency-domain starting position + uint8_t K_TC_p = 0; + if((n_SRS_cs >= n_SRS_cs_max/2)&&(n_SRS_cs < n_SRS_cs_max)&&(N_ap == 4) && ((SRS_antenna_port[p_index] == 1001) || (SRS_antenna_port[p_index] == 1003))) { + K_TC_p = (K_TC_overbar + K_TC/2)%K_TC; + } else { + K_TC_p = K_TC_overbar; + } + uint8_t k_l_offset = 0; // If the SRS is configured by the IE SRS-PosResource-r16, the quantity k_l_offset is + // given by TS 38.211 - Table 6.4.1.4.3-2, otherwise k_l_offset = 0. + uint8_t k_0_overbar_p = (n_shift*N_SC_RB + (K_TC_p+k_l_offset))%K_TC; + uint8_t k_0_p = k_0_overbar_p + K_TC*M_sc_b_SRS*sum_n_b; + +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"K_TC_p = %i\n", K_TC_p); + LOG_I(NR_PHY,"k_0_overbar_p = %i\n", k_0_overbar_p); + LOG_I(NR_PHY,"k_0_p = %i\n", k_0_p); +#endif + + uint16_t subcarrier = subcarrier_offset + k_0_p; + if (subcarrier>frame_parms->ofdm_symbol_size) { + subcarrier -= frame_parms->ofdm_symbol_size; + } + uint16_t l_line_offset = l_line*frame_parms->ofdm_symbol_size; + + // For each port, and for each OFDM symbol, here it is computed and mapped an SRS sequence with M_sc_b_SRS symbols + for (int k = 0; k < M_sc_b_SRS; k++) { + + double shift_real = cos(alpha_i * k); + double shift_imag = sin(alpha_i * k); + int16_t r_overbar_real = rv_ul_ref_sig[u][v][M_sc_b_SRS_index][k<<1]; + int16_t r_overbar_imag = rv_ul_ref_sig[u][v][M_sc_b_SRS_index][(k<<1)+1]; + + // cos(x+y) = cos(x)cos(y) - sin(x)sin(y) + double r_real = (shift_real*r_overbar_real - shift_imag*r_overbar_imag) / sqrt_N_ap; + + // sin(x+y) = sin(x)cos(y) + cos(x)sin(y) + double r_imag = (shift_imag*r_overbar_real + shift_real*r_overbar_imag) / sqrt_N_ap; + + int32_t r_real_amp = ((int32_t) round((double) amp * r_real)) >> 15; + int32_t r_imag_amp = ((int32_t) round((double) amp * r_imag)) >> 15; + +#ifdef SRS_DEBUG + int subcarrier_log = subcarrier-subcarrier_offset; + if(subcarrier_log < 0) { + subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size; + } + if(subcarrier_log%12 == 0) { + LOG_I(NR_PHY,"------------ %d ------------\n", subcarrier_log/12); + } + LOG_I(NR_PHY,"(%d) \t%i\t%i\n", subcarrier_log, (int16_t)(r_real_amp&0xFFFF), (int16_t)(r_imag_amp&0xFFFF)); +#endif + + txdataF[p_index][symbol_offset+l_line_offset+subcarrier] = (r_real_amp & 0xFFFF) + ((r_imag_amp<<16)&0xFFFF0000); + + if(nr_srs_info && p_index==0 && l_line==0) { + nr_srs_info->sc_list[nr_srs_info->sc_list_length] = subcarrier; + nr_srs_info->sc_list_length++; + } + + // Subcarrier increment + subcarrier += K_TC; + if (subcarrier >= frame_parms->ofdm_symbol_size) { + subcarrier=subcarrier-frame_parms->ofdm_symbol_size; + } + + } // for (int k = 0; k < M_sc_b_SRS; k++) + } // for (int l_line = 0; l_line < N_symb_SRS; l_line++) + } // for (int p_index = 0; p_index < N_ap; p_index++) + + return 0; } /******************************************************************* diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h index 56144e8de7..e52338a01a 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h @@ -131,6 +131,13 @@ EXTERN const uint16_t srs_periodicity[SRS_PERIODICITY] #endif ; +// TS 38.211 - Table 6.4.1.4.2-1 +EXTERN const uint16_t srs_max_number_cs[3] +#ifdef INIT_VARIABLES_SRS_MODULATION_NR_H + = {8, 12, 6} +#endif +; + /*************** FUNCTIONS *****************************************/ /** \brief This function generates the sounding reference symbol (SRS) for the uplink according to 38.211 6.4.1.4 Sounding reference signal From 997d52b71da5acb7b9e7e0d3c2650c14ccfb6d0c Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Mon, 16 May 2022 18:11:01 +0100 Subject: [PATCH 052/136] Improvements in nr_get_srs_signal to consider multi-ports and multi-symbols --- openair1/PHY/INIT/nr_init.c | 8 +- openair1/PHY/INIT/nr_init_ue.c | 2 + openair1/PHY/NR_TRANSPORT/srs_rx.c | 76 ++++++++++++++----- .../PHY/NR_UE_TRANSPORT/srs_modulation_nr.c | 13 +++- openair1/PHY/defs_nr_common.h | 1 + 5 files changed, 72 insertions(+), 28 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 635a232228..198e46c166 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -617,7 +617,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, for (int id=0; idnr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); gNB->nr_srs_info[id]->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t)); - gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); + gNB->nr_srs_info[id]->k_0_p = (uint8_t**)malloc16_clear(Prx*sizeof(uint8_t*)); + gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); gNB->nr_srs_info[id]->signal_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); gNB->nr_srs_info[id]->noise_power_per_rb = (uint32_t*)malloc16_clear(fp->N_RB_UL*sizeof(uint32_t)); gNB->nr_srs_info[id]->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); @@ -628,10 +629,9 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, gNB->nr_srs_info[id]->srs_estimated_channel_freq = (int32_t **)malloc16(Prx*sizeof(int32_t*)); gNB->nr_srs_info[id]->srs_estimated_channel_time = (int32_t **)malloc16(Prx*sizeof(int32_t*)); gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - for(i=0; inr_srs_info[id]->srs_generated_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - } for (i=0;inr_srs_info[id]->k_0_p[i] = (uint8_t*)malloc16_clear(MAX_NUM_NR_SRS_SYMBOLS*sizeof(uint8_t)); + gNB->nr_srs_info[id]->srs_generated_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); gNB->nr_srs_info[id]->srs_received_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); gNB->nr_srs_info[id]->srs_ls_estimated_channel[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); gNB->nr_srs_info[id]->srs_estimated_channel_freq[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index c717d5011a..709e43af85 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -344,6 +344,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) srs_vars[gNB_id]->active = false; ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); ue->nr_srs_info->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t)); + ue->nr_srs_info->k_0_p = (uint8_t**)malloc16_clear(fp->nb_antennas_rx*sizeof(uint8_t*)); ue->nr_srs_info->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); ue->nr_srs_info->srs_received_signal = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); ue->nr_srs_info->srs_ls_estimated_channel = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); @@ -351,6 +352,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) ue->nr_srs_info->srs_estimated_channel_time = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); ue->nr_srs_info->srs_estimated_channel_time_shifted = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); for (i=0; inb_antennas_rx; i++) { + ue->nr_srs_info->k_0_p[i] = (uint8_t*)malloc16_clear(MAX_NUM_NR_SRS_SYMBOLS*sizeof(uint8_t)); ue->nr_srs_info->srs_received_signal[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); ue->nr_srs_info->srs_ls_estimated_channel[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); ue->nr_srs_info->srs_estimated_channel_freq[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); diff --git a/openair1/PHY/NR_TRANSPORT/srs_rx.c b/openair1/PHY/NR_TRANSPORT/srs_rx.c index 2d7aefdee0..5ed8fc0f9d 100644 --- a/openair1/PHY/NR_TRANSPORT/srs_rx.c +++ b/openair1/PHY/NR_TRANSPORT/srs_rx.c @@ -30,10 +30,12 @@ #include #include +#include "PHY/INIT/phy_init.h" #include "PHY/impl_defs_nr.h" #include "PHY/defs_nr_common.h" #include "PHY/defs_gNB.h" -#include +#include "PHY/CODING/nrSmallBlock/nr_small_block_defs.h" +#include "PHY/NR_UE_TRANSPORT/srs_modulation_nr.h" #include "common/utils/LOG/log.h" #include "nfapi/oai_integration/vendor_ext.h" @@ -100,6 +102,10 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, nr_srs_info_t *nr_srs_info, int32_t **srs_received_signal) { +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"Calling %s function\n", __FUNCTION__); +#endif + if(nr_srs_info->sc_list_length == 0) { LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot); return -1; @@ -111,6 +117,12 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, uint16_t n_symbols = (slot&3)*frame_parms->symbols_per_slot; // number of symbols until this slot uint8_t l0 = frame_parms->symbols_per_slot - 1 - srs_pdu->time_start_position; // starting symbol in this slot uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size; + uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*NR_NB_SC_PER_RB; + + uint8_t N_ap = 1<num_ant_ports; + uint8_t N_symb_SRS = 1<num_symbols; + uint8_t K_TC = 2<comb_size; + uint16_t M_sc_b_SRS = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0] * NR_NB_SC_PER_RB/K_TC; int32_t *rx_signal; for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { @@ -118,27 +130,51 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, memset(srs_received_signal[ant], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t)); rx_signal = &rxdataF[ant][symbol_offset]; - for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { - srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] = rx_signal[nr_srs_info->sc_list[sc_idx]]; + for (int p_index = 0; p_index < N_ap; p_index++) { #ifdef SRS_DEBUG - uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12; - int subcarrier_log = nr_srs_info->sc_list[sc_idx]-subcarrier_offset; - if(subcarrier_log < 0) { - subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size; - } - if(sc_idx == 0) { - LOG_I(NR_PHY,"________ Rx antenna %i ________\n", ant); - } - if(subcarrier_log%12 == 0) { - LOG_I(NR_PHY,"::::::::::::: %i :::::::::::::\n", subcarrier_log/12); - } - LOG_I(NR_PHY,"(%i) \t%i\t%i\n", - subcarrier_log, - (int16_t)(srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]]&0xFFFF), - (int16_t)((srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]]>>16)&0xFFFF)); + LOG_I(NR_PHY,"===== UE port %d --> gNB Rx antenna %i =====\n", p_index, ant); #endif - } - } + + for (int l_line = 0; l_line < N_symb_SRS; l_line++) { + +#ifdef SRS_DEBUG + LOG_I(NR_PHY,":::::::: OFDM symbol %d ::::::::\n", l0+l_line); +#endif + + uint16_t subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][l_line]; + if (subcarrier>frame_parms->ofdm_symbol_size) { + subcarrier -= frame_parms->ofdm_symbol_size; + } + uint16_t l_line_offset = l_line*frame_parms->ofdm_symbol_size; + + for (int k = 0; k < M_sc_b_SRS; k++) { + + srs_received_signal[ant][l_line_offset+subcarrier] = rx_signal[l_line_offset+subcarrier]; + +#ifdef SRS_DEBUG + int subcarrier_log = subcarrier-subcarrier_offset; + if(subcarrier_log < 0) { + subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size; + } + if(subcarrier_log%12 == 0) { + LOG_I(NR_PHY,"------------ %d ------------\n", subcarrier_log/12); + } + LOG_I(NR_PHY,"(%i) \t%i\t%i\n", + subcarrier_log, + (int16_t)(srs_received_signal[ant][l_line_offset+subcarrier]&0xFFFF), + (int16_t)((srs_received_signal[ant][l_line_offset+subcarrier]>>16)&0xFFFF)); +#endif + + // Subcarrier increment + subcarrier += K_TC; + if (subcarrier >= frame_parms->ofdm_symbol_size) { + subcarrier=subcarrier-frame_parms->ofdm_symbol_size; + } + + } // for (int k = 0; k < M_sc_b_SRS; k++) + } // for (int l_line = 0; l_line < N_symb_SRS; l_line++) + } // for (int p_index = 0; p_index < N_ap; p_index++) + } // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) return 0; } \ No newline at end of file diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c index c4fe9cd120..6ed9277ce3 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c @@ -78,7 +78,7 @@ uint16_t sequence_number_hopping(int slot_number, uint8_t l0, uint8_t l_line) { uint16_t v = 0; - if (M_sc_b_SRS > 6 * N_SC_RB) { + if (M_sc_b_SRS > 6 * NR_NB_SC_PER_RB) { // Pseudo-random sequence c(i) defined by TS 38.211 - Section 5.2.1 uint32_t cinit = n_ID_SRS; uint8_t c_last_index = (slot_number * N_SYMB_SLOT + l0 + l_line); @@ -192,6 +192,10 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, int frame_number, int slot_number) { +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"Calling %s function\n", __FUNCTION__); +#endif + // SRS config parameters uint8_t B_SRS = srs_config_pdu->bandwidth_index; uint8_t C_SRS = srs_config_pdu->config_index; @@ -212,7 +216,7 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, uint8_t l0 = frame_parms->symbols_per_slot - 1 - l_offset; // Starting symbol position in the time domain uint8_t n_SRS_cs_max = srs_max_number_cs[srs_config_pdu->comb_size]; uint16_t m_SRS_b = srs_bandwidth_config[C_SRS][B_SRS][0]; // Number of resource blocks - uint16_t M_sc_b_SRS = m_SRS_b * N_SC_RB/K_TC; // Length of the SRS sequence + uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB/K_TC; // Length of the SRS sequence #ifdef SRS_DEBUG LOG_I(NR_PHY,"Frame = %i, slot = %i\n", frame_number, slot_number); @@ -272,7 +276,7 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, nr_srs_info->sc_list_length = 0; nr_srs_info->srs_generated_signal_bits = log2_approx(amp); } - uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_config_pdu->bwp_start*N_SC_RB; + uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_config_pdu->bwp_start*NR_NB_SC_PER_RB; double sqrt_N_ap = sqrt(N_ap); uint16_t n_b[B_SRS_NUMBER]; @@ -356,8 +360,9 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, } uint8_t k_l_offset = 0; // If the SRS is configured by the IE SRS-PosResource-r16, the quantity k_l_offset is // given by TS 38.211 - Table 6.4.1.4.3-2, otherwise k_l_offset = 0. - uint8_t k_0_overbar_p = (n_shift*N_SC_RB + (K_TC_p+k_l_offset))%K_TC; + uint8_t k_0_overbar_p = (n_shift*NR_NB_SC_PER_RB + (K_TC_p+k_l_offset))%K_TC; uint8_t k_0_p = k_0_overbar_p + K_TC*M_sc_b_SRS*sum_n_b; + nr_srs_info->k_0_p[p_index][l_line] = k_0_p; #ifdef SRS_DEBUG LOG_I(NR_PHY,"K_TC_p = %i\n", K_TC_p); diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 2bb626bcfd..0286b91d0f 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -242,6 +242,7 @@ typedef struct { typedef struct { uint16_t sc_list_length; uint16_t *sc_list; + uint8_t **k_0_p; uint8_t srs_generated_signal_bits; int32_t **srs_generated_signal; int32_t **srs_received_signal; From 86874047ac6e43960e477f234c1d89e241b22044 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Tue, 17 May 2022 17:42:48 +0100 Subject: [PATCH 053/136] Channel estimation, channel interpolation and SNR per RB computation based on SRS up to 4 antenna ports --- openair1/PHY/INIT/nr_init.c | 22 +- openair1/PHY/INIT/nr_init_ue.c | 12 - .../NR_ESTIMATION/nr_ul_channel_estimation.c | 359 ++++++++++-------- openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h | 8 +- .../PHY/NR_UE_TRANSPORT/srs_modulation_nr.c | 2 +- openair1/PHY/defs_nr_common.h | 8 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 8 +- 7 files changed, 234 insertions(+), 185 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 198e46c166..6ce196c49d 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -625,18 +625,24 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, gNB->nr_srs_info[id]->snr_per_rb = (int8_t*)malloc16_clear(fp->N_RB_UL*sizeof(int8_t)); gNB->nr_srs_info[id]->snr = (int8_t*)malloc16_clear(sizeof(int8_t)); gNB->nr_srs_info[id]->srs_received_signal = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_ls_estimated_channel = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_estimated_channel_freq = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_estimated_channel_time = (int32_t **)malloc16(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted = (int32_t **)malloc16(Prx*sizeof(int32_t*)); + gNB->nr_srs_info[id]->srs_ls_estimated_channel = (int32_t ***)malloc16(Prx*sizeof(int32_t**)); + gNB->nr_srs_info[id]->srs_estimated_channel_freq = (int32_t ***)malloc16(Prx*sizeof(int32_t**)); + gNB->nr_srs_info[id]->srs_estimated_channel_time = (int32_t ***)malloc16(Prx*sizeof(int32_t**)); + gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted = (int32_t ***)malloc16(Prx*sizeof(int32_t**)); for (i=0;inr_srs_info[id]->k_0_p[i] = (uint8_t*)malloc16_clear(MAX_NUM_NR_SRS_SYMBOLS*sizeof(uint8_t)); gNB->nr_srs_info[id]->srs_generated_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); gNB->nr_srs_info[id]->srs_received_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->srs_ls_estimated_channel[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->srs_estimated_channel_freq[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->srs_estimated_channel_time[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + gNB->nr_srs_info[id]->srs_ls_estimated_channel[i] = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); + gNB->nr_srs_info[id]->srs_estimated_channel_freq[i] = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); + gNB->nr_srs_info[id]->srs_estimated_channel_time[i] = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); + gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i] = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); + for (int j = 0; j < Prx; j++) { + gNB->nr_srs_info[id]->srs_ls_estimated_channel[i][j] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + gNB->nr_srs_info[id]->srs_estimated_channel_freq[i][j] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + gNB->nr_srs_info[id]->srs_estimated_channel_time[i][j] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i][j] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + } } } diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 709e43af85..2aa6400bfb 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -345,22 +345,10 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); ue->nr_srs_info->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t)); ue->nr_srs_info->k_0_p = (uint8_t**)malloc16_clear(fp->nb_antennas_rx*sizeof(uint8_t*)); - ue->nr_srs_info->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); - ue->nr_srs_info->srs_received_signal = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - ue->nr_srs_info->srs_ls_estimated_channel = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - ue->nr_srs_info->srs_estimated_channel_freq = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - ue->nr_srs_info->srs_estimated_channel_time = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); - ue->nr_srs_info->srs_estimated_channel_time_shifted = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) ); for (i=0; inb_antennas_rx; i++) { ue->nr_srs_info->k_0_p[i] = (uint8_t*)malloc16_clear(MAX_NUM_NR_SRS_SYMBOLS*sizeof(uint8_t)); - ue->nr_srs_info->srs_received_signal[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - ue->nr_srs_info->srs_ls_estimated_channel[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - ue->nr_srs_info->srs_estimated_channel_freq[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - ue->nr_srs_info->srs_estimated_channel_time[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - ue->nr_srs_info->srs_estimated_channel_time_shifted[i] = (int32_t *) malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); } - // RACH prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); prach_vars[gNB_id]->prach = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index b91f603f3c..91295d0015 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -28,6 +28,7 @@ #include "PHY/NR_REFSIG/dmrs_nr.h" #include "PHY/NR_REFSIG/ptrs_nr.h" #include "PHY/NR_TRANSPORT/nr_transport_proto.h" +#include "PHY/NR_UE_TRANSPORT/srs_modulation_nr.h" #include "PHY/NR_UE_ESTIMATION/filt16a_32.h" #include "PHY/NR_REFSIG/ul_ref_seq_nr.h" @@ -951,139 +952,228 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, int slot, nfapi_nr_srs_pdu_t *srs_pdu, nr_srs_info_t *nr_srs_info, - int32_t *srs_generated_signal, + int32_t **srs_generated_signal, int32_t **srs_received_signal, - int32_t **srs_estimated_channel_freq, - int32_t **srs_estimated_channel_time, - int32_t **srs_estimated_channel_time_shifted, + int32_t ***srs_estimated_channel_freq, + int32_t ***srs_estimated_channel_time, + int32_t ***srs_estimated_channel_time_shifted, uint32_t *signal_power, uint32_t *noise_power_per_rb, uint32_t *noise_power, int8_t *snr_per_rb, int8_t *snr) { +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"Calling %s function\n", __FUNCTION__); +#endif + if(nr_srs_info->sc_list_length == 0) { LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot); return -1; } NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - int32_t **srs_ls_estimated_channel = nr_srs_info->srs_ls_estimated_channel; + int32_t ***srs_ls_estimated_channel = nr_srs_info->srs_ls_estimated_channel; - int16_t ch_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; - int16_t ch_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; - int16_t noise_real[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; - int16_t noise_imag[frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length]; + uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*NR_NB_SC_PER_RB; + + uint8_t N_ap = 1<num_ant_ports; + uint8_t K_TC = 2<comb_size; + uint16_t m_SRS_b = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0]; + uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB/K_TC; + uint8_t fd_cdm = N_ap; + if (N_ap == 4 && ((K_TC == 2 && srs_pdu->cyclic_shift >= 4) || (K_TC == 4 && srs_pdu->cyclic_shift >= 6))) { + fd_cdm = 2; + } + + int16_t ch_real[frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS]; + int16_t ch_imag[frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS]; + int16_t noise_real[frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS]; + int16_t noise_imag[frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS]; int16_t ls_estimated[2]; for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { - memset(srs_ls_estimated_channel[ant], 0, frame_parms->ofdm_symbol_size*(1<num_symbols)*sizeof(int32_t)); - memset(srs_estimated_channel_freq[ant], 0, frame_parms->ofdm_symbol_size*(1<num_symbols)*sizeof(int32_t)); + for (int p_index = 0; p_index < N_ap; p_index++) { - int16_t *srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][nr_srs_info->sc_list[0]]; + memset(srs_ls_estimated_channel[ant][p_index], 0, frame_parms->ofdm_symbol_size*(1<num_symbols)*sizeof(int32_t)); + memset(srs_estimated_channel_freq[ant][p_index], 0, frame_parms->ofdm_symbol_size*(1<num_symbols)*sizeof(int32_t)); - for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { +#ifdef SRS_DEBUG + LOG_I(NR_PHY,"====================== UE port %d --> gNB Rx antenna %i ======================\n", p_index, ant); +#endif - int16_t generated_real = srs_generated_signal[nr_srs_info->sc_list[sc_idx]] & 0xFFFF; - int16_t generated_imag = (srs_generated_signal[nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF; + uint16_t subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0]; + if (subcarrier>frame_parms->ofdm_symbol_size) { + subcarrier -= frame_parms->ofdm_symbol_size; + } - int16_t received_real = srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] & 0xFFFF; - int16_t received_imag = (srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF; + int16_t *srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][p_index][subcarrier]; - // We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag. - // So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits. - ls_estimated[0] = (int16_t)(((int32_t)generated_real*received_real + (int32_t)generated_imag*received_imag)>>nr_srs_info->srs_generated_signal_bits); - ls_estimated[1] = (int16_t)(((int32_t)generated_real*received_imag - (int32_t)generated_imag*received_real)>>nr_srs_info->srs_generated_signal_bits); - srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]] = ls_estimated[0] + (((int32_t)ls_estimated[1] << 16) & 0xFFFF0000); + for (int k = 0; k < M_sc_b_SRS; k++) { - // Channel interpolation - if(srs_pdu->comb_size == 0) { - if(sc_idx == 0) { // First subcarrier case - // filt8_start is {12288,8192,4096,0,0,0,0,0} - multadd_real_vector_complex_scalar(filt8_start, ls_estimated, srs_estimated_channel16, 8); - } else if(nr_srs_info->sc_list[sc_idx] < nr_srs_info->sc_list[sc_idx - 1]) { // Start of OFDM symbol case - // filt8_start is {12288,8192,4096,0,0,0,0,0} - srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx + 2]] - sizeof(uint64_t); - multadd_real_vector_complex_scalar(filt8_start, ls_estimated, srs_estimated_channel16, 8); - } else if((sc_idx < (nr_srs_info->sc_list_length - 1) && nr_srs_info->sc_list[sc_idx + 1] < nr_srs_info->sc_list[sc_idx]) - || (sc_idx == (nr_srs_info->sc_list_length - 1))) { // End of OFDM symbol or last subcarrier cases - // filt8_end is {4096,8192,12288,16384,0,0,0,0} - multadd_real_vector_complex_scalar(filt8_end, ls_estimated, srs_estimated_channel16, 8); - } else if(sc_idx%2 == 1) { // 1st middle case - // filt8_middle2 is {4096,8192,8192,8192,4096,0,0,0} - multadd_real_vector_complex_scalar(filt8_middle2, ls_estimated, srs_estimated_channel16, 8); - } else if(sc_idx%2 == 0) { // 2nd middle case - // filt8_middle4 is {0,0,4096,8192,8192,8192,4096,0} - multadd_real_vector_complex_scalar(filt8_middle4, ls_estimated, srs_estimated_channel16, 8); - srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]]; + if (k%fd_cdm==0) { + + ls_estimated[0] = 0; + ls_estimated[1] = 0; + uint16_t subcarrier_cdm = subcarrier; + + for (int cdm_idx = 0; cdm_idx < fd_cdm; cdm_idx++) { + + int16_t generated_real = srs_generated_signal[p_index][subcarrier_cdm] & 0xFFFF; + int16_t generated_imag = (srs_generated_signal[p_index][subcarrier_cdm] >> 16) & 0xFFFF; + + int16_t received_real = srs_received_signal[ant][subcarrier_cdm] & 0xFFFF; + int16_t received_imag = (srs_received_signal[ant][subcarrier_cdm] >> 16) & 0xFFFF; + + // We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag. + // So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits. + ls_estimated[0] += (int16_t)(((int32_t)generated_real*received_real + (int32_t)generated_imag*received_imag)>>nr_srs_info->srs_generated_signal_bits); + ls_estimated[1] += (int16_t)(((int32_t)generated_real*received_imag - (int32_t)generated_imag*received_real)>>nr_srs_info->srs_generated_signal_bits); + + // Subcarrier increment + subcarrier_cdm += K_TC; + if (subcarrier_cdm >= frame_parms->ofdm_symbol_size) { + subcarrier_cdm=subcarrier_cdm-frame_parms->ofdm_symbol_size; + } + } } - } else { - if(sc_idx == 0) { // First subcarrier case - // filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0} - multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16); - } else if(nr_srs_info->sc_list[sc_idx] < nr_srs_info->sc_list[sc_idx - 1]) { // Start of OFDM symbol case - srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx + 1]] - sizeof(uint64_t); - // filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0} - multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16); - } else if((sc_idx < (nr_srs_info->sc_list_length - 1) && nr_srs_info->sc_list[sc_idx + 1] < nr_srs_info->sc_list[sc_idx]) - || (sc_idx == (nr_srs_info->sc_list_length - 1))) { // End of OFDM symbol or last subcarrier cases - // filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0} - multadd_real_vector_complex_scalar(filt16_end, ls_estimated, srs_estimated_channel16, 16); - } else { // Middle case - // filt16_middle4 is {4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0} - multadd_real_vector_complex_scalar(filt16_middle4, ls_estimated, srs_estimated_channel16, 16); - srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]]; + + srs_ls_estimated_channel[ant][p_index][subcarrier] = ls_estimated[0] + (((int32_t)ls_estimated[1] << 16) & 0xFFFF0000); + +#ifdef SRS_DEBUG + int subcarrier_log = subcarrier-subcarrier_offset; + if(subcarrier_log < 0) { + subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size; + } + if(subcarrier_log%12 == 0) { + LOG_I(NR_PHY,"------------------------------------ %d ------------------------------------\n", subcarrier_log/12); + LOG_I(NR_PHY,"\t __genRe________genIm__|____rxRe_________rxIm__|____lsRe________lsIm_\n"); + } + LOG_I(NR_PHY,"(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n", + subcarrier_log, + (int16_t)(srs_generated_signal[p_index][subcarrier] & 0xFFFF), (int16_t)((srs_generated_signal[p_index][subcarrier] >> 16) & 0xFFFF), + (int16_t)(srs_received_signal[ant][subcarrier] & 0xFFFF), (int16_t)((srs_received_signal[ant][subcarrier] >> 16) & 0xFFFF), + ls_estimated[0], ls_estimated[1]); +#endif + + // Channel interpolation + if(srs_pdu->comb_size == 0) { + if(k == 0) { // First subcarrier case + // filt8_start is {12288,8192,4096,0,0,0,0,0} + multadd_real_vector_complex_scalar(filt8_start, ls_estimated, srs_estimated_channel16, 8); + } else if(subcarrier < K_TC) { // Start of OFDM symbol case + // filt8_start is {12288,8192,4096,0,0,0,0,0} + srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][p_index][subcarrier + (K_TC<<1)] - sizeof(uint64_t); + multadd_real_vector_complex_scalar(filt8_start, ls_estimated, srs_estimated_channel16, 8); + } else if((subcarrier+K_TC)>=frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS-1)) { // End of OFDM symbol or last subcarrier cases + // filt8_end is {4096,8192,12288,16384,0,0,0,0} + multadd_real_vector_complex_scalar(filt8_end, ls_estimated, srs_estimated_channel16, 8); + } else if(k%2 == 1) { // 1st middle case + // filt8_middle2 is {4096,8192,8192,8192,4096,0,0,0} + multadd_real_vector_complex_scalar(filt8_middle2, ls_estimated, srs_estimated_channel16, 8); + } else if(k%2 == 0) { // 2nd middle case + // filt8_middle4 is {0,0,4096,8192,8192,8192,4096,0} + multadd_real_vector_complex_scalar(filt8_middle4, ls_estimated, srs_estimated_channel16, 8); + srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][p_index][subcarrier]; + } + } else { + if(k == 0) { // First subcarrier case + // filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0} + multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16); + } else if(subcarrier < K_TC) { // Start of OFDM symbol case + srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][p_index][subcarrier + K_TC] - sizeof(uint64_t); + // filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0} + multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16); + } else if((subcarrier+K_TC)>=frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS-1)) { // End of OFDM symbol or last subcarrier cases + // filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0} + multadd_real_vector_complex_scalar(filt16_end, ls_estimated, srs_estimated_channel16, 16); + } else { // Middle case + // filt16_middle4 is {4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0} + multadd_real_vector_complex_scalar(filt16_middle4, ls_estimated, srs_estimated_channel16, 16); + srs_estimated_channel16 = (int16_t *)&srs_estimated_channel_freq[ant][p_index][subcarrier]; + } + } + + // Subcarrier increment + subcarrier += K_TC; + if (subcarrier >= frame_parms->ofdm_symbol_size) { + subcarrier=subcarrier-frame_parms->ofdm_symbol_size; + } + + } // for (int k = 0; k < M_sc_b_SRS; k++) + + // Compute noise + subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0]; + if (subcarrier>frame_parms->ofdm_symbol_size) { + subcarrier -= frame_parms->ofdm_symbol_size; + } + uint16_t base_idx = ant*N_ap*M_sc_b_SRS + p_index*M_sc_b_SRS; + for (int k = 0; k < M_sc_b_SRS; k++) { + ch_real[base_idx+k] = (int16_t)(srs_estimated_channel_freq[ant][p_index][subcarrier] & 0xFFFF); + ch_imag[base_idx+k] = (int16_t)((srs_estimated_channel_freq[ant][p_index][subcarrier] >> 16) & 0xFFFF); + noise_real[base_idx+k] = abs((int16_t)(srs_ls_estimated_channel[ant][p_index][subcarrier] & 0xFFFF) - ch_real[base_idx+k]); + noise_imag[base_idx+k] = abs((int16_t)((srs_ls_estimated_channel[ant][p_index][subcarrier] >> 16) & 0xFFFF) - ch_imag[base_idx+k]); + subcarrier += K_TC; + if (subcarrier >= frame_parms->ofdm_symbol_size) { + subcarrier=subcarrier-frame_parms->ofdm_symbol_size; } } #ifdef SRS_DEBUG - uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12; - int subcarrier_log = nr_srs_info->sc_list[sc_idx]-subcarrier_offset; - if(subcarrier_log < 0) { - subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size; + subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0]; + if (subcarrier>frame_parms->ofdm_symbol_size) { + subcarrier -= frame_parms->ofdm_symbol_size; } - if(sc_idx == 0) { - LOG_I(NR_PHY,"______________________________ Rx antenna %i _______________________________\n", ant); + + for (int k = 0; k < K_TC*M_sc_b_SRS; k++) { + + int subcarrier_log = subcarrier-subcarrier_offset; + if(subcarrier_log < 0) { + subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size; + } + + if(subcarrier_log%12 == 0) { + LOG_I(NR_PHY,"------------------------------------- %d -------------------------------------\n", subcarrier_log/12); + LOG_I(NR_PHY,"\t __lsRe__________lsIm__|____intRe_______intIm__|____noiRe_______noiIm__\n"); + } + + LOG_I(NR_PHY,"(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n", + subcarrier_log, + (int16_t)(srs_ls_estimated_channel[ant][p_index][subcarrier]&0xFFFF), + (int16_t)((srs_ls_estimated_channel[ant][p_index][subcarrier]>>16)&0xFFFF), + (int16_t)(srs_estimated_channel_freq[ant][p_index][subcarrier]&0xFFFF), + (int16_t)((srs_estimated_channel_freq[ant][p_index][subcarrier]>>16)&0xFFFF), + noise_real[base_idx+(k/K_TC)], noise_imag[base_idx+(k/K_TC)]); + + // Subcarrier increment + subcarrier++; + if (subcarrier >= frame_parms->ofdm_symbol_size) { + subcarrier=subcarrier-frame_parms->ofdm_symbol_size; + } } - if(subcarrier_log%12 == 0) { - LOG_I(NR_PHY,":::::::::::::::::::::::::::::::::::: %i ::::::::::::::::::::::::::::::::::::\n", subcarrier_log/12); - LOG_I(NR_PHY,"\t __genRe________genIm__|____rxRe_________rxIm__|____lsRe________lsIm_\n"); - } - LOG_I(NR_PHY,"(%4i) %6i\t%6i | %6i\t%6i | %6i\t%6i\n", - subcarrier_log, - generated_real, generated_imag, - received_real, received_imag, - ls_estimated[0], ls_estimated[1]); #endif - } - // Compute noise - for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { - ch_real[ant*nr_srs_info->sc_list_length + sc_idx] = (int16_t)(srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]] & 0xFFFF); - ch_imag[ant*nr_srs_info->sc_list_length + sc_idx] = (int16_t)((srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF); - noise_real[ant*nr_srs_info->sc_list_length + sc_idx] = abs((int16_t)(srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]] & 0xFFFF) - ch_real[ant*nr_srs_info->sc_list_length + sc_idx]); - noise_imag[ant*nr_srs_info->sc_list_length + sc_idx] = abs((int16_t)((srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]] >> 16) & 0xFFFF) - ch_imag[ant*nr_srs_info->sc_list_length + sc_idx]); - } + // Convert to time domain + freq2time(gNB->frame_parms.ofdm_symbol_size, + (int16_t*) srs_estimated_channel_freq[ant][p_index], + (int16_t*) srs_estimated_channel_time[ant][p_index]); - // Convert to time domain - freq2time(gNB->frame_parms.ofdm_symbol_size, - (int16_t*) srs_estimated_channel_freq[ant], - (int16_t*) srs_estimated_channel_time[ant]); + memcpy(&srs_estimated_channel_time_shifted[ant][p_index][0], + &srs_estimated_channel_time[ant][p_index][gNB->frame_parms.ofdm_symbol_size>>1], + (gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t)); - memcpy(&srs_estimated_channel_time_shifted[ant][0], - &srs_estimated_channel_time[ant][gNB->frame_parms.ofdm_symbol_size>>1], - (gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t)); + memcpy(&srs_estimated_channel_time_shifted[ant][p_index][gNB->frame_parms.ofdm_symbol_size>>1], + &srs_estimated_channel_time[ant][p_index][0], + (gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t)); - memcpy(&srs_estimated_channel_time_shifted[ant][gNB->frame_parms.ofdm_symbol_size>>1], - &srs_estimated_channel_time[ant][0], - (gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t)); - } + } // for (int p_index = 0; p_index < N_ap; p_index++) + } // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) // Compute signal power - *signal_power = calc_power(ch_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length) - + calc_power(ch_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length); + *signal_power = calc_power(ch_real,frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS) + + calc_power(ch_imag,frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS); #ifdef SRS_DEBUG LOG_I(NR_PHY,"signal_power = %u\n", *signal_power); @@ -1095,83 +1185,48 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, uint8_t factor_bits = signal_power_bits < 32 ? 32 - signal_power_bits : 0; // 32 due to input of dB_fixed(uint32_t x) int32_t factor_dB = dB_fixed(1<first_carrier_offset + srs_pdu->bwp_start*12; uint8_t srs_symbols_per_rb = srs_pdu->comb_size == 0 ? 6 : 3; - uint8_t n_noise_estimates = frame_parms->nb_antennas_rx*srs_symbols_per_rb; - uint8_t count_estimates = 0; + uint8_t n_noise_estimates = frame_parms->nb_antennas_rx*N_ap*srs_symbols_per_rb; uint64_t sum_re = 0; uint64_t sum_re2 = 0; uint64_t sum_im = 0; uint64_t sum_im2 = 0; - for (int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { + for (int rb = 0; rb < m_SRS_b; rb++) { - int subcarrier0 = nr_srs_info->sc_list[sc_idx]-subcarrier_offset; - if(subcarrier0 < 0) { - subcarrier0 = subcarrier0 + frame_parms->ofdm_symbol_size; - } - int rb = subcarrier0/NR_NB_SC_PER_RB; + sum_re = 0; + sum_re2 = 0; + sum_im = 0; + sum_im2 = 0; for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { + for (int p_index = 0; p_index < N_ap; p_index++) { + uint16_t base_idx = ant*N_ap*M_sc_b_SRS + p_index*M_sc_b_SRS + rb*srs_symbols_per_rb; + for (int srs_symb = 0; srs_symb < srs_symbols_per_rb; srs_symb++) { + sum_re = sum_re + noise_real[base_idx+srs_symb]; + sum_re2 = sum_re2 + noise_real[base_idx+srs_symb]*noise_real[base_idx+srs_symb]; + sum_im = sum_im + noise_imag[base_idx+srs_symb]; + sum_im2 = sum_im2 + noise_imag[base_idx+srs_symb]*noise_imag[base_idx+srs_symb]; + } // for (int srs_symb = 0; srs_symb < srs_symbols_per_rb; srs_symb++) + } // for (int p_index = 0; p_index < N_ap; p_index++) + } // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) - sum_re = sum_re + noise_real[ant*nr_srs_info->sc_list_length+sc_idx]; - sum_re2 = sum_re2 + noise_real[ant*nr_srs_info->sc_list_length+sc_idx]*noise_real[ant*nr_srs_info->sc_list_length+sc_idx]; - sum_im = sum_im + noise_imag[ant*nr_srs_info->sc_list_length+sc_idx]; - sum_im2 = sum_im2 + noise_imag[ant*nr_srs_info->sc_list_length+sc_idx]*noise_imag[ant*nr_srs_info->sc_list_length+sc_idx]; - - count_estimates++; - if (count_estimates == n_noise_estimates) { - noise_power_per_rb[rb] = sum_re2/n_noise_estimates - (sum_re/n_noise_estimates)*(sum_re/n_noise_estimates) + - sum_im2/n_noise_estimates - (sum_im/n_noise_estimates)*(sum_im/n_noise_estimates); - snr_per_rb[rb] = dB_fixed((int32_t)((*signal_power<nb_antennas_rx*nr_srs_info->sc_list_length) - + calc_power(noise_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length); + *noise_power = calc_power(noise_real,frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS) + + calc_power(noise_imag,frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS); *snr = dB_fixed((int32_t)((*signal_power<first_carrier_offset + srs_pdu->bwp_start*12; - uint8_t R = srs_pdu->comb_size == 0 ? 2 : 4; - for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { - for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) { - int subcarrier_log = nr_srs_info->sc_list[sc_idx]-subcarrier_offset; - if(subcarrier_log < 0) { - subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size; - } - if(sc_idx == 0) { - LOG_I(NR_PHY,"______________________________ Rx antenna %i _______________________________\n", ant); - } - if(subcarrier_log%12 == 0) { - LOG_I(NR_PHY,":::::::::::::::::::::::::::::::::::: %i ::::::::::::::::::::::::::::::::::::\n", subcarrier_log/12); - LOG_I(NR_PHY,"\t __lsRe__________lsIm__|____intRe_______intIm__|____noiRe_______noiIm_\n"); - } - for(int r = 0; rsc_list[sc_idx]+r]&0xFFFF), - (int16_t)((srs_ls_estimated_channel[ant][nr_srs_info->sc_list[sc_idx]+r]>>16)&0xFFFF), - (int16_t)(srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]+r]&0xFFFF), - (int16_t)((srs_estimated_channel_freq[ant][nr_srs_info->sc_list[sc_idx]+r]>>16)&0xFFFF), - noise_real[ant*nr_srs_info->sc_list_length+sc_idx], - noise_imag[ant*nr_srs_info->sc_list_length+sc_idx]); - } - - } - } LOG_I(NR_PHY,"noise_power = %u, SNR = %i dB\n", *noise_power, *snr); #endif diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index 914b0d7385..c940853a8d 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -71,11 +71,11 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, int slot, nfapi_nr_srs_pdu_t *srs_pdu, nr_srs_info_t *nr_srs_info, - int32_t *srs_generated_signal, + int32_t **srs_generated_signal, int32_t **srs_received_signal, - int32_t **srs_estimated_channel_freq, - int32_t **srs_estimated_channel_time, - int32_t **srs_estimated_channel_time_shifted, + int32_t ***srs_estimated_channel_freq, + int32_t ***srs_estimated_channel_time, + int32_t ***srs_estimated_channel_time_shifted, uint32_t *signal_power, uint32_t *noise_power_per_rb, uint32_t *noise_power, diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c index 6ed9277ce3..242ce102fb 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c @@ -216,7 +216,7 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, uint8_t l0 = frame_parms->symbols_per_slot - 1 - l_offset; // Starting symbol position in the time domain uint8_t n_SRS_cs_max = srs_max_number_cs[srs_config_pdu->comb_size]; uint16_t m_SRS_b = srs_bandwidth_config[C_SRS][B_SRS][0]; // Number of resource blocks - uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB/K_TC; // Length of the SRS sequence + uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB/K_TC; // Length of the SRS sequence #ifdef SRS_DEBUG LOG_I(NR_PHY,"Frame = %i, slot = %i\n", frame_number, slot_number); diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 0286b91d0f..6dc889bc83 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -246,10 +246,10 @@ typedef struct { uint8_t srs_generated_signal_bits; int32_t **srs_generated_signal; int32_t **srs_received_signal; - int32_t **srs_ls_estimated_channel; - int32_t **srs_estimated_channel_freq; - int32_t **srs_estimated_channel_time; - int32_t **srs_estimated_channel_time_shifted; + int32_t ***srs_ls_estimated_channel; + int32_t ***srs_estimated_channel_freq; + int32_t ***srs_estimated_channel_time; + int32_t ***srs_estimated_channel_time_shifted; uint32_t *signal_power; uint32_t *noise_power_per_rb; uint32_t *noise_power; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 5b3c4ac26d..297693c31d 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -862,7 +862,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { nr_srs_channel_estimation(gNB,frame_rx,slot_rx,srs_pdu, gNB->nr_srs_info[i], - gNB->nr_srs_info[i]->srs_generated_signal[0], + gNB->nr_srs_info[i]->srs_generated_signal, gNB->nr_srs_info[i]->srs_received_signal, gNB->nr_srs_info[i]->srs_estimated_channel_freq, gNB->nr_srs_info[i]->srs_estimated_channel_time, @@ -874,10 +874,10 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { gNB->nr_srs_info[i]->snr); T(T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0), - T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_freq[0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t))); + T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_freq[0][0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t))); T(T_GNB_PHY_UL_TIME_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0), - T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted[0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t))); + T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted[0][0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t))); uint16_t num_srs = gNB->UL_INFO.srs_ind.number_of_pdus; gNB->UL_INFO.srs_ind.pdu_list = &gNB->srs_pdu_list[0]; @@ -885,7 +885,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { gNB->UL_INFO.srs_ind.slot = slot_rx; gNB->srs_pdu_list[num_srs].handle = srs_pdu->handle; gNB->srs_pdu_list[num_srs].rnti = srs_pdu->rnti; - gNB->srs_pdu_list[num_srs].timing_advance = nr_est_timing_advance_srs(&gNB->frame_parms, gNB->nr_srs_info[i]->srs_estimated_channel_time); + gNB->srs_pdu_list[num_srs].timing_advance = nr_est_timing_advance_srs(&gNB->frame_parms, gNB->nr_srs_info[i]->srs_estimated_channel_time[0]); gNB->srs_pdu_list[num_srs].num_symbols = 1<num_symbols; gNB->srs_pdu_list[num_srs].wide_band_snr = (*gNB->nr_srs_info[i]->snr + 64)<<1; gNB->srs_pdu_list[num_srs].num_reported_symbols = 1<num_symbols; From 2ef5edd17c75e21e60dc28b399c038b646680347 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Tue, 17 May 2022 18:16:54 +0100 Subject: [PATCH 054/136] Remove sc_list_length and sc_list variables --- openair1/PHY/INIT/nr_init.c | 2 -- openair1/PHY/INIT/nr_init_ue.c | 2 -- openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c | 5 ----- openair1/PHY/NR_TRANSPORT/srs_rx.c | 5 ----- openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c | 6 ------ openair1/PHY/defs_nr_common.h | 2 -- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 7 files changed, 1 insertion(+), 23 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 6ce196c49d..3454b5e74f 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -616,7 +616,6 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, for (int id=0; idnr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); - gNB->nr_srs_info[id]->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t)); gNB->nr_srs_info[id]->k_0_p = (uint8_t**)malloc16_clear(Prx*sizeof(uint8_t*)); gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); gNB->nr_srs_info[id]->signal_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); @@ -809,7 +808,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) for(int i=0; inr_srs_info[id]->srs_generated_signal[i]); } - free_and_zero(gNB->nr_srs_info[id]->sc_list); free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal); free_and_zero(gNB->nr_srs_info[id]->signal_power); free_and_zero(gNB->nr_srs_info[id]->noise_power_per_rb); diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 2aa6400bfb..5353d79734 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -343,7 +343,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) srs_vars[gNB_id]->active = false; ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); - ue->nr_srs_info->sc_list = (uint16_t *) malloc16_clear(6*fp->N_RB_UL*sizeof(uint16_t)); ue->nr_srs_info->k_0_p = (uint8_t**)malloc16_clear(fp->nb_antennas_rx*sizeof(uint8_t*)); for (i=0; inb_antennas_rx; i++) { ue->nr_srs_info->k_0_p[i] = (uint8_t*)malloc16_clear(MAX_NUM_NR_SRS_SYMBOLS*sizeof(uint8_t)); @@ -456,7 +455,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) free_and_zero(ue->nr_srs_info->srs_estimated_channel_time[i]); free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted[i]); } - free_and_zero(ue->nr_srs_info->sc_list); free_and_zero(ue->nr_srs_info->noise_power); free_and_zero(ue->nr_srs_info->srs_received_signal); free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel); diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 91295d0015..21e5c19fd7 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -967,11 +967,6 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB, LOG_I(NR_PHY,"Calling %s function\n", __FUNCTION__); #endif - if(nr_srs_info->sc_list_length == 0) { - LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot); - return -1; - } - NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; int32_t ***srs_ls_estimated_channel = nr_srs_info->srs_ls_estimated_channel; diff --git a/openair1/PHY/NR_TRANSPORT/srs_rx.c b/openair1/PHY/NR_TRANSPORT/srs_rx.c index 5ed8fc0f9d..5e06fe6d65 100644 --- a/openair1/PHY/NR_TRANSPORT/srs_rx.c +++ b/openair1/PHY/NR_TRANSPORT/srs_rx.c @@ -106,11 +106,6 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, LOG_I(NR_PHY,"Calling %s function\n", __FUNCTION__); #endif - if(nr_srs_info->sc_list_length == 0) { - LOG_E(NR_PHY, "(%d.%d) nr_srs_info was not generated yet!\n", frame, slot); - return -1; - } - int32_t **rxdataF = gNB->common_vars.rxdataF; NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c index 242ce102fb..604b24fbf7 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c @@ -273,7 +273,6 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, // Variable initialization if(nr_srs_info) { - nr_srs_info->sc_list_length = 0; nr_srs_info->srs_generated_signal_bits = log2_approx(amp); } uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_config_pdu->bwp_start*NR_NB_SC_PER_RB; @@ -406,11 +405,6 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, txdataF[p_index][symbol_offset+l_line_offset+subcarrier] = (r_real_amp & 0xFFFF) + ((r_imag_amp<<16)&0xFFFF0000); - if(nr_srs_info && p_index==0 && l_line==0) { - nr_srs_info->sc_list[nr_srs_info->sc_list_length] = subcarrier; - nr_srs_info->sc_list_length++; - } - // Subcarrier increment subcarrier += K_TC; if (subcarrier >= frame_parms->ofdm_symbol_size) { diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 6dc889bc83..49c9fe329d 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -240,8 +240,6 @@ typedef struct { } NR_PRACH_RESOURCES_t; typedef struct { - uint16_t sc_list_length; - uint16_t *sc_list; uint8_t **k_0_p; uint8_t srs_generated_signal_bits; int32_t **srs_generated_signal; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 297693c31d..3acd1fd4c1 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -854,7 +854,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu; // At least currently, the configuration is constant, so it is enough to generate the sequence just once. - if(gNB->nr_srs_info[i]->sc_list_length == 0) { + if(gNB->nr_srs_info[i]->srs_generated_signal_bits == 0) { generate_srs_nr(srs_pdu, &gNB->frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, 0, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx); } From e6e6fdedf95a021510b1068878d958400db525f4 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Tue, 17 May 2022 18:53:05 +0100 Subject: [PATCH 055/136] Free allocated variables for SRS --- openair1/PHY/INIT/nr_init.c | 12 +++++++++--- openair1/PHY/INIT/nr_init_ue.c | 14 ++------------ 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 3454b5e74f..223c6b9db3 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -799,15 +799,21 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) for (int id = 0; id < NUMBER_OF_NR_SRS_MAX; id++) { for (int i = 0; i < Prx; i++) { + free_and_zero(gNB->nr_srs_info[id]->k_0_p[i]); + free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal[i]); free_and_zero(gNB->nr_srs_info[id]->srs_received_signal[i]); + for (int j = 0; j < Prx; j++) { + free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel[i][j]); + free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq[i][j]); + free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time[i][j]); + free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i][j]); + } free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel[i]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq[i]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time[i]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i]); } - for(int i=0; inr_srs_info[id]->srs_generated_signal[i]); - } + free_and_zero(gNB->nr_srs_info[id]->k_0_p); free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal); free_and_zero(gNB->nr_srs_info[id]->signal_power); free_and_zero(gNB->nr_srs_info[id]->noise_power_per_rb); diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 5353d79734..63b211eb71 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -444,23 +444,13 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) { for (int th_id = 0; th_id < RX_NB_TH_MAX; th_id++) { - free_and_zero(ue->pdcch_vars[th_id][gNB_id]); } for (int i = 0; i < fp->nb_antennas_rx; i++) { - free_and_zero(ue->nr_srs_info->srs_received_signal[i]); - free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel[i]); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_freq[i]); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_time[i]); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted[i]); + free_and_zero(ue->nr_srs_info->k_0_p[i]); } - free_and_zero(ue->nr_srs_info->noise_power); - free_and_zero(ue->nr_srs_info->srs_received_signal); - free_and_zero(ue->nr_srs_info->srs_ls_estimated_channel); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_freq); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_time); - free_and_zero(ue->nr_srs_info->srs_estimated_channel_time_shifted); + free_and_zero(ue->nr_srs_info->k_0_p); free_and_zero(ue->nr_srs_info); free_and_zero(ue->srs_vars[gNB_id]); From 58102d24d8fb7865102f1e70d0a46d8803246643 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Mon, 23 May 2022 20:33:12 +0100 Subject: [PATCH 056/136] Configuration of nrofSRS_Ports based on UE capability --- openair2/RRC/NR/MESSAGES/asn1_msg.c | 3 ++- openair2/RRC/NR/nr_rrc_config.c | 21 +++++++++++++++++++++ openair2/RRC/NR/nr_rrc_config.h | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index 75563e5093..310eec493c 100755 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -1682,7 +1682,7 @@ void fill_initial_SpCellConfig(int uid, // We are using do_srs = 0 here because the periodic SRS will only be enabled in update_cellGroupConfig() if do_srs == 1 initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config)); - config_srs(initialUplinkBWP->srs_Config, scc, uid, 0); + config_srs(initialUplinkBWP->srs_Config, scc, NULL, uid, 0); // configure Scheduling request // 40 slot period @@ -2168,6 +2168,7 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, } config_srs(SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config, scc, + uecap, uid, configuration->do_SRS); } diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index a6089fa2bd..5ef857efe7 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -292,6 +292,7 @@ long rrc_get_max_nr_csrs(uint8_t max_rbs, long b_SRS) { void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, NR_ServingCellConfigCommon_t *servingcellconfigcommon, + NR_UE_NR_Capability_t *uecap, int uid, int do_srs) { @@ -356,6 +357,26 @@ void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0)); srs_res0->srs_ResourceId = 0; srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_port1; + if (uecap && + uecap->featureSets && + uecap->featureSets->featureSetsUplink && + uecap->featureSets->featureSetsUplink->list.count > 0) { + NR_FeatureSetUplink_t *ul_feature_setup = uecap->featureSets->featureSetsUplink->list.array[0]; + switch (ul_feature_setup->supportedSRS_Resources->maxNumberSRS_Ports_PerResource) { + case NR_SRS_Resources__maxNumberSRS_Ports_PerResource_n1: + srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_port1; + break; + case NR_SRS_Resources__maxNumberSRS_Ports_PerResource_n2: + srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_ports2; + break; + case NR_SRS_Resources__maxNumberSRS_Ports_PerResource_n4: + srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_ports4; + break; + default: + LOG_E(NR_RRC, "Max Number of SRS Ports Per Resource %ld is invalid!\n", + ul_feature_setup->supportedSRS_Resources->maxNumberSRS_Ports_PerResource); + } + } srs_res0->ptrs_PortIndex = NULL; srs_res0->transmissionComb.present = NR_SRS_Resource__transmissionComb_PR_n2; srs_res0->transmissionComb.choice.n2 = calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2)); diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index fef30f18da..eb12fa71eb 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -125,6 +125,7 @@ void config_csiim(int do_csirs, int dl_antenna_ports, int curr_bwp, NR_CSI_MeasConfig_t *csi_MeasConfig); void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, NR_ServingCellConfigCommon_t *servingcellconfigcommon, + NR_UE_NR_Capability_t *uecap, int uid, int do_srs); void set_dl_mcs_table(int scs, NR_UE_NR_Capability_t *cap, From 40f2f543396adc0e94325b2b91c1f31a2816e188 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Tue, 24 May 2022 17:40:55 +0100 Subject: [PATCH 057/136] Fix memory allocation for SRS --- openair1/PHY/INIT/nr_init.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 2db0923b04..e503babda6 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -616,8 +616,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, for (int id=0; idnr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); - gNB->nr_srs_info[id]->k_0_p = (uint8_t**)malloc16_clear(Prx*sizeof(uint8_t*)); - gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); + gNB->nr_srs_info[id]->k_0_p = (uint8_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(uint8_t*)); + gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); gNB->nr_srs_info[id]->signal_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); gNB->nr_srs_info[id]->noise_power_per_rb = (uint32_t*)malloc16_clear(fp->N_RB_UL*sizeof(uint32_t)); gNB->nr_srs_info[id]->noise_power = (uint32_t*)malloc16_clear(sizeof(uint32_t)); @@ -628,15 +628,17 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, gNB->nr_srs_info[id]->srs_estimated_channel_freq = (int32_t ***)malloc16(Prx*sizeof(int32_t**)); gNB->nr_srs_info[id]->srs_estimated_channel_time = (int32_t ***)malloc16(Prx*sizeof(int32_t**)); gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted = (int32_t ***)malloc16(Prx*sizeof(int32_t**)); - for (i=0;inr_srs_info[id]->k_0_p[i] = (uint8_t*)malloc16_clear(MAX_NUM_NR_SRS_SYMBOLS*sizeof(uint8_t)); gNB->nr_srs_info[id]->srs_generated_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + } + for (i=0;inr_srs_info[id]->srs_received_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); - gNB->nr_srs_info[id]->srs_ls_estimated_channel[i] = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_estimated_channel_freq[i] = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_estimated_channel_time[i] = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); - gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i] = (int32_t**)malloc16_clear(Prx*sizeof(int32_t*)); - for (int j = 0; j < Prx; j++) { + gNB->nr_srs_info[id]->srs_ls_estimated_channel[i] = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); + gNB->nr_srs_info[id]->srs_estimated_channel_freq[i] = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); + gNB->nr_srs_info[id]->srs_estimated_channel_time[i] = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); + gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i] = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); + for (int j = 0; j < MAX_NUM_NR_SRS_AP; j++) { gNB->nr_srs_info[id]->srs_ls_estimated_channel[i][j] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); gNB->nr_srs_info[id]->srs_estimated_channel_freq[i][j] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); gNB->nr_srs_info[id]->srs_estimated_channel_time[i][j] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); @@ -799,20 +801,22 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) for (int id = 0; id < NUMBER_OF_NR_SRS_MAX; id++) { for (int i = 0; i < Prx; i++) { - free_and_zero(gNB->nr_srs_info[id]->k_0_p[i]); - free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal[i]); - free_and_zero(gNB->nr_srs_info[id]->srs_received_signal[i]); - for (int j = 0; j < Prx; j++) { + for (int j = 0; j < MAX_NUM_NR_SRS_AP; j++) { free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel[i][j]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq[i][j]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time[i][j]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i][j]); } + free_and_zero(gNB->nr_srs_info[id]->srs_received_signal[i]); free_and_zero(gNB->nr_srs_info[id]->srs_ls_estimated_channel[i]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_freq[i]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time[i]); free_and_zero(gNB->nr_srs_info[id]->srs_estimated_channel_time_shifted[i]); } + for (int i = 0; i < MAX_NUM_NR_SRS_AP; i++) { + free_and_zero(gNB->nr_srs_info[id]->k_0_p[i]); + free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal[i]); + } free_and_zero(gNB->nr_srs_info[id]->k_0_p); free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal); free_and_zero(gNB->nr_srs_info[id]->signal_power); From e1198b3d96d7e87e105078362a306a63df0df0f0 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Wed, 25 May 2022 17:30:17 +0100 Subject: [PATCH 058/136] Add debug logs and comment update for nrofSRS_Ports --- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 34 +++++++++++++++- openair2/RRC/NR/nr_rrc_config.c | 40 +++++++++---------- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 45327eda73..27d44755e4 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -62,6 +62,8 @@ #include "common/ran_context.h" +//#define DEBUG_DCI + extern RAN_CONTEXT_t RC; // Note the 2 scs values in the table names represent resp. scs_common and pdcch_scs @@ -1974,7 +1976,37 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc, // UL-SCH indicator pos += 1; *dci_pdu |= ((uint64_t)dci_pdu_rel15->ulsch_indicator & 0x1) << (dci_size - pos); - break; + +#ifdef DEBUG_DCI + LOG_I(NR_MAC,"============= NR_UL_DCI_FORMAT_0_1 =============\n"); + LOG_I(NR_MAC,"dci_size = %i\n", dci_size); + LOG_I(NR_MAC,"dci_pdu_rel15->format_indicator = %i\n", dci_pdu_rel15->format_indicator); + LOG_I(NR_MAC,"dci_pdu_rel15->carrier_indicator.val = %i\n", dci_pdu_rel15->carrier_indicator.val); + LOG_I(NR_MAC,"dci_pdu_rel15->ul_sul_indicator.val = %i\n", dci_pdu_rel15->ul_sul_indicator.val); + LOG_I(NR_MAC,"dci_pdu_rel15->bwp_indicator.val = %i\n", dci_pdu_rel15->bwp_indicator.val); + LOG_I(NR_MAC,"dci_pdu_rel15->frequency_domain_assignment.val = %i\n", dci_pdu_rel15->frequency_domain_assignment.val); + LOG_I(NR_MAC,"dci_pdu_rel15->time_domain_assignment.val = %i\n", dci_pdu_rel15->time_domain_assignment.val); + LOG_I(NR_MAC,"dci_pdu_rel15->frequency_hopping_flag.val = %i\n", dci_pdu_rel15->frequency_hopping_flag.val); + LOG_I(NR_MAC,"dci_pdu_rel15->mcs = %i\n", dci_pdu_rel15->mcs); + LOG_I(NR_MAC,"dci_pdu_rel15->ndi = %i\n", dci_pdu_rel15->ndi); + LOG_I(NR_MAC,"dci_pdu_rel15->rv= %i\n", dci_pdu_rel15->rv); + LOG_I(NR_MAC,"dci_pdu_rel15->harq_pid = %i\n", dci_pdu_rel15->harq_pid); + LOG_I(NR_MAC,"dci_pdu_rel15->dai[0].val = %i\n", dci_pdu_rel15->dai[0].val); + LOG_I(NR_MAC,"dci_pdu_rel15->dai[1].val = %i\n", dci_pdu_rel15->dai[1].val); + LOG_I(NR_MAC,"dci_pdu_rel15->tpc = %i\n", dci_pdu_rel15->tpc); + LOG_I(NR_MAC,"dci_pdu_rel15->srs_resource_indicator.val = %i\n", dci_pdu_rel15->srs_resource_indicator.val); + LOG_I(NR_MAC,"dci_pdu_rel15->precoding_information.val = %i\n", dci_pdu_rel15->precoding_information.val); + LOG_I(NR_MAC,"dci_pdu_rel15->antenna_ports.val = %i\n", dci_pdu_rel15->antenna_ports.val); + LOG_I(NR_MAC,"dci_pdu_rel15->srs_request.val = %i\n", dci_pdu_rel15->srs_request.val); + LOG_I(NR_MAC,"dci_pdu_rel15->csi_request.val = %i\n", dci_pdu_rel15->csi_request.val); + LOG_I(NR_MAC,"dci_pdu_rel15->cbgti.val = %i\n", dci_pdu_rel15->cbgti.val); + LOG_I(NR_MAC,"dci_pdu_rel15->ptrs_dmrs_association.val = %i\n", dci_pdu_rel15->ptrs_dmrs_association.val); + LOG_I(NR_MAC,"dci_pdu_rel15->beta_offset_indicator.val = %i\n", dci_pdu_rel15->beta_offset_indicator.val); + LOG_I(NR_MAC,"dci_pdu_rel15->dmrs_sequence_initialization.val = %i\n", dci_pdu_rel15->dmrs_sequence_initialization.val); + LOG_I(NR_MAC,"dci_pdu_rel15->ulsch_indicator = %i\n", dci_pdu_rel15->ulsch_indicator); +#endif + + break; } break; diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 5ef857efe7..a019ef28c4 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -357,26 +357,26 @@ void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, NR_SRS_Resource_t *srs_res0=calloc(1,sizeof(*srs_res0)); srs_res0->srs_ResourceId = 0; srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_port1; - if (uecap && - uecap->featureSets && - uecap->featureSets->featureSetsUplink && - uecap->featureSets->featureSetsUplink->list.count > 0) { - NR_FeatureSetUplink_t *ul_feature_setup = uecap->featureSets->featureSetsUplink->list.array[0]; - switch (ul_feature_setup->supportedSRS_Resources->maxNumberSRS_Ports_PerResource) { - case NR_SRS_Resources__maxNumberSRS_Ports_PerResource_n1: - srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_port1; - break; - case NR_SRS_Resources__maxNumberSRS_Ports_PerResource_n2: - srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_ports2; - break; - case NR_SRS_Resources__maxNumberSRS_Ports_PerResource_n4: - srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_ports4; - break; - default: - LOG_E(NR_RRC, "Max Number of SRS Ports Per Resource %ld is invalid!\n", - ul_feature_setup->supportedSRS_Resources->maxNumberSRS_Ports_PerResource); - } - } + // if (uecap && + // uecap->featureSets && + // uecap->featureSets->featureSetsUplink && + // uecap->featureSets->featureSetsUplink->list.count > 0) { + // NR_FeatureSetUplink_t *ul_feature_setup = uecap->featureSets->featureSetsUplink->list.array[0]; + // switch (ul_feature_setup->supportedSRS_Resources->maxNumberSRS_Ports_PerResource) { + // case NR_SRS_Resources__maxNumberSRS_Ports_PerResource_n1: + // srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_port1; + // break; + // case NR_SRS_Resources__maxNumberSRS_Ports_PerResource_n2: + // srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_ports2; + // break; + // case NR_SRS_Resources__maxNumberSRS_Ports_PerResource_n4: + // srs_res0->nrofSRS_Ports = NR_SRS_Resource__nrofSRS_Ports_ports4; + // break; + // default: + // LOG_E(NR_RRC, "Max Number of SRS Ports Per Resource %ld is invalid!\n", + // ul_feature_setup->supportedSRS_Resources->maxNumberSRS_Ports_PerResource); + // } + // } srs_res0->ptrs_PortIndex = NULL; srs_res0->transmissionComb.present = NR_SRS_Resource__transmissionComb_PR_n2; srs_res0->transmissionComb.choice.n2 = calloc(1,sizeof(*srs_res0->transmissionComb.choice.n2)); From 81c402d7ff196a8861a35d751f3ac4329b2a5f67 Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 17 Jun 2022 15:29:53 +0200 Subject: [PATCH 059/136] bug fix after merge --- openair1/SIMULATION/NR_PHY/ulsim.c | 55 +++++------------------------- 1 file changed, 9 insertions(+), 46 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index f16103e2db..f95094a90e 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -351,11 +351,7 @@ int main(int argc, char **argv) /* initialize the sin-cos table */ InitSinLUT(); -<<<<<<< HEAD - while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:o:p:q:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) { -======= - while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:kl:m:n:p:q:r:s:t:u:w:y:z:F:G:H:I:M:N:PR:S:T:U:L:ZW:")) != -1) { ->>>>>>> develop + while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:o:p:q:r:s:t:u:v:w:y:z:F:G:H:I:M:N:PR:S:T:U:L:ZW:")) != -1) { printf("handling optarg %c\n",c); switch (c) { @@ -483,11 +479,7 @@ int main(int argc, char **argv) break; case 'q': -<<<<<<< HEAD - max_rounds = atoi(optarg); -======= mcs_table = atoi(optarg); ->>>>>>> develop break; case 'r': @@ -503,6 +495,10 @@ int main(int argc, char **argv) mu = atoi(optarg); break; + case 'v': + max_rounds = atoi(optarg); + break; + case 'w': start_rb = atoi(optarg); break; @@ -809,14 +805,10 @@ int main(int argc, char **argv) cfg->carrier_config.num_rx_ant.value = n_rx; // nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,0,0x01); -<<<<<<< HEAD - gNB->ldpc_offload_flag = ldpc_offload_flag; - -======= gNB->chest_freq = chest_type[0]; gNB->chest_time = chest_type[1]; ->>>>>>> develop + phy_init_nr_gNB(gNB,0,1); N_RB_DL = gNB->frame_parms.N_RB_DL; @@ -871,13 +863,9 @@ int main(int argc, char **argv) unsigned char harq_pid = 0; -<<<<<<< HEAD - - NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0]; -======= NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id]; ->>>>>>> develop + //nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &ulsch_gNB->harq_processes[harq_pid]->ulsch_pdu; nfapi_nr_ul_tti_request_t *UL_tti_req = malloc(sizeof(*UL_tti_req)); NR_Sched_Rsp_t *Sched_INFO = malloc(sizeof(*Sched_INFO)); @@ -1550,16 +1538,6 @@ int main(int argc, char **argv) errors_decoding++; } } -<<<<<<< HEAD - /*if (n_trials == 1) { - for (int r=0;rharq_processes[harq_pid]->C;r++) - for (int i=0;iharq_processes[harq_pid]->K>>3;i++) { - if ((ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]) != 0) - printf("r %d: in[%d] %x, out[%d] %x (%x)\n",r, - i,ulsch_ue[0]->harq_processes[harq_pid]->c[r][i], - i,ulsch_gNB->harq_processes[harq_pid]->c[r][i], - ulsch_ue[0]->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]); -======= if (n_trials == 1) { for (int r=0;rharq_processes[harq_pid]->C;r++) for (int i=0;iharq_processes[harq_pid]->K>>3;i++) { @@ -1568,9 +1546,8 @@ int main(int argc, char **argv) i,ulsch_ue->harq_processes[harq_pid]->c[r][i], i,ulsch_gNB->harq_processes[harq_pid]->c[r][i], ulsch_ue->harq_processes[harq_pid]->c[r][i]^ulsch_gNB->harq_processes[harq_pid]->c[r][i]);*/ ->>>>>>> develop } - }*/ + } if (errors_decoding > 0 && error_flag == 0) { n_false_positive++; if (n_trials==1) @@ -1676,20 +1653,6 @@ int main(int argc, char **argv) length_dmrs, num_dmrs_cdm_grps_no_data); -<<<<<<< HEAD - LOG_M("ulsimStats.m","SNR",snrStats,snrRun,1,7); - LOG_MM("ulsimStats.m","BLER_round0",blerStats[0],snrRun,1,7); - LOG_MM("ulsimStats.m","BLER_round1",blerStats[1],snrRun,1,7); - LOG_MM("ulsimStats.m","BLER_round2",blerStats[2],snrRun,1,7); - LOG_MM("ulsimStats.m","BLER_round3",blerStats[3],snrRun,1,7); - LOG_MM("ulsimStats.m","BER_round0",berStats[0],snrRun,1,7); - LOG_MM("ulsimStats.m","BER_round1",berStats[1],snrRun,1,7); - LOG_MM("ulsimStats.m","BER_round2",berStats[2],snrRun,1,7); - LOG_MM("ulsimStats.m","BER_round3",berStats[3],snrRun,1,7); - LOG_MM("ulsimStats.m","EffRate",effRate,snrRun,1,7); - LOG_MM("ulsimStats.m","EffTP",effTP,snrRun,1,7); - LOG_MM("ulsimStats.m","LDPC_dec_time",ldpcDecStats,snrRun,1,7); -======= char opStatsFile[50]; sprintf(opStatsFile, "ulsimStats_z%d.m", n_rx); LOG_M(opStatsFile,"SNR",snrStats,snrRun,1,7); @@ -1703,7 +1666,7 @@ int main(int argc, char **argv) LOG_MM(opStatsFile,"BER_round3",berStats[3],snrRun,1,7); LOG_MM(opStatsFile,"EffRate",effRate,snrRun,1,7); LOG_MM(opStatsFile,"EffTP",effTP,snrRun,1,7); ->>>>>>> develop + free(test_input_bit); free(estimated_output_bit); if (gNB->ldpc_offload_flag) From ad5a3e8d9475d92d22c19ecea86f86d0d85ec5a8 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Sun, 19 Jun 2022 03:02:19 +0100 Subject: [PATCH 060/136] Fix warning after merge --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index e5b383ee70..4597038e43 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -873,7 +873,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { slot_rx, srs_pdu, gNB->nr_srs_info[i], - gNB->nr_srs_info[i]->srs_generated_signal, + (const int32_t **)gNB->nr_srs_info[i]->srs_generated_signal, (const int32_t **)gNB->nr_srs_info[i]->srs_received_signal, gNB->nr_srs_info[i]->srs_estimated_channel_freq, gNB->nr_srs_info[i]->srs_estimated_channel_time, From fb9be23057f04e801ce50f069b550e3f7f92446a Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 22 Jun 2022 10:03:55 +0200 Subject: [PATCH 061/136] adding bbdev license --- .../PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 08824ec0d0..436d4f4a1b 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -19,12 +19,17 @@ * contact@openairinterface.org */ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2017 Intel Corporation + */ + /*!\file nrLDPC_decoder_offload.c * \brief Defines the LDPC decoder * \author openairinterface * \date 12-06-2021 * \version 1.0 - * \note + * \note: based on testbbdev functions. Harq buffer offset added. + * \mbuf and mempool allocated at the init step, LDPC parameters updated from OAI. * \warning */ From e8fc4da2b69e5d127e6efc9550df788255a91bef Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 22 Jun 2022 17:26:30 +0200 Subject: [PATCH 062/136] update offload decoder license and notes --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 436d4f4a1b..a523e960e2 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -1,24 +1,3 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2017 Intel Corporation */ @@ -28,7 +7,7 @@ * \author openairinterface * \date 12-06-2021 * \version 1.0 - * \note: based on testbbdev functions. Harq buffer offset added. + * \note: based on testbbdev test_bbdev_perf.c functions. Harq buffer offset added. * \mbuf and mempool allocated at the init step, LDPC parameters updated from OAI. * \warning */ From 33fac86bb487d417b3f12f6631170f3b0259c98e Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 22 Jun 2022 17:46:04 +0200 Subject: [PATCH 063/136] adding license exception --- NOTICE.md | 3 +++ ci-scripts/checkCodingFormattingRules.sh | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/NOTICE.md b/NOTICE.md index 39dd33795d..94a80195b6 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -25,3 +25,6 @@ Niels Provos : BSD 2-Clause Licence. Amit Chawre : BSD 2-Clause Licence. +## Credits for source code openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c and nrLDPC_offload.h: ## + + Intel Corporation SPDX-License-Identifier: BSD-3-Clause Licence \ No newline at end of file diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh index c29941cade..02cf0b8c28 100755 --- a/ci-scripts/checkCodingFormattingRules.sh +++ b/ci-scripts/checkCodingFormattingRules.sh @@ -77,7 +77,7 @@ then IS_NFAPI=`echo $FILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true` IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FILE || true` IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause" $FILE || true` - IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h|openair3/GTPV1-U/nw-gtpv1u|openair2/UTIL/OPT/ws_|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc|openair1/PHY/CODING/types.h" || true` + IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h|openair3/GTPV1-U/nw-gtpv1u|openair2/UTIL/OPT/ws_|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc|openair1/PHY/CODING/types.h|openair1/PHY/CODING/crc|openair1/PHY/CODING/nrLDPC_decoder_offload.c|openair1/PHY/CODING/crc|openair1/PHY/CODING/nrLDPC_offload.h" || true` if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] then if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ] From 44ad2fe4ffe4749a984a4b65c8ee82657b2f249c Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 28 Jun 2022 13:52:38 +0200 Subject: [PATCH 064/136] Correct and update license exception list --- ci-scripts/checkCodingFormattingRules.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh index 02cf0b8c28..215530dd2f 100755 --- a/ci-scripts/checkCodingFormattingRules.sh +++ b/ci-scripts/checkCodingFormattingRules.sh @@ -77,7 +77,7 @@ then IS_NFAPI=`echo $FILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true` IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FILE || true` IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause" $FILE || true` - IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h|openair3/GTPV1-U/nw-gtpv1u|openair2/UTIL/OPT/ws_|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc|openair1/PHY/CODING/types.h|openair1/PHY/CODING/crc|openair1/PHY/CODING/nrLDPC_decoder_offload.c|openair1/PHY/CODING/crc|openair1/PHY/CODING/nrLDPC_offload.h" || true` + IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/types.h|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h" || true` if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] then if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ] @@ -198,7 +198,7 @@ do IS_NFAPI=`echo $FULLFILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext" || true` IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FULLFILE || true` IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence|License-Identifier: BSD-2-Clause" $FULLFILE || true` - IS_EXCEPTION=`echo $FULLFILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h|openair3/GTPV1-U/nw-gtpv1u|openair2/UTIL/OPT/ws_|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/crc|openair1/PHY/CODING/types.h" || true` + IS_EXCEPTION=`echo $FULLFILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|openair2/UTIL/OPT/packet-rohc.h|openair3/NAS/COMMON/milenage.h|openair1/PHY/CODING/types.h|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c|openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_offload.h" || true` if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] then if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ] From 2849a81c787223b4c1e128870bb1b980448b6de3 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 28 Jun 2022 13:53:57 +0200 Subject: [PATCH 065/136] Update NOTICE.md --- NOTICE.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/NOTICE.md b/NOTICE.md index 94a80195b6..b92941540d 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -21,10 +21,6 @@ The Regents of the University of California: BSD 3-Clause Licence. Niels Provos : BSD 2-Clause Licence. -## Credits for source code openair3/GTPV1-U/nw-gtpv1u: ## - -Amit Chawre : BSD 2-Clause Licence. - ## Credits for source code openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c and nrLDPC_offload.h: ## - Intel Corporation SPDX-License-Identifier: BSD-3-Clause Licence \ No newline at end of file +Intel Corporation SPDX-License-Identifier: BSD-3-Clause Licence From 9a3326b63c0f13b28e329b9d140e5d6fba22ab61 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Tue, 5 Jul 2022 15:33:35 +0100 Subject: [PATCH 066/136] Fixes after merge --- openair1/PHY/INIT/nr_init.c | 8 ++++++-- openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c | 10 +++++----- openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h | 10 +++++----- openair1/PHY/defs_nr_common.h | 2 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 10 +++++----- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 31cc0d7cf8..35fc2b2e2f 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -614,8 +614,10 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, for (int id=0; idnr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); gNB->nr_srs_info[id]->k_0_p = (uint8_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(uint8_t*)); + gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); for(i=0; inr_srs_info[id]->k_0_p[i] = (uint8_t*)malloc16_clear(MAX_NUM_NR_SRS_SYMBOLS*sizeof(uint8_t)); + gNB->nr_srs_info[id]->srs_generated_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); } } @@ -774,10 +776,12 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) free_and_zero(gNB->nr_csi_rs_info); for (int id = 0; id < NUMBER_OF_NR_SRS_MAX; id++) { - for(int ap=0; apnr_srs_info[id]->k_0_p[ap]); + for(int i=0; inr_srs_info[id]->k_0_p[i]); + free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal[i]); } free_and_zero(gNB->nr_srs_info[id]->k_0_p); + free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal); free_and_zero(gNB->nr_srs_info[id]); } diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index bc486623dd..b804d810ee 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -965,12 +965,12 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, const int slot, const nfapi_nr_srs_pdu_t *srs_pdu, const nr_srs_info_t *nr_srs_info, - const int32_t *srs_generated_signal, + const int32_t **srs_generated_signal, int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_ls_estimated_channel[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_estimated_channel_freq[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_estimated_channel_time[][gNB->frame_parms.ofdm_symbol_size], - int32_t srs_estimated_channel_time_shifted[][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_ls_estimated_channel[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], + int32_t srs_estimated_channel_freq[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], + int32_t srs_estimated_channel_time[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_estimated_channel_time_shifted[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size], uint32_t *signal_power, uint32_t *noise_power_per_rb, uint32_t *noise_power, diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index b0ed3662ea..33ed01194b 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -71,12 +71,12 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, const int slot, const nfapi_nr_srs_pdu_t *srs_pdu, const nr_srs_info_t *nr_srs_info, - const int32_t *srs_generated_signal, + const int32_t **srs_generated_signal, int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_ls_estimated_channel[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_estimated_channel_freq[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_estimated_channel_time[][gNB->frame_parms.ofdm_symbol_size], - int32_t srs_estimated_channel_time_shifted[][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_ls_estimated_channel[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], + int32_t srs_estimated_channel_freq[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], + int32_t srs_estimated_channel_time[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_estimated_channel_time_shifted[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size], uint32_t *signal_power, uint32_t *noise_power_per_rb, uint32_t *noise_power, diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 2dce47c90c..edfcc67997 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -243,7 +243,7 @@ typedef struct { typedef struct { uint8_t **k_0_p; uint8_t srs_generated_signal_bits; - int32_t srs_generated_signal[OFDM_SYMBOL_SIZE_SAMPLES_MAX * MAX_NUM_NR_SRS_SYMBOLS]; + int32_t **srs_generated_signal; } nr_srs_info_t; typedef struct { diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 077ddad461..8681dfcdc7 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -854,10 +854,10 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu; uint8_t N_symb_SRS = 1<num_symbols; int32_t srs_received_signal[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS]; - int32_t srs_ls_estimated_channel[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS]; - int32_t srs_estimated_channel_freq[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS]; - int32_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size]; - int32_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size]; + int32_t srs_ls_estimated_channel[frame_parms->nb_antennas_rx][MAX_NUM_NR_SRS_AP][frame_parms->ofdm_symbol_size*N_symb_SRS]; + int32_t srs_estimated_channel_freq[frame_parms->nb_antennas_rx][MAX_NUM_NR_SRS_AP][frame_parms->ofdm_symbol_size*N_symb_SRS]; + int32_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][MAX_NUM_NR_SRS_AP][frame_parms->ofdm_symbol_size]; + int32_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][MAX_NUM_NR_SRS_AP][frame_parms->ofdm_symbol_size]; uint32_t noise_power_per_rb[srs_pdu->bwp_size]; int8_t snr_per_rb[srs_pdu->bwp_size]; uint32_t signal_power; @@ -877,7 +877,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { slot_rx, srs_pdu, gNB->nr_srs_info[i], - gNB->nr_srs_info[i]->srs_generated_signal, + (const int32_t **) gNB->nr_srs_info[i]->srs_generated_signal, srs_received_signal, srs_ls_estimated_channel, srs_estimated_channel_freq, From e8327ffe74fa40cd36584beabc122d20918bec13 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Tue, 5 Jul 2022 16:47:41 +0100 Subject: [PATCH 067/136] Change k_0_p to stack allocation --- openair1/PHY/INIT/nr_init.c | 4 ---- openair1/PHY/INIT/nr_init_ue.c | 8 -------- openair1/PHY/defs_nr_common.h | 2 +- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 35fc2b2e2f..43e170bac7 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -613,10 +613,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, for (int id=0; idnr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); - gNB->nr_srs_info[id]->k_0_p = (uint8_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(uint8_t*)); gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); for(i=0; inr_srs_info[id]->k_0_p[i] = (uint8_t*)malloc16_clear(MAX_NUM_NR_SRS_SYMBOLS*sizeof(uint8_t)); gNB->nr_srs_info[id]->srs_generated_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); } } @@ -777,10 +775,8 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) for (int id = 0; id < NUMBER_OF_NR_SRS_MAX; id++) { for(int i=0; inr_srs_info[id]->k_0_p[i]); free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal[i]); } - free_and_zero(gNB->nr_srs_info[id]->k_0_p); free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal); free_and_zero(gNB->nr_srs_info[id]); } diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 5ebd8025a7..702a0a23de 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -377,10 +377,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) } ue->nr_srs_info = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); - ue->nr_srs_info->k_0_p = (uint8_t**)malloc16_clear(fp->nb_antennas_rx*sizeof(uint8_t*)); - for (i=0; inb_antennas_rx; i++) { - ue->nr_srs_info->k_0_p[i] = (uint8_t*)malloc16_clear(MAX_NUM_NR_SRS_SYMBOLS*sizeof(uint8_t)); - } // RACH prach_vars[gNB_id]->prachF = (int16_t *)malloc16_clear( sizeof(int)*(7*2*sizeof(int)*(fp->ofdm_symbol_size*12)) ); @@ -507,10 +503,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) free_and_zero(ue->nr_csi_rs_info->csi_rs_estimated_channel_freq); free_and_zero(ue->nr_csi_rs_info); - for (int i = 0; i < fp->nb_antennas_rx; i++) { - free_and_zero(ue->nr_srs_info->k_0_p[i]); - } - free_and_zero(ue->nr_srs_info->k_0_p); free_and_zero(ue->nr_srs_info); free_and_zero(ue->csiim_vars[gNB_id]); diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index edfcc67997..cf66ca7be8 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -241,7 +241,7 @@ typedef struct { } NR_PRACH_RESOURCES_t; typedef struct { - uint8_t **k_0_p; + uint8_t k_0_p[MAX_NUM_NR_SRS_AP][MAX_NUM_NR_SRS_SYMBOLS]; uint8_t srs_generated_signal_bits; int32_t **srs_generated_signal; } nr_srs_info_t; From 49d60500c053dbf02e52572a9f03b94b5aff018a Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Mon, 8 Aug 2022 13:49:33 +0100 Subject: [PATCH 068/136] Change array size from MAX_NUM_NR_SRS_AP to 1<num_ant_ports --- openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c | 8 ++++---- openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h | 8 ++++---- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index fbeca8b183..bc29298f0a 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -967,10 +967,10 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, const nr_srs_info_t *nr_srs_info, const int32_t **srs_generated_signal, int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_ls_estimated_channel[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_estimated_channel_freq[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_estimated_channel_time[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size], - int32_t srs_estimated_channel_time_shifted[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_ls_estimated_channel[][1<num_ant_ports][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], + int32_t srs_estimated_channel_freq[][1<num_ant_ports][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], + int32_t srs_estimated_channel_time[][1<num_ant_ports][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_estimated_channel_time_shifted[][1<num_ant_ports][gNB->frame_parms.ofdm_symbol_size], uint32_t *signal_power, uint32_t *noise_power_per_rb, uint32_t *noise_power, diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index 33ed01194b..f00db212f7 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -73,10 +73,10 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, const nr_srs_info_t *nr_srs_info, const int32_t **srs_generated_signal, int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_ls_estimated_channel[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_estimated_channel_freq[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], - int32_t srs_estimated_channel_time[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size], - int32_t srs_estimated_channel_time_shifted[][MAX_NUM_NR_SRS_AP][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_ls_estimated_channel[][1<num_ant_ports][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], + int32_t srs_estimated_channel_freq[][1<num_ant_ports][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)], + int32_t srs_estimated_channel_time[][1<num_ant_ports][gNB->frame_parms.ofdm_symbol_size], + int32_t srs_estimated_channel_time_shifted[][1<num_ant_ports][gNB->frame_parms.ofdm_symbol_size], uint32_t *signal_power, uint32_t *noise_power_per_rb, uint32_t *noise_power, diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 3a7491a152..99acccb612 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -832,10 +832,10 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu; uint8_t N_symb_SRS = 1<num_symbols; int32_t srs_received_signal[frame_parms->nb_antennas_rx][frame_parms->ofdm_symbol_size*N_symb_SRS]; - int32_t srs_ls_estimated_channel[frame_parms->nb_antennas_rx][MAX_NUM_NR_SRS_AP][frame_parms->ofdm_symbol_size*N_symb_SRS]; - int32_t srs_estimated_channel_freq[frame_parms->nb_antennas_rx][MAX_NUM_NR_SRS_AP][frame_parms->ofdm_symbol_size*N_symb_SRS] __attribute__ ((aligned(32))); - int32_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][MAX_NUM_NR_SRS_AP][frame_parms->ofdm_symbol_size] __attribute__ ((aligned(32))); - int32_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][MAX_NUM_NR_SRS_AP][frame_parms->ofdm_symbol_size]; + int32_t srs_ls_estimated_channel[frame_parms->nb_antennas_rx][1<num_ant_ports][frame_parms->ofdm_symbol_size*N_symb_SRS]; + int32_t srs_estimated_channel_freq[frame_parms->nb_antennas_rx][1<num_ant_ports][frame_parms->ofdm_symbol_size*N_symb_SRS] __attribute__ ((aligned(32))); + int32_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][1<num_ant_ports][frame_parms->ofdm_symbol_size] __attribute__ ((aligned(32))); + int32_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][1<num_ant_ports][frame_parms->ofdm_symbol_size]; uint32_t noise_power_per_rb[srs_pdu->bwp_size]; int8_t snr_per_rb[srs_pdu->bwp_size]; uint32_t signal_power; From 1273ad406cd63167f040fc7aa212b338042ad0be Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 18 Aug 2022 17:44:19 +0200 Subject: [PATCH 069/136] fix compiling issue and removing dead code --- cmake_targets/CMakeLists.txt | 3 --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 7 ------- 2 files changed, 10 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 429d14ff54..a603604911 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -186,9 +186,6 @@ else (CUDA_FOUND) message ("No CUDA tool installed") endif () -#INCLUDE(FindPackageHandleStandardArgs) -#FIND_PACKAGE_HANDLE_STANDARD_ARGS(dpdk DEFAULT_MSG) - #################################################### # compilation flags ############################################# diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 424630a192..9b6591c63e 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -724,13 +724,6 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB, LOG_D(PHY,"[gNB %d] ULSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d) r %d\n", phy_vars_gNB->Mod_id, harq_process->frame, harq_process->slot, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,r); - harq_process->round++; - if (harq_process->round >= ulsch->Mlimit) { - harq_process->status = SCH_IDLE; - harq_process->round = 0; - harq_process->handled = 0; - ulsch->harq_mask &= ~(1 << harq_pid); - } harq_process->handled = 1; no_iteration_ldpc = ulsch->max_ldpc_iterations + 1; LOG_D(PHY, "ULSCH %d in error\n",ULSCH_id); From a0d800917008044cee022a3742882920edcdcde4 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Fri, 19 Aug 2022 14:31:13 +0100 Subject: [PATCH 070/136] Address review comments --- openair1/PHY/INIT/nr_init.c | 4 +-- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 8 ++--- .../PHY/NR_TRANSPORT/nr_transport_proto.h | 14 ++++---- openair1/PHY/NR_TRANSPORT/srs_rx.c | 32 +++++++++---------- .../PHY/NR_UE_TRANSPORT/srs_modulation_nr.c | 16 +++++----- .../PHY/NR_UE_TRANSPORT/srs_modulation_nr.h | 4 +-- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index d516ef3f10..4a053f2142 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -614,8 +614,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, for (int id=0; idnr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); gNB->nr_srs_info[id]->srs_generated_signal = (int32_t**)malloc16_clear(MAX_NUM_NR_SRS_AP*sizeof(int32_t*)); - for(i=0; inr_srs_info[id]->srs_generated_signal[i] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); + for(int ap=0; apnr_srs_info[id]->srs_generated_signal[ap] = (int32_t*)malloc16_clear(fp->ofdm_symbol_size*MAX_NUM_NR_SRS_SYMBOLS*sizeof(int32_t)); } } diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index bc29298f0a..7016f05866 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -984,10 +984,10 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, const NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*NR_NB_SC_PER_RB; - uint8_t N_ap = 1<num_ant_ports; - uint8_t K_TC = 2<comb_size; - uint16_t m_SRS_b = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0]; - uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB/K_TC; + const uint8_t N_ap = 1<num_ant_ports; + const uint8_t K_TC = 2<comb_size; + const uint16_t m_SRS_b = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0]; + const uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB/K_TC; uint8_t fd_cdm = N_ap; if (N_ap == 4 && ((K_TC == 2 && srs_pdu->cyclic_shift >= 4) || (K_TC == 4 && srs_pdu->cyclic_shift >= 6))) { fd_cdm = 2; diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index 5437a9bb81..e5b043c395 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -315,19 +315,19 @@ int nr_find_pucch(uint16_t rnti, NR_gNB_SRS_t *new_gNB_srs(void); void free_gNB_srs(NR_gNB_SRS_t *srs); -int nr_find_srs(uint16_t rnti, - int frame, - int slot, +int nr_find_srs(rnti_t rnti, + frame_t frame, + slot_t slot, PHY_VARS_gNB *gNB); void nr_fill_srs(PHY_VARS_gNB *gNB, - int frame, - int slot, + frame_t frame, + slot_t slot, nfapi_nr_srs_pdu_t *srs_pdu); int nr_get_srs_signal(PHY_VARS_gNB *gNB, - int frame, - int slot, + frame_t frame, + slot_t slot, nfapi_nr_srs_pdu_t *srs_pdu, nr_srs_info_t *nr_srs_info, int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)]); diff --git a/openair1/PHY/NR_TRANSPORT/srs_rx.c b/openair1/PHY/NR_TRANSPORT/srs_rx.c index 1362cebffd..54264b70e0 100644 --- a/openair1/PHY/NR_TRANSPORT/srs_rx.c +++ b/openair1/PHY/NR_TRANSPORT/srs_rx.c @@ -56,9 +56,9 @@ void free_gNB_srs(NR_gNB_SRS_t *srs) free_and_zero(srs); } -int nr_find_srs(uint16_t rnti, - int frame, - int slot, +int nr_find_srs(rnti_t rnti, + frame_t frame, + slot_t slot, PHY_VARS_gNB *gNB) { AssertFatal(gNB!=NULL,"gNB is null\n"); @@ -80,8 +80,8 @@ int nr_find_srs(uint16_t rnti, } void nr_fill_srs(PHY_VARS_gNB *gNB, - int frame, - int slot, + frame_t frame, + slot_t slot, nfapi_nr_srs_pdu_t *srs_pdu) { int id = nr_find_srs(srs_pdu->rnti,frame,slot,gNB); @@ -96,8 +96,8 @@ void nr_fill_srs(PHY_VARS_gNB *gNB, } int nr_get_srs_signal(PHY_VARS_gNB *gNB, - int frame, - int slot, + frame_t frame, + slot_t slot, nfapi_nr_srs_pdu_t *srs_pdu, nr_srs_info_t *nr_srs_info, int32_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size*(1<num_symbols)]) { @@ -107,17 +107,17 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, #endif int32_t **rxdataF = gNB->common_vars.rxdataF; - NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; + const NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; - uint16_t n_symbols = (slot&3)*frame_parms->symbols_per_slot; // number of symbols until this slot - uint8_t l0 = frame_parms->symbols_per_slot - 1 - srs_pdu->time_start_position; // starting symbol in this slot - uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size; - uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*NR_NB_SC_PER_RB; + const uint16_t n_symbols = (slot&3)*frame_parms->symbols_per_slot; // number of symbols until this slot + const uint8_t l0 = frame_parms->symbols_per_slot - 1 - srs_pdu->time_start_position; // starting symbol in this slot + const uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size; + const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*NR_NB_SC_PER_RB; - uint8_t N_ap = 1<num_ant_ports; - uint8_t N_symb_SRS = 1<num_symbols; - uint8_t K_TC = 2<comb_size; - uint16_t M_sc_b_SRS = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0] * NR_NB_SC_PER_RB/K_TC; + const uint8_t N_ap = 1<num_ant_ports; + const uint8_t N_symb_SRS = 1<num_symbols; + const uint8_t K_TC = 2<comb_size; + const uint16_t M_sc_b_SRS = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0] * NR_NB_SC_PER_RB/K_TC; int32_t *rx_signal; bool no_srs_signal = true; diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c index 604b24fbf7..55669ba322 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c @@ -91,8 +91,8 @@ uint16_t sequence_number_hopping(int slot_number, return v; } -uint16_t compute_F_b(int frame_number, - int slot_number, +uint16_t compute_F_b(frame_t frame_number, + slot_t slot_number, uint16_t slots_per_frame, uint8_t N_symb_SRS, uint8_t B_SRS, @@ -101,7 +101,7 @@ uint16_t compute_F_b(int frame_number, uint8_t R, uint16_t T_offset, uint16_t T_SRS, - uint8_t resource_type, + resourceType_t resource_type, uint8_t l_line, uint8_t b) { @@ -133,8 +133,8 @@ uint16_t compute_F_b(int frame_number, return F_b; } -uint16_t compute_n_b(int frame_number, - int slot_number, +uint16_t compute_n_b(frame_t frame_number, + slot_t slot_number, uint16_t slots_per_frame, uint8_t N_symb_SRS, uint8_t B_SRS, @@ -144,7 +144,7 @@ uint16_t compute_n_b(int frame_number, uint8_t R, uint16_t T_offset, uint16_t T_SRS, - uint8_t resource_type, + resourceType_t resource_type, uint8_t l_line, uint8_t b) { @@ -189,8 +189,8 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, uint16_t symbol_offset, nr_srs_info_t *nr_srs_info, int16_t amp, - int frame_number, - int slot_number) { + frame_t frame_number, + slot_t slot_number) { #ifdef SRS_DEBUG LOG_I(NR_PHY,"Calling %s function\n", __FUNCTION__); diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h index e52338a01a..2c3d6d266c 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h @@ -156,8 +156,8 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, uint16_t symbol_offset, nr_srs_info_t *nr_srs_info, int16_t amp, - int frame_number, - int slot_number); + frame_t frame_number, + slot_t slot_number); /** \brief This function checks for periodic srs if srs should be transmitted in this slot * @param p_SRS_Resource pointer to active resource From 5ba55a511ee28f0b8c199e07da6b3d7d82c009bc Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Mon, 22 Aug 2022 10:07:23 +0100 Subject: [PATCH 071/136] Fixes when there is no spCellConfig configured --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index a35c80b95a..e3590c1332 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -1059,9 +1059,8 @@ void nr_schedule_ue_spec(module_id_t module_id, csi_report->codebook_mode); } // TBS_LBRM according to section 5.4.2.1 of 38.212 - long *maxMIMO_Layers = current_BWP->pdsch_servingcellconfig->ext1->maxMIMO_Layers; - AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n"); - int nl_tbslbrm = *maxMIMO_Layers < 4 ? *maxMIMO_Layers : 4; + long maxMIMO_Layers = current_BWP->pdsch_servingcellconfig ? *current_BWP->pdsch_servingcellconfig->ext1->maxMIMO_Layers : 1; + const int nl_tbslbrm = min(maxMIMO_Layers, 4); // Maximum number of PRBs across all configured DL BWPs int scc_bwpsize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, cg); @@ -1119,7 +1118,7 @@ void nr_schedule_ue_spec(module_id_t module_id, // as per table 7.3.1.1.2-1 in 38.212 dci_payload.bwp_indicator.val = current_BWP->n_dl_bwp < 4 ? bwp_id : bwp_id - 1; - AssertFatal(pdsch_Config->resourceAllocation == NR_PDSCH_Config__resourceAllocation_resourceAllocationType1, + AssertFatal(pdsch_Config == NULL || pdsch_Config->resourceAllocation == NR_PDSCH_Config__resourceAllocation_resourceAllocationType1, "Only frequency resource allocation type 1 is currently supported\n"); dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(pdsch_pdu->rbSize, From f9f175a6f15ccd9ea11b99f36adaab9fc68c0c97 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 17 Aug 2022 18:02:02 +0100 Subject: [PATCH 072/136] Fix initial_cyclic_shift for pucch-ConfigCommon --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 17f97ba59c..5043f5446d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -1247,8 +1247,8 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu, pucch_pdu->format_type = default_pucch_fmt[rsetindex]; pucch_pdu->initial_cyclic_shift = r_pucch%default_pucch_csset[rsetindex]; if (rsetindex==3||rsetindex==7||rsetindex==11) pucch_pdu->initial_cyclic_shift*=6; - else if (rsetindex==1||rsetindex==2) pucch_pdu->initial_cyclic_shift*=3; - else pucch_pdu->initial_cyclic_shift*=4; + else if (rsetindex==1||rsetindex==2) pucch_pdu->initial_cyclic_shift*=4; + else pucch_pdu->initial_cyclic_shift*=3; pucch_pdu->nr_of_symbols = nr_of_symb; pucch_pdu->start_symbol_index = start_symb; if (pucch_pdu->format_type == 1) pucch_pdu->time_domain_occ_idx = 0; // check this!! From df0f756c8730b63fc096b26ee508304c9c5152b1 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Mon, 22 Aug 2022 11:30:06 +0100 Subject: [PATCH 073/136] Fix build after merge --- openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c | 5 +---- openair2/RRC/NR/MESSAGES/asn1_msg.c | 5 +++-- openair2/RRC/NR/nr_rrc_config.c | 3 ++- openair2/RRC/NR/nr_rrc_config.h | 2 +- openair2/RRC/NR/rrc_gNB_reconfig.c | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index d3f67cd881..369527e5cd 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -1000,10 +1000,7 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, int16_t ls_estimated[2]; - uint8_t mem_offset = 0; - while(((long)&srs_estimated_channel_freq[0][nr_srs_info->sc_list[0] + mem_offset] & 0xF) != 0) { - mem_offset++; - } + uint8_t mem_offset = ((long)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]]) & 0xF; int32_t srs_est[frame_parms->ofdm_symbol_size*(1<num_symbols) + mem_offset] __attribute__ ((aligned(32))); for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index e13abbfe0c..04b0bb2d3c 100755 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -1092,7 +1092,7 @@ void fill_initial_SpCellConfig(int uid, // We are using do_srs = 0 here because the periodic SRS will only be enabled in update_cellGroupConfig() if do_srs == 1 initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config)); - config_srs(initialUplinkBWP->srs_Config, curr_bwp, NULL, uid, 0, 0); + config_srs(initialUplinkBWP->srs_Config, NULL, curr_bwp, uid, 0, 0); scheduling_request_config(scc, pucch_Config); @@ -1596,8 +1596,8 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, calloc(1,sizeof(*SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config)); } config_srs(SpCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config, - curr_bwp, uecap, + curr_bwp, uid, 0, configuration->do_SRS); @@ -1621,6 +1621,7 @@ void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig, NR_BWP_Uplink_t *ul_bwp = UL_BWP_list->list.array[i]; int bwp_size = NRRIV2BW(ul_bwp->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); config_srs(ul_bwp->bwp_Dedicated->srs_Config, + uecap, bwp_size, uid, i+1, diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 23d6f9a894..9a1d137a8c 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -352,8 +352,8 @@ long rrc_get_max_nr_csrs(const uint8_t max_rbs, const long b_SRS) { } void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, - const int curr_bwp, const NR_UE_NR_Capability_t *uecap, + const int curr_bwp, const int uid, const int res_id, const int do_srs) { @@ -1137,6 +1137,7 @@ void config_uplinkBWP(NR_BWP_Uplink_t *ubwp, ubwp->bwp_Dedicated->srs_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->srs_Config)); config_srs(ubwp->bwp_Dedicated->srs_Config, + NULL, curr_bwp, uid, bwp_loop+1, diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h index acd25e5575..49922aed6b 100644 --- a/openair2/RRC/NR/nr_rrc_config.h +++ b/openair2/RRC/NR/nr_rrc_config.h @@ -145,8 +145,8 @@ void config_csirs(const NR_ServingCellConfigCommon_t *servingcellconfigcommon, void config_csiim(int do_csirs, int dl_antenna_ports, int curr_bwp, NR_CSI_MeasConfig_t *csi_MeasConfig, int id); void config_srs(NR_SetupRelease_SRS_Config_t *setup_release_srs_Config, - const int curr_bwp, const NR_UE_NR_Capability_t *uecap, + const int curr_bwp, const int uid, const int res_id, const int do_srs); diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 85aa5e24a9..0f1da63510 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -489,7 +489,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco int curr_bwp = NRRIV2BW(servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth,MAX_BWP_SIZE); initialUplinkBWP->srs_Config = calloc(1,sizeof(*initialUplinkBWP->srs_Config)); - config_srs(initialUplinkBWP->srs_Config, curr_bwp, uid, 0, configuration->do_SRS); + config_srs(initialUplinkBWP->srs_Config, NULL, curr_bwp, uid, 0, configuration->do_SRS); // Downlink BWPs int n_dl_bwp = 1; From 0475b78ff43f925f909bf96494c4efe87f9be445 Mon Sep 17 00:00:00 2001 From: laurent Date: Mon, 22 Aug 2022 12:55:23 +0200 Subject: [PATCH 074/136] fix unaligned --- openair1/PHY/TOOLS/cmult_sv.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c index a9d502b9eb..fb2f4d589e 100644 --- a/openair1/PHY/TOOLS/cmult_sv.c +++ b/openair1/PHY/TOOLS/cmult_sv.c @@ -85,38 +85,30 @@ void multadd_real_vector_complex_scalar(int16_t *x, uint32_t i; // do 8 multiplications at a time - simd_q15_t alpha_r_128,alpha_i_128,yr,yi,*x_128=(simd_q15_t*)x,*y_128=(simd_q15_t*)y; - int j; + simd_q15_t alpha_r_128, alpha_i_128, yr, yi, *x_128 = (simd_q15_t *)x, *y_128 = (simd_q15_t *)y; // printf("alpha = %d,%d\n",alpha[0],alpha[1]); alpha_r_128 = set1_int16(alpha[0]); alpha_i_128 = set1_int16(alpha[1]); - - j=0; - for (i=0; i>3; i++) { yr = mulhi_s1_int16(alpha_r_128,x_128[i]); yi = mulhi_s1_int16(alpha_i_128,x_128[i]); #if defined(__x86_64__) || defined(__i386__) - y_128[j] = _mm_adds_epi16(y_128[j],_mm_unpacklo_epi16(yr,yi)); - j++; - y_128[j] = _mm_adds_epi16(y_128[j],_mm_unpackhi_epi16(yr,yi)); - j++; + const simd_q15_t tmp = _mm_loadu_si128(y_128); + _mm_storeu_si128(y_128++, _mm_adds_epi16(tmp, _mm_unpacklo_epi16(yr, yi))); + const simd_q15_t tmp2 = _mm_loadu_si128(y_128); + _mm_storeu_si128(y_128++, _mm_adds_epi16(tmp2, _mm_unpackhi_epi16(yr, yi))); #elif defined(__arm__) int16x8x2_t yint; yint = vzipq_s16(yr,yi); - y_128[j] = adds_int16(y_128[j],yint.val[0]); + *y_128 = adds_int16(*y_128, yint.val[0]); j++; - y_128[j] = adds_int16(y_128[j],yint.val[1]); - + *y_128 = adds_int16(*y_128, yint.val[1]); + j++; #endif } - - _mm_empty(); - _m_empty(); - } void multadd_real_four_symbols_vector_complex_scalar(int16_t *x, From c6fda387e0d62b2dcd6806b2a80aae90a681178e Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Mon, 22 Aug 2022 14:23:12 +0100 Subject: [PATCH 075/136] Fix mem_offset after merge --- openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 369527e5cd..6b10ed19cc 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -1000,7 +1000,7 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, int16_t ls_estimated[2]; - uint8_t mem_offset = ((long)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]]) & 0xF; + uint8_t mem_offset = ((16 - ((long)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]])) & 0xF) >> 2; // >> 2 <=> /sizeof(int32_t) int32_t srs_est[frame_parms->ofdm_symbol_size*(1<num_symbols) + mem_offset] __attribute__ ((aligned(32))); for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { From e28fccc7fbd5a10bc3b0ed9dd0033988899f71e5 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 23 Aug 2022 10:36:16 +0200 Subject: [PATCH 076/136] Hardcode (implicit) physim OC server to use --- ci-scripts/cls_physim1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-scripts/cls_physim1.py b/ci-scripts/cls_physim1.py index 3907fc2a34..0464681b1d 100644 --- a/ci-scripts/cls_physim1.py +++ b/ci-scripts/cls_physim1.py @@ -141,7 +141,7 @@ class PhySim: logging.debug('oai-physim size is unknown') # logging to OC Cluster and then switch to corresponding project - mySSH.command(f'oc login -u {ocUserName} -p {ocPassword}', '\$', 30) + mySSH.command(f'oc login -u {ocUserName} -p {ocPassword} --server https://api.oai.cs.eurecom.fr:6443', '\$', 30) if mySSH.getBefore().count('Login successful.') == 0: logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m') mySSH.close() From 90d4868a43d096a48766a5e436d9fcc09ba36e4d Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 23 Aug 2022 12:43:53 +0200 Subject: [PATCH 077/136] Isolate PhySim source build XML scenario --- ci-scripts/xml_files/ldpc_gpu_test.xml | 9 +---- ci-scripts/xml_files/physim_build_source.xml | 36 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 ci-scripts/xml_files/physim_build_source.xml diff --git a/ci-scripts/xml_files/ldpc_gpu_test.xml b/ci-scripts/xml_files/ldpc_gpu_test.xml index c17bc082d5..14255e89c9 100644 --- a/ci-scripts/xml_files/ldpc_gpu_test.xml +++ b/ci-scripts/xml_files/ldpc_gpu_test.xml @@ -26,16 +26,9 @@ Test-ldpc-GPU tasks 1 - 000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021 + 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021 - - Build_PhySim - Build for physical simulator - --phy_simulators --ninja --noavx512 - FALSE - - Run_PhySim Run LDPC Test with CPU diff --git a/ci-scripts/xml_files/physim_build_source.xml b/ci-scripts/xml_files/physim_build_source.xml new file mode 100644 index 0000000000..f062ca53ce --- /dev/null +++ b/ci-scripts/xml_files/physim_build_source.xml @@ -0,0 +1,36 @@ + + + + build-offload + Build physical simulators + tasks + 1 + 000001 + + + + Build_PhySim + Build physical simulators + --phy_simulators --ninja --noavx512 + FALSE + + From 4d85beae738af4654d4ba939bf30743cfb646d32 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 23 Aug 2022 15:08:21 +0200 Subject: [PATCH 078/136] Rename CI Run_PhySim to Run_LDPCTest --- ci-scripts/cls_physim.py | 6 ++-- ci-scripts/main.py | 13 +++++++-- ci-scripts/xml_class_list.yml | 2 +- ci-scripts/xml_files/ldpc_gpu_test.xml | 40 +++++++++++++------------- 4 files changed, 34 insertions(+), 27 deletions(-) diff --git a/ci-scripts/cls_physim.py b/ci-scripts/cls_physim.py index 0342333c06..21bb2314b8 100644 --- a/ci-scripts/cls_physim.py +++ b/ci-scripts/cls_physim.py @@ -64,7 +64,7 @@ class PhySim: #PRIVATE Methods #----------------- - def __CheckResults_PhySim(self,HTML,CONST,testcase_id): + def __CheckResults_LDPCTest(self,HTML,CONST,testcase_id): mySSH = sshconnection.SSHConnection() mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord) #retrieve run log file and store it locally$ @@ -173,7 +173,7 @@ class PhySim: return lHTML - def Run_PhySim(self,htmlObj,constObj,testcase_id): + def Run_LDPCTest(self,htmlObj,constObj,testcase_id): #create run logs folder locally os.system('mkdir -p ./'+self.__runLogPath) #log file is tc_.log remotely @@ -187,5 +187,5 @@ class PhySim: mySSH.close() #return updated HTML to main lHTML = cls_oai_html.HTMLManagement() - lHTML=self.__CheckResults_PhySim(htmlObj,constObj,testcase_id) + lHTML=self.__CheckResults_LDPCTest(htmlObj,constObj,testcase_id) return lHTML diff --git a/ci-scripts/main.py b/ci-scripts/main.py index baed6a6011..23c9ac9e21 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -457,8 +457,13 @@ def GetParametersFromXML(action): if (string_field is not None): CONTAINERS.testSvrId = string_field - else: # ie action == 'Run_PhySim': + elif action == 'Run_LDPCTest': ldpc.runargs = test.findtext('physim_run_args') + + else: + logging.error(f"unknown action {action}, abort") + exit(1) + #check if given test is in list @@ -914,8 +919,10 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re HTML=ldpc.Build_PhySim(HTML,CONST) if ldpc.exitStatus==1: RAN.prematureExit = True - elif action == 'Run_PhySim': - HTML=ldpc.Run_PhySim(HTML,CONST,id) + elif action == 'Run_LDPCTest': + HTML=ldpc.Run_LDPCTest(HTML,CONST,id) + if ldpc.exitStatus==1: + RAN.prematureExit = True elif action == 'Build_Image': CONTAINERS.BuildImage(HTML) elif action == 'Build_Proxy': diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml index 2c5f04b11f..8a0800e818 100755 --- a/ci-scripts/xml_class_list.yml +++ b/ci-scripts/xml_class_list.yml @@ -1,6 +1,6 @@ - Build_Proxy - Build_PhySim - - Run_PhySim + - Run_LDPCTest - Build_eNB - WaitEndBuild_eNB - Initialize_eNB diff --git a/ci-scripts/xml_files/ldpc_gpu_test.xml b/ci-scripts/xml_files/ldpc_gpu_test.xml index 14255e89c9..85bdc0bff8 100644 --- a/ci-scripts/xml_files/ldpc_gpu_test.xml +++ b/ci-scripts/xml_files/ldpc_gpu_test.xml @@ -30,121 +30,121 @@ - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 3872 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 3872 -s10 -n100 -G 1 - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 4224 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 4224 -s10 -n100 -G 1 - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 4576 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 4576 -s10 -n100 -G 1 - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 4928 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 4928 -s10 -n100 -G 1 - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 5280 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 5280 -s10 -n100 -G 1 - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 5632 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 5632 -s10 -n100 -G 1 - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 6336 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 6336 -s10 -n100 -G 1 - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 7040 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 7040 -s10 -n100 -G 1 - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 7744 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 7744 -s10 -n100 -G 1 - Run_PhySim + Run_LDPCTest Run LDPC Test with CPU -l 8448 -s10 -n100 - Run_PhySim + Run_LDPCTest Run LDPC Test with GPU -l 8448 -s10 -n100 -G 1 From aa1cbff59727386605dfb6d0f4b2c6daeeb198e6 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 23 Aug 2022 15:08:43 +0200 Subject: [PATCH 079/136] Improve PhySim build to be shorter --- ci-scripts/cls_physim.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/ci-scripts/cls_physim.py b/ci-scripts/cls_physim.py index 21bb2314b8..fe7fc2d7d7 100644 --- a/ci-scripts/cls_physim.py +++ b/ci-scripts/cls_physim.py @@ -100,21 +100,16 @@ class PhySim: mySSH.command('rm ' + self.__workSpacePath+self.__runLogFile, '\$', 5) mySSH.close() #check build result from local compile log file - buildStatus=False with open(self.__buildLogFile) as f: - #nr_prachsim is the last compile step - if 'nr_prachsim compiled' in f.read(): - buildStatus=True - #update HTML based on build status - if buildStatus: - HTML.CreateHtmlTestRow(self.buildargs, 'OK', CONST.ALL_PROCESSES_OK, 'LDPC') - self.exitStatus=0 - else: - logging.error('\u001B[1m Building Physical Simulators Failed\u001B[0m') - HTML.CreateHtmlTestRow(self.buildargs, 'KO', CONST.ALL_PROCESSES_OK, 'LDPC') - HTML.CreateHtmlTabFooter(False) - #exitStatus=1 will do a sys.exit in main - self.exitStatus=1 + if 'BUILD SHOULD BE SUCCESSFUL' in f.read(): + HTML.CreateHtmlTestRow(self.buildargs, 'OK', CONST.ALL_PROCESSES_OK, 'PhySim') + self.exitStatus=0 + return HTML + logging.error('\u001B[1m Building Physical Simulators Failed\u001B[0m') + HTML.CreateHtmlTestRow(self.buildargs, 'KO', CONST.ALL_PROCESSES_OK, 'LDPC') + HTML.CreateHtmlTabFooter(False) + #exitStatus=1 will do a sys.exit in main + self.exitStatus = 1 return HTML @@ -163,8 +158,7 @@ class PhySim: mySSH.command('source oaienv', '\$', 5) mySSH.command('cd cmake_targets', '\$', 5) mySSH.command('mkdir -p log', '\$', 5) - mySSH.command('chmod 777 log', '\$', 5) - mySSH.command('stdbuf -o0 ./build_oai ' + self.buildargs + ' 2>&1 | stdbuf -o0 tee ' + self.__buildLogFile, 'Bypassing the Tests|build have failed', 1500) + mySSH.command(f'./build_oai {self.buildargs} 2>&1 | tee {self.__buildLogFile}', '\$', 1500) mySSH.close() #check build status and update HTML object From b0e5b6eb9a830ec6ec9897ad81bc2a588435240e Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 23 Aug 2022 15:09:48 +0200 Subject: [PATCH 080/136] Add Run_NRulsimTest --- ci-scripts/cls_physim.py | 52 ++++++++++++++++++++++++++++++++--- ci-scripts/main.py | 6 +++- ci-scripts/xml_class_list.yml | 1 + 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/ci-scripts/cls_physim.py b/ci-scripts/cls_physim.py index fe7fc2d7d7..5e0dbc11b2 100644 --- a/ci-scripts/cls_physim.py +++ b/ci-scripts/cls_physim.py @@ -56,7 +56,6 @@ class PhySim: self.__workSpacePath='' self.__buildLogFile='compile_phy_sim.log' self.__runLogFile='' - self.__runResults=[] self.__runLogPath='phy_sim_logs' @@ -71,13 +70,13 @@ class PhySim: mySSH.copyin(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord, self.__workSpacePath+self.__runLogFile, '.') mySSH.close() #parse results looking for Encoding and Decoding mean values - self.__runResults=[] + runResults=[] with open(self.__runLogFile) as f: for line in f: if 'mean' in line: - self.__runResults.append(line) + runResults.append(line) #the values are appended for each mean value (2), so we take these 2 values from the list - info=self.__runResults[0]+self.__runResults[1] + info = runResults[0] + runResults[1] #once parsed move the local logfile to its folder for tidiness os.system('mv '+self.__runLogFile+' '+ self.__runLogPath+'/.') @@ -89,6 +88,38 @@ class PhySim: HTML.CreateHtmlTestRowQueue(self.runargs, 'OK', 1, html_queue) return HTML + def __CheckResults_NRulsimTest(self, HTML, CONST, testcase_id): + html_queue = SimpleQueue() + #retrieve run log file and store it locally + mySSH = sshconnection.SSHConnection() + filename = self.__workSpacePath + self.__runLogFile + ret = mySSH.copyin(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord, filename, '.') + if ret != 0: + error_msg = f'could not recover test result file {filename}' + logging.error(error_msg) + html_queue.put(f'
{error_msg}
') + HTML.CreateHtmlTestRowQueue("could not recover results", 'KO', 1, html_queue) + self.exitStatus = 1 + return HTML + + PUSCH_OK = False + with open(self.__runLogFile) as f: + PUSCH_OK = 'PUSCH test OK' in f.read() + + # once parsed move the local logfile to its folder for tidiness + os.system(f'mv {self.__runLogFile} {self.__runLogPath}/.') + + #updating the HTML with results + if PUSCH_OK: + html_queue.put('
succeeded
') + HTML.CreateHtmlTestRowQueue(self.runargs, 'OK', 1, html_queue) + else: + error_msg = 'error: no "PUSCH test OK"' + logging.error(error_msg) + html_queue.put(f'
{error_msg}
') + HTML.CreateHtmlTestRowQueue(self.runargs, 'KO', 1, html_queue) + self.exitStatus = 1 + return HTML def __CheckBuild_PhySim(self, HTML, CONST): self.__workSpacePath=self.eNBSourceCodePath+'/cmake_targets/' @@ -183,3 +214,16 @@ class PhySim: lHTML = cls_oai_html.HTMLManagement() lHTML=self.__CheckResults_LDPCTest(htmlObj,constObj,testcase_id) return lHTML + + def Run_NRulsimTest(self, htmlObj, constObj, testcase_id): + self.__workSpacePath=self.eNBSourceCodePath+'/cmake_targets/' + os.system(f'mkdir -p ./{self.__runLogPath}') + self.__runLogFile = f'physim_{testcase_id}.log' + mySSH = sshconnection.SSHConnection() + mySSH.open(self.eNBIpAddr, self.eNBUserName, self.eNBPassWord) + mySSH.command(f'cd {self.__workSpacePath}', '\$', 5) + mySSH.command(f'sudo {self.__workSpacePath}ran_build/build/nr_ulsim {self.runargs} > {self.__runLogFile} 2>&1', '\$', 30) + mySSH.close() + #return updated HTML to main + lHTML = self.__CheckResults_NRulsimTest(htmlObj, constObj, testcase_id) + return lHTML diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 23c9ac9e21..75018b64d6 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -457,7 +457,7 @@ def GetParametersFromXML(action): if (string_field is not None): CONTAINERS.testSvrId = string_field - elif action == 'Run_LDPCTest': + elif action == 'Run_LDPCTest' or action == 'Run_NRulsimTest': ldpc.runargs = test.findtext('physim_run_args') else: @@ -923,6 +923,10 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re HTML=ldpc.Run_LDPCTest(HTML,CONST,id) if ldpc.exitStatus==1: RAN.prematureExit = True + elif action == 'Run_NRulsimTest': + HTML=ldpc.Run_NRulsimTest(HTML,CONST,id) + if ldpc.exitStatus==1: + RAN.prematureExit = True elif action == 'Build_Image': CONTAINERS.BuildImage(HTML) elif action == 'Build_Proxy': diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml index 8a0800e818..f9894d501f 100755 --- a/ci-scripts/xml_class_list.yml +++ b/ci-scripts/xml_class_list.yml @@ -1,6 +1,7 @@ - Build_Proxy - Build_PhySim - Run_LDPCTest + - Run_NRulsimTest - Build_eNB - WaitEndBuild_eNB - Initialize_eNB From 5bd81ae95d665ff07e99ca5d28c5bd9c8a48fe69 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 23 Aug 2022 15:19:27 +0200 Subject: [PATCH 081/136] Define T1 Offload scenario file --- ci-scripts/xml_files/t1_offload_test.xml | 54 ++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 ci-scripts/xml_files/t1_offload_test.xml diff --git a/ci-scripts/xml_files/t1_offload_test.xml b/ci-scripts/xml_files/t1_offload_test.xml new file mode 100644 index 0000000000..44a259d74c --- /dev/null +++ b/ci-scripts/xml_files/t1_offload_test.xml @@ -0,0 +1,54 @@ + + + + test-t1-offload + Test T1 Offload + tasks + 1 + 000001 000002 000003 000004 + + + + Run_NRulsimTest + Run T1 Offload nr_ulsim + -n2 -s30 -m9 -r50 -R106 -o1 + + + + Run_NRulsimTest + Run T1 Offload nr_ulsim + -n2 -s30 -m9 -r106 -R106 -o1 + + + + Run_NRulsimTest + Run T1 Offload nr_ulsim + -n2 -s30 -m16 -r106 -R106 -o1 + + + + Run_NRulsimTest + Run T1 Offload nr_ulsim + -n2 -s30 -m9 -r273 -R273 -o1 + + + From 0ccb3a2d478fce20435b96d3536ed48eafc8add6 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 23 Aug 2022 17:17:48 +0200 Subject: [PATCH 082/136] Add T1 Offload test to RAN-Container-Parent --- ci-scripts/Jenkinsfile-GitLab-Container | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container index 7c872e7b22..37bcd01676 100644 --- a/ci-scripts/Jenkinsfile-GitLab-Container +++ b/ci-scripts/Jenkinsfile-GitLab-Container @@ -338,6 +338,26 @@ pipeline { } } } + stage ("Test T1 Offload") { + when { expression {doMandatoryTests} } + steps { + script { + triggerSlaveJob ('RAN-T1-Offload-Test', 'Test-T1-Offload') + } + } + post { + always { + script { + finalizeSlaveJob('RAN-T1-Offload-Test') + } + } + failure { + script { + currentBuild.result = 'FAILURE' + } + } + } + } } } stage ("Images Push to Registries") { From ea6524c52f55bf5c97c219c3e23dde9abe45040d Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Wed, 24 Aug 2022 08:27:14 +0200 Subject: [PATCH 083/136] update cmakelists and ulsim --- cmake_targets/CMakeLists.txt | 8 +------- openair1/SIMULATION/NR_PHY/ulsim.c | 8 ++++---- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index a603604911..e3b53d451f 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -831,14 +831,8 @@ TARGET_LINK_LIBRARIES(benetel_5g pthread dl rt m numa) # LDPC offload library ########################################################## -include_directories ("/usr/local/include") - -set(HWLIB_LDPC_OFFLOAD_SOURCE - ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c - ) - if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") -add_library(ldpc_offload MODULE ${HWLIB_LDPC_OFFLOAD_SOURCE} ) +add_library(ldpc_offload MODULE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c) set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include -DALLOW_EXPERIMENTAL_API") diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 8c0febfa0e..5784ca0b83 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -361,7 +361,7 @@ int main(int argc, char **argv) /* initialize the sin-cos table */ InitSinLUT(); - while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:kl:m:n:o:p:q:r:s:t:u:v:w:y:z:F:G:H:I:M:N:PR:S:T:U:L:ZW:")) != -1) { + while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:kl:m:n:op:q:r:s:t:u:v:w:y:z:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:")) != -1) { printf("handling optarg %c\n",c); switch (c) { @@ -481,7 +481,7 @@ int main(int argc, char **argv) break; case 'o': - ldpc_offload_flag = atoi(optarg); + ldpc_offload_flag = 1; break; case 'p': @@ -646,6 +646,7 @@ int main(int argc, char **argv) //printf("-x Transmission mode (1,2,6 for the moment)\n"); printf("-y Number of TX antennas used at UE\n"); printf("-z Number of RX antennas used at gNB\n"); + printf("-v Set the max rounds\n"); printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n"); //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n"); printf("-F Input filename (.txt format) for RX conformance testing\n"); @@ -1070,14 +1071,13 @@ int main(int argc, char **argv) double blerStats[4][100]; double berStats[4][100]; double snrStats[100]; - double ldpcDecStats[100]; + double ldpcDecStats[100] = {0}; memset(errors_scrambling, 0, sizeof(uint32_t)*4*100); memset(n_errors, 0, sizeof(int)*4*100); memset(round_trials, 0, sizeof(int)*4*100); memset(blerStats, 0, sizeof(double)*4*100); memset(berStats, 0, sizeof(double)*4*100); memset(snrStats, 0, sizeof(double)*100); - memset(ldpcDecStats, 0, sizeof(double)*100); for (SNR = snr0; SNR < snr1; SNR += snr_step) { varArray_t *table_rx=initVarArray(1000,sizeof(double)); int error_flag = 0; From 3a0a14cf7d4c59996956ed670a66fe9e476679cc Mon Sep 17 00:00:00 2001 From: laurent Date: Thu, 18 Aug 2022 14:59:16 +0200 Subject: [PATCH 084/136] gzip optim, links for size --- ci-scripts/cls_containerize.py | 2 +- cmake_targets/tools/build_helper | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index 9570610cd8..24e2f9b187 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -579,7 +579,7 @@ class Containerize(): lUserName = self.eNB2UserName lPassWord = self.eNB2Password lSsh.open(lIpAddr, lUserName, lPassWord) - lSsh.command('docker save ' + self.imageToCopy + ':' + imageTag + ' | gzip > ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60) + lSsh.command('docker save ' + self.imageToCopy + ':' + imageTag + ' | gzip --fast > ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60) lSsh.copyin(lIpAddr, lUserName, lPassWord, '~/' + self.imageToCopy + '-' + imageTag + '.tar.gz', '.') lSsh.command('rm ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60) lSsh.close() diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper index d35f90fcce..608ace0486 100755 --- a/cmake_targets/tools/build_helper +++ b/cmake_targets/tools/build_helper @@ -237,8 +237,9 @@ compilations() { echo_error "$2 compilation failed" exit 1 fi - if [ -s $3 ] ; then - cp $3 $4 + if [ -s "$3" ] ; then + rm -f "$4" + ln -s "$PWD/$3" "$4" echo_success "$2 compiled" check_warnings "$dlog/$2.$REL.txt" else From c1b448cd1ac97ab9faea20115c32a0951054fe55 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 19 Aug 2022 10:01:55 +0200 Subject: [PATCH 085/136] Handle errors in Copy_Image_to_Test_Server() --- ci-scripts/cls_containerize.py | 21 ++++++++++++++++++++- ci-scripts/main.py | 4 +++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index 24e2f9b187..81714c18c7 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -580,8 +580,16 @@ class Containerize(): lPassWord = self.eNB2Password lSsh.open(lIpAddr, lUserName, lPassWord) lSsh.command('docker save ' + self.imageToCopy + ':' + imageTag + ' | gzip --fast > ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60) - lSsh.copyin(lIpAddr, lUserName, lPassWord, '~/' + self.imageToCopy + '-' + imageTag + '.tar.gz', '.') + ret = lSsh.copyin(lIpAddr, lUserName, lPassWord, '~/' + self.imageToCopy + '-' + imageTag + '.tar.gz', '.') + if ret != 0: + HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK) + self.exitStatus = 1 + return False lSsh.command('rm ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60) + if lSsh.getBefore().count('cannot remove'): + HTML.CreateHtmlTestRow('file not created by docker save', 'KO', CONST.ALL_PROCESSES_OK) + self.exitStatus = 1 + return False lSsh.close() # Going to the Test Server @@ -599,15 +607,26 @@ class Containerize(): lPassWord = self.eNB2Password lSsh.open(lIpAddr, lUserName, lPassWord) lSsh.copyout(lIpAddr, lUserName, lPassWord, './' + self.imageToCopy + '-' + imageTag + '.tar.gz', '~') + # copyout has no return code and will quit if something fails lSsh.command('docker rmi ' + self.imageToCopy + ':' + imageTag, '\$', 10) lSsh.command('docker load < ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60) + if lSsh.getBefore().count('o such file') or lSsh.getBefore().count('invalid tar header'): + logging.debug(lSsh.getBefore()) + HTML.CreateHtmlTestRow('problem during docker load', 'KO', CONST.ALL_PROCESSES_OK) + self.exitStatus = 1 + return False lSsh.command('rm ' + self.imageToCopy + '-' + imageTag + '.tar.gz', '\$', 60) + if lSsh.getBefore().count('cannot remove'): + HTML.CreateHtmlTestRow('file not copied during scp?', 'KO', CONST.ALL_PROCESSES_OK) + self.exitStatus = 1 + return False lSsh.close() if os.path.isfile('./' + self.imageToCopy + '-' + imageTag + '.tar.gz'): os.remove('./' + self.imageToCopy + '-' + imageTag + '.tar.gz') HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) + return True def DeployObject(self, HTML, EPC): if self.eNB_serverId[self.eNB_instance] == '0': diff --git a/ci-scripts/main.py b/ci-scripts/main.py index baed6a6011..8a4b59ede6 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -921,7 +921,9 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re elif action == 'Build_Proxy': CONTAINERS.BuildProxy(HTML) elif action == 'Copy_Image_to_Test': - CONTAINERS.Copy_Image_to_Test_Server(HTML) + success = CONTAINERS.Copy_Image_to_Test_Server(HTML) + if not success: + RAN.prematureExit = True elif action == 'Deploy_Object': CONTAINERS.DeployObject(HTML, EPC) if CONTAINERS.exitStatus==1: From 23cf8059aa87bf2633b1112aeeeb8b656d46ab4f Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 19 Aug 2022 10:09:34 +0200 Subject: [PATCH 086/136] Save logs of unhealthy containers during deployment --- ci-scripts/cls_containerize.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index 81714c18c7..b8dc8b32fb 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -702,6 +702,9 @@ class Containerize(): logging.debug(' -- ' + str(unhealthyNb) + ' unhealthy container(s)') logging.debug(' -- ' + str(startingNb) + ' still starting container(s)') + self.testCase_id = HTML.testCase_id + self.eNB_logFile[self.eNB_instance] = 'enb_' + self.testCase_id + '.log' + status = False if healthyNb == 1: cnt = 0 @@ -716,11 +719,12 @@ class Containerize(): status = True logging.info('\u001B[1m Deploying OAI object Pass\u001B[0m') time.sleep(10) + else: + # containers are unhealthy, so we won't start. However, logs are stored at the end + # in UndeployObject so we here store the logs of the unhealthy container to report it + mySSH.command('docker logs ' + containerName + ' > ' + lSourcePath + '/cmake_targets/' + self.eNB_logFile[self.eNB_instance], '\$', 30) mySSH.close() - self.testCase_id = HTML.testCase_id - self.eNB_logFile[self.eNB_instance] = 'enb_' + self.testCase_id + '.log' - if status: HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) else: From 4dc26bf575770a6b210b14397f843fe479f4d3da Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 11 Aug 2022 16:07:40 +0200 Subject: [PATCH 087/136] docker entrypoints: print config, log USRP loader --- docker/scripts/enb_entrypoint.sh | 6 ++++++ docker/scripts/gnb_entrypoint.sh | 6 ++++++ docker/scripts/lte_ru_entrypoint.sh | 6 ++++++ docker/scripts/lte_ue_entrypoint.sh | 6 ++++++ docker/scripts/nr_ue_entrypoint.sh | 6 ++++++ 5 files changed, 30 insertions(+) diff --git a/docker/scripts/enb_entrypoint.sh b/docker/scripts/enb_entrypoint.sh index 825dfd73c1..7e787abaa6 100755 --- a/docker/scripts/enb_entrypoint.sh +++ b/docker/scripts/enb_entrypoint.sh @@ -51,9 +51,15 @@ for c in ${CONFIG_FILES}; do # render template and inline replace config file sed -i "${EXPRESSIONS}" ${c} + + echo "==================================" + echo "== Configuration file: ${c}" + cat ${c} done # Load the USRP binaries +echo "==================================" +echo "== Load USRP binaries" if [[ -v USE_B2XX ]]; then $PREFIX/bin/uhd_images_downloader.py -t b2xx elif [[ -v USE_X3XX ]]; then diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh index 6deff8da10..146e9e8ecf 100755 --- a/docker/scripts/gnb_entrypoint.sh +++ b/docker/scripts/gnb_entrypoint.sh @@ -51,9 +51,15 @@ for c in ${CONFIG_FILES}; do # render template and inline replace config file sed -i "${EXPRESSIONS}" ${c} + + echo "==================================" + echo "== Configuration file: ${c}" + cat ${c} done # Load the USRP binaries +echo "==================================" +echo "== Load USRP binaries" if [[ -v USE_B2XX ]]; then $PREFIX/bin/uhd_images_downloader.py -t b2xx elif [[ -v USE_X3XX ]]; then diff --git a/docker/scripts/lte_ru_entrypoint.sh b/docker/scripts/lte_ru_entrypoint.sh index 297e437ac0..395ea6b109 100755 --- a/docker/scripts/lte_ru_entrypoint.sh +++ b/docker/scripts/lte_ru_entrypoint.sh @@ -31,9 +31,15 @@ for c in ${CONFIG_FILES}; do # render template and inline replace config file sed -i "${EXPRESSIONS}" ${c} + + echo "==================================" + echo "== Configuration file: ${c}" + cat ${c} done # Load the USRP binaries +echo "==================================" +echo "== Load USRP binaries" if [[ -v USE_B2XX ]]; then $PREFIX/bin/uhd_images_downloader.py -t b2xx elif [[ -v USE_X3XX ]]; then diff --git a/docker/scripts/lte_ue_entrypoint.sh b/docker/scripts/lte_ue_entrypoint.sh index 82e96dd07f..6de61f23e4 100755 --- a/docker/scripts/lte_ue_entrypoint.sh +++ b/docker/scripts/lte_ue_entrypoint.sh @@ -30,6 +30,10 @@ for c in ${CONFIG_FILES}; do # render template and inline replace config file sed -i "${EXPRESSIONS}" ${c} + + echo "==================================" + echo "== Configuration file: ${c}" + cat ${c} done #now generate USIM files @@ -38,6 +42,8 @@ cd $PREFIX $PREFIX/bin/conf2uedata -c $PREFIX/etc/ue_usim.conf -o $PREFIX # Load the USRP binaries +echo "==================================" +echo "== Load USRP binaries" if [[ -v USE_B2XX ]]; then $PREFIX/bin/uhd_images_downloader.py -t b2xx elif [[ -v USE_X3XX ]]; then diff --git a/docker/scripts/nr_ue_entrypoint.sh b/docker/scripts/nr_ue_entrypoint.sh index 38b080a41b..888c4da792 100755 --- a/docker/scripts/nr_ue_entrypoint.sh +++ b/docker/scripts/nr_ue_entrypoint.sh @@ -40,9 +40,15 @@ for c in ${CONFIG_FILES}; do # render template and inline replace config file sed -i "${EXPRESSIONS}" ${c} + + echo "==================================" + echo "== Configuration file: ${c}" + cat ${c} done # Load the USRP binaries +echo "==================================" +echo "== Load USRP binaries" if [[ -v USE_B2XX ]]; then $PREFIX/bin/uhd_images_downloader.py -t b2xx elif [[ -v USE_X3XX ]]; then From a58b3989d177dd743678ae85c675d1a3eab4901e Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 19 Aug 2022 10:59:16 +0200 Subject: [PATCH 088/136] Install gdb in RAN images to have stack traces on asserts --- docker/Dockerfile.eNB.rhel8.2 | 1 + docker/Dockerfile.eNB.ubuntu18 | 1 + docker/Dockerfile.gNB.rhel8.2 | 1 + docker/Dockerfile.gNB.ubuntu18 | 1 + docker/Dockerfile.lteRU.rhel8.2 | 1 + docker/Dockerfile.lteRU.ubuntu18 | 1 + docker/Dockerfile.lteUE.rhel8.2 | 1 + docker/Dockerfile.nrUE.rhel8.2 | 1 + docker/Dockerfile.nrUE.ubuntu18 | 1 + docker/scripts/enb_entrypoint.sh | 3 +++ docker/scripts/gnb_entrypoint.sh | 3 +++ docker/scripts/lte_ru_entrypoint.sh | 3 +++ docker/scripts/lte_ue_entrypoint.sh | 3 +++ docker/scripts/nr_ue_entrypoint.sh | 3 +++ 14 files changed, 24 insertions(+) diff --git a/docker/Dockerfile.eNB.rhel8.2 b/docker/Dockerfile.eNB.rhel8.2 index 5296ac2172..23afb5f38d 100644 --- a/docker/Dockerfile.eNB.rhel8.2 +++ b/docker/Dockerfile.eNB.rhel8.2 @@ -43,6 +43,7 @@ RUN yum update -y && \ tzdata \ procps-ng \ atlas \ + gdb \ python3 \ python3-pip \ net-tools \ diff --git a/docker/Dockerfile.eNB.ubuntu18 b/docker/Dockerfile.eNB.ubuntu18 index f95a03398a..2b50dcadfb 100644 --- a/docker/Dockerfile.eNB.ubuntu18 +++ b/docker/Dockerfile.eNB.ubuntu18 @@ -53,6 +53,7 @@ RUN apt-get update && \ iputils-ping \ iproute2 \ iperf \ + gdb \ python \ python3 \ python3-six \ diff --git a/docker/Dockerfile.gNB.rhel8.2 b/docker/Dockerfile.gNB.rhel8.2 index 9ec7ee7556..f782384f58 100644 --- a/docker/Dockerfile.gNB.rhel8.2 +++ b/docker/Dockerfile.gNB.rhel8.2 @@ -46,6 +46,7 @@ RUN yum repolist --disablerepo=* && \ lksctp-tools \ nettle \ tzdata \ + gdb \ python3 \ python3-pip \ net-tools \ diff --git a/docker/Dockerfile.gNB.ubuntu18 b/docker/Dockerfile.gNB.ubuntu18 index 6a98c8d3ce..11669c2af4 100644 --- a/docker/Dockerfile.gNB.ubuntu18 +++ b/docker/Dockerfile.gNB.ubuntu18 @@ -52,6 +52,7 @@ RUN apt-get update && \ net-tools \ iproute2 \ iputils-ping \ + gdb \ python \ python3 \ python3-six \ diff --git a/docker/Dockerfile.lteRU.rhel8.2 b/docker/Dockerfile.lteRU.rhel8.2 index b41aee36dc..f20910ff51 100644 --- a/docker/Dockerfile.lteRU.rhel8.2 +++ b/docker/Dockerfile.lteRU.rhel8.2 @@ -41,6 +41,7 @@ RUN yum update -y && \ tzdata \ procps-ng \ atlas \ + gdb \ python3 \ python3-pip \ net-tools \ diff --git a/docker/Dockerfile.lteRU.ubuntu18 b/docker/Dockerfile.lteRU.ubuntu18 index 1810afb621..157a5a615a 100644 --- a/docker/Dockerfile.lteRU.ubuntu18 +++ b/docker/Dockerfile.lteRU.ubuntu18 @@ -47,6 +47,7 @@ RUN apt-get update && \ libatlas3-base \ libconfig9 \ net-tools \ + gdb \ python \ python3 \ python3-six \ diff --git a/docker/Dockerfile.lteUE.rhel8.2 b/docker/Dockerfile.lteUE.rhel8.2 index ab7d224939..303394ea27 100644 --- a/docker/Dockerfile.lteUE.rhel8.2 +++ b/docker/Dockerfile.lteUE.rhel8.2 @@ -44,6 +44,7 @@ RUN yum update -y && \ nettle \ tzdata \ atlas \ + gdb \ python3 \ python3-pip \ iproute \ diff --git a/docker/Dockerfile.nrUE.rhel8.2 b/docker/Dockerfile.nrUE.rhel8.2 index dfb28cfd1d..3ee93ed5d2 100644 --- a/docker/Dockerfile.nrUE.rhel8.2 +++ b/docker/Dockerfile.nrUE.rhel8.2 @@ -46,6 +46,7 @@ RUN yum update -y && \ iputils \ iproute \ atlas \ + gdb \ python3 \ python3-pip \ libXpm \ diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18 index 9f68b947cd..0997783b8b 100644 --- a/docker/Dockerfile.nrUE.ubuntu18 +++ b/docker/Dockerfile.nrUE.ubuntu18 @@ -50,6 +50,7 @@ RUN apt-get update && \ libconfig9 \ openssl \ net-tools \ + gdb \ python \ python3 \ python3-six \ diff --git a/docker/scripts/enb_entrypoint.sh b/docker/scripts/enb_entrypoint.sh index 7e787abaa6..2d49a0ed20 100755 --- a/docker/scripts/enb_entrypoint.sh +++ b/docker/scripts/enb_entrypoint.sh @@ -68,6 +68,9 @@ elif [[ -v USE_N3XX ]]; then $PREFIX/bin/uhd_images_downloader.py -t n3xx fi +# enable printing of stack traces on assert +export gdbStacks=1 + echo "==================================" echo "== Starting eNB soft modem" if [[ -v USE_ADDITIONAL_OPTIONS ]]; then diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh index 146e9e8ecf..4e8983599e 100755 --- a/docker/scripts/gnb_entrypoint.sh +++ b/docker/scripts/gnb_entrypoint.sh @@ -68,6 +68,9 @@ elif [[ -v USE_N3XX ]]; then $PREFIX/bin/uhd_images_downloader.py -t n3xx fi +# enable printing of stack traces on assert +export gdbStacks=1 + echo "==================================" echo "== Starting gNB soft modem" if [[ -v USE_ADDITIONAL_OPTIONS ]]; then diff --git a/docker/scripts/lte_ru_entrypoint.sh b/docker/scripts/lte_ru_entrypoint.sh index 395ea6b109..746efb30b3 100755 --- a/docker/scripts/lte_ru_entrypoint.sh +++ b/docker/scripts/lte_ru_entrypoint.sh @@ -48,6 +48,9 @@ elif [[ -v USE_N3XX ]]; then $PREFIX/bin/uhd_images_downloader.py -t n3xx fi +# enable printing of stack traces on assert +export gdbStacks=1 + echo "==================================" echo "== Starting eNB soft modem" if [[ -v USE_ADDITIONAL_OPTIONS ]]; then diff --git a/docker/scripts/lte_ue_entrypoint.sh b/docker/scripts/lte_ue_entrypoint.sh index 6de61f23e4..2bdcb873c9 100755 --- a/docker/scripts/lte_ue_entrypoint.sh +++ b/docker/scripts/lte_ue_entrypoint.sh @@ -63,6 +63,9 @@ if [[ -v USE_NFAPI ]]; then new_args+=("$PREFIX/etc/ue.conf") fi +# enable printing of stack traces on assert +export gdbStacks=1 + echo "==================================" echo "== Starting LTE UE soft modem" if [[ -v USE_ADDITIONAL_OPTIONS ]]; then diff --git a/docker/scripts/nr_ue_entrypoint.sh b/docker/scripts/nr_ue_entrypoint.sh index 888c4da792..616d71b555 100755 --- a/docker/scripts/nr_ue_entrypoint.sh +++ b/docker/scripts/nr_ue_entrypoint.sh @@ -64,6 +64,9 @@ while [[ $# -gt 0 ]]; do shift done +# enable printing of stack traces on assert +export gdbStacks=1 + echo "==================================" echo "== Starting NR UE soft modem" if [[ -v USE_ADDITIONAL_OPTIONS ]]; then From 21ea2f2136f8b5fee360926c3b507e143502833c Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Thu, 14 Jul 2022 10:30:59 +0000 Subject: [PATCH 089/136] pbchsim: apply nr rotation in frequency domain, like in all other places, instead of time domain --- openair1/SIMULATION/NR_PHY/pbchsim.c | 29 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 0e648c945f..49645c9f1b 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -606,6 +606,13 @@ int main(int argc, char **argv) for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (cyclic_prefix_type == 1) { + apply_nr_rotation(frame_parms, + (int16_t*)gNB->common_vars.txdataF[aa], + slot, + 0, + 12, + frame_parms->ofdm_symbol_size); + PHY_ofdm_mod(gNB->common_vars.txdataF[aa], &txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)], frame_parms->ofdm_symbol_size, @@ -613,10 +620,18 @@ int main(int argc, char **argv) frame_parms->nb_prefix_samples, CYCLIC_PREFIX); } else { + apply_nr_rotation(frame_parms, + (int16_t*)gNB->common_vars.txdataF[aa], + slot, + 0, + 14, + frame_parms->ofdm_symbol_size); + /*nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], &txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)], 14, frame_parms);*/ + PHY_ofdm_mod(gNB->common_vars.txdataF[aa], (int*)&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)], frame_parms->ofdm_symbol_size, @@ -624,26 +639,12 @@ int main(int argc, char **argv) frame_parms->nb_prefix_samples0, CYCLIC_PREFIX); - apply_nr_rotation(frame_parms, - (int16_t*)&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)], - slot, - 0, - 1, - frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples0); - PHY_ofdm_mod(&gNB->common_vars.txdataF[aa][frame_parms->ofdm_symbol_size], (int*)&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)+frame_parms->nb_prefix_samples0+frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size, 13, frame_parms->nb_prefix_samples, CYCLIC_PREFIX); - - apply_nr_rotation(frame_parms, - (int16_t*)&txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)+frame_parms->nb_prefix_samples0+frame_parms->ofdm_symbol_size], - slot, - 1, - 13, - frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples); } } } From 3c17573f3451622cdef19e23679e03af82c48916 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Thu, 14 Jul 2022 10:34:49 +0000 Subject: [PATCH 090/136] apply nr rotation only on used PRBs instead of complete OFDM symbol --- executables/nr-gnb.c | 3 +- openair1/PHY/MODULATION/nr_modulation.h | 6 +- openair1/PHY/MODULATION/ofdm_mod.c | 20 ++++--- openair1/PHY/MODULATION/slot_fep_nr.c | 64 ++++++++++++++-------- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 7 ++- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 2 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 6 +- openair1/SIMULATION/NR_PHY/ulsim.c | 3 +- 8 files changed, 67 insertions(+), 44 deletions(-) diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 14eefa1e32..6a2e7d3577 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -221,8 +221,7 @@ void rx_func(void *param) { gNB->common_vars.rxdataF[aa], slot_rx, 0, - gNB->frame_parms.Ncp==EXTENDED?12:14, - gNB->frame_parms.ofdm_symbol_size); + gNB->frame_parms.Ncp==EXTENDED?12:14); } phy_procedures_gNB_uespec_RX(gNB, frame_rx, slot_rx); } diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h index 88a4cfefed..435251868e 100644 --- a/openair1/PHY/MODULATION/nr_modulation.h +++ b/openair1/PHY/MODULATION/nr_modulation.h @@ -112,8 +112,7 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp, int16_t* txdata, int slot, int first_symbol, - int nsymb, - int length); + int nsymb); void init_symbol_rotation(NR_DL_FRAME_PARMS *fp); @@ -123,8 +122,7 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, int32_t *rxdataF, int slot, int first_symbol, - int nsymb, - int length); + int nsymb); /*! \brief Perform NR precoding. TS 38.211 V15.4.0 subclause 6.3.1.5 @param[in] datatx_F_precoding, Pointer to n_layers*re data array diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 0b8f22a094..288200d674 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -341,29 +341,33 @@ void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t ne } void apply_nr_rotation(NR_DL_FRAME_PARMS *fp, - int16_t* trxdata, + int16_t* txdataF, int slot, int first_symbol, - int nsymb, - int length) { + int nsymb) +{ int symb_offset = (slot%fp->slots_per_subframe)*fp->symbols_per_slot; c16_t *symbol_rotation = fp->symbol_rotation[0]; for (int sidx=0;sidxofdm_symbol_size, symbol_rotation + sidx + first_symbol + symb_offset, - ((c16_t*) trxdata) + sidx * length, - length, + ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, + fp->N_RB_DL * 6, + 15); + rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset, + symbol_rotation + sidx + first_symbol + symb_offset, + ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset, + fp->N_RB_DL * 6, 15); } } diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index 548db21878..b2499286ec 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -108,19 +108,30 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, #endif rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - &rot2, - (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - frame_parms->ofdm_symbol_size, - 15); + &rot2, + (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + frame_parms->N_RB_DL * 6, + 15); + rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], + &rot2, + (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], + frame_parms->N_RB_DL * 6, + 15); c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - (int16_t *)shift_rot, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - 1, - frame_parms->ofdm_symbol_size, - 15); + (int16_t *)shift_rot, + (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + 1, + frame_parms->N_RB_DL * 6, + 15); + multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], + (int16_t *)(shift_rot + frame_parms->first_carrier_offset), + (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], + 1, + frame_parms->N_RB_DL * 6, + 15); } #ifdef DEBUG_FEP @@ -301,10 +312,8 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, int32_t *rxdataF, int slot, int first_symbol, - int nsymb, - int length) { - - + int nsymb) +{ int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot; int soffset = (slot&3)*frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size; @@ -314,18 +323,29 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, rot2.i=-rot2.i; LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,rot2.r,rot2.i); rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - &rot2, - (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - length, - 15); + &rot2, + (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + frame_parms->N_RB_UL * 6, + 15); + rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], + &rot2, + (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], + frame_parms->N_RB_UL * 6, + 15); c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - (int16_t *)shift_rot, - (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - 1, - length, - 15); + (int16_t *)shift_rot, + (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + 1, + frame_parms->N_RB_UL * 6, + 15); + multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], + (int16_t *)(shift_rot + frame_parms->first_carrier_offset), + (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], + 1, + frame_parms->N_RB_UL * 6, + 15); } } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index eaeffd0809..229a6c5572 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -606,7 +606,12 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE, rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], &rot, (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], - frame_parms->ofdm_symbol_size, + frame_parms->N_RB_UL * 6, + 15); + rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset], + &rot, + (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset], + frame_parms->N_RB_UL * 6, 15); } } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 7c6a2eb998..daca0fd0e3 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -181,7 +181,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, //apply the OFDM symbol rotation here for (aa=0; aacarrier_config.num_tx_ant.value; aa++) { - apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[aa][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14,fp->ofdm_symbol_size); + apply_nr_rotation(fp,(int16_t*) &gNB->common_vars.txdataF[aa][txdataF_offset],slot,0,fp->Ncp==EXTENDED?12:14); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0); diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 49645c9f1b..aaa28b274c 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -610,8 +610,7 @@ int main(int argc, char **argv) (int16_t*)gNB->common_vars.txdataF[aa], slot, 0, - 12, - frame_parms->ofdm_symbol_size); + 12); PHY_ofdm_mod(gNB->common_vars.txdataF[aa], &txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)], @@ -624,8 +623,7 @@ int main(int argc, char **argv) (int16_t*)gNB->common_vars.txdataF[aa], slot, 0, - 14, - frame_parms->ofdm_symbol_size); + 14); /*nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], &txdata[aa][frame_parms->get_samples_slot_timestamp(slot,frame_parms,0)], diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index f4dece26ff..be940da1a1 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -1377,8 +1377,7 @@ int main(int argc, char **argv) gNB->common_vars.rxdataF[aa], slot, 0, - gNB->frame_parms.Ncp == EXTENDED ? 12 : 14, - gNB->frame_parms.ofdm_symbol_size); + gNB->frame_parms.Ncp == EXTENDED ? 12 : 14); } ul_proc_error = phy_procedures_gNB_uespec_RX(gNB, frame, slot); From 631060698096be0878db11d437ef823b931aa9f1 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Thu, 14 Jul 2022 13:12:42 +0000 Subject: [PATCH 091/136] fix alignment issues in case of odd number of PRBs --- openair1/PHY/MODULATION/ofdm_mod.c | 33 +++-- openair1/PHY/MODULATION/slot_fep_nr.c | 139 ++++++++++++++------- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 33 +++-- 3 files changed, 140 insertions(+), 65 deletions(-) diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 288200d674..0d2c95a926 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -359,16 +359,29 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp, symbol_rotation[sidx + first_symbol + symb_offset].r, symbol_rotation[sidx + first_symbol + symb_offset].i); - rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, - symbol_rotation + sidx + first_symbol + symb_offset, - ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, - fp->N_RB_DL * 6, - 15); - rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset, - symbol_rotation + sidx + first_symbol + symb_offset, - ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset, - fp->N_RB_DL * 6, - 15); + if (fp->N_RB_DL & 1) { + rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, + symbol_rotation + sidx + first_symbol + symb_offset, + ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, + (fp->N_RB_DL + 1) * 6, + 15); + rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset - 6, + symbol_rotation + sidx + first_symbol + symb_offset, + ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset - 6, + (fp->N_RB_DL + 1) * 6, + 15); + } else { + rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, + symbol_rotation + sidx + first_symbol + symb_offset, + ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, + fp->N_RB_DL * 6, + 15); + rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset, + symbol_rotation + sidx + first_symbol + symb_offset, + ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset, + fp->N_RB_DL * 6, + 15); + } } } diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index b2499286ec..58711777ae 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -107,31 +107,55 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, symbol+symb_offset,rot2.r,rot2.i); #endif - rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - &rot2, - (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - frame_parms->N_RB_DL * 6, - 15); - rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], - &rot2, - (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], - frame_parms->N_RB_DL * 6, - 15); - c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; - multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - (int16_t *)shift_rot, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - 1, - frame_parms->N_RB_DL * 6, - 15); - multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], - (int16_t *)(shift_rot + frame_parms->first_carrier_offset), - (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], - 1, - frame_parms->N_RB_DL * 6, - 15); + if (frame_parms->N_RB_DL & 1) { + rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + &rot2, + (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + (frame_parms->N_RB_DL + 1) * 6, + 15); + rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset - 6], + &rot2, + (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset - 6], + (frame_parms->N_RB_DL + 1) * 6, + 15); + multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + (int16_t *)shift_rot, + (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + 1, + (frame_parms->N_RB_DL + 1) * 6, + 15); + multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset - 6], + (int16_t *)(shift_rot + frame_parms->first_carrier_offset - 6), + (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset - 6], + 1, + (frame_parms->N_RB_DL + 1) * 6, + 15); + } else { + rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + &rot2, + (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + frame_parms->N_RB_DL * 6, + 15); + rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], + &rot2, + (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], + frame_parms->N_RB_DL * 6, + 15); + multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + (int16_t *)shift_rot, + (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + 1, + frame_parms->N_RB_DL * 6, + 15); + multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], + (int16_t *)(shift_rot + frame_parms->first_carrier_offset), + (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], + 1, + frame_parms->N_RB_DL * 6, + 15); + } } #ifdef DEBUG_FEP @@ -322,30 +346,55 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, c16_t rot2 = frame_parms->symbol_rotation[1][symbol + symb_offset]; rot2.i=-rot2.i; LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,rot2.r,rot2.i); - rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - &rot2, - (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - frame_parms->N_RB_UL * 6, - 15); - rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], - &rot2, - (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], - frame_parms->N_RB_UL * 6, - 15); c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; - multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - (int16_t *)shift_rot, - (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - 1, - frame_parms->N_RB_UL * 6, - 15); - multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], - (int16_t *)(shift_rot + frame_parms->first_carrier_offset), - (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], - 1, - frame_parms->N_RB_UL * 6, - 15); + if (frame_parms->N_RB_UL & 1) { + rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + &rot2, + (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + (frame_parms->N_RB_UL + 1) * 6, + 15); + rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset-6], + &rot2, + (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset-6], + (frame_parms->N_RB_UL + 1) * 6, + 15); + multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + (int16_t *)shift_rot, + (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + 1, + (frame_parms->N_RB_UL+1) * 6, + 15); + multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset-6], + (int16_t *)(shift_rot + frame_parms->first_carrier_offset - 6), + (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset-6], + 1, + (frame_parms->N_RB_UL+1) * 6, + 15); + } else { + rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + &rot2, + (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + frame_parms->N_RB_UL * 6, + 15); + rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], + &rot2, + (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], + frame_parms->N_RB_UL * 6, + 15); + multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + (int16_t *)shift_rot, + (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + 1, + frame_parms->N_RB_UL * 6, + 15); + multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], + (int16_t *)(shift_rot + frame_parms->first_carrier_offset), + (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], + 1, + frame_parms->N_RB_UL * 6, + 15); + } } } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 229a6c5572..10fd8e9e8a 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -603,16 +603,29 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE, s + symb_offset, rot.r, rot.i); - rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], - &rot, - (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], - frame_parms->N_RB_UL * 6, - 15); - rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset], - &rot, - (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset], - frame_parms->N_RB_UL * 6, - 15); + if (frame_parms->N_RB_UL & 1) { + rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], + &rot, + (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], + (frame_parms->N_RB_UL + 1) * 6, + 15); + rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset - 6], + &rot, + (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset - 6], + (frame_parms->N_RB_UL + 1) * 6, + 15); + } else { + rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], + &rot, + (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], + frame_parms->N_RB_UL * 6, + 15); + rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset], + &rot, + (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset], + frame_parms->N_RB_UL * 6, + 15); + } } } From d39a77243604934c5f8130ce8e41cd64029c975b Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Thu, 25 Aug 2022 10:33:38 +0100 Subject: [PATCH 092/136] Remove tabs --- .../nfapi/public_inc/nfapi_nr_interface_scf.h | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h index 66a8930f8d..75a7ac67b1 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h @@ -1291,30 +1291,30 @@ typedef struct } nfapi_nr_pucch_pdu_t; typedef struct { - uint16_t rnti; // UE RNTI, Value: 1->65535 - uint32_t handle; // An opaque handling returned in the SRS.indication - uint16_t bwp_size; // Bandwidth part size [3GPP TS 38.213, sec 12]. Number of contiguous PRBs allocated to the BWP, Value: 1->275 - uint16_t bwp_start; // Bandwidth part start RB index from reference CRB [3GPP TS 38.213, sec 12], Value: 0->274 - uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4 - uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended - uint8_t num_ant_ports; // Number of antenna ports N_SRS_ap [3GPP TS 38.211, Sec 6.4.1.4.1], Value: 0 = 1 port, 1 = 2 ports, 2 = 4 ports - uint8_t num_symbols; // Number of symbols N_SRS_symb [3GPP TS 38.211, Sec 6.4.1.4.1], Value: 0 = 1 symbol, 1 = 2 symbols, 2 = 4 symbols - uint8_t num_repetitions; // Repetition factor R [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 = 1, 1 = 2, 2 = 4 - uint8_t time_start_position; // Starting position in the time domain l_0 [3GPP TS 38.211, Sec 6.4.1.4.1], Note: the MAC undertakes the translation from startPosition to l_0, Value: 0 --> 13 - uint8_t config_index; // SRS bandwidth config index C_SRS [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 63 - uint16_t sequence_id; // SRS sequence ID n_SRS_ID [3GPP TS 38.211, Sec 6.4.1.4.2], Value: 0 --> 1023 - uint8_t bandwidth_index; // SRS bandwidth index B_SRS [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 3 - uint8_t comb_size; // Transmission comb size K_TC [3GPP TS 38.211, Sec 6.4.1.4.2], Value: 0 = comb size 2, 1 = comb size 4, 2 = comb size 8 (Rel16) - uint8_t comb_offset; // Transmission comb offset K'_TC[3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 1 (combSize = 0), Value: 0 --> 3 (combSize = 1), Value: 0 --> 7 (combSize = 2) - uint8_t cyclic_shift; // Cyclic shift n_CS_SRS [3GPP TS 38.211, Sec 6.4.1.4.2], Value: 0 --> 7 (combSize = 0), Value: 0 --> 11 (combSize = 1), Value: 0 --> 5 (combSize = 2) - uint8_t frequency_position; // Frequency domain position n_RRC [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 67 - uint16_t frequency_shift; // Frequency domain shift n_shift [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 268 - uint8_t frequency_hopping; // Frequency hopping b_hop [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 3 - uint8_t group_or_sequence_hopping; // Group or sequence hopping configuration (RRC parameter groupOrSequenceHopping in SRSResource IE), Value: 0 = No hopping, 1 = Group hopping groupOrSequenceHopping, 2 = Sequence hopping - uint8_t resource_type; // Type of SRS resource allocation [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0: aperiodic, 1: semi-persistent, 2: periodic - uint16_t t_srs; // SRS-Periodicity in slots [3GPP TS 38.211, Sec 6.4.1.4.4], Value: 1,2,3,4,5,8,10,16,20,32,40,64,80,160,320,640,1280,2560 - uint16_t t_offset; // Slot offset value [3GPP TS 38.211, Sec 6.4.1.4.3], Value:0->2559 - nfapi_nr_ul_beamforming_t beamforming; + uint16_t rnti; // UE RNTI, Value: 1->65535 + uint32_t handle; // An opaque handling returned in the SRS.indication + uint16_t bwp_size; // Bandwidth part size [3GPP TS 38.213, sec 12]. Number of contiguous PRBs allocated to the BWP, Value: 1->275 + uint16_t bwp_start; // Bandwidth part start RB index from reference CRB [3GPP TS 38.213, sec 12], Value: 0->274 + uint8_t subcarrier_spacing; // subcarrierSpacing [3GPP TS 38.211, sec 4.2], Value:0->4 + uint8_t cyclic_prefix; // Cyclic prefix type [3GPP TS 38.211, sec 4.2], 0: Normal; 1: Extended + uint8_t num_ant_ports; // Number of antenna ports N_SRS_ap [3GPP TS 38.211, Sec 6.4.1.4.1], Value: 0 = 1 port, 1 = 2 ports, 2 = 4 ports + uint8_t num_symbols; // Number of symbols N_SRS_symb [3GPP TS 38.211, Sec 6.4.1.4.1], Value: 0 = 1 symbol, 1 = 2 symbols, 2 = 4 symbols + uint8_t num_repetitions; // Repetition factor R [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 = 1, 1 = 2, 2 = 4 + uint8_t time_start_position; // Starting position in the time domain l_0 [3GPP TS 38.211, Sec 6.4.1.4.1], Note: the MAC undertakes the translation from startPosition to l_0, Value: 0 --> 13 + uint8_t config_index; // SRS bandwidth config index C_SRS [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 63 + uint16_t sequence_id; // SRS sequence ID n_SRS_ID [3GPP TS 38.211, Sec 6.4.1.4.2], Value: 0 --> 1023 + uint8_t bandwidth_index; // SRS bandwidth index B_SRS [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 3 + uint8_t comb_size; // Transmission comb size K_TC [3GPP TS 38.211, Sec 6.4.1.4.2], Value: 0 = comb size 2, 1 = comb size 4, 2 = comb size 8 (Rel16) + uint8_t comb_offset; // Transmission comb offset K'_TC[3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 1 (combSize = 0), Value: 0 --> 3 (combSize = 1), Value: 0 --> 7 (combSize = 2) + uint8_t cyclic_shift; // Cyclic shift n_CS_SRS [3GPP TS 38.211, Sec 6.4.1.4.2], Value: 0 --> 7 (combSize = 0), Value: 0 --> 11 (combSize = 1), Value: 0 --> 5 (combSize = 2) + uint8_t frequency_position; // Frequency domain position n_RRC [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 67 + uint16_t frequency_shift; // Frequency domain shift n_shift [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 268 + uint8_t frequency_hopping; // Frequency hopping b_hop [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 --> 3 + uint8_t group_or_sequence_hopping; // Group or sequence hopping configuration (RRC parameter groupOrSequenceHopping in SRSResource IE), Value: 0 = No hopping, 1 = Group hopping groupOrSequenceHopping, 2 = Sequence hopping + uint8_t resource_type; // Type of SRS resource allocation [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0: aperiodic, 1: semi-persistent, 2: periodic + uint16_t t_srs; // SRS-Periodicity in slots [3GPP TS 38.211, Sec 6.4.1.4.4], Value: 1,2,3,4,5,8,10,16,20,32,40,64,80,160,320,640,1280,2560 + uint16_t t_offset; // Slot offset value [3GPP TS 38.211, Sec 6.4.1.4.3], Value:0->2559 + nfapi_nr_ul_beamforming_t beamforming; } nfapi_nr_srs_pdu_t; typedef enum { From 015a4d945b4869f3b08ee291cdf6aba3c635615a Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Mon, 22 Aug 2022 13:08:14 +0100 Subject: [PATCH 093/136] Enable 2 Downlink layers MIMO and other minor improvements in default configuration files --- .../CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf | 5 ++--- .../CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf | 13 +++++++------ .../CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf | 11 ++++++----- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf index 9d00ae20aa..16bd6d9055 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf @@ -28,7 +28,6 @@ gNBs = ////////// Physical parameters: - min_rxtxtime = 2; do_CSIRS = 1; do_SRS = 1; @@ -283,8 +282,8 @@ RUs = ( local_rf = "yes" nb_tx = 1 nb_rx = 1 - att_tx = 6; - att_rx = 6; + att_tx = 12; + att_rx = 12; bands = [78]; max_pdschReferenceSignalPower = -27; max_rxgain = 114; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf index 5f8bf45232..ef732126bd 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.162PRB.2x2.usrpn300.conf @@ -27,15 +27,14 @@ gNBs = ////////// Physical parameters: - pdsch_AntennaPorts_XP = 1; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; - do_CSIRS = 0; - ul_prbblacklist = "79,80,81,82" + do_CSIRS = 1; pdcch_ConfigSIB1 = ( { controlResourceSetZero = 12; - searchSpaceZero = 10; + searchSpaceZero = 0; } ); @@ -67,7 +66,7 @@ gNBs = initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon initialDLBWPcontrolResourceSetZero = 12; - initialDLBWPsearchSpaceZero = 10; + initialDLBWPsearchSpaceZero = 0; #uplinkConfigCommon #frequencyInfoUL @@ -203,9 +202,11 @@ MACRLCs = ( num_cc = 1; tr_s_preference = "local_L1"; tr_n_preference = "local_RRC"; - pusch_TargetSNRx10 = 150; + pusch_TargetSNRx10 = 300; pucch_TargetSNRx10 = 200; + pusch_FailureThres = 1000; ulsch_max_frame_inactivity = 0; + ul_max_mcs = 28; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf index 24090bef85..50ad80ccc8 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf @@ -27,15 +27,15 @@ gNBs = ////////// Physical parameters: - pdsch_AntennaPorts_XP = 1; + pdsch_AntennaPorts_XP = 2; pusch_AntennaPorts = 2; - do_CSIRS = 0; + do_CSIRS = 1; ul_prbblacklist = "135,136,137,138" pdcch_ConfigSIB1 = ( { controlResourceSetZero = 12; - searchSpaceZero = 10; + searchSpaceZero = 0; } ); @@ -68,7 +68,7 @@ gNBs = initialDLBWPsubcarrierSpacing = 1; #pdcch-ConfigCommon initialDLBWPcontrolResourceSetZero = 12; - initialDLBWPsearchSpaceZero = 10; + initialDLBWPsearchSpaceZero = 0; #uplinkConfigCommon #frequencyInfoUL @@ -237,10 +237,11 @@ MACRLCs = ( num_cc = 1; tr_s_preference = "local_L1"; tr_n_preference = "local_RRC"; - pusch_TargetSNRx10 = 150; + pusch_TargetSNRx10 = 300; pucch_TargetSNRx10 = 200; pusch_FailureThres = 1000; ulsch_max_frame_inactivity = 0; + ul_max_mcs = 28; } ); From f3781c435346016aba2622d8c55a8f571eaf1497 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Thu, 25 Aug 2022 14:56:10 +0100 Subject: [PATCH 094/136] Add band n77 configuration file for N300 with 100 MHz Band n78 is widely used by mobile network operators, we want to transmit over the air without interfere with them, so we set the allocation in this configuration file outside of band n78 --- ...gnb.sa.band77.fr1.273PRB.2x2.usrpn300.conf | 321 ++++++++++++++++++ ...gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf | 321 ------------------ 2 files changed, 321 insertions(+), 321 deletions(-) create mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.fr1.273PRB.2x2.usrpn300.conf delete mode 100644 targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.fr1.273PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.fr1.273PRB.2x2.usrpn300.conf new file mode 100644 index 0000000000..730198653e --- /dev/null +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.fr1.273PRB.2x2.usrpn300.conf @@ -0,0 +1,321 @@ +Active_gNBs = ( "gNB-OAI"); +# Asn1_verbosity, choice in: none, info, annoying +Asn1_verbosity = "none"; + +gNBs = ( +{ + ////////// Identification parameters: + gNB_ID = 0xe00; + gNB_name = "gNB-OAI"; + + // Tracking area code, 0x0000 and 0xfffe are reserved values + tracking_area_code = 1; + plmn_list = ( + { + mcc = 208; + mnc = 99; + mnc_length = 2; + snssaiList = ({ + sst = 1; + sd = 0x1; // 0 false, else true + }); + } + ); + + nr_cellid = 12345678L; + + ////////// Physical parameters: + + pdsch_AntennaPorts_XP = 2; + pusch_AntennaPorts = 2; + do_CSIRS = 1; + do_SRS = 0; + ul_prbblacklist = "135,136,137,138" + + pdcch_ConfigSIB1 = ({ + controlResourceSetZero = 12; + searchSpaceZero = 0; + }); + + servingCellConfigCommon = ( + { + # spCellConfigCommon + + physCellId = 0; + + # downlinkConfigCommon + # frequencyInfoDL + # this is 3900.60 MHz + (134 PRBs + 4 SCs)@30kHz SCS (GSCN: 8158) + absoluteFrequencySSB = 663264; + dl_frequencyBand = 77; + # this is 3900.60 MHz + dl_absoluteFrequencyPointA = 660040; + + # scs-SpecificCarrierList + dl_offstToCarrier = 0; + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_subcarrierSpacing = 1; + dl_carrierBandwidth = 273; + + # initialDownlinkBWP + # genericParameters + # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart)) + initialDLBWPlocationAndBandwidth = 31624; + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialDLBWPsubcarrierSpacing = 1; + + # pdcch-ConfigCommon + initialDLBWPcontrolResourceSetZero = 12; + initialDLBWPsearchSpaceZero = 0; + + # uplinkConfigCommon + # frequencyInfoUL + ul_frequencyBand = 77; + # scs-SpecificCarrierList + ul_offstToCarrier = 0; + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_subcarrierSpacing = 1; + ul_carrierBandwidth = 273; + pMax = 20; + + # initialUplinkBWP + # genericParameters + initialULBWPlocationAndBandwidth = 31624; + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + initialULBWPsubcarrierSpacing = 1; + + # rach-ConfigCommon + # rach-ConfigGeneric + prach_ConfigurationIndex = 98; + # prach_msg1_FDM + # 0 = one, 1=two, 2=four, 3=eight + prach_msg1_FDM = 0; + prach_msg1_FrequencyStart = 0; + zeroCorrelationZoneConfig = 12; + preambleReceivedTargetPower = -90; + # preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) + preambleTransMax = 6; + # powerRampingStep + # 0=dB0,1=dB2,2=dB4,3=dB6 + powerRampingStep = 1; + # ra_ReponseWindow + # 1,2,4,8,10,20,40,80 + ra_ResponseWindow = 4; + # ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR + # 1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen + ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; + # oneHalf (0..15) 4,8,12,16,...60,64 + ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; + # ra_ContentionResolutionTimer + # (0..7) 8,16,24,32,40,48,56,64 + ra_ContentionResolutionTimer = 7; + rsrp_ThresholdSSB = 19; + # prach-RootSequenceIndex_PR + # 1 = 839, 2 = 139 + prach_RootSequenceIndex_PR = 2; + prach_RootSequenceIndex = 1; + # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex + msg1_SubcarrierSpacing = 1, + # restrictedSetConfig + # 0=unrestricted, 1=restricted type A, 2=restricted type B + restrictedSetConfig = 0, + msg3_DeltaPreamble = 1; + p0_NominalWithGrant =-90; + + # pucch-ConfigCommon + # pucchGroupHopping + # 0 = neither, 1= group hopping, 2=sequence hopping + pucchGroupHopping = 0; + hoppingId = 40; + p0_nominal = -70; + + # dmrs_TypeA_position + # 0 = pos2, 1 = pos3 + dmrs_TypeA_Position = 0; + + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + subcarrierSpacing = 1; + + + # ssb_PositionsInBurs_BitmapPR + # 1=short, 2=medium, 3=long + ssb_PositionsInBurst_PR = 2; + ssb_PositionsInBurst_Bitmap = 1; + # ssb_periodicityServingCell + # 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 + ssb_periodicityServingCell = 2; + + #tdd-UL-DL-ConfigurationCommon + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + referenceSubcarrierSpacing = 1; + # pattern1 + # dl_UL_TransmissionPeriodicity + # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 + dl_UL_TransmissionPeriodicity = 6; + nrofDownlinkSlots = 7; + nrofDownlinkSymbols = 6; + nrofUplinkSlots = 2; + nrofUplinkSymbols = 4; + + ssPBCH_BlockPower = -25; + } + ); + + + # Dedicated Serving Cell Configuration + servingCellConfigDedicated = ( + { + # BWP-Downlink + # BWP 1 Configuration + dl_bwp-Id_1 = 1; + dl_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + dl_bwp1_subcarrierSpacing = 1; + + firstActiveDownlinkBWP-Id = 1; #BWP-Id + defaultDownlinkBWP-Id = 1; #BWP-Id + + # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, + # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500, + # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8, + # spare7, spare6, spare5, spare4, spare3, spare2, spare1 } + + # UplinkConfig + # BWP-Uplink + # BWP 1 Configuration + ul_bwp-Id_1 = 1; + ul_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW) + # subcarrierSpacing + # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 + ul_bwp1_subcarrierSpacing = 1; + + firstActiveUplinkBWP-Id = 1; #BWP-Id + } + ); + + + + # ------- SCTP definitions + SCTP : + { + # Number of streams to use in input/output + SCTP_INSTREAMS = 2; + SCTP_OUTSTREAMS = 2; + }; + + + ////////// AMF parameters: + amf_ip_address = ( + { + ipv4 = "192.168.70.132"; + ipv6 = "192:168:30::17"; + active = "yes"; + preference = "ipv4"; + } + ); + + NETWORK_INTERFACES : + { + GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; + GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; + GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; + GNB_PORT_FOR_S1U = 2152; # Spec 2152 + } + +} +); + +MACRLCs = ( +{ + num_cc = 1; + tr_s_preference = "local_L1"; + tr_n_preference = "local_RRC"; + pusch_TargetSNRx10 = 300; + pucch_TargetSNRx10 = 200; + pusch_FailureThres = 1000; + ulsch_max_frame_inactivity = 0; + ul_max_mcs = 28; +} +); + +L1s = ( +{ + num_cc = 1; + tr_n_preference = "local_mac"; + prach_dtx_threshold = 120; + pucch0_dtx_threshold = 80; +} +); + +RUs = ( +{ + local_rf = "yes" + nb_tx = 2; + nb_rx = 2; + att_tx = 0; + att_rx = 0; + bands = [77]; + max_pdschReferenceSignalPower = -27; + max_rxgain = 75; + eNB_instances = [0]; + ##beamforming 1x2 matrix: 1 layer x 2 antennas + bf_weights = [0x00007fff, 0x0000]; + #clock_src = "internal"; + sdr_addrs = "mgmt_addr=192.168.10.2,addr=192.168.10.2,clock_source=internal,time_source=internal" +} +); + +THREAD_STRUCT = ( +{ + #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" + parallel_config = "PARALLEL_SINGLE_THREAD"; + #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" + worker_config = "WORKER_ENABLE"; +} +); + +rfsimulator : +{ + serveraddr = "server"; + serverport = "4043"; + options = (); #("saviq"); or/and "chanmod" + modelname = "AWGN"; + IQfile = "/tmp/rfsimulator.iqs"; +}; + +security = { + # preferred ciphering algorithms + # the first one of the list that an UE supports in chosen + # valid values: nea0, nea1, nea2, nea3 + ciphering_algorithms = ( "nea0" ); + + # preferred integrity algorithms + # the first one of the list that an UE supports in chosen + # valid values: nia0, nia1, nia2, nia3 + integrity_algorithms = ( "nia2", "nia0" ); + + # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter + # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' + drb_ciphering = "yes"; + drb_integrity = "no"; +}; + +log_config : +{ + global_log_level ="info"; + hw_log_level ="info"; + phy_log_level ="info"; + mac_log_level ="info"; + rlc_log_level ="info"; + pdcp_log_level ="info"; + rrc_log_level ="info"; + ngap_log_level ="debug"; + f1ap_log_level ="debug"; +}; diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf deleted file mode 100644 index 50ad80ccc8..0000000000 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.273PRB.2x2.usrpn300.conf +++ /dev/null @@ -1,321 +0,0 @@ -Active_gNBs = ( "gNB-OAI"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -gNBs = -( - { - ////////// Identification parameters: - gNB_ID = 0xe00; - gNB_name = "gNB-OAI"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = 1; - plmn_list = ({ - mcc = 208; - mnc = 99; - mnc_length = 2; - snssaiList = ( - { - sst = 1; - sd = 0x1; // 0 false, else true - } - ); - }); - - nr_cellid = 12345678L; - - ////////// Physical parameters: - - pdsch_AntennaPorts_XP = 2; - pusch_AntennaPorts = 2; - do_CSIRS = 1; - ul_prbblacklist = "135,136,137,138" - - pdcch_ConfigSIB1 = ( - { - controlResourceSetZero = 12; - searchSpaceZero = 0; - } - ); - - servingCellConfigCommon = ( - { - #spCellConfigCommon - - physCellId = 0; - -# downlinkConfigCommon - #frequencyInfoDL - # this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741) - absoluteFrequencySSB = 623232; - dl_frequencyBand = 78; - # this is 3300.24 MHz - dl_absoluteFrequencyPointA = 620016; - #scs-SpecificCarrierList - dl_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - dl_subcarrierSpacing = 1; - dl_carrierBandwidth = 273; - #initialDownlinkBWP - #genericParameters - # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart)) - initialDLBWPlocationAndBandwidth = 31624; - # -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialDLBWPsubcarrierSpacing = 1; - #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 12; - initialDLBWPsearchSpaceZero = 0; - - #uplinkConfigCommon - #frequencyInfoUL - ul_frequencyBand = 78; - #scs-SpecificCarrierList - ul_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - ul_subcarrierSpacing = 1; - ul_carrierBandwidth = 273; - pMax = 20; - #initialUplinkBWP - #genericParameters - initialULBWPlocationAndBandwidth = 31624; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialULBWPsubcarrierSpacing = 1; - #rach-ConfigCommon - #rach-ConfigGeneric - prach_ConfigurationIndex = 98; -#prach_msg1_FDM -#0 = one, 1=two, 2=four, 3=eight - prach_msg1_FDM = 0; - prach_msg1_FrequencyStart = 0; - zeroCorrelationZoneConfig = 12; - preambleReceivedTargetPower = -90; -#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) - preambleTransMax = 6; -#powerRampingStep -# 0=dB0,1=dB2,2=dB4,3=dB6 - powerRampingStep = 1; -#ra_ReponseWindow -#1,2,4,8,10,20,40,80 - ra_ResponseWindow = 4; -#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR -#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen - ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; -#oneHalf (0..15) 4,8,12,16,...60,64 - ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; -#ra_ContentionResolutionTimer -#(0..7) 8,16,24,32,40,48,56,64 - ra_ContentionResolutionTimer = 7; - rsrp_ThresholdSSB = 19; -#prach-RootSequenceIndex_PR -#1 = 839, 2 = 139 - prach_RootSequenceIndex_PR = 2; - prach_RootSequenceIndex = 1; - # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex - # - msg1_SubcarrierSpacing = 1, -# restrictedSetConfig -# 0=unrestricted, 1=restricted type A, 2=restricted type B - restrictedSetConfig = 0, - - msg3_DeltaPreamble = 1; - p0_NominalWithGrant =-90; - -# pucch-ConfigCommon setup : -# pucchGroupHopping -# 0 = neither, 1= group hopping, 2=sequence hopping - pucchGroupHopping = 0; - hoppingId = 40; - p0_nominal = -70; -# ssb_PositionsInBurs_BitmapPR -# 1=short, 2=medium, 3=long - ssb_PositionsInBurst_PR = 2; - ssb_PositionsInBurst_Bitmap = 1; - -# ssb_periodicityServingCell -# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 - ssb_periodicityServingCell = 2; - -# dmrs_TypeA_position -# 0 = pos2, 1 = pos3 - dmrs_TypeA_Position = 0; - -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - subcarrierSpacing = 1; - - - #tdd-UL-DL-ConfigurationCommon -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - referenceSubcarrierSpacing = 1; - # pattern1 - # dl_UL_TransmissionPeriodicity - # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 - dl_UL_TransmissionPeriodicity = 6; - nrofDownlinkSlots = 7; - nrofDownlinkSymbols = 6; - nrofUplinkSlots = 2; - nrofUplinkSymbols = 4; - - ssPBCH_BlockPower = -25; - } - - ); - - -# Dedicated Serving Cell Configuration -servingCellConfigDedicated = ({ - # BWP-Downlink - # BWP 1 Configuration - dl_bwp-Id_1 = 1; - dl_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW) - # subcarrierSpacing - # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - dl_bwp1_subcarrierSpacing = 1; - - firstActiveDownlinkBWP-Id = 1; #BWP-Id - defaultDownlinkBWP-Id = 1; #BWP-Id - - # bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, - # ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500, - # ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8, - # spare7, spare6, spare5, spare4, spare3, spare2, spare1 } - - # UplinkConfig - # BWP-Uplink - # BWP 1 Configuration - ul_bwp-Id_1 = 1; - ul_bwp1_locationAndBandwidth = 1099; // RBstart=0, L=273 (100 MHz BW) - # subcarrierSpacing - # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - ul_bwp1_subcarrierSpacing = 1; - - firstActiveUplinkBWP-Id = 1; #BWP-Id - } -); - - - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - - ////////// AMF parameters: - amf_ip_address = ( { ipv4 = "192.168.70.132"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - - NETWORK_INTERFACES : - { - GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; - GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; - GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; - GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; - GNB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - } -); - -MACRLCs = ( -{ - num_cc = 1; - tr_s_preference = "local_L1"; - tr_n_preference = "local_RRC"; - pusch_TargetSNRx10 = 300; - pucch_TargetSNRx10 = 200; - pusch_FailureThres = 1000; - ulsch_max_frame_inactivity = 0; - ul_max_mcs = 28; -} -); - -L1s = ( -{ - num_cc = 1; - tr_n_preference = "local_mac"; - prach_dtx_threshold = 120; - pucch0_dtx_threshold = 80; -} -); - -RUs = ( -{ - local_rf = "yes" - nb_tx = 2; - nb_rx = 2; - att_tx = 0; - att_rx = 0; - bands = [78]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 75; - eNB_instances = [0]; - ##beamforming 1x2 matrix: 1 layer x 2 antennas - bf_weights = [0x00007fff, 0x0000]; - #clock_src = "internal"; - sdr_addrs = "mgmt_addr=192.168.10.2,addr=192.168.10.2,clock_source=internal,time_source=internal" -} -); - -THREAD_STRUCT = ( -{ - #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" - parallel_config = "PARALLEL_SINGLE_THREAD"; - #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" - worker_config = "WORKER_ENABLE"; -} -); - -rfsimulator : -{ - serveraddr = "server"; - serverport = "4043"; - options = (); #("saviq"); or/and "chanmod" - modelname = "AWGN"; - IQfile = "/tmp/rfsimulator.iqs"; -}; - -security = { - # preferred ciphering algorithms - # the first one of the list that an UE supports in chosen - # valid values: nea0, nea1, nea2, nea3 - ciphering_algorithms = ( "nea0" ); - - # preferred integrity algorithms - # the first one of the list that an UE supports in chosen - # valid values: nia0, nia1, nia2, nia3 - integrity_algorithms = ( "nia2", "nia0" ); - - # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter - # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' - drb_ciphering = "yes"; - drb_integrity = "no"; -}; - -log_config : -{ - global_log_level ="info"; - hw_log_level ="info"; - phy_log_level ="info"; - mac_log_level ="info"; - rlc_log_level ="info"; - pdcp_log_level ="info"; - rrc_log_level ="info"; - ngap_log_level ="debug"; - f1ap_log_level ="debug"; -}; From f1df28637af7ff8834c0803ad59821b52d9537cf Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Thu, 25 Aug 2022 23:23:18 +0200 Subject: [PATCH 095/136] delete conf file --- ....band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf | 314 ------------------ 1 file changed, 314 deletions(-) delete mode 100644 ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf deleted file mode 100644 index ae43581e0b..0000000000 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310mwc.conf +++ /dev/null @@ -1,314 +0,0 @@ -Active_gNBs = ( "gNB-OAI"); -# Asn1_verbosity, choice in: none, info, annoying -Asn1_verbosity = "none"; - -gNBs = -( - { - ////////// Identification parameters: - gNB_CU_ID = 0xe00; - -# cell_type = "CELL_MACRO_GNB"; - - gNB_name = "gNB-OAI"; - - // Tracking area code, 0x0000 and 0xfffe are reserved values - tracking_area_code = 1; - - plmn_list = ({ - mcc = 208; - mnc = 99; - mnc_length = 2; - snssaiList = ( - { - sst = 1; - sd = 0x010203; // 0 false, else true - }, - { - sst = 1; - sd = 0x000001; // 0 false, else true - } - ); - }); - - nr_cellid = 12345678L - -# tr_s_preference = "local_mac" - - ////////// Physical parameters: - - ssb_SubcarrierOffset = 0; - pdsch_AntennaPorts = 1; - pusch_AntennaPorts = 2; - ul_prbblacklist = "79,80,81,82" - min_rxtxtime = 2; - - pdcch_ConfigSIB1 = ( - { - controlResourceSetZero = 11; - searchSpaceZero = 0; - } - ); - - servingCellConfigCommon = ( - { - #spCellConfigCommon - - physCellId = 0; - -# downlinkConfigCommon - #frequencyInfoDL - # this is 3301.68 MHz + 22*12*30e-3 MHz = 3309.6 - #absoluteFrequencySSB = 620640; - # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68 - absoluteFrequencySSB = 621312; - # this is 3503.28 MHz + 22*12*30e-3 MHz = 3511.2 - #absoluteFrequencySSB = 634080; - # this is 3600.48 MHz - #absoluteFrequencySSB = 640032; - #dl_frequencyBand = 78; - # this is 3301.68 MHz - #dl_absoluteFrequencyPointA = 620112; - # this is 3300.60 MHz - dl_absoluteFrequencyPointA = 620040; - # this is 3502.56 MHz - #dl_absoluteFrequencyPointA = 633552; - # this is 3600.48 MHz - #dl_absoluteFrequencyPointA = 640032; - #scs-SpecificCarrierList - dl_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - dl_subcarrierSpacing = 1; - dl_carrierBandwidth = 162; - #initialDownlinkBWP - #genericParameters - # this is RBstart=0,L=106 (275*(L-1))+RBstart - initialDLBWPlocationAndBandwidth = 31899; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialDLBWPsubcarrierSpacing = 1; - #pdcch-ConfigCommon - initialDLBWPcontrolResourceSetZero = 11; - initialDLBWPsearchSpaceZero = 0; - - - - #uplinkConfigCommon - #frequencyInfoUL - ul_frequencyBand = 78; - #scs-SpecificCarrierList - ul_offstToCarrier = 0; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - ul_subcarrierSpacing = 1; - ul_carrierBandwidth = 162; - pMax = 20; - #initialUplinkBWP - #genericParameters - initialULBWPlocationAndBandwidth = 31899; -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - initialULBWPsubcarrierSpacing = 1; - #rach-ConfigCommon - #rach-ConfigGeneric - prach_ConfigurationIndex = 98; -#prach_msg1_FDM -#0 = one, 1=two, 2=four, 3=eight - prach_msg1_FDM = 0; - prach_msg1_FrequencyStart = 0; - zeroCorrelationZoneConfig = 12; - preambleReceivedTargetPower = -104; -#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200) - preambleTransMax = 6; -#powerRampingStep -# 0=dB0,1=dB2,2=dB4,3=dB6 - powerRampingStep = 1; -#ra_ReponseWindow -#1,2,4,8,10,20,40,80 - ra_ResponseWindow = 4; -#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR -#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen - ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 3; -#oneHalf (0..15) 4,8,12,16,...60,64 - ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15; -#ra_ContentionResolutionTimer -#(0..7) 8,16,24,32,40,48,56,64 - ra_ContentionResolutionTimer = 7; - rsrp_ThresholdSSB = 19; -#prach-RootSequenceIndex_PR -#1 = 839, 2 = 139 - prach_RootSequenceIndex_PR = 2; - prach_RootSequenceIndex = 1; - # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex - # - msg1_SubcarrierSpacing = 1, -# restrictedSetConfig -# 0=unrestricted, 1=restricted type A, 2=restricted type B - restrictedSetConfig = 0, - - msg3_DeltaPreamble = 1; - p0_NominalWithGrant =-90; - -# pucch-ConfigCommon setup : -# pucchGroupHopping -# 0 = neither, 1= group hopping, 2=sequence hopping - pucchGroupHopping = 0; - hoppingId = 40; - p0_nominal = -90; -# ssb_PositionsInBurs_BitmapPR -# 1=short, 2=medium, 3=long - ssb_PositionsInBurst_PR = 2; - ssb_PositionsInBurst_Bitmap = 1; - -# ssb_periodicityServingCell -# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 - ssb_periodicityServingCell = 2; - -# dmrs_TypeA_position -# 0 = pos2, 1 = pos3 - dmrs_TypeA_Position = 0; - -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - subcarrierSpacing = 1; - - - #tdd-UL-DL-ConfigurationCommon -# subcarrierSpacing -# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120 - referenceSubcarrierSpacing = 1; - # pattern1 - # dl_UL_TransmissionPeriodicity - # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 - dl_UL_TransmissionPeriodicity = 6; - nrofDownlinkSlots = 6; - nrofDownlinkSymbols = 6; - nrofUplinkSlots = 3; - nrofUplinkSymbols = 4; - - ssPBCH_BlockPower = -25; - } - - ); - - - # ------- SCTP definitions - SCTP : - { - # Number of streams to use in input/output - SCTP_INSTREAMS = 2; - SCTP_OUTSTREAMS = 2; - }; - - ////////// AMF parameters: - amf_ip_address = ( { ipv4 = "192.168.70.132"; - ipv6 = "192:168:30::17"; - active = "yes"; - preference = "ipv4"; - } - ); - - NETWORK_INTERFACES : - { - - GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai"; - GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24"; - GNB_INTERFACE_NAME_FOR_NGU = "demo-oai"; - GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24"; - GNB_PORT_FOR_S1U = 2152; # Spec 2152 - }; - - } -); - -MACRLCs = ( - { - num_cc = 1; - tr_s_preference = "local_L1"; - tr_n_preference = "local_RRC"; - pusch_TargetSNRx10 = 220; - pucch_TargetSNRx10 = 220; - ulsch_max_frame_inactivity = 1; - } -); - -L1s = ( -{ - num_cc = 1; - tr_n_preference = "local_mac"; - prach_dtx_threshold = 120; - thread_pool_size = 8; -# pucch0_dtx_threshold = 150; -} -); - -RUs = ( - { - local_rf = "yes" - nb_tx = 2 - nb_rx = 2 - att_tx = 0 - att_rx = 0; - bands = [78]; - max_pdschReferenceSignalPower = -27; - max_rxgain = 75; - eNB_instances = [0]; - ##beamforming 1x2 matrix: 1 layer x 2 antennas - bf_weights = [0x00007fff, 0x0000]; - ##beamforming 1x4 matrix: 1 layer x 4 antennas - #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000]; - ## beamforming 2x2 matrix: - # bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff]; - ## beamforming 4x4 matrix: - #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; - sf_extension = 0 - sdr_addrs = "addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal" - } -); - -THREAD_STRUCT = ( - { - #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT" - parallel_config = "PARALLEL_RU_L1_SPLIT"; - #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE" - worker_config = "WORKER_ENABLE"; - } -); - -security = { - # preferred ciphering algorithms - # the first one of the list that an UE supports in chosen - # valid values: nea0, nea1, nea2, nea3 - ciphering_algorithms = ( "nea0" ); - - # preferred integrity algorithms - # the first one of the list that an UE supports in chosen - # valid values: nia0, nia1, nia2, nia3 - integrity_algorithms = ( "nia2", "nia0" ); - - # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter - # what 'ciphering_algorithms' configures; same thing for 'drb_integrity' - drb_ciphering = "yes"; - drb_integrity = "no"; -}; - - log_config : - { - global_log_level ="info"; - global_log_verbosity ="medium"; - hw_log_level ="info"; - hw_log_verbosity ="medium"; - phy_log_level ="info"; - phy_log_verbosity ="medium"; - mac_log_level ="info"; - mac_log_verbosity ="high"; - rlc_log_level ="info"; - rlc_log_verbosity ="medium"; - pdcp_log_level ="info"; - pdcp_log_verbosity ="medium"; - rrc_log_level ="info"; - rrc_log_verbosity ="medium"; - f1ap_log_level ="debug"; - f1ap_log_verbosity ="medium"; - }; From 51483a3223d8b8b4fc4f5eb9171bbe20c60859e5 Mon Sep 17 00:00:00 2001 From: francescomani Date: Sun, 21 Aug 2022 18:06:44 +0200 Subject: [PATCH 096/136] add option for limited buffer rate-matching for UL --- .../nfapi/public_inc/fapi_nr_ue_interface.h | 1 + openair1/PHY/CODING/nr_rate_matching.c | 7 ++--- .../PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c | 2 +- openair1/SIMULATION/NR_PHY/ulsim.c | 18 ++++++++--- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 31 ++++++++++++++----- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h | 1 + openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 8 ++--- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 26 ++++++++++++++++ openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 4 +-- .../LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 2 +- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 5 ++- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 16 +++++++++- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 1 + 13 files changed, 95 insertions(+), 27 deletions(-) diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h index a28762d1ff..7c91b06962 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h @@ -333,6 +333,7 @@ typedef struct //Resource Allocation in time domain uint8_t start_symbol_index; uint8_t nr_of_symbols; + uint32_t tbslbrm; //Optional Data only included if indicated in pduBitmap nfapi_nr_ue_pusch_data_t pusch_data; nfapi_nr_ue_pusch_uci_t pusch_uci; diff --git a/openair1/PHY/CODING/nr_rate_matching.c b/openair1/PHY/CODING/nr_rate_matching.c index 06dfcaa4a9..c99bd02fb2 100644 --- a/openair1/PHY/CODING/nr_rate_matching.c +++ b/openair1/PHY/CODING/nr_rate_matching.c @@ -497,10 +497,10 @@ int nr_rate_matching_ldpc_rx(uint32_t Tbslbrm, N = (BG==1)?(66*Z):(50*Z); if (Tbslbrm == 0) - Ncb = N; + Ncb = N; else { - Nref = (3*Tbslbrm/(2*C)); //R_LBRM = 2/3 - Ncb = min(N, Nref); + Nref = (3*Tbslbrm/(2*C)); //R_LBRM = 2/3 + Ncb = min(N, Nref); } ind = (index_k0[BG-1][rvidx]*Ncb/N)*Z; @@ -564,7 +564,6 @@ int nr_rate_matching_ldpc_rx(uint32_t Tbslbrm, } } - return 0; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c index ef952b0152..0ff5d0a2eb 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c @@ -381,7 +381,7 @@ int nr_ulsch_encoding(PHY_VARS_NR_UE *ue, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_IN); start_meas(&ue->ulsch_rate_matching_stats); - if (nr_rate_matching_ldpc(0, + if (nr_rate_matching_ldpc(harq_process->pusch_pdu.tbslbrm, harq_process->BG, *pz, harq_process->d[r], diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 3ac1ec3439..4a5f97a5ec 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -302,7 +302,6 @@ int main(int argc, char **argv) //unsigned char frame_type = 0; NR_DL_FRAME_PARMS *frame_parms; int loglvl = OAILOG_WARNING; - //uint64_t SSB_positions=0x01; uint16_t nb_symb_sch = 12; int start_symbol = 0; uint16_t nb_rb = 50; @@ -337,6 +336,7 @@ int main(int argc, char **argv) uint8_t transform_precoding = transformPrecoder_disabled; // 0 - ENABLE, 1 - DISABLE uint8_t num_dmrs_cdm_grps_no_data = 1; uint8_t mcs_table = 0; + int ilbrm = 0; UE_nr_rxtx_proc_t UE_proc; FILE *scg_fd=NULL; @@ -375,6 +375,7 @@ int main(int argc, char **argv) nb_symb_sch = atoi(optarg); AssertFatal(nb_symb_sch > 0 && nb_symb_sch < 15,"start_symbol %d is not in 1..14\n",nb_symb_sch); break; + case 'c': n_rnti = atoi(optarg); AssertFatal(n_rnti > 0 && n_rnti<=65535,"Illegal n_rnti %x\n",n_rnti); @@ -476,7 +477,7 @@ int main(int argc, char **argv) case 'n': n_trials = atoi(optarg); break; - + case 'p': extended_prefix_flag = 1; break; @@ -561,7 +562,7 @@ int main(int argc, char **argv) break; case 'M': - // SSB_positions = atoi(optarg); + ilbrm = atoi(optarg); break; case 'N': @@ -628,7 +629,6 @@ int main(int argc, char **argv) printf("-n Number of trials to simulate\n"); printf("-p Use extended prefix mode\n"); printf("-q MCS table\n"); - printf("-t Delay spread for multipath channel\n"); printf("-u Set the numerology\n"); printf("-w Start PRB for PUSCH\n"); //printf("-x Transmission mode (1,2,6 for the moment)\n"); @@ -640,7 +640,7 @@ int main(int argc, char **argv) printf("-G Offset of samples to read from file (0 default)\n"); printf("-L \n"); printf("-I Maximum LDPC decoder iterations\n"); - printf("-M Multiple SSB positions in burst\n"); + printf("-M Use limited buffer rate-matching\n"); printf("-N Nid_cell\n"); printf("-O oversampling factor (1,2,4,8,16)\n"); printf("-R N_RB_DL\n"); @@ -922,6 +922,12 @@ int main(int argc, char **argv) printf("num dmrs sym %d\n",number_dmrs_symbols); uint8_t nb_re_dmrs = (dmrs_config_type == pusch_dmrs_type1) ? 6 : 4; + uint32_t tbslbrm = 0; + if (ilbrm) + tbslbrm = nr_compute_tbslbrm(mcs_table, + N_RB_UL, + precod_nbr_layers); + if ((UE->frame_parms.nb_antennas_tx==4)&&(precod_nbr_layers==4)) num_dmrs_cdm_grps_no_data = 2; @@ -1150,6 +1156,7 @@ int main(int argc, char **argv) pusch_pdu->uplink_frequency_shift_7p5khz = 0; pusch_pdu->start_symbol_index = start_symbol; pusch_pdu->nr_of_symbols = nb_symb_sch; + pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = tbslbrm; pusch_pdu->pusch_data.rv_index = rv_index; pusch_pdu->pusch_data.harq_process_id = 0; pusch_pdu->pusch_data.new_data_indicator = trial & 0x1; @@ -1210,6 +1217,7 @@ int main(int argc, char **argv) ul_config.ul_config_list[0].pusch_config_pdu.dmrs_ports = ((1<spCellConfig && cg->spCellConfig->spCellConfigDedicated) { const NR_ServingCellConfig_t *servingCellConfig = cg->spCellConfig->spCellConfigDedicated; - if(servingCellConfig->downlinkBWP_ToAddModList) { - struct NR_ServingCellConfig__downlinkBWP_ToAddModList *BWP_list = servingCellConfig->downlinkBWP_ToAddModList; - for (int i=0; ilist.count; i++) { - NR_BWP_t genericParameters = BWP_list->list.array[i]->bwp_Common->genericParameters; - int curr_bw = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - if (curr_bw > bw) - bw = curr_bw; + if(is_dl) { + if(servingCellConfig->downlinkBWP_ToAddModList) { + const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *BWP_list = servingCellConfig->downlinkBWP_ToAddModList; + for (int i=0; ilist.count; i++) { + NR_BWP_t genericParameters = BWP_list->list.array[i]->bwp_Common->genericParameters; + int curr_bw = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (curr_bw > bw) + bw = curr_bw; + } + } + } + else { + if (servingCellConfig->uplinkConfig && + servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList) { + const struct NR_UplinkConfig__uplinkBWP_ToAddModList *BWP_list = servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList; + for (int i=0; ilist.count; i++) { + NR_BWP_t genericParameters = BWP_list->list.array[i]->bwp_Common->genericParameters; + int curr_bw = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (curr_bw > bw) + bw = curr_bw; + } } } } @@ -4738,4 +4753,4 @@ uint16_t nr_get_csi_bitlen(nr_csi_report_t *csi_report_template, uint8_t csi_rep } return csi_bitlen; -} \ No newline at end of file +} diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h index 3b76faeef1..476c6793c0 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h @@ -143,6 +143,7 @@ uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx); uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset); int get_bw_tbslbrm(int scc_bwpsize, + bool is_dl, NR_CellGroupConfig_t *cg); uint32_t nr_compute_tbslbrm(uint16_t table, diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 0d9383eaf2..b5b3365a42 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -965,13 +965,13 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr NR_BWP_t genericParameters = mac->scc ? mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters : mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters; int BWPSize = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - bw_tbslbrm = get_bw_tbslbrm(BWPSize, mac->cg); + bw_tbslbrm = get_bw_tbslbrm(BWPSize, true, mac->cg); } else bw_tbslbrm = dlsch_config_pdu_1_0->BWPSize; dlsch_config_pdu_1_0->tbslbrm = nr_compute_tbslbrm(dlsch_config_pdu_1_0->mcs_table, - bw_tbslbrm, - 1); + bw_tbslbrm, + 1); /* NDI (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/ dlsch_config_pdu_1_0->ndi = dci->ndi; @@ -1406,7 +1406,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr NR_BWP_t genericParameters = mac->scc ? mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters : mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters; int BWPSize = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int bw_tbslbrm = get_bw_tbslbrm(BWPSize, mac->cg); + int bw_tbslbrm = get_bw_tbslbrm(BWPSize, true, mac->cg); dlsch_config_pdu_1_1->tbslbrm = nr_compute_tbslbrm(dlsch_config_pdu_1_1->mcs_table, bw_tbslbrm, nl_tbslbrm); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 8605550593..9834a4bb87 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -681,6 +681,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, pusch_config_pdu->pusch_data.harq_process_id = 0; pusch_config_pdu->pusch_data.new_data_indicator = 1; // new data pusch_config_pdu->pusch_data.num_cb = 0; + pusch_config_pdu->tbslbrm = 0; } else if (dci) { NR_BWP_Id_t dl_bwp_id = mac->DL_BWP_Id; @@ -863,6 +864,31 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, else N_PRB_oh = 0; + if (mac->cg && + mac->cg->spCellConfig && + mac->cg->spCellConfig->spCellConfigDedicated && + mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig && + mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig && + mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->rateMatching) { + long *maxMIMO_Layers = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers; + if (!maxMIMO_Layers) + maxMIMO_Layers = pusch_Config ? pusch_Config->maxRank : NULL; + AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n"); + int bw_tbslbrm; + if (mac->scc || mac->scc_SIB || mac->cg) { + NR_BWP_t genericParameters = initialUplinkBWP->genericParameters; + int BWPSize = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + bw_tbslbrm = get_bw_tbslbrm(BWPSize, false, mac->cg); + } + else + bw_tbslbrm = pusch_config_pdu->bwp_size; + pusch_config_pdu->tbslbrm = nr_compute_tbslbrm(pusch_config_pdu->mcs_table, + bw_tbslbrm, + *maxMIMO_Layers); + } + else + pusch_config_pdu->tbslbrm = 0; + /* PTRS */ if (ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] && diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 745fc1ae2b..88501c0ea7 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1318,7 +1318,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } int scc_bwpsize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, ra->CellGroup); + int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, true, ra->CellGroup); pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx, bw_tbslbrm, 1); @@ -1699,7 +1699,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, tb_scaling); int scc_bwpsize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, ra->CellGroup); + int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, true, ra->CellGroup); pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx, bw_tbslbrm, 1); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 6aee81fa67..0f7a7e52f8 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -1056,7 +1056,7 @@ void nr_schedule_ue_spec(module_id_t module_id, int nl_tbslbrm = *maxMIMO_Layers < 4 ? *maxMIMO_Layers : 4; // Maximum number of PRBs across all configured DL BWPs int scc_bwpsize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, cg); + int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, true, cg); pdsch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(current_BWP->mcsTableIdx, bw_tbslbrm, nl_tbslbrm); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 1475abc08a..7230ed94f5 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -2217,7 +2217,10 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac, CellGroup->spCellConfig->spCellConfigDedicated) { const NR_ServingCellConfig_t *servingCellConfig = CellGroup->spCellConfig->spCellConfigDedicated; - DL_BWP->pdsch_servingcellconfig = servingCellConfig->pdsch_ServingCellConfig? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL; + DL_BWP->pdsch_servingcellconfig = servingCellConfig->pdsch_ServingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL; + UL_BWP->pusch_servingcellconfig = servingCellConfig->uplinkConfig ? + (servingCellConfig->uplinkConfig->pusch_ServingCellConfig ? servingCellConfig->uplinkConfig->pusch_ServingCellConfig->choice.setup : NULL ) : + NULL; target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; if(UE && UE->Msg3_dcch_dtch) { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 43e88eb9a9..aa6e1920b3 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1683,7 +1683,21 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) pusch_pdu->pusch_data.tb_size = sched_pusch->tb_size; pusch_pdu->pusch_data.num_cb = 0; //CBG not supported - pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = 0; + if(current_BWP->pusch_servingcellconfig && + current_BWP->pusch_servingcellconfig->rateMatching) { + // TBS_LBRM according to section 5.4.2.1 of 38.212 + long *maxMIMO_Layers = current_BWP->pusch_servingcellconfig->ext1->maxMIMO_Layers; + if (!maxMIMO_Layers) + maxMIMO_Layers = current_BWP->pusch_Config->maxRank; + AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n"); + const int scc_bwpsize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, false, cg); + pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(current_BWP->mcs_table, + bw_tbslbrm, + *maxMIMO_Layers); + } + else + pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = 0; LOG_D(NR_MAC,"PUSCH PDU : data_scrambling_identity %x, dmrs_scrambling_id %x\n",pusch_pdu->data_scrambling_id,pusch_pdu->ul_dmrs_scrambling_id); /* TRANSFORM PRECODING --------------------------------------------------------*/ diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 09f3193790..1c8885f398 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -113,6 +113,7 @@ typedef struct NR_UE_UL_BWP { long *cyclicprefix; uint16_t BWPSize; uint16_t BWPStart; + NR_PUSCH_ServingCellConfig_t *pusch_servingcellconfig; NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList; NR_PUSCH_Config_t *pusch_Config; NR_PUCCH_Config_t *pucch_Config; From 313a63f52a46a5dac4b0dd9edb73b1a07e06e566 Mon Sep 17 00:00:00 2001 From: Dhanuja Elizabeth Thomas Date: Sat, 20 Aug 2022 01:11:31 +0200 Subject: [PATCH 097/136] Update 5gcn images for CI - in ci-scripts for l2-sim, rf-sim - in epc.py for OTA tests --- ci-scripts/epc.py | 4 ++-- ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml | 8 ++++---- ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py index 9113d29ac9..a636bf9433 100644 --- a/ci-scripts/epc.py +++ b/ci-scripts/epc.py @@ -253,7 +253,7 @@ class EPCManagement(): logging.debug('Starting OAI CN5G') mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5) mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5) - mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5) + mySSH.command('cd /opt/oai-cn5g-fed-v1.4/docker-compose', '\$', 5) mySSH.command('python3 ./core-network.py '+self.cfgDeploy, '\$', 60) if re.search('start-mini-as-ue', self.cfgDeploy): dFile = 'docker-compose-mini-nrf-asue.yaml' @@ -537,7 +537,7 @@ class EPCManagement(): mySSH.command('docker logs ' + c + ' > ' + self.SourceCodePath + '/logs/' + c + '.log', '\$', 5) logging.debug('Terminating OAI CN5G') - mySSH.command('cd /opt/oai-cn5g-fed-v1.3/docker-compose', '\$', 5) + mySSH.command('cd /opt/oai-cn5g-fed-v1.4/docker-compose', '\$', 5) mySSH.command('python3 ./core-network.py '+self.cfgUnDeploy, '\$', 60) mySSH.command('docker volume prune --force || true', '\$', 60) time.sleep(2) diff --git a/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml b/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml index a28b640e1a..7edcad25a4 100644 --- a/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml +++ b/ci-scripts/yaml_files/5g_l2sim_tdd/docker-compose.yaml @@ -2,7 +2,7 @@ version: '3.8' services: oai-nrf: container_name: "l2sim-oai-nrf" - image: oai-nrf:latest + image: oai-nrf:august-dev environment: - NRF_INTERFACE_NAME_FOR_SBI=eth0 - NRF_INTERFACE_PORT_FOR_SBI=80 @@ -42,7 +42,7 @@ services: ipv4_address: 192.168.71.131 oai-amf: container_name: "l2sim-oai-amf" - image: oai-amf:latest + image: oai-amf:august-dev environment: - TZ=Europe/paris - INSTANCE=0 @@ -110,7 +110,7 @@ services: ipv4_address: 192.168.71.132 oai-smf: container_name: "l2sim-oai-smf" - image: oai-smf:latest + image: oai-smf:august-dev environment: - TZ=Europe/Paris - INSTANCE=0 @@ -156,7 +156,7 @@ services: ipv4_address: 192.168.71.133 oai-spgwu: container_name: "l2sim-oai-spgwu" - image: oai-spgwu-tiny:latest + image: oai-spgwu-tiny:august-dev environment: - TZ=Europe/Paris - PID_DIRECTORY=/var/run diff --git a/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml index 696d8c6698..88188da53e 100644 --- a/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml +++ b/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml @@ -2,7 +2,7 @@ version: '3.8' services: oai-nrf: container_name: "rfsim5g-oai-nrf" - image: oai-nrf:latest + image: oai-nrf:august-dev environment: - NRF_INTERFACE_NAME_FOR_SBI=eth0 - NRF_INTERFACE_PORT_FOR_SBI=80 @@ -42,7 +42,7 @@ services: ipv4_address: 192.168.71.131 oai-amf: container_name: "rfsim5g-oai-amf" - image: oai-amf:latest + image: oai-amf:august-dev environment: - TZ=Europe/paris - INSTANCE=0 @@ -110,7 +110,7 @@ services: ipv4_address: 192.168.71.132 oai-smf: container_name: "rfsim5g-oai-smf" - image: oai-smf:latest + image: oai-smf:august-dev environment: - TZ=Europe/Paris - INSTANCE=0 @@ -156,7 +156,7 @@ services: ipv4_address: 192.168.71.133 oai-spgwu: container_name: "rfsim5g-oai-spgwu" - image: oai-spgwu-tiny:latest + image: oai-spgwu-tiny:august-dev environment: - TZ=Europe/Paris - PID_DIRECTORY=/var/run From 4e434ecf4594976bca2ab821333cc7418d505f5c Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Fri, 26 Aug 2022 11:04:04 +0100 Subject: [PATCH 098/136] Fix buffer overflow for SRS --- openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 2dc368fdb0..2ba020f7cc 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -994,7 +994,11 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, while(((long)&srs_estimated_channel_freq[0][nr_srs_info->sc_list[0] + mem_offset] & 0xF) != 0) { mem_offset++; } - int32_t srs_est[frame_parms->ofdm_symbol_size*(1<num_symbols) + mem_offset] __attribute__ ((aligned(32))); + // filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0} + // The End of OFDM symbol corresponds to the position of last 16384 in the filter + // The multadd_real_vector_complex_scalar applies the remaining 8 zeros of filter, therefore, to avoid a buffer overflow, + // we added 8 in the array size + int32_t srs_est[frame_parms->ofdm_symbol_size*(1<num_symbols) + mem_offset + 8] __attribute__ ((aligned(32))); for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) { From 1124b216573b9109278fdb858a0c0f844e9dd79b Mon Sep 17 00:00:00 2001 From: Hongzhi Wang Date: Fri, 26 Aug 2022 12:28:26 +0200 Subject: [PATCH 099/136] fix warnings --- executables/nr-softmodem.h | 2 +- executables/softmodem-common.c | 2 +- executables/softmodem-common.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/executables/nr-softmodem.h b/executables/nr-softmodem.h index bcfc243fc9..546fe7bee0 100644 --- a/executables/nr-softmodem.h +++ b/executables/nr-softmodem.h @@ -45,7 +45,7 @@ extern uint32_t target_ul_bw; extern uint64_t dlsch_slot_bitmap; extern uint64_t ulsch_slot_bitmap; extern char *uecap_file; -extern uint32_t ldpc_offload_flag; +extern int ldpc_offload_flag; // In nr-gnb.c extern void init_gNB(int single_thread_flag,int wait_for_sync); diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c index 6229fbbbc2..d42c46a895 100644 --- a/executables/softmodem-common.c +++ b/executables/softmodem-common.c @@ -46,7 +46,7 @@ static softmodem_params_t softmodem_params; char *parallel_config=NULL; char *worker_config=NULL; int usrp_tx_thread = 0; -uint32_t ldpc_offload_flag=0; +int ldpc_offload_flag=0; uint8_t nfapi_mode=0; static mapping softmodem_funcs[] = MAPPING_SOFTMODEM_FUNCTIONS; diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 57772ad531..e2fbf279e1 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -283,7 +283,7 @@ extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; extern int usrp_tx_thread; extern uint16_t sl_ahead; extern uint16_t sf_ahead; -extern uint32_t ldpc_offload_flag; +extern int ldpc_offload_flag; extern int oai_exit; void tx_func(void *param); From e026e2018601f3471448151f97df34880e0688eb Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Fri, 26 Aug 2022 11:41:23 +0100 Subject: [PATCH 100/136] Avoid division by 0 for low noise scenario --- openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 2ba020f7cc..c59ef12cc5 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -1174,8 +1174,8 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, } } - *noise_power = calc_power(noise_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length) - + calc_power(noise_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length); + *noise_power = max(calc_power(noise_real,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length) + + calc_power(noise_imag,frame_parms->nb_antennas_rx*nr_srs_info->sc_list_length), 1); *snr = dB_fixed((int32_t)((*signal_power< Date: Thu, 25 Aug 2022 19:07:24 +0200 Subject: [PATCH 101/136] Update T1 Offload scenario file after option change in ulsim --- ci-scripts/xml_files/t1_offload_test.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ci-scripts/xml_files/t1_offload_test.xml b/ci-scripts/xml_files/t1_offload_test.xml index 44a259d74c..9abea4c977 100644 --- a/ci-scripts/xml_files/t1_offload_test.xml +++ b/ci-scripts/xml_files/t1_offload_test.xml @@ -30,25 +30,25 @@ Run_NRulsimTest Run T1 Offload nr_ulsim - -n2 -s30 -m9 -r50 -R106 -o1 + -n2 -s30 -m9 -r50 -R106 -o Run_NRulsimTest Run T1 Offload nr_ulsim - -n2 -s30 -m9 -r106 -R106 -o1 + -n2 -s30 -m9 -r106 -R106 -o Run_NRulsimTest Run T1 Offload nr_ulsim - -n2 -s30 -m16 -r106 -R106 -o1 + -n2 -s30 -m16 -r106 -R106 -o Run_NRulsimTest Run T1 Offload nr_ulsim - -n2 -s30 -m9 -r273 -R273 -o1 + -n2 -s30 -m9 -r273 -R273 -o From da5702e3c9b83c6f17b31f67a2f1558017e92728 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 26 Aug 2022 08:55:23 +0200 Subject: [PATCH 102/136] Use variable for T1 Offload detection --- cmake_targets/CMakeLists.txt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index e3b53d451f..5bcc9f808c 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -831,7 +831,16 @@ TARGET_LINK_LIBRARIES(benetel_5g pthread dl rt m numa) # LDPC offload library ########################################################## -if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") +# there is no generic way to test for T1 Offload, it simply comes with the +# shared object +if (EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") + set(T1_OFFLOAD_FOUND TRUE) +else() + set(T1_OFFLOAD_FOUND FALSE) +endif() + +if(T1_OFFLOAD_FOUND) + message(STATUS "T1 Offload support detected") add_library(ldpc_offload MODULE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c) set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include -DALLOW_EXPERIMENTAL_API") @@ -840,6 +849,8 @@ SET(T1_DPDK_LIBS "-Wl,-rpath /usr/local/lib64 -L/usr/local/lib64 -lrte_node -lrt target_link_libraries(ldpc_offload ${T1_DPDK_LIBS}) target_link_libraries(ldpc_offload pthread dl rt m numa) +else() + message(STATUS "No T1 Offload support detected") endif () ########################################################## @@ -2790,7 +2801,7 @@ target_link_libraries (nr-softmodem ${T_LIB}) add_dependencies( nr-softmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc) -if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") +if(T1_OFFLOAD_FOUND) add_dependencies( nr-softmodem ldpc_offload) endif () @@ -3003,7 +3014,7 @@ add_executable(nr_ulsim ${SHLIB_LOADER_SOURCES} ) -if(EXISTS "/usr/local/lib64/librte_pmd_hpac_sdfec_pmd.so") +if(T1_OFFLOAD_FOUND) add_dependencies( nr_ulsim ldpc_offload) endif () From a4eed55cea3b8054ce7902bd9a6a168ce4d69bb6 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Fri, 26 Aug 2022 09:04:34 +0200 Subject: [PATCH 103/136] Detect DPDK using PkgConfig --- cmake_targets/CMakeLists.txt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 5bcc9f808c..d3868da6cd 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -841,14 +841,12 @@ endif() if(T1_OFFLOAD_FOUND) message(STATUS "T1 Offload support detected") -add_library(ldpc_offload MODULE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c) - -set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-include rte_config.h -march=native -I/usr/local/include -DALLOW_EXPERIMENTAL_API") - -SET(T1_DPDK_LIBS "-Wl,-rpath /usr/local/lib64 -L/usr/local/lib64 -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,--whole-archive -L/usr/local/lib64 -lrte_common_cpt -lrte_common_dpaax -lrte_common_iavf -lrte_common_octeontx -lrte_common_octeontx2 -lrte_bus_dpaa -lrte_bus_fslmc -lrte_bus_ifpga -lrte_bus_pci -lrte_bus_vdev -lrte_bus_vmbus -lrte_mempool_bucket -lrte_mempool_dpaa -lrte_mempool_dpaa2 -lrte_mempool_octeontx -lrte_mempool_octeontx2 -lrte_mempool_ring -lrte_mempool_stack -lrte_pmd_af_packet -lrte_pmd_ark -lrte_pmd_hns3 -lrte_pmd_iavf -lrte_pmd_ice -lrte_pmd_igc -lrte_pmd_ixgbe -lrte_pmd_kni -lrte_pmd_liquidio -lrte_pmd_memif -lrte_pmd_netvsc -lrte_pmd_nfp -lrte_pmd_null -lrte_pmd_octeontx -lrte_pmd_octeontx2 -lrte_pmd_pcap -lrte_pmd_pfe -lrte_pmd_qede -lrte_pmd_ring -lrte_pmd_sfc -lrte_pmd_softnic -lrte_pmd_tap -lrte_pmd_thunderx -lrte_pmd_vdev_netvsc -lrte_pmd_vhost -lrte_pmd_virtio -lrte_pmd_vmxnet3 -lrte_rawdev_dpaa2_cmdif -lrte_rawdev_dpaa2_qdma -lrte_rawdev_ioat -lrte_rawdev_ntb -lrte_rawdev_octeontx2_dma -lrte_rawdev_octeontx2_ep -lrte_rawdev_skeleton -lrte_pmd_caam_jr -lrte_pmd_ccp -lrte_pmd_dpaa_sec -lrte_pmd_dpaa2_sec -lrte_pmd_nitrox -lrte_pmd_null_crypto -lrte_pmd_octeontx_crypto -lrte_pmd_octeontx2_crypto -lrte_pmd_openssl -lrte_pmd_crypto_scheduler -lrte_pmd_virtio_crypto -lrte_pmd_octeontx_compress -lrte_pmd_qat -lrte_pmd_zlib -lrte_pmd_ifc -lrte_pmd_dpaa_event -lrte_pmd_dpaa2_event -lrte_pmd_octeontx2_event -lrte_pmd_opdl_event -lrte_pmd_skeleton_event -lrte_pmd_sw_event -lrte_pmd_dsw_event -lrte_pmd_octeontx_event -lrte_pmd_bbdev_null -lrte_pmd_bbdev_fpga_5gnr_fec -lrte_pmd_hpac_sdfec_pmd -Wl,--no-whole-archive -lrte_node -lrte_graph -lrte_bpf -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_rawdev -lrte_pdump -lrte_power -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -Wl,-Bdynamic -pthread -lm -ldl -lnuma -lpcap") - -target_link_libraries(ldpc_offload ${T1_DPDK_LIBS}) -target_link_libraries(ldpc_offload pthread dl rt m numa) + set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/usr/local/lib64/pkgconfig/") + pkg_search_module(LIBDPDK REQUIRED libdpdk=20.05.0) + add_library(ldpc_offload MODULE ${OPENAIR1_DIR}/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c) + set_target_properties(ldpc_offload PROPERTIES COMPILE_FLAGS "-DALLOW_EXPERIMENTAL_API") + target_compile_options(ldpc_offload PRIVATE ${LIBDPDK_CFLAGS}) + target_link_libraries(ldpc_offload ${LIBDPDK_LDFLAGS} rte_pmd_hpac_sdfec_pmd "-Wl,-rpath /usr/local/lib64") else() message(STATUS "No T1 Offload support detected") endif () From 030e0c40aaab2956c7e0fb89ed582fec7489a839 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 25 Jul 2022 16:49:12 +0200 Subject: [PATCH 104/136] Add .clang-format file --- .clang-format | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000000..4574bee4f2 --- /dev/null +++ b/.clang-format @@ -0,0 +1,106 @@ +--- +Language: Cpp +# BasedOnStyle: Google +AccessModifierOffset: -1 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Left +AlignOperands: true +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: true +BinPackArguments: false +BinPackParameters: false +BraceWrapping: + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: NonAssignment +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: false +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakStringLiterals: true +ColumnLimit: 200 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: true +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^' + Priority: 1 + - Regex: '^<.*\.h>' + Priority: 1 + - Regex: '^<.*' + Priority: 1 + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '([-_](test|unittest))?$' +IndentCaseLabels: true +IndentPPDirectives: None +IndentWidth: 2 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: false +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 1 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 200 +PointerAlignment: Right +ReflowComments: true +SortIncludes: false +SortUsingDeclarations: false +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +TabWidth: 2 +UseTab: Never +... + From d0079ce5545e5635bb5faa79cd14e759806c60e7 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 25 Jul 2022 16:49:26 +0200 Subject: [PATCH 105/136] Add clang-format specific pre-commit hook --- pre-commit-clang | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 pre-commit-clang diff --git a/pre-commit-clang b/pre-commit-clang new file mode 100644 index 0000000000..f7b219a7d5 --- /dev/null +++ b/pre-commit-clang @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# +# Runs clang-format on changed regions before commit. +# +# To install this, copy it to .git/hooks/pre-commit in your repo. +# Remaining installation checks/instructions will be printed when you commit. +# + +read -d '' help <<- EOF +This repository requires you to install the clang-format command. This hook has +been tested with clang-format-10, so remove all previous versions and reinstall: +$ sudo apt-get remove clang-format-* +$ sudo apt-get install clang-format-10 +You should now have clang-format-10 installed. Then, update the configuration +as follows: +$ git config --global clangFormat.binary clang-format-10 +$ git config --global clangFormat.style file +$ git config --global alias.clang-format clang-format-10 +EOF + +check_clang_format() { + if hash git clang-format 2>/dev/null; then + return + else + echo "SETUP ERROR: no git clang-format executable found, or it is not executable" + echo "$help" + exit 1 + fi +} + +check_git_config() { + if [[ "$(git config --get clangFormat.binary)" != "clang-format-10" ]]; then + echo "SETUP ERROR: git config clangFormat.binary should be \"clang-format-10\"." + echo "$help" + exit 1 + fi + if [[ "$(git config --get clangFormat.style)" != "file" ]]; then + echo "SETUP ERROR: git config clangFormat.style should be \"file\"." + echo "$help" + exit 1 + fi +} + +check_clang_format +check_git_config + +readonly out=$(git clang-format -v --diff) + +if [[ "$out" == *"no modified files to format"* ]]; then exit 0; fi +if [[ "$out" == *"clang-format did not modify any files"* ]]; then exit 0; fi + +echo "ERROR: the code to be committed is not formatted properly" +echo "you need to run \"git clang-format\" on your commit" +exit 1 From af6059d4ab8754c430b6b0ca85597048710a46f6 Mon Sep 17 00:00:00 2001 From: Cedric Roux Date: Wed, 17 Aug 2022 12:48:01 +0200 Subject: [PATCH 106/136] clang-format: open-brace at column one to start the body of a function --- .clang-format | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.clang-format b/.clang-format index 4574bee4f2..f61776f9e2 100644 --- a/.clang-format +++ b/.clang-format @@ -24,7 +24,7 @@ BraceWrapping: AfterClass: false AfterControlStatement: false AfterEnum: false - AfterFunction: false + AfterFunction: true AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false From e87dd85db166e51c34ff0c8f0a3117d3f6298f95 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Wed, 17 Aug 2022 21:04:12 +0200 Subject: [PATCH 107/136] Bitfield colon spacing after the colon --- .clang-format | 1 + 1 file changed, 1 insertion(+) diff --git a/.clang-format b/.clang-format index f61776f9e2..6843818d6e 100644 --- a/.clang-format +++ b/.clang-format @@ -20,6 +20,7 @@ AlwaysBreakBeforeMultilineStrings: true AlwaysBreakTemplateDeclarations: true BinPackArguments: false BinPackParameters: false +BitFieldColonSpacing: After BraceWrapping: AfterClass: false AfterControlStatement: false From f3cd2c9aca3811a29a05872e616bd8995bbfd950 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 22 Aug 2022 13:35:56 +0200 Subject: [PATCH 108/136] Remove astyle --- ci-scripts/Jenkinsfile-gitlab | 15 +- ci-scripts/astyle-options.txt | 26 ---- ci-scripts/checkCodingFormattingRules.sh | 26 +--- ci-scripts/cls_static_code_analysis.py | 14 -- .../docker/Dockerfile.formatting.bionic | 4 - ci-scripts/reportBuildLocally.sh | 137 +++++++----------- cmake_targets/tools/indent_source_code | 68 --------- pre-commit | 31 ---- 8 files changed, 58 insertions(+), 263 deletions(-) delete mode 100644 ci-scripts/astyle-options.txt delete mode 100755 cmake_targets/tools/indent_source_code delete mode 100644 pre-commit diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab index 784588357d..10b7034199 100644 --- a/ci-scripts/Jenkinsfile-gitlab +++ b/ci-scripts/Jenkinsfile-gitlab @@ -111,17 +111,7 @@ pipeline { sh "./ci-scripts/doGitLabMerge.sh --src-branch ${env.gitlabSourceBranch} --src-commit ${env.gitlabMergeRequestLastCommit} --target-branch ${env.gitlabTargetBranch} --target-commit ${GIT_COMMIT}" sh "zip -r -qq localZip.zip ." - // Running astyle options on the list of modified files by the merge request - // For the moment, there is no fail criteria. Just a notification of number of files that do not follow - sh "./ci-scripts/checkCodingFormattingRules.sh --src-branch ${env.gitlabSourceBranch} --target-branch ${env.gitlabTargetBranch}" - def res=readFile('./oai_rules_result.txt').trim(); - if ("0".equals(res)) { - def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): All Changed files in Merge Request follow OAI Formatting Rules" - addGitLabMRComment comment: message - } else { - def message = "OAI " + JOB_NAME + " build (" + BUILD_ID + "): Some Changed files in Merge Request DO NOT follow OAI Formatting Rules" - addGitLabMRComment comment: message - } + // here was an astyle formatting check, with corresponding messages. The same could be done with clang-format } else { echo "Git Branch is ${GIT_BRANCH}" echo "Git Commit is ${GIT_COMMIT}" @@ -132,9 +122,6 @@ pipeline { sh "git log -n1 --pretty=format:\"%s\" > .git/CI_COMMIT_MSG" sh "zip -r -qq localZip.zip ." - // Running astyle options on all C/H files in the repository - // For the moment, there is no fail criteria. Just a notification of number of files that do not follow - sh "./ci-scripts/checkCodingFormattingRules.sh" } } } diff --git a/ci-scripts/astyle-options.txt b/ci-scripts/astyle-options.txt deleted file mode 100644 index 81c4d68ace..0000000000 --- a/ci-scripts/astyle-options.txt +++ /dev/null @@ -1,26 +0,0 @@ -# OAI is using a style that is similar to the Google style ---style=google -# long options can be written without the preceding '--' -# Convert tabs to spaces -convert-tabs -# Indentation is 2 spaces -indent=spaces=2 -# Indent 'switch' blocks so that the 'case X:' statements are indented in the switch block. -indent-switches -# Indent preprocessor blocks at bracket level 0. -indent-preproc-block -# Indent multi-line preprocessor #define statements. -indent-preproc-define -# Indent C++ comments beginning in column one. -indent-col1-comments -# Pad empty lines around header blocks -break-blocks -delete-empty-lines -# Attach a pointer or reference operator (*, &, or ^) to the variable name (right) -align-pointer=name -# The code line length is 200 characters/columns (this is the maximum allowed by astyle) -max-code-length=200 -# If the line contains logical conditionals they will be placed first on the new line. -break-after-logical -# Force use of the linux end of line -lineend=linux diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh index c29941cade..38447674df 100755 --- a/ci-scripts/checkCodingFormattingRules.sh +++ b/ci-scripts/checkCodingFormattingRules.sh @@ -24,8 +24,6 @@ function usage { echo "OAI Coding / Formatting Guideline Check script" echo " Original Author: Raphael Defosseux" echo "" - echo " Requirement: astyle shall be installed" - echo "" echo " By default (no options) the complete repository will be checked" echo " In case of merge request, provided source and target branch," echo " the script will check only the modified files" @@ -57,11 +55,10 @@ fi if [ $# -eq 0 ] then - echo " ---- Checking the whole repository ----" - echo "" - NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive --exclude=ci-scripts --exclude=cmake_targets *.c *.h | grep -c Formatted || true` - echo "Nb Files that do NOT follow OAI rules: $NB_FILES_TO_FORMAT" - echo $NB_FILES_TO_FORMAT > ./oai_rules_result.txt + # in this file we previously had a list of files that were not properly + # formatted. At the time of this MR, the Jenkinsfile expects this file, so + # we simply produce an empty one + touch ./oai_rules_result.txt # Testing Circular Dependencies protection awk '/#[ \t]*ifndef/ { gsub("^.*ifndef *",""); if (names[$1]!="") print "files with same {define ", FILENAME, names[$1]; names[$1]=FILENAME } /#[ \t]*define/ { gsub("^.*define *",""); if(names[$1]!=FILENAME) print "error in declaration", FILENAME, $1, names[$1]; nextfile }' `find openair* common targets executables -name *.h |grep -v LFDS` > header-files-w-incorrect-define.txt @@ -151,10 +148,6 @@ echo "" # Retrieve the list of modified files since the latest develop commit MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-status | egrep "^M|^A" | sed -e "s@^M\t*@@" -e "s@^A\t*@@" | sort | uniq` NB_TO_FORMAT=0 -if [ -f oai_rules_result_list.txt ] -then - rm -f oai_rules_result_list.txt -fi if [ -f header-files-w-incorrect-define.txt ] then rm -f header-files-w-incorrect-define.txt @@ -178,13 +171,6 @@ do EXT="${filename##*.}" if [ $EXT = "c" ] || [ $EXT = "h" ] || [ $EXT = "cpp" ] || [ $EXT = "hpp" ] then - TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt $FULLFILE | grep -c Formatted || true` - NB_TO_FORMAT=$((NB_TO_FORMAT + TO_FORMAT)) - if [ $TO_FORMAT -ne 0 ] - then - echo $FULLFILE - echo $FULLFILE >> ./oai_rules_result_list.txt - fi # Testing if explicit GNU GPL license banner GNU_EXCEPTION=`echo $FULLFILE | egrep -c "openair3/NAS/COMMON/milenage.h" || true` if [ $GNU_EXCEPTION -eq 0 ] @@ -215,9 +201,5 @@ do fi done rm -f header-files-w-incorrect-define-tmp.txt -echo "" -echo " ----------------------------------------------------------" -echo "Nb Files that do NOT follow OAI rules: $NB_TO_FORMAT" -echo $NB_TO_FORMAT > ./oai_rules_result.txt exit 0 diff --git a/ci-scripts/cls_static_code_analysis.py b/ci-scripts/cls_static_code_analysis.py index 5b45b48ba6..131f2d72bc 100644 --- a/ci-scripts/cls_static_code_analysis.py +++ b/ci-scripts/cls_static_code_analysis.py @@ -321,20 +321,6 @@ class StaticCodeAnalysis(): if ret is not None: analyzed = True if analyzed: - ret = re.search('Nb Files that do NOT follow OAI rules: (?P[0-9\.]+)', str(line)) - if ret is not None: - nbFilesNotFormatted = int(ret.group('nb_errors')) - - if re.search('=== Files not properly formatted ===', str(line)) is not None: - listFiles = True - if listFiles: - if re.search('Removing intermediate container', str(line)) is not None: - listFiles = False - elif re.search('Running in|Files not properly formatted', str(line)) is not None: - pass - else: - listFilesNotFormatted.append(str(line).strip()) - if re.search('=== Files with incorrect define protection ===', str(line)) is not None: circularHeaderDependency = True if circularHeaderDependency: diff --git a/ci-scripts/docker/Dockerfile.formatting.bionic b/ci-scripts/docker/Dockerfile.formatting.bionic index 01417a3bdb..47fd2a08d0 100644 --- a/ci-scripts/docker/Dockerfile.formatting.bionic +++ b/ci-scripts/docker/Dockerfile.formatting.bionic @@ -8,7 +8,6 @@ ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \ DEBIAN_FRONTEND=noninteractive apt-get install --yes \ - astyle \ gawk \ git @@ -18,9 +17,6 @@ COPY . . RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then echo 'Source Branch = $SRC_BRANCH'; echo 'Target Branch = $TARGET_BRANCH'; else echo 'Push to develop'; fi" RUN /bin/bash -c "if [[ -v MERGE_REQUEST ]]; then ./ci-scripts/checkCodingFormattingRules.sh --src-branch $SRC_BRANCH --target-branch $TARGET_BRANCH; else ./ci-scripts/checkCodingFormattingRules.sh; fi" -RUN echo "=== Files not properly formatted ===" && \ - /bin/bash -c "if [[ -f oai_rules_result_list.txt ]]; then cat oai_rules_result_list.txt; fi" - RUN echo "=== Files with incorrect define protection ===" && \ /bin/bash -c "if [[ -f header-files-w-incorrect-define.txt ]]; then cat header-files-w-incorrect-define.txt; fi" diff --git a/ci-scripts/reportBuildLocally.sh b/ci-scripts/reportBuildLocally.sh index bcd3e2f7fe..894eb85be1 100755 --- a/ci-scripts/reportBuildLocally.sh +++ b/ci-scripts/reportBuildLocally.sh @@ -463,106 +463,75 @@ function report_build { echo " " >> ./build_results.html echo "

Build Summary

" >> ./build_results.html - if [ -f ./oai_rules_result.txt ] + echo "

OAI Coding / Formatting Guidelines Check

" >> ./build_results.html + if [ -f ./header-files-w-incorrect-define.txt ] then - echo "

OAI Coding / Formatting Guidelines Check

" >> ./build_results.html - NB_FILES=`cat ./oai_rules_result.txt` - if [ $NB_FILES = "0" ] - then + NB_FILES_IN_ERROR=`wc -l ./header-files-w-incorrect-define.txt | sed -e "s@ .*@@"` + if [ $NB_FILES_IN_ERROR -eq 0 ] + then echo "
" >> ./build_results.html - if [ $PU_TRIG -eq 1 ]; then echo " All files in repository follow OAI rules. " >> ./build_results.html; fi - if [ $MR_TRIG -eq 1 ]; then echo " All modified files in Merge-Request follow OAI rules. " >> ./build_results.html; fi + if [ $MR_TRIG -eq 1 ]; then echo " No Issue for CIRCULAR DEPENDENCY PROTECTION in modified files" >> ./build_results.html; fi + if [ $PU_TRIG -eq 1 ]; then echo " No Issue for CIRCULAR DEPENDENCY PROTECTION in the whole repository" >> ./build_results.html; fi echo "
" >> ./build_results.html else echo "
" >> ./build_results.html - if [ $PU_TRIG -eq 1 ]; then echo " $NB_FILES files in repository DO NOT follow OAI rules. " >> ./build_results.html; fi - if [ $MR_TRIG -eq 1 ]; then echo " $NB_FILES modified files in Merge-Request DO NOT follow OAI rules. " >> ./build_results.html; fi + if [ $MR_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} modified files MAY NOT HAVE CIRCULAR DEPENDENCY PROTECTION" >> ./build_results.html; fi + if [ $PU_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} files in repository MAY NOT HAVE CIRCULAR DEPENDENCY PROTECTION in the whole repository" >> ./build_results.html; fi echo "
" >> ./build_results.html - fi - if [ -f ./oai_rules_result_list.txt ] - then - echo " " >> ./build_results.html - echo "
" >> ./build_results.html - echo "

Please apply the following command to this(ese) file(s):

" >> ./build_results.html - echo "

astyle --options=ci-scripts/astyle-options.txt filename(s)

" >> ./build_results.html + echo " " >> ./build_results.html + echo "
" >> ./build_results.html echo " " >> ./build_results.html echo " " >> ./build_results.html - echo " " >> ./build_results.html + echo " " >> ./build_results.html + echo " " >> ./build_results.html + echo " " >> ./build_results.html echo " " >> ./build_results.html - awk '{print " "}' ./oai_rules_result_list.txt >> ./build_results.html + awk '{if($0 ~/error in/){print " "};if($0 ~/files with same/){print " "}}' ./header-files-w-incorrect-define.txt >> ./build_results.html echo "
FilenamePotential IssueImpacted FileIncorrect Macro
"$1"
error in declaration"$4""$5"
files with same #define"$5""$6"
" >> ./build_results.html echo "
" >> ./build_results.html echo "
" >> ./build_results.html fi - if [ -f ./header-files-w-incorrect-define.txt ] + fi + if [ -f ./files-w-gnu-gpl-license-banner.txt ] + then + NB_FILES_IN_ERROR=`wc -l ./files-w-gnu-gpl-license-banner.txt | sed -e "s@ .*@@"` + if [ $NB_FILES_IN_ERROR -ne 0 ] then - NB_FILES_IN_ERROR=`wc -l ./header-files-w-incorrect-define.txt | sed -e "s@ .*@@"` - if [ $NB_FILES_IN_ERROR -eq 0 ] - then - echo "
" >> ./build_results.html - if [ $MR_TRIG -eq 1 ]; then echo " No Issue for CIRCULAR DEPENDENCY PROTECTION in modified files" >> ./build_results.html; fi - if [ $PU_TRIG -eq 1 ]; then echo " No Issue for CIRCULAR DEPENDENCY PROTECTION in the whole repository" >> ./build_results.html; fi - echo "
" >> ./build_results.html - else - echo "
" >> ./build_results.html - if [ $MR_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} modified files MAY NOT HAVE CIRCULAR DEPENDENCY PROTECTION" >> ./build_results.html; fi - if [ $PU_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} files in repository MAY NOT HAVE CIRCULAR DEPENDENCY PROTECTION in the whole repository" >> ./build_results.html; fi - echo "
" >> ./build_results.html - echo " " >> ./build_results.html - echo "
" >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - awk '{if($0 ~/error in/){print " "};if($0 ~/files with same/){print " "}}' ./header-files-w-incorrect-define.txt >> ./build_results.html - echo "
Potential IssueImpacted FileIncorrect Macro
error in declaration"$4""$5"
files with same #define"$5""$6"
" >> ./build_results.html - echo "
" >> ./build_results.html - echo "
" >> ./build_results.html - fi + echo "
" >> ./build_results.html + if [ $MR_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} modified files HAVE a GNU GPL license banner" >> ./build_results.html; fi + if [ $PU_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} files in repository HAVE a GNU GPL license banner" >> ./build_results.html; fi + echo "
" >> ./build_results.html + echo " " >> ./build_results.html + echo "
" >> ./build_results.html + echo " " >> ./build_results.html + echo " " >> ./build_results.html + echo " " >> ./build_results.html + echo " " >> ./build_results.html + awk '{print " "}' ./files-w-gnu-gpl-license-banner.txt >> ./build_results.html + echo "
Filename
"$1"
" >> ./build_results.html + echo "
" >> ./build_results.html + echo "
" >> ./build_results.html fi - if [ -f ./files-w-gnu-gpl-license-banner.txt ] + fi + if [ -f ./files-w-suspect-banner.txt ] + then + NB_FILES_IN_ERROR=`wc -l ./files-w-suspect-banner.txt | sed -e "s@ .*@@"` + if [ $NB_FILES_IN_ERROR -ne 0 ] then - NB_FILES_IN_ERROR=`wc -l ./files-w-gnu-gpl-license-banner.txt | sed -e "s@ .*@@"` - if [ $NB_FILES_IN_ERROR -ne 0 ] - then - echo "
" >> ./build_results.html - if [ $MR_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} modified files HAVE a GNU GPL license banner" >> ./build_results.html; fi - if [ $PU_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} files in repository HAVE a GNU GPL license banner" >> ./build_results.html; fi - echo "
" >> ./build_results.html - echo " " >> ./build_results.html - echo "
" >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - awk '{print " "}' ./files-w-gnu-gpl-license-banner.txt >> ./build_results.html - echo "
Filename
"$1"
" >> ./build_results.html - echo "
" >> ./build_results.html - echo "
" >> ./build_results.html - fi - fi - if [ -f ./files-w-suspect-banner.txt ] - then - NB_FILES_IN_ERROR=`wc -l ./files-w-suspect-banner.txt | sed -e "s@ .*@@"` - if [ $NB_FILES_IN_ERROR -ne 0 ] - then - echo "
" >> ./build_results.html - if [ $MR_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} modified files HAVE a suspect license banner" >> ./build_results.html; fi - if [ $PU_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} files in repository HAVE a suspect license banner" >> ./build_results.html; fi - echo "
" >> ./build_results.html - echo " " >> ./build_results.html - echo "
" >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - echo " " >> ./build_results.html - awk '{print " "}' ././files-w-suspect-banner.txt >> ./build_results.html - echo "
Filename
"$1"
" >> ./build_results.html - echo "
" >> ./build_results.html - echo "
" >> ./build_results.html - fi + echo "
" >> ./build_results.html + if [ $MR_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} modified files HAVE a suspect license banner" >> ./build_results.html; fi + if [ $PU_TRIG -eq 1 ]; then echo " ${NB_FILES_IN_ERROR} files in repository HAVE a suspect license banner" >> ./build_results.html; fi + echo "
" >> ./build_results.html + echo " " >> ./build_results.html + echo "
" >> ./build_results.html + echo " " >> ./build_results.html + echo " " >> ./build_results.html + echo " " >> ./build_results.html + echo " " >> ./build_results.html + awk '{print " "}' ././files-w-suspect-banner.txt >> ./build_results.html + echo "
Filename
"$1"
" >> ./build_results.html + echo "
" >> ./build_results.html + echo "
" >> ./build_results.html fi fi diff --git a/cmake_targets/tools/indent_source_code b/cmake_targets/tools/indent_source_code deleted file mode 100755 index a16914a91d..0000000000 --- a/cmake_targets/tools/indent_source_code +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash -#/* -# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more -# * contributor license agreements. See the NOTICE file distributed with -# * this work for additional information regarding copyright ownership. -# * The OpenAirInterface Software Alliance licenses this file to You under -# * the OAI Public License, Version 1.1 (the "License"); you may not use this file -# * except in compliance with the License. -# * You may obtain a copy of the License at -# * -# * http://www.openairinterface.org/?page_id=698 -# * -# * Unless required by applicable law or agreed to in writing, software -# * distributed under the License is distributed on an "AS IS" BASIS, -# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# * See the License for the specific language governing permissions and -# * limitations under the License. -# *------------------------------------------------------------------------------- -# * For more information about the OpenAirInterface (OAI) Software Alliance: -# * contact@openairinterface.org -# */ - -# file indent_source_code -# brief -# author Lionel Gauthier -# company Eurecom -# email: lionel.gauthier@eurecom.fr -# -################################ -# include helper functions -################################ -THIS_SCRIPT_PATH=$(dirname $(readlink -f $0)) -source $THIS_SCRIPT_PATH/build_helper - -function main() -{ - local MAX_CODE_LENGTH=200 - local INDENT_SPACES=2 -set_openair_env - - - # remove trailing white spaces - #find $OPENAIR_DIR/openair1 -type f \( -name '*.c' -o -name '*.h' \) -exec sed --in-place 's/[[:space:]]\+$//' {} \+ - #find $OPENAIR_DIR/openair2 -type f \( -name '*.c' -o -name '*.h' \) -exec sed --in-place 's/[[:space:]]\+$//' {} \+ - #find $OPENAIR_DIR/openair3 -type f \( -name '*.c' -o -name '*.h' \) -exec sed --in-place 's/[[:space:]]\+$//' {} \+ - #find $OPENAIR_DIR/openair3 -type f \( -name '*.c' -o -name '*.h' \) -exec sed --in-place 's/[[:space:]]\+$//' {} \+ - #find $OPENAIR_DIR/targets -type f \( -name '*.c' -o -name '*.h' \) -exec sed --in-place 's/[[:space:]]\+$//' {} \+ - -# Style google not available on 14.04 - - exit 0 - # will use indent - command -v astyle >/dev/null 2>&1 || { echo >&2 "astyle required but it's not installed."; sudo apt-get install astyle; } - astyle --recursive --convert-tabs --indent=spaces=$INDENT_SPACES --style=kr --indent-col1-comments --max-code-length=$MAX_CODE_LENGTH \ - $OPENAIR_DIR/openair1/*.h \ - $OPENAIR_DIR/openair1/*.c \ - $OPENAIR_DIR/openair2/*.h \ - $OPENAIR_DIR/openair2/*.c \ - $OPENAIR_DIR/openair3/*.h \ - $OPENAIR_DIR/openair3/*.c \ - $OPENAIR_DIR/openair3/*.h \ - $OPENAIR_DIR/openair3/*.c \ - $OPENAIR_DIR/targets/*.h \ - $OPENAIR_DIR/targets/*.c -} - - -main "$@" diff --git a/pre-commit b/pre-commit deleted file mode 100644 index ab54a821a5..0000000000 --- a/pre-commit +++ /dev/null @@ -1,31 +0,0 @@ - -#!/bin/bash -# Installation: -# cp pre-commit .git/hooks -# chmod +x .git/hooks/pre-commit - -OPTIONS="--options=ci-scripts/astyle-options.txt" - -RETURN=0 -ASTYLE=$(which astyle) -if [ $? -ne 0 ]; then - echo "[!] astyle not installed. Unable to check source file format policy." >&2 - exit 1 -fi - -FILES=`git diff --cached --name-only --diff-filter=ACMR | grep -E "\.(c|cpp|h)$"` -for FILE in $FILES; do - $ASTYLE $OPTIONS < $FILE | cmp -s $FILE - - if [ $? -ne 0 ]; then - echo "[!] $FILE does not respect the agreed coding style." >&2 - RETURN=1 - fi -done - -if [ $RETURN -eq 1 ]; then - echo "" >&2 - echo "Make sure you have run astyle with the following options:" >&2 - echo $OPTIONS >&2 -fi - -exit $RETURN From 91f2453a5769572b69e08e666f52745355f36631 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 22 Aug 2022 13:40:23 +0200 Subject: [PATCH 109/136] Update documentation on how to get sources --- doc/GET_SOURCES.md | 52 ++++++---------------------------------------- 1 file changed, 6 insertions(+), 46 deletions(-) diff --git a/doc/GET_SOURCES.md b/doc/GET_SOURCES.md index 854ff3b504..f594ba1747 100644 --- a/doc/GET_SOURCES.md +++ b/doc/GET_SOURCES.md @@ -1,41 +1,20 @@ - - - - - -
- - - - - - The OpenAirInterface repository: the sources -
- The OpenAirInterface software can be obtained from our gitLab server. You will need a git client to get the sources. The repository is currently used for main developments. # Prerequisites -You need to install the subversion/git using the following commands: +You need to install git using the following commands: ```shell sudo apt-get update -sudo apt-get install subversion git +sudo apt-get install git ``` # Using EURECOM Gitlab The [openairinterface5g repository](https://gitlab.eurecom.fr/oai/openairinterface5g.git) -holds the source code for (eNB RAN + UE RAN). - -For legal issues (licenses), the core network (EPC) source code is now moved away from -the above openairinterface5g git repository. - -* A more recent version is available under our GitHub domain: - * [OAI GitHub openair-cn domain](https://github.com/OPENAIRINTERFACE) - * Check its wiki pages for more details +holds the source code for the RAN (4G and 5G). Configure git with your name/email address (only important if you are developer and want to contribute/push code to Git Repository): @@ -44,18 +23,6 @@ git config --global user.name "Your Name" git config --global user.email "Your email address" ``` -- Add a certificate from gitlab.eurecom.fr to your Ubuntu 14.04 installation: - -```shell -echo -n | openssl s_client -showcerts -connect gitlab.eurecom.fr:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-certificates.crt -``` - -- Disable certificate check completely if you do not have root access to /etc/ssl directory - -```shell -git config --global http.sslverify false -``` - ## In order to clone the Git repository (for OAI Users without login to gitlab server) Cloning RAN repository (eNB RAN + UE RAN): @@ -70,13 +37,6 @@ Please send email to [contact@openairinterface.org](mailto:contact@openairinterf as a developer (only important for users who want to commit code to the repository). If you do not have account on gitlab.eurecom.fr, please register yourself to gitlab.eurecom.fr and provide the identifiant in the email. -* Clone with using ssh keys: - * You will need to put your ssh keys in https://gitlab.eurecom.fr/profile/keys - to access to the git repo. Once that is done, clone the git repository using: - * `git clone git@gitlab.eurecom.fr:oai/openairinterface5g.git` -* Clone with user name/password prompt: - * `git clone https://YOUR_USERNAME@gitlab.eurecom.fr/oai/openairinterface5g.git` - # Which branch to checkout? On the RAN side: @@ -84,15 +44,15 @@ On the RAN side: * **master**: This branch is targeted for the user community. Since January 2019, it is also subject to a Continuous Integration process. The update frequency is about once every 2-3 months. We are also performing bug fixes on this branch. * **develop**: This branch contains recent commits that are tested on our CI test bench. The update frequency is about once a week. -Please see the work flow and policies page : +Please see the work flow and policies page: https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/oai-policies-home -you can find the latest stable tag release here : +you can find the latest stable tag release here: https://gitlab.eurecom.fr/oai/openairinterface5g/tags -The tag naming conventions are : +The tag naming conventions are: - On `master` branch: **v1.`x`.`y`** where * `x` is the minor release number, incremented every 2-3 months when we are merging `develop` into `master` branch. From 5ec8a11ec95fd2ad03a6b0a6101b11c79e9d7b6e Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 22 Aug 2022 13:51:25 +0200 Subject: [PATCH 110/136] Add readme for clang-format --- doc/clang-format.md | 66 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 doc/clang-format.md diff --git a/doc/clang-format.md b/doc/clang-format.md new file mode 100644 index 0000000000..fa751b303d --- /dev/null +++ b/doc/clang-format.md @@ -0,0 +1,66 @@ +We use [clang-format](https://clang.llvm.org/docs/ClangFormat.html) to format our code. + +# Integration into editors + +Integration into various editors (`vim`, `emacs`, `VSCode`, `CLion`) is on the +[clang-format project page](https://clang.llvm.org/docs/ClangFormat.html). + +There is also an [eclipse plugin](https://github.com/wangzw/CppStyle). + +# Integration into git + +## Short version + +See below for a more detailed explanation. In short: Add this to `~/.gitconfig`: +``` +[clangFormat] + binary = clang-format-12 + style = file +``` +Now stage files for reformatting, then run `git clang-format`. It will reformat +only the code that is staged, and you can view reformatted code with `git +diff`. To add modified lines to your commit, stage them as well, then commit. + +There is also a pre-commit hook that you can install. To install it, copy it +`pre-commit-clang` to `.git/hooks/pre-commit`, and make it executable. + +## Long version + +In order to integrate `clang-format` into `git`, follow these steps: + +1) Copy `pre-commit-clang` to `.git/hooks/pre-commit` and make it executable. + +2) Install clang-format-12 (needs at least Ubuntu 20, remove anything else) + ```bash + $ sudo apt-get remove clang-format* + $ sudo apt-get install clang-format-12 + ``` + +3) Configure `git` (set correct executable, set mode, provide more convenient alias) + ```bash + $ git config --global clangFormat.binary clang-format-12 + $ git config --global clangFormat.style file + $ git config --global alias.clang-format clang-format-12 + ``` + +When this is done, you are set up. How to use: + +4) When committing new code, add the code to commit into the staging (`git add + -p` or `git add `) _and stash the rest_ (e.g., `git stash -p`, this is + quite important or reformatting might not work properly, or you don't know + what has been reformatted) + +5) Run git clang-format. The staged code will be reformatted. After this, you + still have your changes in the staging area, and the formatted code appears + as additional modification. Thus, your changes can be seen with + ```bash + $ git diff --staged + ``` + while the modifications of clang-format with + ```bash + $ git diff + ``` + So now, you can add all or parts of reformatted code to the staging area + +6) Commit. It won't work if code is not properly formatted due to the + pre-commit hook. Force committing with `git commit --no-verify` From e2e62e78fea89b6c4f9a7f6744cd606c188f5b08 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 29 Aug 2022 08:45:27 +0200 Subject: [PATCH 111/136] CI: add unhandled action LicenceAndFormattingCheck --- ci-scripts/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 75018b64d6..85e079fd3f 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -460,6 +460,9 @@ def GetParametersFromXML(action): elif action == 'Run_LDPCTest' or action == 'Run_NRulsimTest': ldpc.runargs = test.findtext('physim_run_args') + elif action == 'LicenceAndFormattingCheck': + pass + else: logging.error(f"unknown action {action}, abort") exit(1) From 8de2578be59d0506e178d24d76ea32dd8ca7b2df Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 29 Aug 2022 11:37:12 +0200 Subject: [PATCH 112/136] Disable T1 Offload pipeline: avra is offline --- ci-scripts/Jenkinsfile-GitLab-Container | 41 +++++++++++++------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container index 37bcd01676..89665f292f 100644 --- a/ci-scripts/Jenkinsfile-GitLab-Container +++ b/ci-scripts/Jenkinsfile-GitLab-Container @@ -338,26 +338,27 @@ pipeline { } } } - stage ("Test T1 Offload") { - when { expression {doMandatoryTests} } - steps { - script { - triggerSlaveJob ('RAN-T1-Offload-Test', 'Test-T1-Offload') - } - } - post { - always { - script { - finalizeSlaveJob('RAN-T1-Offload-Test') - } - } - failure { - script { - currentBuild.result = 'FAILURE' - } - } - } - } + //avra is offline, re-enable once it is available + //stage ("Test T1 Offload") { + // when { expression {doMandatoryTests} } + // steps { + // script { + // triggerSlaveJob ('RAN-T1-Offload-Test', 'Test-T1-Offload') + // } + // } + // post { + // always { + // script { + // finalizeSlaveJob('RAN-T1-Offload-Test') + // } + // } + // failure { + // script { + // currentBuild.result = 'FAILURE' + // } + // } + // } + //} } } stage ("Images Push to Registries") { From 59cb60216104087b581133af3be53a25ab8d034f Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Mon, 29 Aug 2022 12:43:50 +0200 Subject: [PATCH 113/136] review changes --- openair1/PHY/MODULATION/ofdm_mod.c | 46 +++---- openair1/PHY/MODULATION/slot_fep_nr.c | 137 ++++++++------------- openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 31 ++--- 3 files changed, 80 insertions(+), 134 deletions(-) diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index 0d2c95a926..0f79c4532b 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -348,39 +348,33 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp, { int symb_offset = (slot%fp->slots_per_subframe)*fp->symbols_per_slot; - c16_t *symbol_rotation = fp->symbol_rotation[0]; + c16_t *symbol_rotation = fp->symbol_rotation[0] + symb_offset; - for (int sidx=0;sidxofdm_symbol_size; LOG_D(PHY,"Rotating symbol %d, slot %d, symbol_subframe_index %d (%d,%d)\n", - first_symbol + sidx, + sidx, slot, - sidx + first_symbol + symb_offset, - symbol_rotation[sidx + first_symbol + symb_offset].r, - symbol_rotation[sidx + first_symbol + symb_offset].i); + sidx + symb_offset, + this_rotation->r, + this_rotation->i); if (fp->N_RB_DL & 1) { - rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, - symbol_rotation + sidx + first_symbol + symb_offset, - ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, - (fp->N_RB_DL + 1) * 6, - 15); - rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset - 6, - symbol_rotation + sidx + first_symbol + symb_offset, - ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset - 6, - (fp->N_RB_DL + 1) * 6, - 15); + rotate_cpx_vector(this_symbol, this_rotation, this_symbol, + (fp->N_RB_DL + 1) * 6, 15); + rotate_cpx_vector(this_symbol + fp->first_carrier_offset - 6, + this_rotation, + this_symbol + fp->first_carrier_offset - 6, + (fp->N_RB_DL + 1) * 6, 15); } else { - rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, - symbol_rotation + sidx + first_symbol + symb_offset, - ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size, - fp->N_RB_DL * 6, - 15); - rotate_cpx_vector(((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset, - symbol_rotation + sidx + first_symbol + symb_offset, - ((c16_t*) txdataF) + sidx * fp->ofdm_symbol_size + fp->first_carrier_offset, - fp->N_RB_DL * 6, - 15); + rotate_cpx_vector(this_symbol, this_rotation, this_symbol, + fp->N_RB_DL * 6, 15); + rotate_cpx_vector(this_symbol + fp->first_carrier_offset, + this_rotation, + this_symbol + fp->first_carrier_offset, + fp->N_RB_DL * 6, 15); } } } diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index 58711777ae..71be5ba6ed 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -108,53 +108,34 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, #endif c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; + c16_t *this_symbol = (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol]; if (frame_parms->N_RB_DL & 1) { - rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + rotate_cpx_vector(this_symbol, &rot2, this_symbol, + (frame_parms->N_RB_DL + 1) * 6, 15); + rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset - 6, &rot2, - (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - (frame_parms->N_RB_DL + 1) * 6, - 15); - rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset - 6], - &rot2, - (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset - 6], - (frame_parms->N_RB_DL + 1) * 6, - 15); - multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - (int16_t *)shift_rot, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - 1, - (frame_parms->N_RB_DL + 1) * 6, - 15); - multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset - 6], - (int16_t *)(shift_rot + frame_parms->first_carrier_offset - 6), - (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset - 6], - 1, - (frame_parms->N_RB_DL + 1) * 6, - 15); + this_symbol + frame_parms->first_carrier_offset - 6, + (frame_parms->N_RB_DL + 1) * 6, 15); + multadd_cpx_vector((int16_t *)this_symbol, (int16_t *)shift_rot, (int16_t *)this_symbol, + 1, (frame_parms->N_RB_DL + 1) * 6, 15); + multadd_cpx_vector((int16_t *)(this_symbol + frame_parms->first_carrier_offset - 6), + (int16_t *)(shift_rot + frame_parms->first_carrier_offset - 6), + (int16_t *)(this_symbol + frame_parms->first_carrier_offset - 6), + 1, (frame_parms->N_RB_DL + 1) * 6, 15); } else { - rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + rotate_cpx_vector(this_symbol, &rot2, this_symbol, + frame_parms->N_RB_DL * 6, 15); + rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset, &rot2, - (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - frame_parms->N_RB_DL * 6, - 15); - rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], - &rot2, - (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], - frame_parms->N_RB_DL * 6, - 15); - multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - (int16_t *)shift_rot, - (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - 1, - frame_parms->N_RB_DL * 6, - 15); - multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], - (int16_t *)(shift_rot + frame_parms->first_carrier_offset), - (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol + frame_parms->first_carrier_offset], - 1, - frame_parms->N_RB_DL * 6, - 15); + this_symbol + frame_parms->first_carrier_offset, + frame_parms->N_RB_DL * 6, 15); + multadd_cpx_vector((int16_t *)this_symbol, (int16_t *)shift_rot, (int16_t *)this_symbol, + 1, frame_parms->N_RB_DL * 6, 15); + multadd_cpx_vector((int16_t *)(this_symbol + frame_parms->first_carrier_offset), + (int16_t *)(shift_rot + frame_parms->first_carrier_offset), + (int16_t *)(this_symbol + frame_parms->first_carrier_offset), + 1, frame_parms->N_RB_DL * 6, 15); } } @@ -258,11 +239,8 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue, symbol+symb_offset,rot2.r,rot2.i); #endif - rotate_cpx_vector((c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - &rot2, - (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], - frame_parms->ofdm_symbol_size, - 15); + c16_t *this_symbol = (c16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol]; + rotate_cpx_vector(this_symbol, &rot2, this_symbol, frame_parms->ofdm_symbol_size, 15); } #ifdef DEBUG_FEP @@ -348,53 +326,34 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms, LOG_D(PHY,"slot %d, symb_offset %d rotating by %d.%d\n",slot,symb_offset,rot2.r,rot2.i); c16_t *shift_rot = frame_parms->timeshift_symbol_rotation; + c16_t *this_symbol = (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)]; if (frame_parms->N_RB_UL & 1) { - rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + rotate_cpx_vector(this_symbol, &rot2, this_symbol, + (frame_parms->N_RB_UL + 1) * 6, 15); + rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset - 6, &rot2, - (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - (frame_parms->N_RB_UL + 1) * 6, - 15); - rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset-6], - &rot2, - (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset-6], - (frame_parms->N_RB_UL + 1) * 6, - 15); - multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - (int16_t *)shift_rot, - (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - 1, - (frame_parms->N_RB_UL+1) * 6, - 15); - multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset-6], - (int16_t *)(shift_rot + frame_parms->first_carrier_offset - 6), - (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset-6], - 1, - (frame_parms->N_RB_UL+1) * 6, - 15); + this_symbol + frame_parms->first_carrier_offset - 6, + (frame_parms->N_RB_UL + 1) * 6, 15); + multadd_cpx_vector((int16_t *)this_symbol, (int16_t *)shift_rot, (int16_t *)this_symbol, + 1, (frame_parms->N_RB_UL+1) * 6, 15); + multadd_cpx_vector((int16_t *)(this_symbol + frame_parms->first_carrier_offset - 6), + (int16_t *)(shift_rot + frame_parms->first_carrier_offset - 6), + (int16_t *)(this_symbol + frame_parms->first_carrier_offset - 6), + 1, (frame_parms->N_RB_UL+1) * 6, 15); } else { - rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], + rotate_cpx_vector(this_symbol, &rot2, this_symbol, + frame_parms->N_RB_UL * 6, 15); + rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset, &rot2, - (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - frame_parms->N_RB_UL * 6, - 15); - rotate_cpx_vector((c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], - &rot2, - (c16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], - frame_parms->N_RB_UL * 6, - 15); - multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - (int16_t *)shift_rot, - (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)], - 1, - frame_parms->N_RB_UL * 6, - 15); - multadd_cpx_vector((int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], - (int16_t *)(shift_rot + frame_parms->first_carrier_offset), - (int16_t *)&rxdataF[soffset+(frame_parms->ofdm_symbol_size*symbol)+frame_parms->first_carrier_offset], - 1, - frame_parms->N_RB_UL * 6, - 15); + this_symbol + frame_parms->first_carrier_offset, + frame_parms->N_RB_UL * 6, 15); + multadd_cpx_vector((int16_t *)this_symbol, (int16_t *)shift_rot, (int16_t *)this_symbol, + 1, frame_parms->N_RB_UL * 6, 15); + multadd_cpx_vector((int16_t *)(this_symbol + frame_parms->first_carrier_offset), + (int16_t *)(shift_rot + frame_parms->first_carrier_offset), + (int16_t *)(this_symbol + frame_parms->first_carrier_offset), + 1, frame_parms->N_RB_UL * 6, 15); } } } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index 10fd8e9e8a..dba1fd194d 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -597,34 +597,27 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE, int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot; for(ap = 0; ap < n_antenna_ports; ap++) { for (int s=0;ssymbol_rotation[1])[s + symb_offset]; + c16_t *this_symbol = (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s]; + c16_t rot=frame_parms->symbol_rotation[1][s + symb_offset]; LOG_D(PHY,"rotating txdataF symbol %d (%d) => (%d.%d)\n", s, s + symb_offset, rot.r, rot.i); if (frame_parms->N_RB_UL & 1) { - rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], + rotate_cpx_vector(this_symbol, &rot, this_symbol, + (frame_parms->N_RB_UL + 1) * 6, 15); + rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset - 6, &rot, - (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], - (frame_parms->N_RB_UL + 1) * 6, - 15); - rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset - 6], - &rot, - (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset - 6], - (frame_parms->N_RB_UL + 1) * 6, - 15); + this_symbol + frame_parms->first_carrier_offset - 6, + (frame_parms->N_RB_UL + 1) * 6, 15); } else { - rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], + rotate_cpx_vector(this_symbol, &rot, this_symbol, + frame_parms->N_RB_UL * 6, 15); + rotate_cpx_vector(this_symbol + frame_parms->first_carrier_offset, &rot, - (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s], - frame_parms->N_RB_UL * 6, - 15); - rotate_cpx_vector((c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset], - &rot, - (c16_t *)&txdataF[ap][frame_parms->ofdm_symbol_size * s + frame_parms->first_carrier_offset], - frame_parms->N_RB_UL * 6, - 15); + this_symbol + frame_parms->first_carrier_offset, + frame_parms->N_RB_UL * 6, 15); } } } From c3c6aa8e75bb65dcb41cddde1b2996ca39c3ceb0 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 29 Aug 2022 13:06:28 +0200 Subject: [PATCH 114/136] Add Cppcheck_Analysis action, make unknown action no fail --- ci-scripts/main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 85e079fd3f..017be0ecd1 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -463,11 +463,12 @@ def GetParametersFromXML(action): elif action == 'LicenceAndFormattingCheck': pass + elif action == 'Cppcheck_Analysis': + pass + else: - logging.error(f"unknown action {action}, abort") - exit(1) + logging.error(f"unknown action {action}") - #check if given test is in list #it is in list if one of the strings in 'list' is at the beginning of 'test' From cf6ac388fddca6fbf1df6bf7b5ea560e6b335ab0 Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 29 Aug 2022 17:10:08 +0200 Subject: [PATCH 115/136] addressing review comments --- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c | 49 ++++++++++--------- openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h | 8 +-- openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c | 4 +- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 5 +- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 4 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 2 +- .../NR_MAC_gNB/gNB_scheduler_primitives.c | 5 +- .../LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 2 +- 8 files changed, 43 insertions(+), 36 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c index 2812e03dca..379823fc6a 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c @@ -4128,34 +4128,39 @@ uint16_t compute_pucch_prb_size(uint8_t format, } } -int get_bw_tbslbrm(int scc_bwpsize, - bool is_dl, - NR_CellGroupConfig_t *cg) { +int get_dlbw_tbslbrm(int scc_bwpsize, + NR_CellGroupConfig_t *cg) { int bw = scc_bwpsize; if (cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated) { const NR_ServingCellConfig_t *servingCellConfig = cg->spCellConfig->spCellConfigDedicated; - if(is_dl) { - if(servingCellConfig->downlinkBWP_ToAddModList) { - const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *BWP_list = servingCellConfig->downlinkBWP_ToAddModList; - for (int i=0; ilist.count; i++) { - NR_BWP_t genericParameters = BWP_list->list.array[i]->bwp_Common->genericParameters; - int curr_bw = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - if (curr_bw > bw) - bw = curr_bw; - } + if(servingCellConfig->downlinkBWP_ToAddModList) { + const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *BWP_list = servingCellConfig->downlinkBWP_ToAddModList; + for (int i=0; ilist.count; i++) { + NR_BWP_t genericParameters = BWP_list->list.array[i]->bwp_Common->genericParameters; + int curr_bw = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (curr_bw > bw) + bw = curr_bw; } } - else { - if (servingCellConfig->uplinkConfig && - servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList) { - const struct NR_UplinkConfig__uplinkBWP_ToAddModList *BWP_list = servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList; - for (int i=0; ilist.count; i++) { - NR_BWP_t genericParameters = BWP_list->list.array[i]->bwp_Common->genericParameters; - int curr_bw = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - if (curr_bw > bw) - bw = curr_bw; - } + } + return bw; +} + +int get_ulbw_tbslbrm(int scc_bwpsize, + NR_CellGroupConfig_t *cg) { + + int bw = scc_bwpsize; + if (cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated) { + const NR_ServingCellConfig_t *servingCellConfig = cg->spCellConfig->spCellConfigDedicated; + if (servingCellConfig->uplinkConfig && + servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList) { + const struct NR_UplinkConfig__uplinkBWP_ToAddModList *BWP_list = servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList; + for (int i=0; ilist.count; i++) { + NR_BWP_t genericParameters = BWP_list->list.array[i]->bwp_Common->genericParameters; + int curr_bw = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); + if (curr_bw > bw) + bw = curr_bw; } } } diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h index 476c6793c0..fab4ab679f 100644 --- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h +++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h @@ -142,9 +142,11 @@ uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx); uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset); -int get_bw_tbslbrm(int scc_bwpsize, - bool is_dl, - NR_CellGroupConfig_t *cg); +int get_dlbw_tbslbrm(int scc_bwpsize, + NR_CellGroupConfig_t *cg); + +int get_ulbw_tbslbrm(int scc_bwpsize, + NR_CellGroupConfig_t *cg); uint32_t nr_compute_tbslbrm(uint16_t table, uint16_t nb_rb, diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index b5b3365a42..a3f50839a6 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -965,7 +965,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr NR_BWP_t genericParameters = mac->scc ? mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters : mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters; int BWPSize = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - bw_tbslbrm = get_bw_tbslbrm(BWPSize, true, mac->cg); + bw_tbslbrm = get_dlbw_tbslbrm(BWPSize, mac->cg); } else bw_tbslbrm = dlsch_config_pdu_1_0->BWPSize; @@ -1406,7 +1406,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr NR_BWP_t genericParameters = mac->scc ? mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters : mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters; int BWPSize = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int bw_tbslbrm = get_bw_tbslbrm(BWPSize, true, mac->cg); + int bw_tbslbrm = get_dlbw_tbslbrm(BWPSize, mac->cg); dlsch_config_pdu_1_1->tbslbrm = nr_compute_tbslbrm(dlsch_config_pdu_1_1->mcs_table, bw_tbslbrm, nl_tbslbrm); diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 9834a4bb87..69fab1f87f 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -878,10 +878,11 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, if (mac->scc || mac->scc_SIB || mac->cg) { NR_BWP_t genericParameters = initialUplinkBWP->genericParameters; int BWPSize = NRRIV2BW(genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - bw_tbslbrm = get_bw_tbslbrm(BWPSize, false, mac->cg); + bw_tbslbrm = get_ulbw_tbslbrm(BWPSize, mac->cg); } - else + else { bw_tbslbrm = pusch_config_pdu->bwp_size; + } pusch_config_pdu->tbslbrm = nr_compute_tbslbrm(pusch_config_pdu->mcs_table, bw_tbslbrm, *maxMIMO_Layers); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 88501c0ea7..197ff2fd5d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1318,7 +1318,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra } int scc_bwpsize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, true, ra->CellGroup); + int bw_tbslbrm = get_dlbw_tbslbrm(scc_bwpsize, ra->CellGroup); pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx, bw_tbslbrm, 1); @@ -1699,7 +1699,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra nr_get_tbs_dl(&dl_tti_pdsch_pdu->pdsch_pdu, x_Overhead, pdsch_pdu_rel15->numDmrsCdmGrpsNoData, tb_scaling); int scc_bwpsize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, true, ra->CellGroup); + int bw_tbslbrm = get_dlbw_tbslbrm(scc_bwpsize, ra->CellGroup); pdsch_pdu_rel15->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(mcsTableIdx, bw_tbslbrm, 1); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index 0f7a7e52f8..cf5a590c60 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -1056,7 +1056,7 @@ void nr_schedule_ue_spec(module_id_t module_id, int nl_tbslbrm = *maxMIMO_Layers < 4 ? *maxMIMO_Layers : 4; // Maximum number of PRBs across all configured DL BWPs int scc_bwpsize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, true, cg); + int bw_tbslbrm = get_dlbw_tbslbrm(scc_bwpsize, cg); pdsch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(current_BWP->mcsTableIdx, bw_tbslbrm, nl_tbslbrm); diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index 7230ed94f5..30ce613279 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -2218,9 +2218,8 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac, const NR_ServingCellConfig_t *servingCellConfig = CellGroup->spCellConfig->spCellConfigDedicated; DL_BWP->pdsch_servingcellconfig = servingCellConfig->pdsch_ServingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL; - UL_BWP->pusch_servingcellconfig = servingCellConfig->uplinkConfig ? - (servingCellConfig->uplinkConfig->pusch_ServingCellConfig ? servingCellConfig->uplinkConfig->pusch_ServingCellConfig->choice.setup : NULL ) : - NULL; + UL_BWP->pusch_servingcellconfig = servingCellConfig->uplinkConfig && servingCellConfig->uplinkConfig->pusch_ServingCellConfig ? + servingCellConfig->uplinkConfig->pusch_ServingCellConfig->choice.setup : NULL; target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; if(UE && UE->Msg3_dcch_dtch) { diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index aa6e1920b3..311c01073a 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1691,7 +1691,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot) maxMIMO_Layers = current_BWP->pusch_Config->maxRank; AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n"); const int scc_bwpsize = NRRIV2BW(scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE); - int bw_tbslbrm = get_bw_tbslbrm(scc_bwpsize, false, cg); + int bw_tbslbrm = get_ulbw_tbslbrm(scc_bwpsize, cg); pusch_pdu->maintenance_parms_v3.tbSizeLbrmBytes = nr_compute_tbslbrm(current_BWP->mcs_table, bw_tbslbrm, *maxMIMO_Layers); From 89a71a10e09459c10c2ce169115a29381aba7f91 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 29 Aug 2022 17:39:37 +0200 Subject: [PATCH 116/136] Create oai_rules_result.txt expected by CI --- ci-scripts/checkCodingFormattingRules.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh index 38447674df..16aba3b7a7 100755 --- a/ci-scripts/checkCodingFormattingRules.sh +++ b/ci-scripts/checkCodingFormattingRules.sh @@ -202,4 +202,9 @@ do done rm -f header-files-w-incorrect-define-tmp.txt +# in this script we previously produced a list of files that were not properly +# formatted. At the time of this MR, the Jenkinsfile expects this file, so +# we simply produce an empty file +touch ./oai_rules_result.txt + exit 0 From 2e7533a06886a9094bc1d78e0dab6a8752f32b39 Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 29 Aug 2022 18:27:25 +0200 Subject: [PATCH 117/136] CI: Fix workspace path in LDPC Test --- ci-scripts/cls_physim.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ci-scripts/cls_physim.py b/ci-scripts/cls_physim.py index 5e0dbc11b2..14abd9116e 100644 --- a/ci-scripts/cls_physim.py +++ b/ci-scripts/cls_physim.py @@ -199,6 +199,7 @@ class PhySim: def Run_LDPCTest(self,htmlObj,constObj,testcase_id): + self.__workSpacePath = self.eNBSourceCodePath+'/cmake_targets/' #create run logs folder locally os.system('mkdir -p ./'+self.__runLogPath) #log file is tc_.log remotely From 1440807e230a0d6c341dcddca5b349c4361b55eb Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Tue, 30 Aug 2022 11:17:34 +0200 Subject: [PATCH 118/136] increase prach_dtx_threshold to 20 dB to avoid fake PRACH detections --- ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf index e1264bd069..c3f382c79a 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf @@ -237,7 +237,7 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - prach_dtx_threshold = 120; + prach_dtx_threshold = 200; # pucch0_dtx_threshold = 150; } ); From 3ea751c3cbed5bf9a15984770d5c35ff49ca8671 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Tue, 30 Aug 2022 14:37:59 +0100 Subject: [PATCH 119/136] Schedule ULSCH in flexible slots in InitialBWP --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 1ca9fa067e..f46eb5931e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -1360,18 +1360,6 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t if (!is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot)) return false; - bool is_mixed_slot = false; - const NR_TDD_UL_DL_Pattern_t *tdd = - scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL; - - if (tdd) - is_mixed_slot = is_xlsch_in_slot(nr_mac->dlsch_slot_bitmap[sched_slot / 64], sched_slot) && - is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot); - - // FIXME: Avoid mixed slots for initialUplinkBWP - if (current_BWP->bwp_id==0 && is_mixed_slot) - return false; - // Avoid slots with the SRS UE_iterator(nr_mac->UE_info.list, UE) { NR_sched_srs_t sched_srs = UE->UE_sched_ctrl.sched_srs; From 622e14ad4f9d1ec20d5821da3b6d5c33cb25162e Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Tue, 30 Aug 2022 17:06:44 +0200 Subject: [PATCH 120/136] 5G RFsim: increase PRACH threshold to 20dB to avoid misdetections --- ci-scripts/conf_files/gNB_SA_DU.conf | 2 +- ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ci-scripts/conf_files/gNB_SA_DU.conf b/ci-scripts/conf_files/gNB_SA_DU.conf index 4309c13dd3..a441ecbad9 100644 --- a/ci-scripts/conf_files/gNB_SA_DU.conf +++ b/ci-scripts/conf_files/gNB_SA_DU.conf @@ -205,7 +205,7 @@ L1s = ( num_cc = 1; tr_n_preference = "local_mac"; thread_pool_size = 8; - prach_dtx_threshold = 120; + prach_dtx_threshold = 200; pucch0_dtx_threshold = 150; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } diff --git a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf index 6b7122341d..ee31a01f1a 100644 --- a/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.sa.band66.fr1.106PRB.usrpn300.conf @@ -218,6 +218,7 @@ L1s = ( num_cc = 1; tr_n_preference = "local_mac"; pusch_proc_threads = 8; + prach_dtx_threshold = 200; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); From 13bdcb47438ebf7da3f7a2771c8f964fb7491a9b Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 31 Aug 2022 08:46:42 +0100 Subject: [PATCH 121/136] Implementation of a RA timer to remove UE in the case of Msg4 not be decoded by the UE --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 2 ++ openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c | 11 +++++++++++ openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c | 1 + openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 1 + 4 files changed, 15 insertions(+) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 745fc1ae2b..e68af6ebed 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1829,6 +1829,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra nr_clear_ra_proc(module_idP, CC_id, frameP, ra); UE->Msg3_dcch_dtch = true; UE->Msg4_ACKed = true; + UE->ra_timer = 0; remove_front_nr_list(&sched_ctrl->feedback_dl_harq); harq->feedback_slot = -1; @@ -1867,6 +1868,7 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram if (stats->dl.errors == 0) { LOG_A(NR_MAC, "(UE RNTI 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", ra->rnti); UE->Msg4_ACKed = true; + UE->ra_timer = 0; // Pause scheduling according to: // 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index ea25fd436f..df1d20ed9f 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -2508,6 +2508,8 @@ NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConf "uplinkBWP_ToAddModList has %d BWP!\n", ul_bwp->n_ul_bwp); + UE->ra_timer = 12000 << UE->current_DL_BWP.scs; // TODO: temporary value, 12000 ms from experimental results + /* get Number of HARQ processes for this UE */ // pdsch_servingcellconfig == NULL in SA -> will create default (8) number of HARQ processes create_dl_harq_list(sched_ctrl, dl_bwp->pdsch_servingcellconfig); @@ -2974,6 +2976,15 @@ void nr_mac_update_timers(module_id_t module_id, ups); } } + + // RA timer + if (UE->ra_timer > 0) { + UE->ra_timer--; + if (UE->ra_timer == 0) { + LOG_W(NR_MAC, "Removing UE %04x because RA timer expired\n", UE->rnti); + mac_remove_nr_ue(RC.nrmac[module_id], UE->rnti); + } + } } } diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index 1ca9fa067e..23922efa71 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -668,6 +668,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP, if(ra->cfra) { LOG_A(NR_MAC, "(rnti 0x%04x) CFRA procedure succeeded!\n", ra->rnti); + UE->ra_timer = 0; nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti); nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra); process_CellGroup(ra->CellGroup, UE_scheduling_control); diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 0543b09e9e..5ca915c838 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -709,6 +709,7 @@ typedef struct { uint8_t UE_beam_index; bool Msg3_dcch_dtch; bool Msg4_ACKed; + uint32_t ra_timer; /// Sched CSI-RS: scheduling decisions NR_gNB_UCI_STATS_t uci_statS; float ul_thr_ue; From 8a6d09666d5c675704acf15d6e59d9d2242d6c6b Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Wed, 31 Aug 2022 16:03:36 +0100 Subject: [PATCH 122/136] Fix AssertFatal in Msg3 to not Assert when there is a PUCCH (CSI report) already scheduled for that slot --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 745fc1ae2b..10dbd9ff47 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1072,15 +1072,15 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t return; } - uint16_t *vrb_map_UL = - &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE]; + uint16_t mask = SL_to_bitmap(ra->msg3_startsymb, ra->msg3_nrsymb); + uint16_t *vrb_map_UL = &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE]; for (int i = 0; i < ra->msg3_nb_rb; ++i) { - AssertFatal(!vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start], + AssertFatal(!(vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] & mask), "RB %d in %4d.%2d is already taken, cannot allocate Msg3!\n", i + ra->msg3_first_rb, ra->Msg3_frame, ra->Msg3_slot); - vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] |= SL_to_bitmap(ra->msg3_startsymb, ra->msg3_nrsymb); + vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] |= mask; } LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot); From 00373ed10b0dce00ccde6bcf8576891b4e607930 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Thu, 1 Sep 2022 08:12:26 +0100 Subject: [PATCH 123/136] Address review comments --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index df1d20ed9f..c2732bdade 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -2508,7 +2508,7 @@ NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConf "uplinkBWP_ToAddModList has %d BWP!\n", ul_bwp->n_ul_bwp); - UE->ra_timer = 12000 << UE->current_DL_BWP.scs; // TODO: temporary value, 12000 ms from experimental results + UE->ra_timer = 12000 << UE->current_DL_BWP.scs; // 12000 ms is arbitrary and found to be a good timeout from experiments /* get Number of HARQ processes for this UE */ // pdsch_servingcellconfig == NULL in SA -> will create default (8) number of HARQ processes From 66369a8a4c023301eea1ac27aff5fce19d810d2c Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Thu, 1 Sep 2022 08:29:57 +0100 Subject: [PATCH 124/136] Prevent ra_timer to be enabled when running in phy-test mode When running in this mode there is no RA that will succeed to disable the timer --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c index c2732bdade..e4891a44be 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c @@ -2508,7 +2508,9 @@ NR_UE_info_t *add_new_nr_ue(gNB_MAC_INST *nr_mac, rnti_t rntiP, NR_CellGroupConf "uplinkBWP_ToAddModList has %d BWP!\n", ul_bwp->n_ul_bwp); - UE->ra_timer = 12000 << UE->current_DL_BWP.scs; // 12000 ms is arbitrary and found to be a good timeout from experiments + if (get_softmodem_params()->phy_test == 0) { + UE->ra_timer = 12000 << UE->current_DL_BWP.scs; // 12000 ms is arbitrary and found to be a good timeout from experiments + } /* get Number of HARQ processes for this UE */ // pdsch_servingcellconfig == NULL in SA -> will create default (8) number of HARQ processes From 9178648902445be00fd5d65affd0ba4536f82a86 Mon Sep 17 00:00:00 2001 From: luis_pereira87 Date: Thu, 1 Sep 2022 08:34:53 +0100 Subject: [PATCH 125/136] Address review comments --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c index 10dbd9ff47..9caa08ee04 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c @@ -1072,7 +1072,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t return; } - uint16_t mask = SL_to_bitmap(ra->msg3_startsymb, ra->msg3_nrsymb); + const uint16_t mask = SL_to_bitmap(ra->msg3_startsymb, ra->msg3_nrsymb); uint16_t *vrb_map_UL = &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE]; for (int i = 0; i < ra->msg3_nb_rb; ++i) { AssertFatal(!(vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] & mask), From 8229f00d0ea8d3473fd710ff6416dce21707942e Mon Sep 17 00:00:00 2001 From: Raphael Defosseux Date: Thu, 1 Sep 2022 16:25:49 +0200 Subject: [PATCH 126/136] chore(ci): disable all the 4G Legacy LTE pipelines before we migrate the servers Signed-off-by: Raphael Defosseux --- ci-scripts/Jenkinsfile-gitlab | 203 +--------------------------------- 1 file changed, 1 insertion(+), 202 deletions(-) diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab index 784588357d..814ceeeaa9 100644 --- a/ci-scripts/Jenkinsfile-gitlab +++ b/ci-scripts/Jenkinsfile-gitlab @@ -187,7 +187,7 @@ pipeline { } } } - } + } stage ("Variant Builds") { parallel { @@ -349,142 +349,6 @@ pipeline { } } } - stage ("Test MONOLITHIC - FDD - Band 7 - B210") { - when { - expression {doFullTestsuite} - } - steps { - script { - triggerSlaveJob ('eNB-CI-FDD-Band7-B210', 'Test-Mono-FDD-Band7') - } - } - post { - always { - script { - finalizeSlaveJob('eNB-CI-FDD-Band7-B210') - } - } - failure { - script { - currentBuild.result = 'FAILURE' - } - } - } - } - stage ("Test MONOLITHIC - TDD - Band 40 - B210") { - when { - expression {doFullTestsuite} - } - steps { - script { - triggerSlaveJob ('eNB-CI-TDD-Band40-B210', 'Test-Mono-TDD-Band40') - } - } - post { - always { - script { - finalizeSlaveJob('eNB-CI-TDD-Band40-B210') - } - } - failure { - script { - currentBuild.result = 'FAILURE' - } - } - } - } - stage ("Test IF4p5 - FDD - Band 7 - B210") { - when { - expression {doFullTestsuite} - } - steps { - script { - sh "sleep 60" - triggerSlaveJob ('eNB-CI-IF4p5-FDD-Band7-B210', 'Test-IF4p5-FDD-Band7') - } - } - post { - always { - script { - finalizeSlaveJob('eNB-CI-IF4p5-FDD-Band7-B210') - } - } - failure { - script { - currentBuild.result = 'FAILURE' - } - } - } - } - stage ("Test IF4p5 - TDD - Band 40 - B210") { - when { - expression {doFullTestsuite} - } - steps { - script { - sh "sleep 60" - triggerSlaveJob ('eNB-CI-IF4p5-TDD-Band40-B210', 'Test-IF4p5-TDD-Band40') - } - } - post { - always { - script { - finalizeSlaveJob('eNB-CI-IF4p5-TDD-Band40-B210') - } - } - failure { - script { - currentBuild.result = 'FAILURE' - } - } - } - } - stage ("Test OAI UE - FDD - Band 20 - B200") { - when { - expression {doFullTestsuite} - } - steps { - script { - triggerSlaveJobNoGitLab ('UE-CI-FDD-Band20-B200') - } - } - post { - always { - script { - finalizeSlaveJob('UE-CI-FDD-Band20-B200') - } - } - failure { - script { - currentBuild.result = 'FAILURE' - } - } - } - } - stage ("Test OAI UE - OAI eNB - FDD - Band 7 - B200") { - when { - expression {doFullTestsuite} - } - steps { - script { - // Delayed trigger on slave job, so it is always the last one to run - sh "sleep 240" - triggerSlaveJob ('eNB-UE-CI-MONO-FDD-Band7-B200', 'Test-eNB-OAI-UE-FDD-Band7') - } - } - post { - always { - script { - finalizeSlaveJob('eNB-UE-CI-MONO-FDD-Band7-B200') - } - } - failure { - script { - currentBuild.result = 'FAILURE' - } - } - } - } } post { always { @@ -560,68 +424,3 @@ OAI CI Team''', } } } - -// ---- Slave Job functions - -def triggerSlaveJob (jobName, gitlabStatusName) { - // Workaround for the "cancelled" GitLab pipeline notification - // The slave job is triggered with the propagate false so the following commands are executed - // Its status is now PASS/SUCCESS from a stage pipeline point of view - // localStatus variable MUST be analyzed to properly assess the status - localStatus = build job: jobName, - parameters: [ - string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)), - string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)), - string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)), - booleanParam(name: 'eNB_mergeRequest', value: "MERGE".equals(env.gitlabActionType)), - string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch)) - ], propagate: false - localResult = localStatus.getResult() - echo "${jobName} Slave Job status is ${localResult}" - gitlabCommitStatus(name: gitlabStatusName) { - if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) { - echo "${jobName} Slave Job is OK" - } else { - echo "${jobName} Slave Job is KO" - sh "ci-scripts/fail.sh" - } - } -} - -def triggerSlaveJobNoGitLab (jobName) { - // Workaround for the "cancelled" GitLab pipeline notification - // The slave job is triggered with the propagate false so the following commands are executed - // Its status is now PASS/SUCCESS from a stage pipeline point of view - // localStatus variable MUST be analyzed to properly assess the status - localStatus = build job: jobName, - parameters: [ - string(name: 'eNB_Repository', value: String.valueOf(GIT_URL)), - string(name: 'eNB_Branch', value: String.valueOf(env.gitlabSourceBranch)), - string(name: 'eNB_CommitID', value: String.valueOf(env.gitlabMergeRequestLastCommit)), - booleanParam(name: 'eNB_mergeRequest', value: "MERGE".equals(env.gitlabActionType)), - string(name: 'eNB_TargetBranch', value: String.valueOf(env.gitlabTargetBranch)) - ], propagate: false - localResult = localStatus.getResult() - echo "${jobName} Slave Job status is ${localResult}" - if (localStatus.resultIsBetterOrEqualTo('SUCCESS')) { - echo "${jobName} Slave Job is OK" - } else { - echo "${jobName} Slave Job is KO" - sh "ci-scripts/fail.sh" - } -} - -def finalizeSlaveJob(jobName) { - // In case of any non-success, we are retrieving the HTML report of the last completed - // slave job. The only drop-back is that we may retrieve the HTML report of a previous build - fileName = "test_results-${jobName}.html" - if (!fileExists(fileName)) { - copyArtifacts(projectName: jobName, - filter: 'test_results*.html', - selector: lastCompleted()) - if (fileExists(fileName)) { - sh "sed -i -e 's#TEMPLATE_BUILD_TIME#${JOB_TIMESTAMP}#' ${fileName}" - archiveArtifacts artifacts: fileName - } - } -} From 4c74cc6686f32c057c9a76e1aab67532d55695eb Mon Sep 17 00:00:00 2001 From: laurent Date: Sun, 3 Jul 2022 22:20:00 +0200 Subject: [PATCH 127/136] Improve nr_ul_channel_estimation() --- common/utils/LOG/log.c | 4 + common/utils/LOG/log.h | 1 + common/utils/time_meas.c | 16 +- openair1/PHY/INIT/lte_init.c | 7 - .../lte_ul_channel_estimation.c | 10 +- openair1/PHY/LTE_TRANSPORT/phich.c | 19 +- openair1/PHY/LTE_TRANSPORT/prach.c | 66 +- .../PHY/NR_ESTIMATION/nr_measurements_gNB.c | 2 +- .../NR_ESTIMATION/nr_ul_channel_estimation.c | 936 +++++++----------- openair1/PHY/NR_TRANSPORT/srs_rx.c | 2 +- .../NR_UE_TRANSPORT/nr_dlsch_demodulation.c | 74 +- openair1/PHY/TOOLS/8bit_rxdemux.c | 62 -- openair1/PHY/TOOLS/8bit_txmux.c | 48 - openair1/PHY/TOOLS/cadd_sv.c | 163 --- openair1/PHY/TOOLS/cadd_vv.c | 216 +--- openair1/PHY/TOOLS/cmult_sv.c | 329 +++--- openair1/PHY/TOOLS/memory_routines.c | 67 -- openair1/PHY/TOOLS/oai_dfts.c | 1 - openair1/PHY/TOOLS/tools_defs.h | 293 ++++-- openair1/PHY/defs_eNB.h | 3 - openair1/SCHED/prach_procedures.c | 2 +- openair3/ocp-gtpu/gtp_itf.cpp | 2 +- 22 files changed, 767 insertions(+), 1556 deletions(-) delete mode 100644 openair1/PHY/TOOLS/8bit_rxdemux.c delete mode 100644 openair1/PHY/TOOLS/8bit_txmux.c delete mode 100644 openair1/PHY/TOOLS/cadd_sv.c delete mode 100644 openair1/PHY/TOOLS/memory_routines.c diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c index 4605df06e0..043631d706 100644 --- a/common/utils/LOG/log.c +++ b/common/utils/LOG/log.c @@ -48,6 +48,10 @@ // main log variables +// Fixme: a better place to be shure it is called +void read_cpu_hardware (void) __attribute__ ((constructor)); +void read_cpu_hardware (void) {__builtin_cpu_init(); } + log_mem_cnt_t log_mem_d[2]; int log_mem_flag=0; int log_mem_multi=1; diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h index a1b70c7503..509c4581a9 100644 --- a/common/utils/LOG/log.h +++ b/common/utils/LOG/log.h @@ -366,6 +366,7 @@ typedef struct { #define MATLAB_CSHORT_BRACKET3 15 int32_t write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, unsigned int format, int multiVec); +#define write_output(a, b, c, d, e, f) write_file_matlab(a, b, c, d, e, f, 0) /*----------------macro definitions for reading log configuration from the config module */ #define CONFIG_STRING_LOG_PREFIX "log_config" diff --git a/common/utils/time_meas.c b/common/utils/time_meas.c index 9d1215b5e5..15766b5a3f 100644 --- a/common/utils/time_meas.c +++ b/common/utils/time_meas.c @@ -39,14 +39,14 @@ notifiedFIFO_t measur_fifo; double get_cpu_freq_GHz(void) { if (cpu_freq_GHz <1 ) { - time_stats_t ts = {0}; - reset_meas(&ts); - ts.trials++; - ts.in = rdtsc_oai(); - sleep(1); - ts.diff = (rdtsc_oai()-ts.in); - cpu_freq_GHz = (double)ts.diff/1000000000; - printf("CPU Freq is %f \n", cpu_freq_GHz); + time_stats_t ts = {0}; + reset_meas(&ts); + ts.trials++; + ts.in = rdtsc_oai(); + sleep(1); + ts.diff = (rdtsc_oai()-ts.in); + cpu_freq_GHz = (double)ts.diff/1000000000; + printf("CPU Freq is %f \n", cpu_freq_GHz); } return cpu_freq_GHz; } diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index c92d926a8f..8e351a15f2 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -475,9 +475,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, srs_vars[srs_id].srs = (int32_t *) malloc16_clear (2 * fp->ofdm_symbol_size * sizeof (int32_t)); } - LOG_I(PHY,"PRACH allocation\n"); // PRACH - prach_vars->prachF = (int16_t *) malloc16_clear (1024 * 2 * sizeof (int16_t)); // assume maximum of 64 RX antennas for PRACH receiver prach_vars->prach_ifft[0] = (int32_t **) malloc16_clear (64 * sizeof (int32_t *)); @@ -485,8 +483,6 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, prach_vars->prach_ifft[0][i] = (int32_t *) malloc16_clear (1024 * 2 * sizeof (int32_t)); prach_vars->rxsigF[0] = (int16_t **) malloc16_clear (64 * sizeof (int16_t *)); - // PRACH BR - prach_vars_br->prachF = (int16_t *)malloc16_clear( 1024*2*sizeof(int32_t) ); // assume maximum of 64 RX antennas for PRACH receiver for (int ce_level = 0; ce_level < 4; ce_level++) { @@ -576,8 +572,6 @@ void phy_free_lte_eNB(PHY_VARS_eNB *eNB) { for (UE_id=0; UE_idprachF); - for (i = 0; i < 64; i++) free_and_zero(prach_vars->prach_ifft[0][i]); free_and_zero(prach_vars->prach_ifft[0]); @@ -589,7 +583,6 @@ void phy_free_lte_eNB(PHY_VARS_eNB *eNB) { free_and_zero(prach_vars->rxsigF[ce_level]); } - free_and_zero(prach_vars_br->prachF); free_and_zero(prach_vars->rxsigF[0]); for (int ULSCH_id=0; ULSCH_idN_RB_UL*12*k; @@ -436,9 +436,9 @@ int32_t lte_ul_channel_estimation_RRU(LTE_DL_FRAME_PARMS *frame_parms, #ifdef DEBUG_CH if (l==pilot_pos1) - write_output("drs_seq0.m","drsseq0",ul_ref_sigs_rx[u][v][Msc_RS_idx],Msc_RS,1,1); + write_output("drs_seq0.m","drsseq0",ul_ref_sigs_rx[u][v][Msc_RS_idx],Msc_RS,1,0); else - write_output("drs_seq1.m","drsseq1",ul_ref_sigs_rx[u][v][Msc_RS_idx],Msc_RS,1,1); + write_output("drs_seq1.m","drsseq1",ul_ref_sigs_rx[u][v][Msc_RS_idx],Msc_RS,1,0); #endif symbol_offset = frame_parms->N_RB_UL*12*l; diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 1725588f4c..944e8fe18f 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -74,7 +74,8 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, uint32_t subframe_offset=((frame_parms->Ncp==0)?14:12)*frame_parms->ofdm_symbol_size*subframe; memset(d,0,24*sizeof(int16_t)); - + const int nushift=frame_parms->nushift; + if (frame_parms->nb_antenna_ports_eNB==1) gain_lin_QPSK = (int16_t)(((int32_t)amp*ONE_OVER_SQRT2_Q15)>>15); else @@ -245,7 +246,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, y1_16[7] = -y0_16[5]; for (i=0,j=0,m=0; i<6; i++,j+=2) { - if ((i!=(frame_parms->nushift))&&(i!=(frame_parms->nushift+3))) { + if ((i!=(nushift))&&(i!=((nushift+3)%6))) { y0[j] += y0_16[m]; y1[j] += y1_16[m++]; y0[j+1] += y0_16[m]; @@ -287,7 +288,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, y1_16[7] = -y0_16[5]; for (i=0,j=0,m=0; i<6; i++,j+=2) { - if ((i!=(frame_parms->nushift))&&(i!=(frame_parms->nushift+3))) { + if ((i!=(nushift))&&(i!=((nushift+3)%6))) { y0[j] += y0_16[m]; y1[j] += y1_16[m++]; y0[j+1] += y0_16[m]; @@ -329,7 +330,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, y1_16[7] = -y0_16[5]; for (i=0,j=0,m=0; i<6; i++,j+=2) { - if ((i!=(frame_parms->nushift))&&(i!=(frame_parms->nushift+3))) { + if ((i!=(nushift))&&(i!=((nushift+3)%6))) { y0[j] += y0_16[m]; y1[j] += y1_16[m++]; y0[j+1] += y0_16[m]; @@ -360,7 +361,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, y0_16[7] = d[7]*gain_lin_QPSK; for (i=0,j=0,m=0; i<6; i++,j+=2) { - if ((i!=(frame_parms->nushift))&&(i!=(frame_parms->nushift+3))) { + if ((i!=(nushift))&&(i!=((nushift+3)%6))) { y0[j] += y0_16[m++]; y0[j+1] += y0_16[m++]; } @@ -385,7 +386,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, y0_16[7] = d[15]*gain_lin_QPSK; for (i=0,j=0,m=0; i<6; i++,j+=2) { - if ((i!=(frame_parms->nushift))&&(i!=(frame_parms->nushift+3))) { + if ((i!=(nushift))&&(i!=((nushift+3)%6))) { y0[j] += y0_16[m++]; y0[j+1] += y0_16[m++]; } @@ -410,7 +411,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, y0_16[7] = d[23]*gain_lin_QPSK; for (i=0,j=0,m=0; i<6; i++,j+=2) { - if ((i!=(frame_parms->nushift))&&(i!=(frame_parms->nushift+3))) { + if ((i!=(nushift))&&(i!=((nushift+3)%6))) { y0[j] += y0_16[m++]; y0[j+1] += y0_16[m++]; } @@ -533,7 +534,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, y1_16[7] = -y0_16[5]; for (i=0,j=0,m=0; i<6; i++,j+=2) { - if ((i!=(frame_parms->nushift))&&(i!=(frame_parms->nushift+3))) { + if ((i!=(nushift))&&(i!=((nushift+3)%6))) { y0[j] += y0_16[m]; y1[j] += y1_16[m++]; y0[j+1] += y0_16[m]; @@ -644,7 +645,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms, y0_16[7] = d[7]*gain_lin_QPSK; for (i=0,j=0,m=0; i<6; i++,j+=2) { - if ((i!=(frame_parms->nushift))&&(i!=(frame_parms->nushift+3))) { + if ((i!=(nushift))&&(i!=((nushift+3)%6))) { y0[j] += y0_16[m++]; y0[j+1] += y0_16[m++]; } diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 91c419ebe3..6a989edc4d 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -62,9 +62,7 @@ void rx_prach0(PHY_VARS_eNB *eNB, uint8_t Ncs_config; uint8_t restricted_set; uint8_t n_ra_prb; - int16_t *prachF=NULL; int16_t **rxsigF=NULL; - int16_t *prach2; uint8_t preamble_index; uint16_t NCS,NCS2; uint16_t preamble_offset=0,preamble_offset_old; @@ -77,12 +75,10 @@ void rx_prach0(PHY_VARS_eNB *eNB, uint8_t not_found; int k=0; uint16_t u; - int16_t *Xu=0; - uint16_t offset; + c16_t *Xu=0; int16_t Ncp; uint16_t first_nonzero_root_idx=0; uint8_t new_dft=0; - uint8_t aa; int32_t lev; int16_t levdB; int fft_size=0,log2_ifft_size; @@ -130,14 +126,11 @@ void rx_prach0(PHY_VARS_eNB *eNB, tdd_mapindex,Nf); } - int16_t *prach[nb_rx]; uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type); uint16_t N_ZC = (prach_fmt <4)?839:139; - if (eNB) { if (br_flag == 1) { prach_ifftp = eNB->prach_vars_br.prach_ifft[ce_level]; - prachF = eNB->prach_vars_br.prachF; rxsigF = eNB->prach_vars_br.rxsigF[ce_level]; if (LOG_DEBUGFLAG(PRACH)) { @@ -151,7 +144,6 @@ void rx_prach0(PHY_VARS_eNB *eNB, } } else { prach_ifftp = eNB->prach_vars.prach_ifft[0]; - prachF = eNB->prach_vars.prachF; rxsigF = eNB->prach_vars.rxsigF[0]; //if (LOG_DEBUGFLAG(PRACH)) { @@ -179,7 +171,8 @@ void rx_prach0(PHY_VARS_eNB *eNB, AssertFatal(ru!=NULL,"ru is null\n"); int8_t dBEn0=0; - for (aa=0; aaif_south == LOCAL_RF || ru->function == NGFI_RAU_IF5) { // set the time-domain signal if we have to use it in this node // DJP - indexing below in subframe zero takes us off the beginning of the array??? prach[aa] = (int16_t *)&ru->common.rxdata[aa][(subframe*fp->samples_per_tti)-ru->N_TA_offset]; @@ -291,9 +284,9 @@ void rx_prach0(PHY_VARS_eNB *eNB, LOG_D(PHY,"rx_prach: Doing FFT for N_RB_UL %d nb_rx:%d Ncp:%d\n",fp->N_RB_UL, nb_rx, Ncp); } - for (aa=0; aaN_RB_UL) { @@ -562,37 +555,38 @@ void rx_prach0(PHY_VARS_eNB *eNB, if (new_dft == 1) { new_dft = 0; - + if (br_flag == 1) { - Xu=(int16_t *)eNB->X_u_br[ce_level][preamble_offset-first_nonzero_root_idx]; + Xu=(c16_t *)eNB->X_u_br[ce_level][preamble_offset-first_nonzero_root_idx]; prach_ifft = prach_ifftp[prach_ifft_cnt++]; - + if (eNB->prach_vars_br.repetition_number[ce_level]==1) memset(prach_ifft,0,((N_ZC==839)?2048:256)*sizeof(int32_t)); } else { - Xu=(int16_t *)eNB->X_u[preamble_offset-first_nonzero_root_idx]; + Xu=(c16_t *)eNB->X_u[preamble_offset-first_nonzero_root_idx]; prach_ifft = prach_ifftp[0]; memset(prach_ifft,0,((N_ZC==839) ? 2048 : 256)*sizeof(int32_t)); } - - memset(prachF, 0, sizeof(int16_t)*2*1024 ); - - if (LOG_DUMPFLAG(PRACH)) { - if (prach[0]!= NULL) LOG_M("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1); - - LOG_M("prach_rx1.m","prach_rx1",prach[1],6144+792,1,1); - LOG_M("prach_rxF0.m","prach_rxF0",rxsigF[0],12288,1,1); - LOG_M("prach_rxF1.m","prach_rxF1",rxsigF[1],12288,1,1); - } - - for (aa=0; aa>15); - prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k+1] - (int32_t)Xu[offset+1]*rxsigF[aa][k])>>15); + + for (int offset=0; offset>15); + prachF[offset].i = (int16_t)(((int32_t)Xu[offset].r*rxsigF[aa][k+1] - (int32_t)Xu[offset].i*rxsigF[aa][k])>>15); k+=2; - + if (k==(12*2*fp->ofdm_symbol_size)) k=0; } @@ -600,13 +594,13 @@ void rx_prach0(PHY_VARS_eNB *eNB, // Now do IFFT of size 1024 (N_ZC=839) or 256 (N_ZC=139) if (N_ZC == 839) { log2_ifft_size = 10; - idft(IDFT_1024,prachF,prach_ifft_tmp,1); + idft(IDFT_1024,(int16_t*)prachF,prach_ifft_tmp,1); // compute energy and accumulate over receive antennas and repetitions for BR for (i=0; i<2048; i++) prach_ifft[i] += (prach_ifft_tmp[i<<1]*prach_ifft_tmp[i<<1] + prach_ifft_tmp[1+(i<<1)]*prach_ifft_tmp[1+(i<<1)])>>9; } else { - idft(IDFT_256,prachF,prach_ifft_tmp,1); + idft(IDFT_256,(int16_t*)prachF,prach_ifft_tmp,1); log2_ifft_size = 8; // compute energy and accumulate over receive antennas and repetitions for BR @@ -674,14 +668,12 @@ void rx_prach0(PHY_VARS_eNB *eNB, if (br_flag == 0) { LOG_M("rxsigF.m","prach_rxF",&rxsigF[0][0],12288,1,1); - LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); LOG_M("Xu.m","xu",Xu,N_ZC,1,1); LOG_M("prach_ifft0.m","prach_t0",prach_ifft,1024,1,1); LOG_M("SF2_3.m","sf2_3",&ru->common.rxdata[0][2*fp->samples_per_tti],2*fp->samples_per_tti,1,1); } else { LOG_E(PHY,"Dumping prach (br_flag %d), k = %d (n_ra_prb %d)\n",br_flag,k,n_ra_prb); LOG_M("rxsigF_br.m","prach_rxF_br",&rxsigF[0][0],12288,1,1); - LOG_M("prach_rxF_comp0_br.m","prach_rxF_comp0_br",prachF,1024,1,1); LOG_M("Xu_br.m","xu_br",Xu,N_ZC,1,1); LOG_M("prach_ifft0_br.m","prach_t0_br",prach_ifft,1024,1,1); } diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index c527c3fc9d..d8cf2fdc1b 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -67,7 +67,7 @@ int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id) return max_pos - sync_pos; } -int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, +int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms, const int32_t srs_estimated_channel_time[][frame_parms->ofdm_symbol_size]) { int timing_advance = 0; int max_val = 0; diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c index 6093116ec9..1d6ff4603f 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c @@ -77,6 +77,29 @@ void freq2time(uint16_t ofdm_symbol_size, } } + +__attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *in1, + int *offset1, + const int step1, + c16_t *in2, + int *offset2, + const int step2, + const int modulo2, + const int N) { + + int localOffset1=*offset1; + int localOffset2=*offset2; + c32_t cumul={0}; + for (int i=0; ipusch_vars[ul_id]->ul_ch_estimates_time; - int chest_freq = gNB->chest_freq; - __m128i *ul_ch_128; + + const int chest_freq = gNB->chest_freq; #ifdef DEBUG_CH FILE *debug_ch_est; debug_ch_est = fopen("debug_ch_est.txt","w"); #endif - //uint16_t Nid_cell = (eNB_offset == 0) ? gNB->frame_parms.Nid_cell : gNB->measurements.adj_cell_id[eNB_offset-1]; - - uint8_t nushift; - int **ul_ch_estimates = gNB->pusch_vars[ul_id]->ul_ch_estimates; - int **rxdataF = gNB->common_vars.rxdataF; - int soffset = (Ns&3)*gNB->frame_parms.symbols_per_slot*gNB->frame_parms.ofdm_symbol_size; - nushift = (p>>1)&1; + c16_t **ul_ch_estimates = (c16_t **) gNB->pusch_vars[ul_id]->ul_ch_estimates; + const int symbolSize = gNB->frame_parms.ofdm_symbol_size; + const int soffset = (Ns&3)*gNB->frame_parms.symbols_per_slot*symbolSize; + const int nushift = (p>>1)&1; gNB->frame_parms.nushift = nushift; + int ch_offset = symbolSize*symbol; + const int symbol_offset = symbolSize*symbol; - ch_offset = gNB->frame_parms.ofdm_symbol_size*symbol; - - symbol_offset = gNB->frame_parms.ofdm_symbol_size*symbol; - - k0 = bwp_start_subcarrier; - int re_offset; - - uint16_t nb_rb_pusch = pusch_pdu->rb_size; + const int k0 = bwp_start_subcarrier; + const int nb_rb_pusch = pusch_pdu->rb_size; LOG_D(PHY, "In %s: ch_offset %d, soffset %d, symbol_offset %d, OFDM size %d, Ns = %d, k0 = %d, symbol %d\n", __FUNCTION__, ch_offset, soffset, symbol_offset, - gNB->frame_parms.ofdm_symbol_size, + symbolSize, Ns, k0, symbol); switch (nushift) { - case 0: - fl = filt8_l0; - fm = filt8_m0; - fr = filt8_r0; - fmm = filt8_mm0; - fml = filt8_m0; - fmr = filt8_mr0; - fdcl = filt8_dcl0; - fdcr = filt8_dcr0; - fdclh = filt8_dcl0_h; - fdcrh = filt8_dcr0_h; - break; + case 0: + fl = filt8_l0; + fm = filt8_m0; + fr = filt8_r0; + fmm = filt8_mm0; + fml = filt8_m0; + fmr = filt8_mr0; + fdcl = filt8_dcl0; + fdcr = filt8_dcr0; + fdclh = filt8_dcl0_h; + fdcrh = filt8_dcr0_h; + break; - case 1: - fl = filt8_l1; - fm = filt8_m1; - fr = filt8_r1; - fmm = filt8_mm1; - fml = filt8_ml1; - fmr = filt8_mm1; - fdcl = filt8_dcl1; - fdcr = filt8_dcr1; - fdclh = filt8_dcl1_h; - fdcrh = filt8_dcr1_h; - break; + case 1: + fl = filt8_l1; + fm = filt8_m1; + fr = filt8_r1; + fmm = filt8_mm1; + fml = filt8_ml1; + fmr = filt8_mm1; + fdcl = filt8_dcl1; + fdcr = filt8_dcr1; + fdclh = filt8_dcl1_h; + fdcrh = filt8_dcr1_h; + break; - default: + default: #ifdef DEBUG_CH if (debug_ch_est) fclose(debug_ch_est); #endif - return(-1); - break; - } + return(-1); + break; + } //------------------generate DMRS------------------// @@ -171,656 +180,402 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, gNB->pusch_gold_init[pusch_pdu->scid] = pusch_pdu->ul_dmrs_scrambling_id; nr_gold_pusch(gNB, pusch_pdu->scid, pusch_pdu->ul_dmrs_scrambling_id); } + if (pusch_pdu->transform_precoding == transformPrecoder_disabled) { - nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], (1000+p), 0, nb_rb_pusch, + nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], (int32_t *)pilot, (1000+p), 0, nb_rb_pusch, (pusch_pdu->bwp_start + pusch_pdu->rb_start)*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type); - } - else { // if transform precoding or SC-FDMA is enabled in Uplink - + } else { // if transform precoding or SC-FDMA is enabled in Uplink // NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible - uint16_t index = get_index_for_dmrs_lowpapr_seq(nb_rb_pusch * (NR_NB_SC_PER_RB/2)); - uint8_t u = pusch_pdu->dfts_ofdm.low_papr_group_number; - uint8_t v = pusch_pdu->dfts_ofdm.low_papr_sequence_number; + const uint16_t index = get_index_for_dmrs_lowpapr_seq(nb_rb_pusch * (NR_NB_SC_PER_RB/2)); + const uint8_t u = pusch_pdu->dfts_ofdm.low_papr_group_number; + const uint8_t v = pusch_pdu->dfts_ofdm.low_papr_sequence_number; int16_t *dmrs_seq = gNB_dmrs_lowpaprtype1_sequence[u][v][index]; - AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n"); AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated"); - LOG_D(PHY,"Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index); - - nr_pusch_lowpaprtype1_dmrs_rx(gNB, Ns, dmrs_seq, &pilot[0], 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type); - - #ifdef DEBUG_PUSCH - printf ("NR_UL_CHANNEL_EST: index %d, u %d,v %d\n", index, u, v); - LOG_M("gNb_DMRS_SEQ.m","gNb_DMRS_SEQ", dmrs_seq,6*nb_rb_pusch,1,1); - #endif - + nr_pusch_lowpaprtype1_dmrs_rx(gNB, Ns, dmrs_seq, (int32_t *)pilot, 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type); +#ifdef DEBUG_PUSCH + printf ("NR_UL_CHANNEL_EST: index %d, u %d,v %d\n", index, u, v); + LOG_M("gNb_DMRS_SEQ.m","gNb_DMRS_SEQ", dmrs_seq,6*nb_rb_pusch,1,1); +#endif } //------------------------------------------------// - #ifdef DEBUG_PUSCH + for (int i = 0; i < (6 * nb_rb_pusch); i++) { - LOG_I(PHY, "In %s: %d + j*(%d)\n", - __FUNCTION__, - ((int16_t*)pilot)[2 * i], - ((int16_t*)pilot)[1 + (2 * i)]); + LOG_I(PHY, "In %s: %d + j*(%d)\n", __FUNCTION__, pilot[i].r,pilot[i].i); } + #endif + const uint8_t b_shift = pusch_pdu->nrOfLayers == 1; + + for (int aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + c16_t *rxdataF = (c16_t *)&gNB->common_vars.rxdataF[aarx][symbol_offset]; + c16_t *ul_ch = &ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; - uint8_t b_shift = pusch_pdu->nrOfLayers == 1; - - for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { - - pil = (int16_t *)&pilot[0]; - rxF = (int16_t *)&rxdataF[aarx][(soffset + symbol_offset + k0 + nushift)]; - ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; - re_offset = k0; - - memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size)); - + memset(ul_ch,0,sizeof(*ul_ch)*symbolSize); #ifdef DEBUG_PUSCH LOG_I(PHY, "In %s symbol_offset %d, nushift %d\n", __FUNCTION__, symbol_offset, nushift); - LOG_I(PHY, "In %s ch est pilot addr %p, N_RB_UL %d\n", __FUNCTION__, &pilot[0], gNB->frame_parms.N_RB_UL); + LOG_I(PHY, "In %s ch est pilot, N_RB_UL %d\n", __FUNCTION__, gNB->frame_parms.N_RB_UL); LOG_I(PHY, "In %s bwp_start_subcarrier %d, k0 %d, first_carrier %d, nb_rb_pusch %d\n", __FUNCTION__, bwp_start_subcarrier, k0, gNB->frame_parms.first_carrier_offset, nb_rb_pusch); - LOG_I(PHY, "In %s rxF addr %p p %d\n", __FUNCTION__, rxF, p); LOG_I(PHY, "In %s ul_ch addr %p nushift %d\n", __FUNCTION__, ul_ch, nushift); #endif - - if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && chest_freq == 0){ + + if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && chest_freq == 0) { + c16_t *pil = pilot; + int re_offset = k0; LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation"); - // For configuration type 1: k = 4*n + 2*k' + delta, // where k' is 0 or 1, and delta is in Table 6.4.1.1.3-1 from TS 38.211 - - pilot_cnt = 0; + int pilot_cnt = 0; int delta = nr_pusch_dmrs_delta(pusch_dmrs_type1, p); - + for (int n = 0; n < 3*nb_rb_pusch; n++) { - // LS estimation - ch[0] = 0; - ch[1] = 0; + c32_t ch = {0}; + for (int k_line = 0; k_line <= 1; k_line++) { - re_offset = (k0 + (n << 2) + (k_line << 1) + delta) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *) &rxdataF[aarx][(soffset + symbol_offset + re_offset)]; - ch[0] += (int16_t) (((int32_t) pil[0] * rxF[0] - (int32_t) pil[1] * rxF[1]) >> (15+b_shift)); - ch[1] += (int16_t) (((int32_t) pil[0] * rxF[1] + (int32_t) pil[1] * rxF[0]) >> (15+b_shift)); - pil += 2; + re_offset = (k0 + (n << 2) + (k_line << 1) + delta) % symbolSize; + ch=c32x16maddShift(*pil, + rxdataF[soffset + re_offset], + ch, + 15+b_shift); + pil++; } - + + c16_t ch16= {.r=(int16_t)ch.r, .i=(int16_t)ch.i}; + // Channel interpolation for (int k_line = 0; k_line <= 1; k_line++) { #ifdef DEBUG_PUSCH - re_offset = (k0 + (n << 2) + (k_line << 1)) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *) &rxdataF[aarx][(soffset + symbol_offset + re_offset)]; + re_offset = (k0 + (n << 2) + (k_line << 1)) % symbolSize; + c16_t *rxF = &rxdataF[soffset + re_offset]; printf("pilot %4u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d)\n", - pilot_cnt, pil[0], pil[1], rxF[0], rxF[1], ch[0], ch[1]); - //printf("data %4u: rxF -> (%4d,%4d) (%2d)\n",pilot_cnt, rxF[2], rxF[3], dBc(rxF[2], rxF[3])); + pilot_cnt, pil->r, pil->i, rxF->r, rxF->i, ch.r, ch.i); #endif + if (pilot_cnt == 0) { - multadd_real_vector_complex_scalar(fl, ch, ul_ch, 8); + c16multaddVectRealComplex(fl, &ch16, ul_ch, 8); } else if (pilot_cnt == 1) { - multadd_real_vector_complex_scalar(fml, ch, ul_ch, 8); + c16multaddVectRealComplex(fml, &ch16, ul_ch, 8); } else if (pilot_cnt == (6*nb_rb_pusch-2)) { - multadd_real_vector_complex_scalar(fmr, ch, ul_ch, 8); - ul_ch+=8; + c16multaddVectRealComplex(fmr, &ch16, ul_ch, 8); + ul_ch+=4; } else if (pilot_cnt == (6*nb_rb_pusch-1)) { - multadd_real_vector_complex_scalar(fr, ch, ul_ch, 8); + c16multaddVectRealComplex(fr, &ch16, ul_ch, 8); } else if (pilot_cnt%2 == 0) { - multadd_real_vector_complex_scalar(fmm, ch, ul_ch, 8); - ul_ch+=8; + c16multaddVectRealComplex(fmm, &ch16, ul_ch, 8); + ul_ch+=4; } else { - multadd_real_vector_complex_scalar(fm, ch, ul_ch, 8); + c16multaddVectRealComplex(fm, &ch16, ul_ch, 8); } + pilot_cnt++; } } // check if PRB crosses DC and improve estimates around DC - if ((bwp_start_subcarrier < gNB->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pusch*12 >= gNB->frame_parms.ofdm_symbol_size)) { - ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; - uint16_t idxDC = 2*(gNB->frame_parms.ofdm_symbol_size - bwp_start_subcarrier); - uint16_t idxPil = idxDC/2; + if ((bwp_start_subcarrier < symbolSize) && (bwp_start_subcarrier+nb_rb_pusch*12 >= symbolSize)) { + ul_ch = &ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; + const uint16_t idxDC = symbolSize - bwp_start_subcarrier; re_offset = k0; - pil = (int16_t *)&pilot[0]; - pil += (idxPil-2); - ul_ch += (idxDC-4); - ul_ch = memset(ul_ch, 0, sizeof(int16_t)*10); - re_offset = (re_offset+idxDC/2-2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)]; - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + pil = pilot + idxDC / 2 - 1; + ul_ch += idxDC - 2 ; + ul_ch = memset(ul_ch, 0, sizeof(*ul_ch)*5); + re_offset = (re_offset+idxDC-1) % symbolSize; + const c16_t ch=c16mulShift(*pil, + rxdataF[soffset+nushift+re_offset], + 15); - // for proper allignment of SIMD vectors + // for proper alignment of SIMD vectors if((gNB->frame_parms.N_RB_UL&1)==0) { - - multadd_real_vector_complex_scalar(fdcl, ch, ul_ch-4, 8); - - pil += 4; - re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - - multadd_real_vector_complex_scalar(fdcr, ch, ul_ch-4, 8); - + c16multaddVectRealComplex(fdcl, &ch, ul_ch-2, 8); + pil += 2; + re_offset = (re_offset+4) % symbolSize; + const c16_t ch_tmp=c16mulShift(*pil, + rxdataF[nushift+re_offset], + 15); + c16multaddVectRealComplex(fdcr, &ch_tmp, ul_ch-2, 8); } else { - - multadd_real_vector_complex_scalar(fdclh, ch, ul_ch, 8); - - pil += 4; - re_offset = (re_offset+4) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)]; - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - - multadd_real_vector_complex_scalar(fdcrh, ch, ul_ch, 8); + c16multaddVectRealComplex(fdclh, &ch, ul_ch, 8); + pil += 2; + re_offset = (re_offset+4) % symbolSize; + const c16_t ch_tmp=c16mulShift(*pil, + rxdataF[soffset+nushift+re_offset], + 15); + c16multaddVectRealComplex(fdcrh, &ch_tmp, ul_ch, 8); } } #ifdef DEBUG_PUSCH - ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; + ul_ch = &ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; + for(uint16_t idxP=0; idxPdmrs_config_type == pusch_dmrs_type2 && chest_freq == 0) { //pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d| + +#endif + } else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && chest_freq == 0) { //pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d| LOG_D(PHY,"PUSCH estimation DMRS type 2, Freq-domain interpolation"); + c16_t *pil = pilot; + int re_offset = k0; // Treat first DMRS specially (left edge) + *ul_ch=c16mulShift(*pil, + rxdataF[soffset+nushift+re_offset], + 15); + pil++; + ul_ch++; + re_offset = (re_offset + 1)%symbolSize; + ch_offset++; - rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)]; - - ul_ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ul_ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - - pil += 2; - ul_ch += 2; - re_offset = (re_offset + 1)%gNB->frame_parms.ofdm_symbol_size; + // TO verify: used after the loop, likely a piece of code is missing for ch_r + c16_t ch_r; + for (int re_cnt = 1; re_cnt < (nb_rb_pusch*NR_NB_SC_PER_RB) - 5; re_cnt += 6) { + c16_t ch_l=c16mulShift(*pil, + rxdataF[soffset+nushift+re_offset], + 15); + *ul_ch = ch_l; + pil++; + ul_ch++; ch_offset++; - - for (re_cnt = 1; re_cnt < (nb_rb_pusch*NR_NB_SC_PER_RB) - 5; re_cnt += 6){ - - rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)]; - - ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - - ul_ch[0] = ch_l[0]; - ul_ch[1] = ch_l[1]; - - pil += 2; - ul_ch += 2; - ch_offset++; - - multadd_real_four_symbols_vector_complex_scalar(filt8_ml2, - ch_l, - ul_ch); - - re_offset = (re_offset+5)%gNB->frame_parms.ofdm_symbol_size; - - rxF = (int16_t *)&rxdataF[aarx][soffset+symbol_offset+nushift+re_offset]; - - ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch_r[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - - - multadd_real_four_symbols_vector_complex_scalar(filt8_mr2, - ch_r, - ul_ch); - - //for (int re_idx = 0; re_idx < 8; re_idx += 2) - //printf("ul_ch = %d + j*%d\n", ul_ch[re_idx], ul_ch[re_idx+1]); - - ul_ch += 8; - ch_offset += 4; - - ul_ch[0] = ch_r[0]; - ul_ch[1] = ch_r[1]; - - pil += 2; - ul_ch += 2; - ch_offset++; - re_offset = (re_offset + 1)%gNB->frame_parms.ofdm_symbol_size; - - } - - // Treat last pilot specially (right edge) - - rxF = (int16_t *)&rxdataF[aarx][soffset+(symbol_offset+nushift+re_offset)]; - - ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - - ul_ch[0] = ch_l[0]; - ul_ch[1] = ch_l[1]; - - ul_ch += 2; + multadd_real_four_symbols_vector_complex_scalar(filt8_ml2, + &ch_l, + ul_ch); + re_offset = (re_offset+5)%symbolSize; + ch_r=c16mulShift(*pil, + rxdataF[soffset+nushift+re_offset], + 15); + multadd_real_four_symbols_vector_complex_scalar(filt8_mr2, + &ch_r, + ul_ch); + //for (int re_idx = 0; re_idx < 8; re_idx += 2) + //printf("ul_ch = %d + j*%d\n", ul_ch[re_idx], ul_ch[re_idx+1]); + ul_ch += 4; + ch_offset += 4; + *ul_ch = ch_r; + pil++; + ul_ch++; ch_offset++; + re_offset = (re_offset + 1)%symbolSize; + } + + // Treat last pilot specially (right edge) + c16_t ch_l=c16mulShift(*pil, + rxdataF[soffset+nushift+re_offset], + 15); + *ul_ch = ch_l; + ul_ch++; + ch_offset++; + multadd_real_four_symbols_vector_complex_scalar(filt8_rr1, + &ch_l, + ul_ch); + multadd_real_four_symbols_vector_complex_scalar(filt8_rr2, + &ch_r, + ul_ch); + __m128i *ul_ch_128 = (__m128i *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; + ul_ch_128[0] = _mm_slli_epi16 (ul_ch_128[0], 2); + } - multadd_real_four_symbols_vector_complex_scalar(filt8_rr1, - ch_l, - ul_ch); - - multadd_real_four_symbols_vector_complex_scalar(filt8_rr2, - ch_r, - ul_ch); - - ul_ch_128 = (__m128i *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; - - ul_ch_128[0] = _mm_slli_epi16 (ul_ch_128[0], 2); - } - - else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1) {// this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB - LOG_D(PHY,"PUSCH estimation DMRS type 1, no Freq-domain interpolation"); - int32_t ch_0, ch_1; + else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1) { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB + LOG_D(PHY,"PUSCH estimation DMRS type 1, no Freq-domain interpolation\n"); + c16_t *rxF = &rxdataF[soffset + nushift]; + int pil_offset = 0; + int re_offset = k0; + c16_t ch; + // First PRB - ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch[0] = ch_0 / 6; - ch[1] = ch_1 / 6; - - - + ch=c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6); #if NO_INTERP - for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch; - ul_ch+=24; + for (c16_t *end=ul_ch+12; ul_ch>15; - ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch[0] = ch_0 / 6; - ch[1] = ch_1 / 6; + for (int pilot_cnt=6; pilot_cnt<6*(nb_rb_pusch-1); pilot_cnt += 6) { + ch=c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6); #if NO_INTERP - for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch; - ul_ch+=24; + for (c16_t *end=ul_ch+12; ul_ch>15; // 1/12*16384 - ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 + ul_ch[3].r += (ch.r * 1365)>>15; // 1/12*16384 + ul_ch[3].i += (ch.i * 1365)>>15; // 1/12*16384 + + ul_ch += 4; + multadd_real_vector_complex_scalar(filt8_avlip3, ch, ul_ch, 8); ul_ch += 8; - multadd_real_vector_complex_scalar(filt8_avlip3, - ch, - ul_ch, - 8); + multadd_real_vector_complex_scalar(filt8_avlip4, ch, ul_ch, 8); - ul_ch += 16; - multadd_real_vector_complex_scalar(filt8_avlip4, - ch, - ul_ch, - 8); - - ul_ch += 16; - multadd_real_vector_complex_scalar(filt8_avlip5, - ch, - ul_ch, - 8); - ul_ch -= 16; + ul_ch += 8; + multadd_real_vector_complex_scalar(filt8_avlip5, ch, ul_ch, 8); + ul_ch -= 8; #endif } // Last PRB - ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch[0] = ch_0 / 6; - ch[1] = ch_1 / 6; - + ch=c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6); + #if NO_INTERP - for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch; - ul_ch+=24; + for (c16_t *end=ul_ch+12; ul_ch>15; // 1/12*16384 - ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 - - ul_ch += 8; - multadd_real_vector_complex_scalar(filt8_avlip3, + ul_ch[3].r += (ch.r * 1365)>>15; // 1/12*16384 + ul_ch[3].i += (ch.i * 1365)>>15; // 1/12*16384 + + ul_ch += 4; + c16multaddVectRealComplex(filt8_avlip3, ch, ul_ch, 8); - - ul_ch += 16; - multadd_real_vector_complex_scalar(filt8_avlip6, + + ul_ch += 8; + c16multaddVectRealComplex(filt8_avlip6, ch, ul_ch, 8); #endif - } - else { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB + } else { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB LOG_D(PHY,"PUSCH estimation DMRS type 2, no Freq-domain interpolation"); - int32_t ch_0, ch_1; + c16_t *pil = pilot; + int re_offset = k0; + c32_t ch0={0}; //First PRB - ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch[0] = ch_0 / 4; - ch[1] = ch_1 / 4; + ch0=c32x16mulShift(*pil, + rxdataF[soffset + nushift + re_offset], + 15); + pil++; + re_offset = (re_offset+1) % symbolSize; + ch0=c32x16maddShift(*pil, + rxdataF[nushift+re_offset], + ch0, + 15); + pil++; + re_offset = (re_offset+5) % symbolSize; + ch0=c32x16maddShift(*pil, + rxdataF[nushift+re_offset], + ch0, + 15); + re_offset = (re_offset+1) % symbolSize; + ch0=c32x16maddShift(*pil, + rxdataF[nushift+re_offset], + ch0, + 15); + pil++; + re_offset = (re_offset+5) % symbolSize; + c16_t ch=c16x32div(ch0, 4); #if NO_INTERP - for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch; - ul_ch+=24; + for (c16_t *end=ul_ch+12; ul_ch>15; - ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; + ch0=c32x16maddShift(*pil, rxdataF[nushift+re_offset], ch0, 15); + pil++; + re_offset = (re_offset+5) % symbolSize; - pil += 2; - re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; + ch0=c32x16maddShift(*pil, rxdataF[nushift+re_offset], ch0, 15); + pil++; + re_offset = (re_offset+1) % symbolSize; - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; + ch0=c32x16maddShift(*pil, rxdataF[nushift+re_offset], ch0, 15); + pil++; + re_offset = (re_offset+5) % symbolSize; - pil += 2; - re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch[0] = ch_0 / 4; - ch[1] = ch_1 / 4; + ch=c16x32div(ch0, 4); #if NO_INTERP - for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch; - ul_ch+=24; + for (c16_t *end=ul_ch+12; ul_ch>15; // 1/12*16384 - ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 - + ul_ch[3]=c16maddShift(ch,(c16_t) {1365,1365},15); // 1365 = 1/12*16384 (full range is +/- 32768) + ul_ch += 4; + c16multaddVectRealComplex(filt8_avlip3, &ch, ul_ch, 8); ul_ch += 8; - multadd_real_vector_complex_scalar(filt8_avlip3, - ch, - ul_ch, - 8); - - ul_ch += 16; - multadd_real_vector_complex_scalar(filt8_avlip4, - ch, - ul_ch, - 8); - - ul_ch += 16; - multadd_real_vector_complex_scalar(filt8_avlip5, - ch, - ul_ch, - 8); - ul_ch -= 16; + c16multaddVectRealComplex(filt8_avlip4, &ch, ul_ch, 8); + ul_ch += 8; + c16multaddVectRealComplex(filt8_avlip5, &ch, ul_ch, 8); + ul_ch -= 8; #endif } + // Last PRB - ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15; - ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15; - - pil += 2; - re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)]; - - ch[0] = ch_0 / 4; - ch[1] = ch_1 / 4; - + ch0=c32x16mulShift(*pil, rxdataF[nushift+re_offset], 15); + pil++; + re_offset = (re_offset+1) % symbolSize; + + ch0=c32x16maddShift(*pil, rxdataF[nushift+re_offset], ch0, 15); + pil++; + re_offset = (re_offset+5) % symbolSize; + + ch0=c32x16maddShift(*pil, rxdataF[nushift+re_offset], ch0, 15); + pil++; + re_offset = (re_offset+1) % symbolSize; + + ch0=c32x16maddShift(*pil, rxdataF[nushift+re_offset], ch0, 15); + pil++; + re_offset = (re_offset+5) % symbolSize; + + ch=c16x32div(ch0, 4); #if NO_INTERP - for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch; - ul_ch+=24; + for (c16_t *end=ul_ch+12; ul_ch>15; // 1/12*16384 - ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384 - + ul_ch[3]=c16maddShift(ch, c16_t {1365,1365},15);// 1365 = 1/12*16384 (full range is +/- 32768) + ul_ch += 4; + c16multaddVectRealComplex(filt8_avlip3, &ch, ul_ch, 8); ul_ch += 8; - multadd_real_vector_complex_scalar(filt8_avlip3, - ch, - ul_ch, - 8); - - ul_ch += 16; - multadd_real_vector_complex_scalar(filt8_avlip6, - ch, - ul_ch, - 8); + c16multaddVectRealComplex(filt8_avlip6, &ch, ul_ch, 8); #endif } + #ifdef DEBUG_PUSCH - ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset]; - for(uint16_t idxP=0; idxPframe_parms.nb_antennas_rx+aarx][ch_offset]; + + for(int idxP=0; idxPframe_parms.ofdm_symbol_size, - (int16_t*) &ul_ch_estimates[aarx][symbol_offset], - (int16_t*) ul_ch_estimates_time[aarx]); + freq2time(symbolSize, + (int16_t *) &ul_ch_estimates[aarx][symbol_offset], + (int16_t *) gNB->pusch_vars[ul_id]->ul_ch_estimates_time[aarx]); } #ifdef DEBUG_CH fclose(debug_ch_est); #endif - return(0); } @@ -852,12 +607,10 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, uint8_t ulsch_id, uint8_t nr_tti_rx, unsigned char symbol, - uint32_t nb_re_pusch) -{ + uint32_t nb_re_pusch) { //#define DEBUG_UL_PTRS 1 int32_t *ptrs_re_symbol = NULL; int8_t ret = 0; - uint8_t symbInSlot = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols; uint8_t *startSymbIndex = &rel15_ul->start_symbol_index; uint8_t *nbSymb = &rel15_ul->nr_of_symbols; @@ -869,6 +622,7 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, uint8_t *dmrsConfigType = &rel15_ul->dmrs_config_type; uint16_t *nb_rb = &rel15_ul->rb_size; uint8_t *ptrsReOffset = &rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset; + /* loop over antennas */ for (int aarx=0; aarxnb_antennas_rx; aarx++) { c16_t *phase_per_symbol = (c16_t*)gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx]; @@ -895,8 +649,10 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, 1<< *L_ptrs, *dmrsSymbPos); } + /* if not PTRS symbol set current ptrs symbol index to zero*/ *ptrsSymbIdx = 0; + /* Check if current symbol contains PTRS */ if(is_ptrs_symbol(symbol, *ptrsSymbPos)) { *ptrsSymbIdx = symbol; @@ -907,11 +663,12 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, rel15_ul->rnti, nr_tti_rx, symbol,frame_parms->ofdm_symbol_size, - (int16_t*)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(symbol * nb_re_pusch)], + (int16_t *)&gNB->pusch_vars[ulsch_id]->rxdataF_comp[aarx][(symbol * nb_re_pusch)], gNB->nr_gold_pusch_dmrs[rel15_ul->scid][nr_tti_rx][symbol], (int16_t*)&phase_per_symbol[symbol], ptrs_re_symbol); } + /* For last OFDM symbol at each antenna perform interpolation and compensation for the slot*/ if(symbol == (symbInSlot -1)) { /*------------------------------------------------------------------------------------------------------- */ @@ -924,16 +681,18 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB, LOG_W(PHY,"[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n"); } } + #ifdef DEBUG_UL_PTRS LOG_M("ptrsEstUl.m","est",gNB->pusch_vars[ulsch_id]->ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 ); LOG_M("rxdataF_bf_ptrs_comp_ul.m","bf_ptrs_cmp", &gNB->pusch_vars[0]->rxdataF_comp[aarx][rel15_ul->start_symbol_index * NR_NB_SC_PER_RB * rel15_ul->rb_size], rel15_ul->nr_of_symbols * NR_NB_SC_PER_RB * rel15_ul->rb_size,1,1); #endif + /*------------------------------------------------------------------------------------------------------- */ /* 3) Compensated DMRS based estimated signal with PTRS estimation */ /*--------------------------------------------------------------------------------------------------------*/ - for(uint8_t i = *startSymbIndex; i< symbInSlot ;i++) { + for(uint8_t i = *startSymbIndex; i< symbInSlot ; i++) { /* DMRS Symbol has 0 phase so no need to rotate the respective symbol */ /* Skip rotation if the slot processing is wrong */ if((!is_dmrs_symbol(i,*dmrsSymbPos)) && (ret == 0)) { @@ -957,6 +716,7 @@ uint32_t calc_power(const int16_t *x, const uint32_t size) { sum_x = sum_x + x[k]; sum_x2 = sum_x2 + x[k]*x[k]; } + return sum_x2/size - (sum_x/size)*(sum_x/size); } @@ -1252,7 +1012,7 @@ int nr_srs_channel_estimation(const PHY_VARS_gNB *gNB, *noise_power = max(calc_power(noise_real,frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS) + calc_power(noise_imag,frame_parms->nb_antennas_rx*N_ap*M_sc_b_SRS), 1); - *snr = dB_fixed((int32_t)((*signal_power<nb_symbols; pduBitmap = dlsch1_harq->pduBitmap; } - + /* Check for PTRS bitmap and process it respectively */ if((pduBitmap & 0x1) && (type == PDSCH)) { nr_pdsch_ptrs_processing(ue, - pdsch_vars, - frame_parms, - dlsch0_harq, - dlsch1_harq, - gNB_id, - nr_slot_rx, - symbol, - (nb_rb_pdsch*12), - dlsch[0]->rnti,rx_type); + pdsch_vars, + frame_parms, + dlsch0_harq, + dlsch1_harq, + gNB_id, + nr_slot_rx, + symbol, + (nb_rb_pdsch*12), + dlsch[0]->rnti,rx_type); pdsch_vars[gNB_id]->dl_valid_re[symbol-1] -= pdsch_vars[gNB_id]->ptrs_re_per_slot[0][symbol]; } - + /* at last symbol in a slot calculate LLR's for whole slot */ if(symbol == (startSymbIdx + nbSymb -1)) { for(uint8_t i =startSymbIdx; i < (startSymbIdx+nbSymb);i++) { /* re evaluating the first symbol flag as LLR's are done in symbol loop */ if(i == startSymbIdx && i < 3) { - first_symbol_flag =1; + first_symbol_flag =1; } else { - first_symbol_flag=0; + first_symbol_flag=0; } /* Calculate LLR's for each symbol */ nr_dlsch_llr(pdsch_vars, frame_parms, - rxdataF_comp_ptr, dl_ch_mag_ptr, - dlsch0_harq, dlsch1_harq, - rx_type, harq_pid, - gNB_id, gNB_id_i, - first_symbol_flag, - i, nb_rb_pdsch, - codeword_TB0, codeword_TB1, - pdsch_vars[gNB_id]->dl_valid_re[i-1], - nr_slot_rx, beamforming_mode); + rxdataF_comp_ptr, dl_ch_mag_ptr, + dlsch0_harq, dlsch1_harq, + rx_type, harq_pid, + gNB_id, gNB_id_i, + first_symbol_flag, + i, nb_rb_pdsch, + codeword_TB0, codeword_TB1, + pdsch_vars[gNB_id]->dl_valid_re[i-1], + nr_slot_rx, beamforming_mode); } - + int dmrs_type = dlsch[0]->harq_processes[harq_pid]->dmrsConfigType; uint8_t nb_re_dmrs; uint16_t dmrs_len = get_num_dmrs(dlsch[0]->harq_processes[harq_pid]->dlDmrsSymbPos); @@ -528,29 +528,29 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue, nb_re_dmrs = 4*dlsch[0]->harq_processes[harq_pid]->n_dmrs_cdm_groups; } dlsch[0]->harq_processes[harq_pid]->G = nr_get_G(dlsch[0]->harq_processes[harq_pid]->nb_rb, - dlsch[0]->harq_processes[harq_pid]->nb_symbols, - nb_re_dmrs, - dmrs_len, - dlsch[0]->harq_processes[harq_pid]->Qm, - dlsch[0]->harq_processes[harq_pid]->Nl); + dlsch[0]->harq_processes[harq_pid]->nb_symbols, + nb_re_dmrs, + dmrs_len, + dlsch[0]->harq_processes[harq_pid]->Qm, + dlsch[0]->harq_processes[harq_pid]->Nl); nr_dlsch_layer_demapping(pdsch_vars[gNB_id]->llr, - dlsch[0]->harq_processes[harq_pid]->Nl, - dlsch[0]->harq_processes[harq_pid]->Qm, - dlsch[0]->harq_processes[harq_pid]->G, - codeword_TB0, - codeword_TB1, - pdsch_vars[gNB_id]->layer_llr); + dlsch[0]->harq_processes[harq_pid]->Nl, + dlsch[0]->harq_processes[harq_pid]->Qm, + dlsch[0]->harq_processes[harq_pid]->G, + codeword_TB0, + codeword_TB1, + pdsch_vars[gNB_id]->layer_llr); } - + stop_meas(&ue->generic_stat_bis[proc->thread_id][slot]); if (cpumeas(CPUMEAS_GETSTATE)) LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n",frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[proc->thread_id][slot].p_time/(cpuf*1000.0)); - + // Please keep it: useful for debugging #ifdef DEBUG_PDSCH_RX char filename[50]; uint8_t aa = 0; - + snprintf(filename, 50, "rxdataF0_symb_%d_nr_slot_rx_%d.m", symbol, nr_slot_rx); write_output(filename, "rxdataF0", &common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[0][0], NR_SYMBOLS_PER_SLOT*frame_parms->ofdm_symbol_size, 1, 1); diff --git a/openair1/PHY/TOOLS/8bit_rxdemux.c b/openair1/PHY/TOOLS/8bit_rxdemux.c deleted file mode 100644 index 030be47b5d..0000000000 --- a/openair1/PHY/TOOLS/8bit_rxdemux.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include "PHY/types.h" -#include "PHY/defs.h" -#include "PHY/extern.h" - - -void bit8_rxdemux(int length,int offset) -{ - - int i; - short *rx1_ptr = (short *)&PHY_vars->rx_vars[1].RX_DMA_BUFFER[offset]; - short *rx0_ptr = (short *)&PHY_vars->rx_vars[0].RX_DMA_BUFFER[offset]; - char *rx0_ptr2 = (char *)(&PHY_vars->rx_vars[0].RX_DMA_BUFFER[offset]); - // short tmp; - short r0,i0,r1,i1; - - // printf("demuxing: %d,%d\n",length,offset); - - // printf("%x %x\n",PHY_vars->chsch_data[0].CHSCH_f_sync[0], PHY_vars->chsch_data[0].CHSCH_f_sync[1]); - - for (i=0; ichsch_data[0].CHSCH_f_sync[0], PHY_vars->chsch_data[0].CHSCH_f_sync[1]); - -} diff --git a/openair1/PHY/TOOLS/8bit_txmux.c b/openair1/PHY/TOOLS/8bit_txmux.c deleted file mode 100644 index b103bc9c5c..0000000000 --- a/openair1/PHY/TOOLS/8bit_txmux.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include "PHY/types.h" -#include "PHY/defs.h" -#include "PHY/extern.h" - - -void bit8_txmux(int length,int offset) -{ - - int i; - short *dest,*dest2; - - - - - for (i=0; itx_vars[0].TX_DMA_BUFFER[i+offset]; - dest2 = (short *)&PHY_vars->tx_vars[1].TX_DMA_BUFFER[i+offset]; - - ((char *)dest)[0] = (char)(dest[0]>>BIT8_TX_SHIFT); - ((char *)dest)[1] = (char)(dest[1]>>BIT8_TX_SHIFT); - ((char *)dest)[2] = (char)(dest2[0]>>BIT8_TX_SHIFT); - ((char *)dest)[3] = (char)(dest2[1]>>BIT8_TX_SHIFT); - } - - -} diff --git a/openair1/PHY/TOOLS/cadd_sv.c b/openair1/PHY/TOOLS/cadd_sv.c deleted file mode 100644 index 56dcb71847..0000000000 --- a/openair1/PHY/TOOLS/cadd_sv.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include "defs.h" - -static __m128i alpha_128 __attribute__ ((aligned(16))); -static __m128i shift __attribute__ ((aligned(16))); - -int add_cpx_vector(short *x, - short *alpha, - short *y, - unsigned int N) -{ - unsigned int i; // loop counter - - __m128i *x_128; - __m128i *y_128; - - x_128 = (__m128i *)&x[0]; - y_128 = (__m128i *)&y[0]; - - alpha_128 = _mm_set1_epi32(*((int*)alpha)); - - // we compute 4 cpx multiply for each loop - for(i=0; i<(N>>3); i++) { - y_128[0] = _mm_adds_epi16(alpha_128, x_128[0]); - y_128[1] = _mm_adds_epi16(alpha_128, x_128[1]); - y_128[2] = _mm_adds_epi16(alpha_128, x_128[2]); - y_128[3] = _mm_adds_epi16(alpha_128, x_128[3]); - - - x_128+=4; - y_128 +=4; - - } - - return (0); -} - -int add_vector32_scalar(short *x, - int alpha, - short *y, - unsigned int N) -{ - unsigned int i; // loop counter - - __m128i *x_128; - __m128i *y_128; - - x_128 = (__m128i *)&x[0]; - y_128 = (__m128i *)&y[0]; - - alpha_128 = _mm_setr_epi32(alpha,0,alpha,0); - - // we compute 4 cpx multiply for each loop - for(i=0; i<(N>>3); i++) { - y_128[0] = _mm_add_epi32(alpha_128, x_128[0]); - y_128[1] = _mm_add_epi32(alpha_128, x_128[1]); - y_128[2] = _mm_add_epi32(alpha_128, x_128[2]); - y_128[3] = _mm_add_epi32(alpha_128, x_128[3]); - - - x_128+=4; - y_128 +=4; - - } - - return (0); -} - - -int add_real_vector64_scalar(short *x, - long long int a, - short *y, - unsigned int N) -{ - unsigned int i; // loop counter - - __m128i *x_128; - __m128i *y_128; - - x_128 = (__m128i *)&x[0]; - y_128 = (__m128i *)&y[0]; - - alpha_128 = _mm_set1_epi64((__m64) a); - - // we compute 4 cpx multiply for each loop - for(i=0; i<(N>>3); i++) { - y_128[0] = _mm_add_epi64(alpha_128, x_128[0]); - y_128[1] = _mm_add_epi64(alpha_128, x_128[1]); - y_128[2] = _mm_add_epi64(alpha_128, x_128[2]); - y_128[3] = _mm_add_epi64(alpha_128, x_128[3]); - - - x_128+=4; - y_128+=4; - - } - - return(0); -} - - -#ifdef MAIN -#include - -main () -{ - - short input[256] __attribute__((aligned(16))); - short output[256] __attribute__((aligned(16))); - - int i; - c16_t alpha; - - Zero_Buffer(output,256*2); - - input[0] = 100; - input[1] = 200; - input[2] = 100; - input[3] = 200; - input[4] = 1234; - input[5] = -1234; - input[6] = 1234; - input[7] = -1234; - input[8] = 100; - input[9] = 200; - input[10] = 100; - input[11] = 200; - input[12] = 1000; - input[13] = 2000; - input[14] = 1000; - input[15] = 2000; - - alpha.r = 10; - alpha.i = -10; - - add_cpx_vector(input,(short*) &alpha,input,8); - - for (i=0; i<16; i+=2) - printf("output[%d] = %d + %d i\n",i,input[i],input[i+1]); - -} - -#endif //MAIN diff --git a/openair1/PHY/TOOLS/cadd_vv.c b/openair1/PHY/TOOLS/cadd_vv.c index 08bf514cb3..88a2bd9814 100644 --- a/openair1/PHY/TOOLS/cadd_vv.c +++ b/openair1/PHY/TOOLS/cadd_vv.c @@ -23,153 +23,6 @@ #include "tools_defs.h" -int add_vector16(short *x, - short *y, - short *z, - unsigned int N) -{ - unsigned int i; // loop counter - - __m128i *x_128; - __m128i *y_128; - __m128i *z_128; - - x_128 = (__m128i *)&x[0]; - y_128 = (__m128i *)&y[0]; - z_128 = (__m128i *)&z[0]; - - - for(i=0; i<(N>>5); i++) { - /* - printf("i = %d\n",i); - print_shorts(x_128[0],"x[0]="); - print_shorts(y_128[0],"y[0]="); - */ - - z_128[0] = _mm_adds_epi16(x_128[0],y_128[0]); - /* - print_shorts(z_128[0],"z[0]="); - - print_shorts(x_128[1],"x[1]="); - print_shorts(y_128[1],"y[1]="); - */ - - z_128[1] = _mm_adds_epi16(x_128[1],y_128[1]); - /* - print_shorts(z_128[1],"z[1]="); - - print_shorts(x_128[2],"x[2]="); - print_shorts(y_128[2],"y[2]="); - */ - - z_128[2] = _mm_adds_epi16(x_128[2],y_128[2]); - /* - print_shorts(z_128[2],"z[2]="); - - print_shorts(x_128[3],"x[3]="); - print_shorts(y_128[3],"y[3]="); - */ - - z_128[3] = _mm_adds_epi16(x_128[3],y_128[3]); - /* - print_shorts(z_128[3],"z[3]="); - */ - - - - - - x_128 +=4; - y_128 +=4; - z_128 +=4; - - } - - _mm_empty(); - _m_empty(); - - return(0); -} - -/* -print_shorts64(__m64 x,char *s) { - - printf("%s ",s); - printf("%d %d %d %d\n",((short *)&x)[0],((short *)&x)[1],((short *)&x)[2],((short *)&x)[3]); - -} -*/ - -int add_vector16_64(short *x, - short *y, - short *z, - unsigned int N) -{ - unsigned int i; // loop counter - - __m64 *x_64; - __m64 *y_64; - __m64 *z_64; - - x_64 = (__m64 *)&x[0]; - y_64 = (__m64 *)&y[0]; - z_64 = (__m64 *)&z[0]; - - - for(i=0; i<(N>>2); i++) { - /* - printf("i = %d\n",i); - print_shorts64(x_64[i],"x[i]="); - print_shorts64(y_64[i],"y[i]="); - */ - - z_64[i] = _mm_adds_pi16(x_64[i],y_64[i]); - /* - print_shorts64(z_64[i],"z[i]="); - */ - - - } - - _mm_empty(); - _m_empty(); - return(0); -} - -int add_cpx_vector32(short *x, - short *y, - short *z, - unsigned int N) -{ - unsigned int i; // loop counter - - __m128i *x_128; - __m128i *y_128; - __m128i *z_128; - - x_128 = (__m128i *)&x[0]; - y_128 = (__m128i *)&y[0]; - z_128 = (__m128i *)&z[0]; - - - for(i=0; i<(N>>3); i++) { - z_128[0] = _mm_add_epi32(x_128[0],y_128[0]); - z_128[1] = _mm_add_epi32(x_128[1],y_128[1]); - z_128[2] = _mm_add_epi32(x_128[2],y_128[2]); - z_128[3] = _mm_add_epi32(x_128[3],y_128[3]); - - - x_128+=4; - y_128 +=4; - z_128 +=4; - - } - - _mm_empty(); - _m_empty(); - return(0); -} - int32_t sub_cpx_vector16(int16_t *x, int16_t *y, int16_t *z, @@ -201,73 +54,6 @@ int32_t sub_cpx_vector16(int16_t *x, -int add_real_vector64(short *x, - short* y, - short *z, - unsigned int N) -{ - unsigned int i; // loop counter - - __m128i *x_128; - __m128i *y_128; - __m128i *z_128; - - x_128 = (__m128i *)&x[0]; - y_128 = (__m128i *)&y[0]; - z_128 = (__m128i *)&z[0]; - - for(i=0; i<(N>>3); i++) { - z_128[0] = _mm_add_epi64(x_128[0], y_128[0]); - z_128[1] = _mm_add_epi64(x_128[1], y_128[1]); - z_128[2] = _mm_add_epi64(x_128[2], y_128[2]); - z_128[3] = _mm_add_epi64(x_128[3], y_128[3]); - - - x_128+=4; - y_128+=4; - z_128+=4; - - } - - _mm_empty(); - _m_empty(); - return(0); -} - -int sub_real_vector64(short *x, - short* y, - short *z, - unsigned int N) -{ - unsigned int i; // loop counter - - __m128i *x_128; - __m128i *y_128; - __m128i *z_128; - - x_128 = (__m128i *)&x[0]; - y_128 = (__m128i *)&y[0]; - z_128 = (__m128i *)&z[0]; - - for(i=0; i<(N>>3); i++) { - z_128[0] = _mm_sub_epi64(x_128[0], y_128[0]); - z_128[1] = _mm_sub_epi64(x_128[1], y_128[1]); - z_128[2] = _mm_sub_epi64(x_128[2], y_128[2]); - z_128[3] = _mm_sub_epi64(x_128[3], y_128[3]); - - - x_128+=4; - y_128+=4; - z_128+=4; - - } - - _mm_empty(); - _m_empty(); - return(0); -} - - #ifdef MAIN #include @@ -280,7 +66,7 @@ main () int i; c16_t alpha; - Zero_Buffer(output,256*2); + memset(output,0,256*2); input[0] = 100; input[1] = 200; diff --git a/openair1/PHY/TOOLS/cmult_sv.c b/openair1/PHY/TOOLS/cmult_sv.c index fb2f4d589e..a596446a44 100644 --- a/openair1/PHY/TOOLS/cmult_sv.c +++ b/openair1/PHY/TOOLS/cmult_sv.c @@ -22,28 +22,6 @@ #include "PHY/sse_intrin.h" #include "tools_defs.h" -#if defined(__x86_64__) || defined(__i386__) -#define simd_q15_t __m128i -#define simdshort_q15_t __m64 -#define shiftright_int16(a,shift) _mm_srai_epi16(a,shift) -#define set1_int16(a) _mm_set1_epi16(a) -#define mulhi_int16(a,b) _mm_slli_epi16(_mm_mulhi_epi16(a,b),1) -#define mulhi_s1_int16(a,b) _mm_slli_epi16(_mm_mulhi_epi16(a,b),2) -#define adds_int16(a,b) _mm_adds_epi16(a,b) -#define mullo_int16(a,b) _mm_mullo_epi16(a,b) -#elif defined(__arm__) -#define simd_q15_t int16x8_t -#define simdshort_q15_t int16x4_t -#define shiftright_int16(a,shift) vshrq_n_s16(a,shift) -#define set1_int16(a) vdupq_n_s16(a) -#define mulhi_int16(a,b) vqdmulhq_s16(a,b) -#define mulhi_s1_int16(a,b) vshlq_n_s16(vqdmulhq_s16(a,b),1) -#define adds_int16(a,b) vqaddq_s16(a,b) -#define mullo_int16(a,b) vmulq_s16(a,b) -#define _mm_empty() -#define _m_empty() -#endif - void multadd_complex_vector_real_scalar(int16_t *x, int16_t alpha, @@ -111,216 +89,137 @@ void multadd_real_vector_complex_scalar(int16_t *x, } } -void multadd_real_four_symbols_vector_complex_scalar(int16_t *x, - int16_t *alpha, - int16_t *y) -{ - // do 8 multiplications at a time - simd_q15_t alpha_r_128,alpha_i_128,yr,yi,*x_128=(simd_q15_t*)x; - simd_q15_t y_128; - y_128 = _mm_loadu_si128((simd_q15_t*)y); - - alpha_r_128 = set1_int16(alpha[0]); - alpha_i_128 = set1_int16(alpha[1]); - - - yr = mulhi_s1_int16(alpha_r_128,x_128[0]); - yi = mulhi_s1_int16(alpha_i_128,x_128[0]); - y_128 = _mm_adds_epi16(y_128,_mm_unpacklo_epi16(yr,yi)); - y_128 = _mm_adds_epi16(y_128,_mm_unpackhi_epi16(yr,yi)); - - _mm_storeu_si128((simd_q15_t*)y, y_128); - - _mm_empty(); - _m_empty(); - -} -#ifdef __AVX2__ void rotate_cpx_vector(c16_t *x, - c16_t *alpha, - c16_t *y, - uint32_t N, - uint16_t output_shift) + c16_t *alpha, + c16_t *y, + uint32_t N, + uint16_t output_shift) { - // Multiply elementwise two complex vectors of N elements - // x - input 1 in the format |Re0 Im0 |,......,|Re(N-1) Im(N-1)| - // We assume x1 with a dynamic of 15 bit maximum - // - // alpha - input 2 in the format |Re0 Im0| - // We assume x2 with a dynamic of 15 bit maximum - // - // y - output in the format |Re0 Im0|,......,|Re(N-1) Im(N-1)| - // - // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; - // - // log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0) - // WARNING: log2_amp>0 can cause overflow!! - - uint32_t i; // loop counter - - - simd_q15_t *y_128,alpha_128; - int32_t *xd=(int32_t *)x; - -#if defined(__x86_64__) || defined(__i386__) - __m128i shift = _mm_cvtsi32_si128(output_shift); - register simd_q15_t m0,m1,m2,m3; - - ((int16_t *)&alpha_128)[0] = alpha->r; - ((int16_t *)&alpha_128)[1] = -alpha->i; - ((int16_t *)&alpha_128)[2] = alpha->i; - ((int16_t *)&alpha_128)[3] = alpha->r; - ((int16_t *)&alpha_128)[4] = alpha->r; - ((int16_t *)&alpha_128)[5] = -alpha->i; - ((int16_t *)&alpha_128)[6] = alpha->i; - ((int16_t *)&alpha_128)[7] = alpha->r; -#elif defined(__arm__) - int32x4_t shift; - int32x4_t ab_re0,ab_re1,ab_im0,ab_im1,re32,im32; - int16_t reflip[8] __attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; - int32x4x2_t xtmp; - - ((int16_t *)&alpha_128)[0] = alpha->r; - ((int16_t *)&alpha_128)[1] = alpha->i; - ((int16_t *)&alpha_128)[2] = alpha->r; - ((int16_t *)&alpha_128)[3] = alpha->i; - ((int16_t *)&alpha_128)[4] = alpha->r; - ((int16_t *)&alpha_128)[5] = alpha->i; - ((int16_t *)&alpha_128)[6] = alpha->r; - ((int16_t *)&alpha_128)[7] = alpha->i; - int16x8_t bflip = vrev32q_s16(alpha_128); - int16x8_t bconj = vmulq_s16(alpha_128,*(int16x8_t *)reflip); - shift = vdupq_n_s32(-output_shift); + // multiply a complex vector with a complex value (alpha) + // stores result in y + // N is the number of complex numbers + // output_shift reduces the result of the multiplication by this number of bits + //AssertFatal(N%8==0, "To be developped"); +#ifdef __AVX2__ + if ( (intptr_t)x%32 == 0 && !(intptr_t)y%32 == 0 && __builtin_cpu_supports("avx2")) { + // output is 32 bytes aligned, but not the input + + const c16_t for_re={alpha->r, -alpha->i}; + __m256i const alpha_for_real = _mm256_set1_epi32(*(uint32_t*)&for_re); + const c16_t for_im={alpha->i, alpha->r}; + __m256i const alpha_for_im= _mm256_set1_epi32(*(uint32_t*)&for_im); + __m256i const perm_mask = + _mm256_set_epi8(31,30,23,22,29,28,21,20,27,26,19,18,25,24,17,16, + 15,14,7,6,13,12,5,4,11,10,3,2,9,8,1,0); + __m256i* xd= (__m256i*)x; + const __m256i *end=xd+N/8; + for( __m256i* yd = (__m256i *)y; xd=4; + // + // log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0) + // WARNING: log2_amp>0 can cause overflow!! + + uint32_t i; // loop counter - for(i=0; i>2; i++) { + simd_q15_t *y_128,alpha_128; + int32_t *xd=(int32_t *)x; + #if defined(__x86_64__) || defined(__i386__) - m0 = _mm_setr_epi32(xd[0],xd[0],xd[1],xd[1]); - m1 = _mm_setr_epi32(xd[2],xd[2],xd[3],xd[3]); - m2 = _mm_madd_epi16(m0,alpha_128); //complex multiply. result is 32bit [Re Im Re Im] - m3 = _mm_madd_epi16(m1,alpha_128); //complex multiply. result is 32bit [Re Im Re Im] - m2 = _mm_sra_epi32(m2,shift); // shift right by shift in order to compensate for the input amplitude - m3 = _mm_sra_epi32(m3,shift); // shift right by shift in order to compensate for the input amplitude + __m128i shift = _mm_cvtsi32_si128(output_shift); + register simd_q15_t m0,m1,m2,m3; - y_128[0] = _mm_packs_epi32(m2,m3); // pack in 16bit integers with saturation [re im re im re im re im] - //print_ints("y_128[0]=", &y_128[0]); + ((int16_t *)&alpha_128)[0] = alpha->r; + ((int16_t *)&alpha_128)[1] = -alpha->i; + ((int16_t *)&alpha_128)[2] = alpha->i; + ((int16_t *)&alpha_128)[3] = alpha->r; + ((int16_t *)&alpha_128)[4] = alpha->r; + ((int16_t *)&alpha_128)[5] = -alpha->i; + ((int16_t *)&alpha_128)[6] = alpha->i; + ((int16_t *)&alpha_128)[7] = alpha->r; +#elif defined(__arm__) + int32x4_t shift; + int32x4_t ab_re0,ab_re1,ab_im0,ab_im1,re32,im32; + int16_t reflip[8] __attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; + int32x4x2_t xtmp; + + ((int16_t *)&alpha_128)[0] = alpha->r; + ((int16_t *)&alpha_128)[1] = alpha->i; + ((int16_t *)&alpha_128)[2] = alpha->r; + ((int16_t *)&alpha_128)[3] = alpha->i; + ((int16_t *)&alpha_128)[4] = alpha->r; + ((int16_t *)&alpha_128)[5] = alpha->i; + ((int16_t *)&alpha_128)[6] = alpha->r; + ((int16_t *)&alpha_128)[7] = alpha->i; + int16x8_t bflip = vrev32q_s16(alpha_128); + int16x8_t bconj = vmulq_s16(alpha_128,*(int16x8_t *)reflip); + shift = vdupq_n_s32(-output_shift); +#endif + y_128 = (simd_q15_t *) y; + + + for(i=0; i>2; i++) { +#if defined(__x86_64__) || defined(__i386__) + m0 = _mm_setr_epi32(xd[0],xd[0],xd[1],xd[1]); + m1 = _mm_setr_epi32(xd[2],xd[2],xd[3],xd[3]); + m2 = _mm_madd_epi16(m0,alpha_128); //complex multiply. result is 32bit [Re Im Re Im] + m3 = _mm_madd_epi16(m1,alpha_128); //complex multiply. result is 32bit [Re Im Re Im] + m2 = _mm_sra_epi32(m2,shift); // shift right by shift in order to compensate for the input amplitude + m3 = _mm_sra_epi32(m3,shift); // shift right by shift in order to compensate for the input amplitude + + y_128[0] = _mm_packs_epi32(m2,m3); // pack in 16bit integers with saturation [re im re im re im re im] + //print_ints("y_128[0]=", &y_128[0]); #elif defined(__arm__) - ab_re0 = vmull_s16(((int16x4_t*)xd)[0],((int16x4_t*)&bconj)[0]); - ab_re1 = vmull_s16(((int16x4_t*)xd)[1],((int16x4_t*)&bconj)[1]); - ab_im0 = vmull_s16(((int16x4_t*)xd)[0],((int16x4_t*)&bflip)[0]); - ab_im1 = vmull_s16(((int16x4_t*)xd)[1],((int16x4_t*)&bflip)[1]); - re32 = vshlq_s32(vcombine_s32(vpadd_s32(((int32x2_t*)&ab_re0)[0],((int32x2_t*)&ab_re0)[1]), - vpadd_s32(((int32x2_t*)&ab_re1)[0],((int32x2_t*)&ab_re1)[1])), - shift); - im32 = vshlq_s32(vcombine_s32(vpadd_s32(((int32x2_t*)&ab_im0)[0],((int32x2_t*)&ab_im0)[1]), - vpadd_s32(((int32x2_t*)&ab_im1)[0],((int32x2_t*)&ab_im1)[1])), - shift); + ab_re0 = vmull_s16(((int16x4_t*)xd)[0],((int16x4_t*)&bconj)[0]); + ab_re1 = vmull_s16(((int16x4_t*)xd)[1],((int16x4_t*)&bconj)[1]); + ab_im0 = vmull_s16(((int16x4_t*)xd)[0],((int16x4_t*)&bflip)[0]); + ab_im1 = vmull_s16(((int16x4_t*)xd)[1],((int16x4_t*)&bflip)[1]); + re32 = vshlq_s32(vcombine_s32(vpadd_s32(((int32x2_t*)&ab_re0)[0],((int32x2_t*)&ab_re0)[1]), + vpadd_s32(((int32x2_t*)&ab_re1)[0],((int32x2_t*)&ab_re1)[1])), + shift); + im32 = vshlq_s32(vcombine_s32(vpadd_s32(((int32x2_t*)&ab_im0)[0],((int32x2_t*)&ab_im0)[1]), + vpadd_s32(((int32x2_t*)&ab_im1)[0],((int32x2_t*)&ab_im1)[1])), + shift); - xtmp = vzipq_s32(re32,im32); + xtmp = vzipq_s32(re32,im32); - y_128[0] = vcombine_s16(vmovn_s32(xtmp.val[0]),vmovn_s32(xtmp.val[1])); + y_128[0] = vcombine_s16(vmovn_s32(xtmp.val[0]),vmovn_s32(xtmp.val[1])); #endif - xd+=4; - y_128+=1; + xd+=4; + y_128+=1; + } } - - - _mm_empty(); - _m_empty(); - - return; } -#endif -/* -int mult_vector32_scalar(int16_t *x1, - int x2, - int16_t *y, - uint32_t N) - -{ - // Multiply elementwise two real vectors of N elements - // x1 - input 1 in the format |Re(0) xxx Re(1) xxx|,......,|Re(N-2) xxx Re(N-1) xxx| - // We assume x1 with a dinamic of 31 bit maximum - // - // x1 - input 2 - // - // y - output in the format |Re0 (64bit) |,......,|Re(N-1) (64bit)| - // - // N - the size f the vectors (this function does N cpx mpy. WARNING: N>=4; - // - - uint32_t i; // loop counter - - __m128i *x1_128; - __m128i x2_128; - __m128i *y_128; - - - x1_128 = (__m128i *)&x1[0]; - x2_128 = _mm_setr_epi32(x2,0,x2,0); - y_128 = (__m128i *)&y[0]; - - - // we compute 4 cpx multiply for each loop - for(i=0; i<(N>>3); i++) { - y_128[0] = _mm_mul_epu32(x1_128[0],x2_128); - y_128[1] = _mm_mul_epu32(x1_128[1],x2_128); - y_128[2] = _mm_mul_epu32(x1_128[2],x2_128); - y_128[3] = _mm_mul_epu32(x1_128[3],x2_128); - - - x1_128+=4; - y_128 +=4; - } - - - _mm_empty(); - _m_empty(); - - return(0); -} -*/ - -int complex_conjugate(int16_t *x1, - int16_t *y, - uint32_t N) - -{ - uint32_t i; // loop counter - - simd_q15_t *x1_128; - simd_q15_t *y_128; - int16_t x2[8] __attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; - simd_q15_t *x2_128 = (simd_q15_t*)&x2[0]; - x1_128 = (simd_q15_t *)&x1[0]; - y_128 = (simd_q15_t *)&y[0]; - - - // we compute 4 cpx multiply for each loop - for(i=0; i<(N>>3); i++) { - y_128[0] = mullo_int16(x1_128[0],*x2_128); - y_128[1] = mullo_int16(x1_128[1],*x2_128); - y_128[2] = mullo_int16(x1_128[2],*x2_128); - y_128[3] = mullo_int16(x1_128[3],*x2_128); - - - x1_128+=4; - y_128 +=4; - } - - - _mm_empty(); - _m_empty(); - - return(0); -} - #ifdef MAIN #define L 8 diff --git a/openair1/PHY/TOOLS/memory_routines.c b/openair1/PHY/TOOLS/memory_routines.c deleted file mode 100644 index cef9928988..0000000000 --- a/openair1/PHY/TOOLS/memory_routines.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -#include "PHY/sse_intrin.h" - -void Zero_Buffer(void *buf,unsigned int length) -{ - // zeroes the mmx_t buffer 'buf' starting from buf[0] to buf[length-1] in bytes - int i; - register __m64 mm0; - __m64 *mbuf = (__m64 *)buf; - - // length>>=3; // put length in quadwords - mm0 = _m_pxor(mm0,mm0); // clear the register - - for(i=0; i>3; i++) // for each i - mbuf[i] = mm0; // put 0 in buf[i] - - _mm_empty(); -} - -void mmxcopy(void *dest,void *src,int size) -{ - - // copy size bytes from src to dest - register int i; - register __m64 mm0; - __m64 *mmsrc = (__m64 *)src, *mmdest= (__m64 *)dest; - - - - for (i=0; i>3; i++) { - mm0 = mmsrc[i]; - mmdest[i] = mm0; - } - - _mm_empty(); -} - -void Zero_Buffer_nommx(void *buf,unsigned int length) -{ - - int i; - - for (i=0; i>2; i++) - ((int *)buf)[i] = 0; - -} - diff --git a/openair1/PHY/TOOLS/oai_dfts.c b/openair1/PHY/TOOLS/oai_dfts.c index c2b6a55210..cbedfd815a 100644 --- a/openair1/PHY/TOOLS/oai_dfts.c +++ b/openair1/PHY/TOOLS/oai_dfts.c @@ -2575,7 +2575,6 @@ const static int16_t tw64c[96] __attribute__((aligned(32))) = { #define simd_q15_t __m128i #define simdshort_q15_t __m64 #define shiftright_int16(a,shift) _mm_srai_epi16(a,shift) -#define set1_int16(a) _mm_set1_epi16(a); #define mulhi_int16(a,b) _mm_mulhrs_epi16 (a,b) #ifdef __AVX2__ #define simd256_q15_t __m256i diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index c471978f46..6b81575fee 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -29,46 +29,199 @@ */ -#ifdef __cplusplus -extern "C" { -#endif - #include #include #include #include "PHY/sse_intrin.h" #include "common/utils/assertions.h" +#if defined(__x86_64__) || defined(__i386__) +#define simd_q15_t __m128i +#define simdshort_q15_t __m64 +#define shiftright_int16(a,shift) _mm_srai_epi16(a,shift) +#define set1_int16(a) _mm_set1_epi16(a) +#define mulhi_int16(a,b) _mm_mulhrs_epi16 (a,b) +#define mulhi_s1_int16(a,b) _mm_slli_epi16(_mm_mulhi_epi16(a,b),2) +#define adds_int16(a,b) _mm_adds_epi16(a,b) +#define mullo_int16(a,b) _mm_mullo_epi16(a,b) +#elif defined(__arm__) +#define simd_q15_t int16x8_t +#define simdshort_q15_t int16x4_t +#define shiftright_int16(a,shift) vshrq_n_s16(a,shift) +#define set1_int16(a) vdupq_n_s16(a) +#define mulhi_int16(a,b) vqdmulhq_s16(a,b) +#define mulhi_s1_int16(a,b) vshlq_n_s16(vqdmulhq_s16(a,b),1) +#define adds_int16(a,b) vqaddq_s16(a,b) +#define mullo_int16(a,b) vmulq_s16(a,b) +#define _mm_empty() +#define _m_empty() +#endif + +#ifdef __cplusplus +extern "C" { +#endif + #define CEILIDIV(a,b) ((a+b-1)/b) #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) -typedef struct complexd { - double r; - double i; -} cd_t; + typedef struct complexd { + double r; + double i; + } cd_t; -typedef struct complexf { - float r; - float i; -} cf_t; + typedef struct complexf { + float r; + float i; + } cf_t; -typedef struct complex16 { - int16_t r; - int16_t i; -} c16_t; + typedef struct complex16 { + int16_t r; + int16_t i; + } c16_t; -typedef struct complex32 { - int32_t r; - int32_t i; -} c32_t; + typedef struct complex32 { + int32_t r; + int32_t i; + } c32_t; + + typedef struct complex64 { + int64_t r; + int64_t i; + } c64_t; + +#define squaredMod(a) ((a).r*(a).r + (a).i*(a).i) +#define csum(res, i1, i2) (res).r = (i1).r + (i2).r ; (res).i = (i1).i + (i2).i + + __attribute__((always_inline)) inline c16_t c16mulShift(const c16_t a, const c16_t b, const int Shift) { + return (c16_t) { + .r = (int16_t)((a.r * b.r - a.i * b.i) >> Shift), + .i = (int16_t)((a.r * b.i + a.i * b.r) >> Shift) + }; + } -typedef struct complex64 { - int64_t r; - int64_t i; -} c64_t; + __attribute__((always_inline)) inline c16_t c16divShift(const c16_t a, const c16_t b, const int Shift) { + return (c16_t) { + .r = (int16_t)((a.r * b.r + a.i * b.i) >> Shift), + .i = (int16_t)((a.r * b.i - a.i * b.r) >> Shift) + }; + } + + __attribute__((always_inline)) inline c16_t c16maddShift(const c16_t a, const c16_t b, c16_t c, const int Shift) { + return (c16_t) { + .r = (int16_t)(((a.r * b.r - a.i * b.i ) >> Shift) + c.r), + .i = (int16_t)(((a.r * b.i + a.i * b.r ) >> Shift) + c.i) + }; + } -#define squaredMod(a) ((a).r*(a).r+(a).i*(a).i) -#define csum(res, i1, i2) (res).r=(i1).r+(i2).r ; (res).i=(i1).i+(i2).i + __attribute__((always_inline)) inline c32_t c32x16mulShift(const c16_t a, const c16_t b, const int Shift) { + return (c32_t) { + .r = (a.r * b.r - a.i * b.i) >> Shift, + .i = (a.r * b.i + a.i * b.r) >> Shift + }; + } + + __attribute__((always_inline)) inline c32_t c32x16maddShift(const c16_t a, const c16_t b, const c32_t c, const int Shift) { + return (c32_t) { + .r = ((a.r * b.r - a.i * b.i) >> Shift) + c.r, + .i = ((a.r * b.i + a.i * b.r) >> Shift) + c.i + }; + } + + __attribute__((always_inline)) inline c16_t c16x32div(const c32_t a, const int div) { + return (c16_t) { + .r = (int16_t)(a.r / div), + .i = (int16_t)(a.i / div) + }; + } + + + // On N complex numbers + // y.r += (x * alpha.r) >> 14 + // y.i += (x * alpha.i) >> 14 + // See regular C implementation at the end + __attribute__((always_inline)) inline void c16multaddVectRealComplex(const int16_t *x, + const c16_t *alpha, + c16_t *y, + const int N) { +#ifdef __AVX2__ + const int8_t makePairs[32] __attribute__((aligned(32)))={ + 0,1,0+16,1+16, + 2,3,2+16,3+16, + 4,5,4+16,5+16, + 6,7,6+16,7+16, + 8,9,8+16,9+16, + 10,11,10+16,11+16, + 12,13,12+16,13+16, + 14,15,14+16,15+16}; + + __m256i alpha256= _mm256_set1_epi32(*(int32_t *)alpha); + __m128i *x128=(__m128i *)x; + __m128i *y128=(__m128i *)y; + AssertFatal(N%8==0,"Not implemented\n"); + for (int i=0; ir); + alpha_i_128 = set1_int16(alpha->i); + + j=0; + + for (i=0; i>3; i++) { + + yr = mulhi_s1_int16(alpha_r_128,x_128[i]); + yi = mulhi_s1_int16(alpha_i_128,x_128[i]); +#if defined(__x86_64__) || defined(__i386__) + y_128[j] = _mm_adds_epi16(y_128[j],_mm_unpacklo_epi16(yr,yi)); + j++; + y_128[j] = _mm_adds_epi16(y_128[j],_mm_unpackhi_epi16(yr,yi)); + j++; +#elif defined(__arm__) + int16x8x2_t yint; + yint = vzipq_s16(yr,yi); + y_128[j] = adds_int16(y_128[j],yint.val[0]); + j++; + y_128[j] = adds_int16(y_128[j],yint.val[1]); + + j++; +#endif + } + +#else + for (int i=0; ir)>>14); + if (tmpr>INT16_MAX) + tmpr=INT16_MAX; + if (tmpri)>>14); + if (tmpi>INT16_MAX) + tmpi=INT16_MAX; + if (tmpir); + alpha_i_128 = set1_int16(alpha->i); + + + yr = mulhi_s1_int16(alpha_r_128,x_128[0]); + yi = mulhi_s1_int16(alpha_i_128,x_128[0]); + y_128 = _mm_adds_epi16(y_128,_mm_unpacklo_epi16(yr,yi)); + y_128 = _mm_adds_epi16(y_128,_mm_unpackhi_epi16(yr,yi)); + + _mm_storeu_si128((simd_q15_t*)y, y_128); + +} + /*!\fn void multadd_complex_vector_real_scalar(int16_t *x,int16_t alpha,int16_t *y,uint8_t zero_flag,uint32_t N) This function performs componentwise multiplication and accumulation of a real scalar and a complex vector. @param x Vector input (Q1.15) in the format |Re0 Im0|Re1 Im 1| ... @@ -114,7 +286,7 @@ void multadd_complex_vector_real_scalar(int16_t *x, //cmult_vv.c /*! - Multiply elementwise the complex conjugate of x1 with x2. + Multiply elementwise the complex conjugate of x1 with x2. @param x1 - input 1 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| We assume x1 with a dinamic of 15 bit maximum @param x2 - input 2 in the format |Re0 Im0 Re1 Im1|,......,|Re(N-2) Im(N-2) Re(N-1) Im(N-1)| @@ -364,8 +536,8 @@ dft_size_idx_t get_dft(int ofdm_symbol_size) printf("function get_dft : unsupported ofdm symbol size \n"); assert(0); break; - } - return DFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function; + } + return DFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function; } typedef enum idft_size_idx { @@ -448,8 +620,8 @@ idft_size_idx_t get_idft(int ofdm_symbol_size) printf("function get_idft : unsupported ofdm symbol size \n"); assert(0); break; - } - return IDFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function + } + return IDFT_SIZE_IDXTABLESIZE; // never reached and will trigger assertion in idft function } @@ -491,58 +663,6 @@ int32_t sub_cpx_vector16(int16_t *x, int16_t *z, uint32_t N); -int32_t add_cpx_vector32(int16_t *x, - int16_t *y, - int16_t *z, - uint32_t N); - -int32_t add_real_vector64(int16_t *x, - int16_t *y, - int16_t *z, - uint32_t N); - -int32_t sub_real_vector64(int16_t *x, - int16_t *y, - int16_t *z, - uint32_t N); - -int32_t add_real_vector64_scalar(int16_t *x, - long long int a, - int16_t *y, - uint32_t N); - -/*!\fn int32_t add_vector16(int16_t *x,int16_t *y,int16_t *z,uint32_t N) -This function performs componentwise addition of two vectors with Q1.15 components. -@param x Vector input (Q1.15) -@param y Scalar input (Q1.15) -@param z Scalar output (Q1.15) -@param N Length of x WARNING: N must be a multiple of 32 - -The function implemented is : \f$\mathbf{z} = \mathbf{x} + \mathbf{y}\f$ -*/ -int32_t add_vector16(int16_t *x, - int16_t *y, - int16_t *z, - uint32_t N); - -int32_t add_vector16_64(int16_t *x, - int16_t *y, - int16_t *z, - uint32_t N); - -int32_t complex_conjugate(int16_t *x1, - int16_t *y, - uint32_t N); - -void bit8_txmux(int32_t length,int32_t offset); - -void bit8_rxdemux(int32_t length,int32_t offset); - -void Zero_Buffer(void *,uint32_t); -void Zero_Buffer_nommx(void *buf,uint32_t length); - -void mmxcopy(void *dest,void *src,int size); - /*!\fn int32_t signal_energy(int *,uint32_t); \brief Computes the signal energy per subcarrier */ @@ -631,7 +751,6 @@ int64_t dot_product64(int16_t *x, double interp(double x, double *xs, double *ys, int count); -int write_output(const char *fname,const char *vname,void *data,int length,int dec,char format); #ifdef __cplusplus } diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h index 3a48dc51d6..d5ad705f4e 100644 --- a/openair1/PHY/defs_eNB.h +++ b/openair1/PHY/defs_eNB.h @@ -181,9 +181,6 @@ typedef struct { typedef struct { - /// \brief ?. - /// first index: ? [0..1023] (hard coded) - int16_t *prachF; /// \brief ?. /// first index: ce_level [0..3] /// second index: rx antenna [0..63] (hard coded) \note Hard coded array size indexed by \c nb_antennas_rx. diff --git a/openair1/SCHED/prach_procedures.c b/openair1/SCHED/prach_procedures.c index 805354ce1b..fd78ed4bfb 100644 --- a/openair1/SCHED/prach_procedures.c +++ b/openair1/SCHED/prach_procedures.c @@ -49,7 +49,7 @@ extern int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind); void prach_procedures(PHY_VARS_eNB *eNB, int br_flag ) { - uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4],avg_preamble_energy[4]; + uint16_t max_preamble[4]={0},max_preamble_energy[4]={0},max_preamble_delay[4]={0},avg_preamble_energy[4]={0}; uint16_t i; int frame,subframe; diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index afef8ea435..9779233538 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -145,7 +145,7 @@ class gtpEndPoints { ~gtpEndPoints() { // automatically close all sockets on quit - for (const auto p : instances) + for (const auto &p : instances) close(p.first); } }; From adea216202a0d37ca93f8cce92c20faf9f5e0205 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Thu, 1 Sep 2022 15:48:31 +0000 Subject: [PATCH 128/136] adding a comment --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c index e3590c1332..9f753884aa 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c @@ -1059,6 +1059,9 @@ void nr_schedule_ue_spec(module_id_t module_id, csi_report->codebook_mode); } // TBS_LBRM according to section 5.4.2.1 of 38.212 + // TODO: verify the case where pdsch_servingcellconfig is NULL, in which case + // in principle maxMIMO_layers should be given by the maximum number of layers + // for PDSCH supported by the UE for the serving cell (5.4.2.1 of 38.212) long maxMIMO_Layers = current_BWP->pdsch_servingcellconfig ? *current_BWP->pdsch_servingcellconfig->ext1->maxMIMO_Layers : 1; const int nl_tbslbrm = min(maxMIMO_Layers, 4); // Maximum number of PRBs across all configured DL BWPs From aa2a36768c039cd31a22da9811c1e1ba6267d84a Mon Sep 17 00:00:00 2001 From: laurent Date: Thu, 4 Aug 2022 18:15:59 +0200 Subject: [PATCH 129/136] simplify thread pool configuration fix segv fix bug redeclaration of same struct in phy sim Apply 1 suggestion(s) to 1 file(s) code reveiw comments --- ci-scripts/conf_files/benetel-5g.conf | 1 - ci-scripts/conf_files/gNB_SA_DU.conf | 1 - .../gNB_SA_n78_106PRB.2x2_usrpn310.conf | 1 - .../gNB_SA_n78_133PRB.2x2_usrpn310.conf | 1 - .../gnb.band261.tm1.32PRB.usrpn300.conf | 1 - .../gnb.band66.tm1.106PRB.usrpn300.conf | 1 - .../gnb.band78.nsa_2x2.106PRB.usrpn310.conf | 1 - ...and78.sa.fr1.106PRB.2x2.usrpn310.asue.conf | 1 - ...gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf | 1 - ...nd78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf | 1 - ...gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf | 1 - .../gnb.band78.tm1.106PRB.usrpn300.conf | 1 - .../gnb.band78.tm1.fr1.106PRB.usrpb210.conf | 1 - .../gnb.band78.tm1.fr1.106PRB.usrpn310.conf | 1 - ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml | 2 +- .../gnb_nr_ue_usrp_run_multi_thread.xml | 2 +- common/utils/threadPool/thread-pool.c | 14 ++++++++- common/utils/threadPool/thread-pool.h | 4 +-- executables/main-ocp.c | 6 +--- executables/nr-gnb.c | 15 ++------- executables/nr-ue.c | 2 +- executables/nr-uesoftmodem.c | 17 ++-------- executables/nr-uesoftmodem.h | 3 +- executables/softmodem-common.h | 2 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 5 ++- .../PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 31 ++++--------------- openair1/PHY/defs_gNB.h | 1 - openair1/SCHED_NR_UE/defs.h | 1 - openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 1 - openair1/SIMULATION/NR_PHY/dlschsim.c | 12 +++++-- openair1/SIMULATION/NR_PHY/dlsim.c | 18 +++-------- openair1/SIMULATION/NR_PHY/pbchsim.c | 7 +++++ openair1/SIMULATION/NR_PHY/prachsim.c | 7 +---- openair1/SIMULATION/NR_PHY/pucchsim.c | 8 +++++ openair1/SIMULATION/NR_PHY/ulschsim.c | 11 +++++-- openair1/SIMULATION/NR_PHY/ulsim.c | 20 ++---------- openair2/GNB_APP/L1_nr_paramdef.h | 2 +- openair2/GNB_APP/gnb_config.c | 4 +-- .../GENERIC-LTE-EPC/CONF/benetel-5g.conf | 1 - .../CONF/gnb.band257.tm1.32PRB.usrpn300.conf | 1 - .../CONF/gnb.band257.tm1.32PRB.usrpx300.conf | 1 - .../CONF/gnb.band257.tm1.66PRB.usrpn300.conf | 1 - .../CONF/gnb.band261.tm1.32PRB.usrpn300.conf | 1 - .../CONF/gnb.band66.tm1.106PRB.usrpn300.conf | 1 - .../CONF/gnb.band66.tm1.106PRB.usrpx300.conf | 1 - .../CONF/gnb.band66.tm1.25PRB.usrpn300.conf | 1 - .../CONF/gnb.band78.106PRB.slave.conf | 1 - .../gnb.band78.tm1.106PRB.PTRS.usrpx300.conf | 1 - .../CONF/gnb.band78.tm1.106PRB.usrpb210.conf | 1 - .../CONF/gnb.band78.tm1.106PRB.usrpn300.conf | 1 - .../CONF/gnb.band78.tm1.106PRB.usrpx300.conf | 1 - .../CONF/gnb.band78.tm1.217PRB.usrpn300.conf | 1 - .../CONF/gnb.band78.tm1.217PRB.usrpx300.conf | 1 - .../CONF/gnb.band78.tm1.24PRB.usrpb210.conf | 1 - .../CONF/gnb.band78.tm1.24PRB.usrpn300.conf | 1 - .../CONF/gnb.band78.tm1.24PRB.usrpx300.conf | 1 - .../CONF/gnb.band78.tm1.273PRB.usrpn300.conf | 1 - .../CONF/oaiL1.nfapi.usrpx300.conf | 1 - .../GENERIC-LTE-EPC/CONF/testing_gnb.conf | 1 - .../CONF/testing_gnb_24PRB.conf | 1 - .../CONF/testing_gnb_nsa_n310.conf | 1 - .../PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf | 1 - ...b.sa.band78.fr1.106PRB.usrpb210.sabox.conf | 1 - 63 files changed, 81 insertions(+), 153 deletions(-) diff --git a/ci-scripts/conf_files/benetel-5g.conf b/ci-scripts/conf_files/benetel-5g.conf index 3b872e56e9..cae4ec0b25 100644 --- a/ci-scripts/conf_files/benetel-5g.conf +++ b/ci-scripts/conf_files/benetel-5g.conf @@ -214,7 +214,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; } ); diff --git a/ci-scripts/conf_files/gNB_SA_DU.conf b/ci-scripts/conf_files/gNB_SA_DU.conf index 4309c13dd3..a371380e6e 100644 --- a/ci-scripts/conf_files/gNB_SA_DU.conf +++ b/ci-scripts/conf_files/gNB_SA_DU.conf @@ -204,7 +204,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; prach_dtx_threshold = 120; pucch0_dtx_threshold = 150; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 diff --git a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf index 49383072ed..59358b9f7c 100644 --- a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf +++ b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf @@ -231,7 +231,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; prach_dtx_threshold = 120; pucch0_dtx_threshold = 150; } diff --git a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf index 610485fc92..822e42cf1f 100644 --- a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf +++ b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf @@ -228,7 +228,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; prach_dtx_threshold = 120; } ); diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf index 24ec8f17f8..eeb562b4a4 100644 --- a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf @@ -211,7 +211,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf index b3c7d7d1da..f4f65fe8dc 100644 --- a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf @@ -181,7 +181,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf index c668601c06..b8cc0de15e 100644 --- a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf @@ -210,7 +210,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; prach_dtx_threshold = 120; pucch0_dtx_threshold = 80; } diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf index 92c3a7a2e9..6971c5d818 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.asue.conf @@ -237,7 +237,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; prach_dtx_threshold = 120; # pucch0_dtx_threshold = 150; } diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf index 672713d504..0dd264a6c5 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.2x2.usrpn310.conf @@ -234,7 +234,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; prach_dtx_threshold = 120; # pucch0_dtx_threshold = 150; } diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf index 5bd8b26e05..1d7f9c499e 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.ddsuu.2x2.usrpn310.conf @@ -233,7 +233,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; prach_dtx_threshold = 120; # pucch0_dtx_threshold = 150; } diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf index f92242138c..1086badc0b 100644 --- a/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.162PRB.2x2.usrpn310.conf @@ -235,7 +235,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; prach_dtx_threshold = 120; # pucch0_dtx_threshold = 150; } diff --git a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf index 9334f2cf59..61bb39329e 100644 --- a/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf +++ b/ci-scripts/conf_files/gnb.band78.tm1.106PRB.usrpn300.conf @@ -194,7 +194,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; } ); diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf index cd3ab6278e..92362ebdc9 100644 --- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf +++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf @@ -210,7 +210,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 6; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf index 371753eccc..361cee72e6 100644 --- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf +++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf @@ -211,7 +211,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 6; } ); diff --git a/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml b/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml index a74dd26137..d025b95ce5 100644 --- a/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml +++ b/ci-scripts/xml_files/gnb_nr_ue_usrp_run.xml @@ -52,7 +52,7 @@ Initialize_OAI_UE Initialize NR UE USRP - --phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 50 --rrc_config_path . --dlsch-parallel 4 --log_config.global_log_options level,nocolor,time + --phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 50 --rrc_config_path . --log_config.global_log_options level,nocolor,time NR diff --git a/ci-scripts/xml_files/gnb_nr_ue_usrp_run_multi_thread.xml b/ci-scripts/xml_files/gnb_nr_ue_usrp_run_multi_thread.xml index f91077aacf..ffd41e9e86 100644 --- a/ci-scripts/xml_files/gnb_nr_ue_usrp_run_multi_thread.xml +++ b/ci-scripts/xml_files/gnb_nr_ue_usrp_run_multi_thread.xml @@ -52,7 +52,7 @@ Initialize_OAI_UE Initialize NR UE USRP - --phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path . --dlsch-parallel 4 --log_config.global_log_options level,nocolor,time + --phy-test --usrp-args "addr=192.168.30.2,second_addr=192.168.50.2,clock_source=external,time_source=external" --ue-rxgain 75 --rrc_config_path . --log_config.global_log_options level,nocolor,time NR diff --git a/common/utils/threadPool/thread-pool.c b/common/utils/threadPool/thread-pool.c index d1af56b477..75252a9143 100644 --- a/common/utils/threadPool/thread-pool.c +++ b/common/utils/threadPool/thread-pool.c @@ -111,7 +111,7 @@ void initNamedTpool(char *params,tpool_t *pool, bool performanceMeas, char *name if (measr) { mkfifo(measr,0666); - AssertFatal(-1 != (pool->dummyTraceFd= + AssertFatal(-1 != (pool->dummyKeepReadingTraceFd= open(measr, O_RDONLY| O_NONBLOCK)),""); AssertFatal(-1 != (pool->traceFd= open(measr, O_WRONLY|O_APPEND|O_NOATIME|O_NONBLOCK)),""); @@ -130,6 +130,7 @@ void initNamedTpool(char *params,tpool_t *pool, bool performanceMeas, char *name int c=toupper(curptr[0]); switch (c) { + case 'N': pool->activated=false; break; @@ -161,6 +162,17 @@ void initNamedTpool(char *params,tpool_t *pool, bool performanceMeas, char *name } } +void initFloatingCoresTpool(int nbThreads,tpool_t *pool, bool performanceMeas, char *name) { + char threads[1024] = "n"; + if (nbThreads) { + strcpy(threads,"-1"); + for (int i=1; i < nbThreads; i++) + strncat(threads,",-1", sizeof(threads-1)); + } + threads[sizeof(threads-1)]=0; + initNamedTpool(threads, pool, performanceMeas, name); +} + #ifdef TEST_THREAD_POOL volatile int oai_exit=0; diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index 0e4630117d..81eef5d7e7 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -256,9 +256,8 @@ typedef struct thread_pool { bool activated; bool measurePerf; int traceFd; - int dummyTraceFd; + int dummyKeepReadingTraceFd; uint64_t cpuCyclesMicroSec; - uint64_t startProcessingUE; int nbThreads; notifiedFIFO_t incomingFifo; struct one_thread *allthreads; @@ -389,5 +388,6 @@ static inline int abortTpool(tpool_t *t) { return nbRemoved; } void initNamedTpool(char *params,tpool_t *pool, bool performanceMeas, char *name); +void initFloatingCoresTpool(int nbThreads,tpool_t *pool, bool performanceMeas, char *name); #define initTpool(PARAMPTR,TPOOLPTR, MEASURFLAG) initNamedTpool(PARAMPTR,TPOOLPTR, MEASURFLAG, NULL) #endif diff --git a/executables/main-ocp.c b/executables/main-ocp.c index 3a1ad6ec19..d05b683f39 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -1273,11 +1273,7 @@ int main ( int argc, char **argv ) { L1proc->respEncode=(notifiedFIFO_t *) malloc(sizeof(notifiedFIFO_t)); L1proc->respDecode=(notifiedFIFO_t *) malloc(sizeof(notifiedFIFO_t)); - if ( strlen(get_softmodem_params()->threadPoolConfig) > 0 ) - initTpool(get_softmodem_params()->threadPoolConfig, L1proc->threadPool, true); - else - initTpool("n", L1proc->threadPool, true); - + initTpool(get_softmodem_params()->threadPoolConfig, L1proc->threadPool,cpumeas(CPUMEAS_GETSTATE)); initNotifiedFIFO(L1proc->respEncode); initNotifiedFIFO(L1proc->respDecode); } diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 14eefa1e32..f31cc0c871 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -430,19 +430,8 @@ void init_gNB_Tpool(int inst) { gNB = RC.gNB[inst]; gNB_L1_proc_t *proc = &gNB->proc; - int numCPU = sysconf(_SC_NPROCESSORS_ONLN); - LOG_I(PHY,"Number of threads requested in config file: %d, Number of threads available on this machine: %d\n",gNB->thread_pool_size,numCPU); - int threadCnt = min(numCPU, gNB->thread_pool_size); - if (threadCnt < 2) LOG_E(PHY,"Number of threads for gNB should be more than 1. Allocated only %d\n",threadCnt); - char pool[80]; - sprintf(pool,"-1"); - int s_offset = 0; - for (int icpu=1; icputhreadPool, cpumeas(CPUMEAS_GETSTATE)); + // ULSCH decoding threadpool + initTpool(get_softmodem_params()->threadPoolConfig, &gNB->threadPool, cpumeas(CPUMEAS_GETSTATE)); // ULSCH decoder result FIFO initNotifiedFIFO(&gNB->respDecode); diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 821325f5f1..08cb7de7e5 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -678,7 +678,7 @@ void processSlotRX(void *arg) { phy_procedures_slot_parallelization_nrUE_RX( UE, proc, 0, 0, 1, no_relay, NULL ); #else uint64_t a=rdtsc_oai(); - phy_procedures_nrUE_RX(UE, proc, gNB_id, get_nrUE_params()->nr_dlsch_parallel, &phy_pdcch_config, &rxtxD->txFifo); + phy_procedures_nrUE_RX(UE, proc, gNB_id, &phy_pdcch_config, &rxtxD->txFifo); LOG_D(PHY, "In %s: slot %d, time %llu\n", __FUNCTION__, proc->nr_slot_rx, (rdtsc_oai()-a)/3500); #endif diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 92dab90014..d6e6b7c1af 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -243,20 +243,7 @@ uint64_t set_nrUE_optmask(uint64_t bitmask) { nrUE_params_t *get_nrUE_params(void) { return &nrUE_params; } -/* initialie thread pools used for NRUE processing paralleliation */ -void init_tpools(uint8_t nun_dlsch_threads) { - char params[NR_RX_NB_TH*NR_NB_TH_SLOT*3+1]={0}; - for (int i=0; ithreadPoolConfig, &(nrUE_params.Tpool), cpumeas(CPUMEAS_GETSTATE)); //randominit (0); set_taus_seed (0); diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h index c118db5483..77e7d9e053 100644 --- a/executables/nr-uesoftmodem.h +++ b/executables/nr-uesoftmodem.h @@ -31,7 +31,7 @@ #define CMDLINE_NRUEPARAMS_DESC { \ {"usrp-args", CONFIG_HLP_USRP_ARGS, 0, strptr:&usrp_args, defstrval:"type=b200", TYPE_STRING, 0}, \ {"single-thread-disable", CONFIG_HLP_NOSNGLT, PARAMFLAG_BOOL, iptr:&single_thread_flag, defintval:1, TYPE_INT, 0}, \ - {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, u8ptr:&nrUE_params.nr_dlsch_parallel, defintval:0, TYPE_UINT8, 0}, \ + {"dlsch-parallel", CONFIG_HLP_DLSCH_PARA, 0, u8ptr:NULL, defintval:0, TYPE_UINT8, 0}, \ {"offset-divisor", CONFIG_HLP_OFFSET_DIV, 0, uptr:&nrUE_params.ofdm_offset_divisor, defuintval:8, TYPE_UINT32, 0}, \ {"max-ldpc-iterations", CONFIG_HLP_MAX_LDPC_ITERATIONS, 0, u8ptr:&nrUE_params.max_ldpc_iterations, defuintval:5, TYPE_UINT8, 0}, \ {"nr-dlsch-demod-shift", CONFIG_HLP_DLSHIFT, 0, iptr:(int32_t *)&nr_dlsch_demod_shift, defintval:0, TYPE_INT, 0}, \ @@ -78,7 +78,6 @@ typedef struct { uint64_t optmask; //mask to store boolean config options uint32_t ofdm_offset_divisor; // Divisor for sample offset computation for each OFDM symbol - uint8_t nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization uint8_t max_ldpc_iterations; // number of maximum LDPC iterations tpool_t Tpool; // thread pool } nrUE_params_t; diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 8a898c69b8..e7ef15aab0 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -139,7 +139,7 @@ extern int usrp_tx_thread; #define CMDLINE_PARAMS_DESC { \ {"rf-config-file", CONFIG_HLP_RFCFGF, 0, strptr:&RF_CONFIG_FILE, defstrval:NULL, TYPE_STRING, 0},\ {"split73", CONFIG_HLP_SPLIT73, 0, strptr:&SPLIT73, defstrval:NULL, TYPE_STRING, 0}, \ - {"thread-pool", CONFIG_HLP_TPOOL, 0, strptr:&TP_CONFIG, defstrval:"n", TYPE_STRING, 0}, \ + {"thread-pool", CONFIG_HLP_TPOOL, 0, strptr:&TP_CONFIG, defstrval:"-1,-1,-1,-1,-1,-1,-1,-1", TYPE_STRING, 0}, \ {"phy-test", CONFIG_HLP_PHYTST, PARAMFLAG_BOOL, iptr:&PHY_TEST, defintval:0, TYPE_INT, 0}, \ {"do-ra", CONFIG_HLP_DORA, PARAMFLAG_BOOL, iptr:&DO_RA, defintval:0, TYPE_INT, 0}, \ {"sa", CONFIG_HLP_SA, PARAMFLAG_BOOL, iptr:&SA, defintval:0, TYPE_INT, 0}, \ diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index a6dde08a2c..f71ca76b71 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -335,7 +335,10 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, } union turboReqUnion id= {.s={ulsch->rnti,proc->frame_rx,proc->subframe_rx,0,0}}; - notifiedFIFO_elt_t *req=newNotifiedFIFO_elt(sizeof(turboDecode_t), id.p, proc->respDecode, processULSegment); + notifiedFIFO_elt_t *req=newNotifiedFIFO_elt(sizeof(turboDecode_t), + id.p, + proc->respDecode, + processULSegment); turboDecode_t * rdata=(turboDecode_t *) NotifiedFifoData(req); rdata->eNB=eNB; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index e6833c4cb4..3be0b096e7 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -57,29 +57,6 @@ notifiedFIFO_t freeBlocks_dl; notifiedFIFO_elt_t *msgToPush_dl; int nbDlProcessing =0; - -static tpool_t pool_dl; -//extern double cpuf; - -void init_dlsch_tpool(uint8_t num_dlsch_threads) { - char *params = NULL; - - if( num_dlsch_threads==0) { - params = calloc(1,2); - memcpy(params,"N",1); - } - else { - params = calloc(1,(num_dlsch_threads*3)+1); - for (int i=0; ikey); + int nb=abortTpoolJob(&get_nrUE_params()->Tpool, req->key); nb+=abortNotifiedFIFOJob(nf_p, req->key); LOG_D(PHY,"downlink segment error %d/%d, aborted %d segments\n",rdata->segment_r,rdata->nbSegments, nb); LOG_D(PHY, "DLSCH %d in error\n",rdata->dlsch_id); @@ -606,7 +583,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, reset_meas(&rdata->ts_deinterleave); reset_meas(&rdata->ts_rate_unmatch); reset_meas(&rdata->ts_ldpc_decode); - pushTpool(&(pool_dl),req); + pushTpool(&get_nrUE_params()->Tpool,req); nbDecode++; LOG_D(PHY,"Added a block to decode, in pipe: %d\n",nbDecode); r_offset += E; @@ -614,9 +591,13 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ////////////////////////////////////////////////////////////////////////////////////////// } for (r=0; rTpool); +>>>>>>> e9caae6f99 (simplify thread pool configuration) bool last = false; if (r == nbDecode - 1) last = true; diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index ef66bf5fef..5a30663701 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -894,7 +894,6 @@ typedef struct PHY_VARS_gNB_s { notifiedFIFO_t resp_RU_tx; tpool_t threadPool; int nbDecode; - uint8_t thread_pool_size; int number_of_nr_dlsch_max; int number_of_nr_ulsch_max; void * scopeData; diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index fa354d2284..c4436341fc 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -126,7 +126,6 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, - uint8_t dlsch_parallel, NR_UE_PDCCH_CONFIG *phy_pdcch_config, notifiedFIFO_t *txFifo); diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 4a76608dc0..c68702fa3f 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1325,7 +1325,6 @@ void *UE_thread_slot1_dl_processing(void *arg) { int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t gNB_id, - uint8_t dlsch_parallel, NR_UE_PDCCH_CONFIG *phy_pdcch_config, notifiedFIFO_t *txFifo) { diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index f718aad9f0..60a3342ab4 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -48,6 +48,7 @@ #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h" #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" #include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h" +#include "executables/nr-uesoftmodem.h" //#define DEBUG_NR_DLSCHSIM @@ -73,6 +74,13 @@ openair0_config_t openair0_cfg[MAX_CARDS]; void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {} + +nrUE_params_t nrUE_params={0}; + +nrUE_params_t *get_nrUE_params(void) { + return &nrUE_params; +} + int main(int argc, char **argv) { char c; @@ -344,7 +352,6 @@ int main(int argc, char **argv) if (snr1set == 0) snr1 = snr0 + 10; - init_dlsch_tpool(dlsch_threads); if (ouput_vcd) vcd_signal_dumper_init("/tmp/openair_dump_nr_dlschsim.vcd"); @@ -363,7 +370,8 @@ int main(int argc, char **argv) RC.gNB = (PHY_VARS_gNB **) malloc(sizeof(PHY_VARS_gNB *)); RC.gNB[0] = calloc(1, sizeof(PHY_VARS_gNB)); gNB = RC.gNB[0]; - initTpool(gNBthreads, &gNB->threadPool, true); + initNamedTpool(gNBthreads, &gNB->threadPool, true, "gNB-tpool"); + initFloatingCoresTpool(dlsch_threads, &nrUE_params.Tpool, false, "UE-tpool"); //gNB_config = &gNB->gNB_config; frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) frame_parms->nb_antennas_tx = n_tx; diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 0f57378946..7e141fae57 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -73,6 +73,7 @@ #include #include +#include const char *__asan_default_options() { @@ -362,12 +363,6 @@ void nr_dlsim_preprocessor(module_id_t module_id, AssertFatal(current_BWP->mcsTableIdx >= 0 && current_BWP->mcsTableIdx <= 2, "invalid mcsTableIdx %d\n", current_BWP->mcsTableIdx); } -typedef struct { - uint64_t optmask; //mask to store boolean config options - uint8_t nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization - tpool_t Tpool; // thread pool -} nrUE_params_t; - nrUE_params_t nrUE_params; nrUE_params_t *get_nrUE_params(void) { @@ -475,7 +470,7 @@ int main(int argc, char **argv) FILE *scg_fd=NULL; - while ((c = getopt (argc, argv, "f:hA:pf:g:i:n:s:S:t:x:y:z:M:N:F:GR:dPI:L:Ea:b:d:e:m:w:T:U:q:X:Y")) != -1) { + while ((c = getopt (argc, argv, "f:hA:pf:g:i:n:s:S:t:x:y:z:M:N:F:GR:d:PI:L:Ea:b:e:m:w:T:U:q:X:Y")) != -1) { switch (c) { case 'f': scg_fd = fopen(optarg,"r"); @@ -642,7 +637,7 @@ int main(int argc, char **argv) g_rbSize = atoi(optarg); break; - case 'D': + case 'd': dlsch_threads = atoi(optarg); break; @@ -748,8 +743,6 @@ int main(int argc, char **argv) if (snr1set==0) snr1 = snr0+10; - init_dlsch_tpool(dlsch_threads); - RC.gNB = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *)); RC.gNB[0] = (PHY_VARS_gNB*) malloc(sizeof(PHY_VARS_gNB )); @@ -1001,7 +994,7 @@ int main(int argc, char **argv) unsigned char *test_input_bit; unsigned int errors_bit = 0; - initTpool("N", &(nrUE_params.Tpool), false); + initFloatingCoresTpool(dlsch_threads, &nrUE_params.Tpool, false, "UE-tpool"); test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384); estimated_output_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384); @@ -1042,7 +1035,7 @@ int main(int argc, char **argv) snrRun = 0; int n_errs = 0; - initTpool(gNBthreads, &gNB->threadPool, true); + initNamedTpool(gNBthreads, &gNB->threadPool, true, "gNB-tpool"); initNotifiedFIFO(&gNB->L1_tx_free); initNotifiedFIFO(&gNB->L1_tx_filled); initNotifiedFIFO(&gNB->L1_tx_out); @@ -1268,7 +1261,6 @@ int main(int argc, char **argv) phy_procedures_nrUE_RX(UE, &UE_proc, 0, - dlsch_threads, &phy_pdcch_config, NULL); diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 0e648c945f..999b949c88 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -50,6 +50,7 @@ #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" #include "openair1/PHY/MODULATION/nr_modulation.h" #include +#include //#define DEBUG_NR_PBCHSIM PHY_VARS_gNB *gNB; @@ -72,6 +73,12 @@ softmodem_params_t *get_softmodem_params(void) { return &softmodem_params; } +nrUE_params_t nrUE_params={0}; + +nrUE_params_t *get_nrUE_params(void) { + return &nrUE_params; +} + void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {} int nr_ue_pdcch_procedures(uint8_t gNB_id, diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c index 76776ce110..3622ba49ba 100644 --- a/openair1/SIMULATION/NR_PHY/prachsim.c +++ b/openair1/SIMULATION/NR_PHY/prachsim.c @@ -54,6 +54,7 @@ #include //#include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" #include +#include "executables/nr-uesoftmodem.h" #define NR_PRACH_DEBUG 1 #define PRACH_WRITE_OUTPUT_DEBUG 1 @@ -223,12 +224,6 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t module_idP, return 0; } -typedef struct { - uint64_t optmask; //mask to store boolean config options - uint8_t nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization - tpool_t Tpool; // thread pool -} nrUE_params_t; - nrUE_params_t nrUE_params; nrUE_params_t *get_nrUE_params(void) { diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index 1d1d2f8fa5..fd3231ee33 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -47,6 +47,7 @@ #include "openair1/SIMULATION/RF/rf.h" #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h" #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" +#include "executables/nr-uesoftmodem.h" THREAD_STRUCT thread_struct; PHY_VARS_gNB *gNB; @@ -66,6 +67,13 @@ PHY_VARS_NR_UE * PHY_vars_UE_g[1][1]={{NULL}}; void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {} +nrUE_params_t nrUE_params={0}; + +nrUE_params_t *get_nrUE_params(void) { + return &nrUE_params; +} + + int main(int argc, char **argv) { char c; diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c index 222cd1da7d..9150420d9d 100644 --- a/openair1/SIMULATION/NR_PHY/ulschsim.c +++ b/openair1/SIMULATION/NR_PHY/ulschsim.c @@ -48,6 +48,7 @@ #include "openair1/SIMULATION/NR_PHY/nr_dummy_functions.c" #include "common/utils/threadPool/thread-pool.h" #include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h" +#include "executables/nr-uesoftmodem.h" //#define DEBUG_NR_ULSCHSIM @@ -109,6 +110,13 @@ int nr_postDecode_sim(PHY_VARS_gNB *gNB, notifiedFIFO_elt_t *req) { ulsch->last_iteration_cnt = rdata->decodeIterations; return 0; } + +nrUE_params_t nrUE_params; + +nrUE_params_t *get_nrUE_params(void) { + return &nrUE_params; +} + int main(int argc, char **argv) { char c; @@ -387,8 +395,7 @@ int main(int argc, char **argv) gNB = RC.gNB[0]; //gNB_config = &gNB->gNB_config; - char tp_param[] = "n"; - initTpool(tp_param, &gNB->threadPool, true); + initTpool("n", &gNB->threadPool, true); initNotifiedFIFO(&gNB->respDecode); frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) frame_parms->N_RB_DL = N_RB_DL; diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index f4dece26ff..ab13c0aa4c 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -67,6 +67,7 @@ #include #include "PHY/NR_REFSIG/ul_ref_seq_nr.h" #include +#include "executables/nr-uesoftmodem.h" //#define DEBUG_ULSIM const char *__asan_default_options() @@ -254,12 +255,6 @@ int nr_derive_key(int alg_type, uint8_t alg_id, return 0; } -typedef struct { - uint64_t optmask; //mask to store boolean config options - uint8_t nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization - tpool_t Tpool; // thread pool -} nrUE_params_t; - void processSlotTX(void *arg) {} nrUE_params_t nrUE_params; @@ -700,18 +695,9 @@ int main(int argc, char **argv) RC.gNB[0] = calloc(1,sizeof(PHY_VARS_gNB)); gNB = RC.gNB[0]; gNB->ofdm_offset_divisor = UINT_MAX; - char tp_param[80]; - if (threadCnt>0) - sprintf(tp_param,"-1"); - else - tp_param[0]='n'; - int s_offset = 0; - for (int icpu=1; icpurespDecode); - initTpool(tp_param, &gNB->threadPool, false); + initFloatingCoresTpool(threadCnt, &gNB->threadPool, false, "gNB-tpool"); initNotifiedFIFO(&gNB->respDecode); initNotifiedFIFO(&gNB->L1_tx_free); initNotifiedFIFO(&gNB->L1_tx_filled); diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h index 1e5122956e..89558e2d51 100644 --- a/openair2/GNB_APP/L1_nr_paramdef.h +++ b/openair2/GNB_APP/L1_nr_paramdef.h @@ -66,7 +66,7 @@ {CONFIG_STRING_L1_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \ -{CONFIG_STRING_L1_THREAD_POOL_SIZE, "Maximum number of CPU cores for L1 processing (either max HW CPU cores or this value is used)", 0, uptr:NULL, defintval:4, TYPE_UINT, 0}, \ +{CONFIG_STRING_L1_THREAD_POOL_SIZE, "removed, please use --thread-pool", 0, uptr:NULL, defintval:2022, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_OFDM_OFFSET_DIVISOR, NULL, 0, uptr:NULL, defuintval:8, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:100, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_PRACH_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:150, TYPE_UINT, 0}, \ diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 0beba58e8c..69143acdee 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -725,8 +725,8 @@ void RCconfig_NR_L1(void) { memset(RC.gNB[j],0,sizeof(PHY_VARS_gNB)); RC.gNB[j]->Mod_id = j; } - - RC.gNB[j]->thread_pool_size = *(L1_ParamList.paramarray[j][L1_THREAD_POOL_SIZE].uptr); + AssertFatal(*L1_ParamList.paramarray[j][L1_THREAD_POOL_SIZE].uptr == 2022, + "thread_pool_size removed, please use --thread-pooli\n"); RC.gNB[j]->ofdm_offset_divisor = *(L1_ParamList.paramarray[j][L1_OFDM_OFFSET_DIVISOR].uptr); RC.gNB[j]->pucch0_thres = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr); RC.gNB[j]->prach_thres = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf index c8e109d302..cbad6fe187 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/benetel-5g.conf @@ -216,7 +216,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf index a4c877a7ba..c09f10ea0b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf @@ -210,7 +210,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf index e5478983cf..44a17612a9 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf @@ -196,7 +196,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf index efa0d3e2fa..716e222d60 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf @@ -192,7 +192,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf index 8a2ce9f63e..78bc1220e8 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf @@ -210,7 +210,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf index 616f86a1cd..ab78dfb950 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf @@ -194,7 +194,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf index 0818fe11d7..11b1943b36 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf @@ -193,7 +193,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf index 022f17e490..d28ac755da 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.25PRB.usrpn300.conf @@ -193,7 +193,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf index 812ac8dafb..6666d75de5 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf @@ -209,7 +209,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf index 1450c45eee..807c7cd28b 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf @@ -241,7 +241,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf index 562e2b16ab..a818071029 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf @@ -192,7 +192,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf index a8ecb8c4b6..9d4cf054be 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf @@ -191,7 +191,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; max_ldpc_iterations = 5; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf index 10122b9eb2..8193e55979 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf @@ -191,7 +191,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf index 20d01c2a00..e951754bf0 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf @@ -208,7 +208,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf index 44f3889eec..80d369beff 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf @@ -193,7 +193,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf index fbafef81b4..f4791448fa 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf @@ -192,7 +192,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf index 38d6ed3c61..34a6f35f11 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf @@ -192,7 +192,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf index b7da7b17f4..c9180420fc 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf @@ -192,7 +192,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf index 9f78716bcc..6aaba26991 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf @@ -193,7 +193,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf index 9a0f1cb036..818cd3a0be 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf @@ -21,7 +21,6 @@ L1s = ( remote_n_portc = 50001; // vnf p5 port local_n_portd = 50010; // pnf p7 port remote_n_portd = 50011; // vnf p7 port - thread_pool_size = 8; } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf index 9a3fe358a5..bbc12027d2 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf @@ -209,7 +209,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf index 9e1ae24d67..6604568be1 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf @@ -210,7 +210,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 } ); diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf index 35778ef705..ed3a3ce385 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_nsa_n310.conf @@ -210,7 +210,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; } ); diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf index 4309c13dd3..a371380e6e 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf @@ -204,7 +204,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; prach_dtx_threshold = 120; pucch0_dtx_threshold = 150; ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0 diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf index 6719a5534d..5fcad18f6d 100644 --- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf +++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.sabox.conf @@ -225,7 +225,6 @@ L1s = ( { num_cc = 1; tr_n_preference = "local_mac"; - thread_pool_size = 8; } ); From abf6801094b9ae0826eb9ee215b877d5aa210477 Mon Sep 17 00:00:00 2001 From: laurent Date: Wed, 10 Aug 2022 10:55:19 +0200 Subject: [PATCH 130/136] fix text typos --- openair2/GNB_APP/L1_nr_paramdef.h | 2 +- openair2/GNB_APP/gnb_config.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h index 89558e2d51..5fab0f6dfb 100644 --- a/openair2/GNB_APP/L1_nr_paramdef.h +++ b/openair2/GNB_APP/L1_nr_paramdef.h @@ -66,7 +66,7 @@ {CONFIG_STRING_L1_REMOTE_N_PORTC, NULL, 0, uptr:NULL, defintval:50030, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_LOCAL_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_REMOTE_N_PORTD, NULL, 0, uptr:NULL, defintval:50031, TYPE_UINT, 0}, \ -{CONFIG_STRING_L1_THREAD_POOL_SIZE, "removed, please use --thread-pool", 0, uptr:NULL, defintval:2022, TYPE_UINT, 0}, \ +{CONFIG_STRING_L1_THREAD_POOL_SIZE, "thread_pool_size paramter removed, please use --thread-pool", 0, uptr:NULL, defintval:2022, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_OFDM_OFFSET_DIVISOR, NULL, 0, uptr:NULL, defuintval:8, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:100, TYPE_UINT, 0}, \ {CONFIG_STRING_L1_PRACH_DTX_THRESHOLD, NULL, 0, uptr:NULL, defintval:150, TYPE_UINT, 0}, \ diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 69143acdee..88f74cd1c9 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -726,7 +726,7 @@ void RCconfig_NR_L1(void) { RC.gNB[j]->Mod_id = j; } AssertFatal(*L1_ParamList.paramarray[j][L1_THREAD_POOL_SIZE].uptr == 2022, - "thread_pool_size removed, please use --thread-pooli\n"); + "thread_pool_size removed, please use --thread-pool\n"); RC.gNB[j]->ofdm_offset_divisor = *(L1_ParamList.paramarray[j][L1_OFDM_OFFSET_DIVISOR].uptr); RC.gNB[j]->pucch0_thres = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr); RC.gNB[j]->prach_thres = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr); From 9ee917039a5f53074e6798619ef129cf1c8ab71c Mon Sep 17 00:00:00 2001 From: laurent Date: Fri, 19 Aug 2022 21:36:10 +0200 Subject: [PATCH 131/136] fix non reentrant issue in itti --- common/utils/ocp_itti/intertask_interface.cpp | 38 +++++++++---------- common/utils/ocp_itti/intertask_interface.h | 2 +- openair2/LAYER2/MAC/config.c | 6 +-- openair3/NAS/UE/nas_ue_task.c | 5 +-- openair3/SCTP/sctp_eNB_task.c | 26 ++++++------- openair3/SCTP/sctp_eNB_task.h | 2 - openair3/ocp-gtpu/gtp_itf.cpp | 5 +-- 7 files changed, 35 insertions(+), 49 deletions(-) diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp index 4613cd5c1b..da77b271a6 100644 --- a/common/utils/ocp_itti/intertask_interface.cpp +++ b/common/utils/ocp_itti/intertask_interface.cpp @@ -45,9 +45,7 @@ extern "C" { std::vector message_queue; std::map timer_map; uint64_t next_timer=UINT64_MAX; - struct epoll_event *events =NULL; int nb_fd_epoll=0; - int nb_events=0; int epoll_fd=-1; int sem_fd=-1; } task_list_t; @@ -167,8 +165,6 @@ extern "C" { struct epoll_event event; task_list_t *t=tasks[task_id]; t->nb_fd_epoll++; - t->events = (struct epoll_event *)realloc((void *)t->events, - t->nb_fd_epoll * sizeof(struct epoll_event)); event.events = EPOLLIN | EPOLLERR; event.data.u64 = 0; event.data.fd = fd; @@ -185,7 +181,7 @@ extern "C" { t->nb_fd_epoll--; } - static inline int itti_get_events_locked(task_id_t task_id, struct epoll_event **events) { + static inline int itti_get_events_locked(task_id_t task_id, struct epoll_event *events, int nb_events) { task_list_t *t=tasks[task_id]; uint64_t current_time=0; @@ -234,40 +230,39 @@ extern "C" { pthread_mutex_unlock(&t->queue_cond_lock); LOG_D(ITTI,"enter blocking wait for %s, timeout: %d ms\n", itti_get_task_name(task_id), epoll_timeout); - t->nb_events = epoll_wait(t->epoll_fd,t->events,t->nb_fd_epoll, epoll_timeout); + nb_events = epoll_wait(t->epoll_fd, events,t->nb_fd_epoll, epoll_timeout); - if ( t->nb_events < 0 && (errno == EINTR || errno == EAGAIN ) ) + if ( nb_events < 0 && (errno == EINTR || errno == EAGAIN ) ) pthread_mutex_lock(&t->queue_cond_lock); - } while (t->nb_events < 0 && (errno == EINTR || errno == EAGAIN ) ); + } while (nb_events < 0 && (errno == EINTR || errno == EAGAIN ) ); - AssertFatal (t->nb_events >=0, + AssertFatal (nb_events >=0, "epoll_wait failed for task %s, nb fds %d, timeout %lu: %s!\n", itti_get_task_name(task_id), t->nb_fd_epoll, t->next_timer != UINT64_MAX ? t->next_timer-current_time : -1, strerror(errno)); - LOG_D(ITTI,"receive on %d descriptors for %s\n", t->nb_events, itti_get_task_name(task_id)); + LOG_D(ITTI,"receive on %d descriptors for %s\n", nb_events, itti_get_task_name(task_id)); - if (t->nb_events == 0) + if (nb_events == 0) /* No data to read -> return */ return 0; - for (int i = 0; i < t->nb_events; i++) { + for (int i = 0; i < nb_events; i++) { /* Check if there is an event for ITTI for the event fd */ - if ((t->events[i].events & EPOLLIN) && - (t->events[i].data.fd == t->sem_fd)) { + if ((events[i].events & EPOLLIN) && + (events[i].data.fd == t->sem_fd)) { eventfd_t sem_counter; /* Read will always return 1 */ AssertFatal( sizeof(sem_counter) == read (t->sem_fd, &sem_counter, sizeof(sem_counter)), ""); /* Mark that the event has been processed */ - t->events[i].events &= ~EPOLLIN; + events[i].events &= ~EPOLLIN; } } - *events = t->events; - return t->nb_events; + return nb_events; } - int itti_get_events(task_id_t task_id, struct epoll_event **events) { + int itti_get_events(task_id_t task_id, struct epoll_event *events, int nb_evts) { pthread_mutex_lock(&tasks[task_id]->queue_cond_lock); - return itti_get_events_locked(task_id, events); + return itti_get_events_locked(task_id, events, nb_evts); } void itti_receive_msg(task_id_t task_id, MessageDef **received_msg) { @@ -275,15 +270,16 @@ extern "C" { task_list_t *t=tasks[task_id]; pthread_mutex_lock(&t->queue_cond_lock); + struct epoll_event events[t->nb_fd_epoll]; // Weird condition to deal with crap legacy itti interface if ( t->nb_fd_epoll == 1 ) { while (t->message_queue.empty()) { - itti_get_events_locked(task_id, &t->events); + itti_get_events_locked(task_id, events, t->nb_fd_epoll); pthread_mutex_lock(&t->queue_cond_lock); } } else { if (t->message_queue.empty()) { - itti_get_events_locked(task_id, &t->events); + itti_get_events_locked(task_id, events, t->nb_fd_epoll); pthread_mutex_lock(&t->queue_cond_lock); } } diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h index 3a03e380a1..9f1fcd1741 100644 --- a/common/utils/ocp_itti/intertask_interface.h +++ b/common/utils/ocp_itti/intertask_interface.h @@ -479,7 +479,7 @@ void itti_unsubscribe_event_fd(task_id_t task_id, int fd); \param events events list @returns number of events to handle **/ -int itti_get_events(task_id_t task_id, struct epoll_event **events); + int itti_get_events(task_id_t task_id, struct epoll_event *events, int nb_max_evts); /** \brief Retrieves a message in the queue associated to task_id. If the queue is empty, the thread is blocked till a new message arrives. diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 52a9048cd0..91f4197bfe 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -1009,13 +1009,11 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP, LOG_I(MAC, "[eNB %d][CONFIG] LTE_MBSFNAreaConfiguration_r9_t(%p) commonSF_AllocPeriod_r9(%d)\n",Mod_idP,mbms_AreaConfig, RC.mac[Mod_idP]->common_channels[0].commonSF_AllocPeriod_r9); for(i=0; i < mbms_AreaConfig->commonSF_Alloc_r9.list.count; i++){ RC.mac[Mod_idP]->common_channels[0].commonSF_Alloc_r9_mbsfn_SubframeConfig[i] = mbms_AreaConfig->commonSF_Alloc_r9.list.array[i]; - LOG_I(RRC,"[eNB %d][CONFIG] MBSFNArea[%d] commonSF_Alloc_r9: radioframeAllocationPeriod(%ldn),radioframeAllocationOffset(%ld), subframeAllocation(%x,%x,%x)\n" + LOG_I(RRC,"[eNB %d][CONFIG] MBSFNArea[%d] commonSF_Alloc_r9: radioframeAllocationPeriod(%ldn),radioframeAllocationOffset(%ld), subframeAllocation(%x)\n" ,Mod_idP,i ,RC.mac[Mod_idP]->common_channels[0].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->radioframeAllocationPeriod ,RC.mac[Mod_idP]->common_channels[0].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->radioframeAllocationOffset - ,RC.mac[Mod_idP]->common_channels[0].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0] - ,RC.mac[Mod_idP]->common_channels[0].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[1] - ,RC.mac[Mod_idP]->common_channels[0].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[2]); + ,RC.mac[Mod_idP]->common_channels[0].commonSF_Alloc_r9_mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]); } } diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c index 34bf6cb3ad..f47af8cb66 100644 --- a/openair3/NAS/UE/nas_ue_task.c +++ b/openair3/NAS/UE/nas_ue_task.c @@ -86,7 +86,6 @@ void nas_user_api_id_initialize(nas_user_t *user) { void *nas_ue_task(void *args_p) { int nb_events; - struct epoll_event *events; MessageDef *msg_p; instance_t instance; unsigned int Mod_id; @@ -306,8 +305,8 @@ void *nas_ue_task(void *args_p) AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); msg_p = NULL; } - - nb_events = itti_get_events(TASK_NAS_UE, &events); + struct epoll_event events[20]; + nb_events = itti_get_events(TASK_NAS_UE, events, 20); if ((nb_events > 0) && (events != NULL)) { if (nas_ue_process_events(users, events, nb_events) == true) { diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c index df6dde0f99..14ee716e68 100644 --- a/openair3/SCTP/sctp_eNB_task.c +++ b/openair3/SCTP/sctp_eNB_task.c @@ -216,7 +216,7 @@ sctp_eNB_accept_associations_multi( } //------------------------------------------------------------------------------ -void +static void sctp_handle_new_association_req_multi( const instance_t instance, const task_id_t requestor, @@ -355,7 +355,7 @@ sctp_handle_new_association_req_multi( } //------------------------------------------------------------------------------ -void +static void sctp_handle_new_association_req( const instance_t instance, const task_id_t requestor, @@ -617,7 +617,7 @@ sctp_handle_new_association_req( } //------------------------------------------------------------------------------ -void sctp_send_data( +static void sctp_send_data( instance_t instance, task_id_t task_id, sctp_data_req_t *sctp_data_req_p) @@ -1058,16 +1058,13 @@ sctp_eNB_read_from_socket( //------------------------------------------------------------------------------ void -sctp_eNB_flush_sockets( +static sctp_eNB_flush_sockets( struct epoll_event *events, int nb_events) { + printf("entre sctp_eNB_flush_sockets %p\n",events); int i; struct sctp_cnx_list_elm_s *sctp_cnx = NULL; - if (events == NULL) { - return; - } - for (i = 0; i < nb_events; i++) { sctp_cnx = sctp_get_cnx(-1, events[i].data.fd); @@ -1090,7 +1087,7 @@ sctp_eNB_flush_sockets( } //------------------------------------------------------------------------------ -void sctp_eNB_init(void) +static void sctp_eNB_init(void) { SCTP_DEBUG("Starting SCTP layer\n"); @@ -1100,10 +1097,9 @@ void sctp_eNB_init(void) } //------------------------------------------------------------------------------ -void *sctp_eNB_process_itti_msg(void *notUsed) +static void sctp_eNB_process_itti_msg() { int nb_events; - struct epoll_event *events; MessageDef *received_msg = NULL; int result; @@ -1184,12 +1180,12 @@ void *sctp_eNB_process_itti_msg(void *notUsed) AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); received_msg = NULL; } - - nb_events = itti_get_events(TASK_SCTP, &events); + struct epoll_event events[20]; + nb_events = itti_get_events(TASK_SCTP, events, 20); /* Now handle notifications for other sockets */ sctp_eNB_flush_sockets(events, nb_events); - return NULL; + return; } //------------------------------------------------------------------------------ @@ -1198,7 +1194,7 @@ void *sctp_eNB_task(void *arg) sctp_eNB_init(); while (1) { - (void) sctp_eNB_process_itti_msg(NULL); + sctp_eNB_process_itti_msg(); } return NULL; diff --git a/openair3/SCTP/sctp_eNB_task.h b/openair3/SCTP/sctp_eNB_task.h index e23e80675e..31cb683102 100644 --- a/openair3/SCTP/sctp_eNB_task.h +++ b/openair3/SCTP/sctp_eNB_task.h @@ -22,8 +22,6 @@ #ifndef SCTP_ENB_TASK_H_ #define SCTP_ENB_TASK_H_ -void sctp_eNB_init(void); -void *sctp_eNB_process_itti_msg(void *); void *sctp_eNB_task(void *arg); #endif /* SCTP_ENB_TASK_H_ */ diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp index afef8ea435..33dac2fed0 100644 --- a/openair3/ocp-gtpu/gtp_itf.cpp +++ b/openair3/ocp-gtpu/gtp_itf.cpp @@ -1278,9 +1278,8 @@ void *gtpv1uTask(void *args) { AssertFatal(EXIT_SUCCESS==itti_free(TASK_GTPV1_U, message_p), "Failed to free memory!\n"); } - struct epoll_event *events; - - int nb_events = itti_get_events(TASK_GTPV1_U, &events); + struct epoll_event events[20]; + int nb_events = itti_get_events(TASK_GTPV1_U, events, 20); for (int i = 0; i < nb_events; i++) if ((events[i].events&EPOLLIN)) From 5fcd8b6f9f82c7a9a5046bff63052acbb4f2dd77 Mon Sep 17 00:00:00 2001 From: laurent Date: Fri, 19 Aug 2022 22:13:59 +0200 Subject: [PATCH 132/136] fix direct memory bugs in lte mbms --- openair1/PHY/INIT/lte_init_ue.c | 5 +++-- openair2/RRC/LTE/rrc_UE.c | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/openair1/PHY/INIT/lte_init_ue.c b/openair1/PHY/INIT/lte_init_ue.c index c3f09fa78c..82dae429f1 100644 --- a/openair1/PHY/INIT/lte_init_ue.c +++ b/openair1/PHY/INIT/lte_init_ue.c @@ -689,8 +689,9 @@ int init_lte_ue_signal(PHY_VARS_UE *ue, int idx = (j<<1) + i; for (th_id=0; th_idcommon_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id][idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); - common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id][idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2 ); + common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates[eNB_id][idx] = (int32_t *)malloc16_clear( sizeof(int32_t)* + max(fp->symbols_per_tti*(fp->ofdm_symbol_size+LTE_CE_FILTER_LENGTH),6144) ); + common_vars->common_vars_rx_data_per_thread[th_id].dl_ch_estimates_time[eNB_id][idx] = (int32_t *)malloc16_clear( sizeof(int32_t)*max(fp->ofdm_symbol_size*2,6144) ); } } } diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c index 577ee3effd..f0a81d9821 100644 --- a/openair2/RRC/LTE/rrc_UE.c +++ b/openair2/RRC/LTE/rrc_UE.c @@ -4768,13 +4768,11 @@ void decode_MBSFNAreaConfiguration( module_id_t ue_mod_idP, uint8_t eNB_index, f // Configure commonSF_Alloc for(i=0; i< UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.count; i++) { - LOG_W(RRC,"[UE %d] Frame %d, commonSF_Alloc_r9: radioframeAllocationPeriod(%ldn),radioframeAllocationOffset(%ld), subframeAllocation(%x,%x,%x)\n", + LOG_W(RRC,"[UE %d] Frame %d, commonSF_Alloc_r9: radioframeAllocationPeriod(%ldn),radioframeAllocationOffset(%ld), subframeAllocation(%x)\n", ue_mod_idP, frameP, UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->radioframeAllocationPeriod<<1, UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->radioframeAllocationOffset, - UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[0], - UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[1], - UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[2]); + UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]->subframeAllocation.choice.oneFrame.buf[0]); UE_mac_inst[ue_mod_idP].commonSF_Alloc_r9_mbsfn_SubframeConfig[i] = UE_rrc_inst[ue_mod_idP].mcch_message[eNB_index]->commonSF_Alloc_r9.list.array[i]; } From 9b207834e7caacc15d4993d89da18a98ce0492e2 Mon Sep 17 00:00:00 2001 From: laurent Date: Mon, 22 Aug 2022 10:32:46 +0200 Subject: [PATCH 133/136] merge conflict fix --- openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c index 3be0b096e7..64a70ba974 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c @@ -591,13 +591,9 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ////////////////////////////////////////////////////////////////////////////////////////// } for (r=0; rTpool); if (req == NULL) break; // Tpool has been stopped -======= - notifiedFIFO_elt_t *req=pullTpool(&nf, &get_nrUE_params()->Tpool); ->>>>>>> e9caae6f99 (simplify thread pool configuration) bool last = false; if (r == nbDecode - 1) last = true; From 223ae5c30761a289662e3b7ad31803b2491d262d Mon Sep 17 00:00:00 2001 From: laurent Date: Fri, 2 Sep 2022 11:34:17 +0200 Subject: [PATCH 134/136] remove a forgotten printf() --- openair3/SCTP/sctp_eNB_task.c | 1 - 1 file changed, 1 deletion(-) diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c index 14ee716e68..49a0674bdf 100644 --- a/openair3/SCTP/sctp_eNB_task.c +++ b/openair3/SCTP/sctp_eNB_task.c @@ -1061,7 +1061,6 @@ void static sctp_eNB_flush_sockets( struct epoll_event *events, int nb_events) { - printf("entre sctp_eNB_flush_sockets %p\n",events); int i; struct sctp_cnx_list_elm_s *sctp_cnx = NULL; From bf2b069d96e04cffe54e0b8473575ac39b2e60d5 Mon Sep 17 00:00:00 2001 From: laurent Date: Fri, 2 Sep 2022 11:35:39 +0200 Subject: [PATCH 135/136] let more time for docker compose to start the container --- ci-scripts/cls_containerize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index b8dc8b32fb..edf43cd1bf 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -675,7 +675,7 @@ class Containerize(): result = re.search('service=(?P[a-zA-Z0-9\_]+)', mySSH.getBefore()) if result is not None: svcName = result.group('svc_name') - mySSH.command('docker-compose --file ci-docker-compose.yml up -d ' + svcName, '\$', 10) + mySSH.command('docker-compose --file ci-docker-compose.yml up -d ' + svcName, '\$', 15) # Checking Status mySSH.command('docker-compose --file ci-docker-compose.yml config', '\$', 5) From 6f862c0dfedddff07e963b637170b574eb42d601 Mon Sep 17 00:00:00 2001 From: laurent Date: Fri, 2 Sep 2022 14:25:17 +0200 Subject: [PATCH 136/136] fix a bug in itti external sockets --- common/utils/ocp_itti/intertask_interface.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp index da77b271a6..82f7eb5774 100644 --- a/common/utils/ocp_itti/intertask_interface.cpp +++ b/common/utils/ocp_itti/intertask_interface.cpp @@ -181,10 +181,10 @@ extern "C" { t->nb_fd_epoll--; } - static inline int itti_get_events_locked(task_id_t task_id, struct epoll_event *events, int nb_events) { + static inline int itti_get_events_locked(task_id_t task_id, struct epoll_event *events, int max_events) { task_list_t *t=tasks[task_id]; uint64_t current_time=0; - + int nb_events; do { if ( t->next_timer != UINT64_MAX ) { struct timespec tp; @@ -230,7 +230,7 @@ extern "C" { pthread_mutex_unlock(&t->queue_cond_lock); LOG_D(ITTI,"enter blocking wait for %s, timeout: %d ms\n", itti_get_task_name(task_id), epoll_timeout); - nb_events = epoll_wait(t->epoll_fd, events,t->nb_fd_epoll, epoll_timeout); + nb_events = epoll_wait(t->epoll_fd, events, max_events, epoll_timeout); if ( nb_events < 0 && (errno == EINTR || errno == EAGAIN ) ) pthread_mutex_lock(&t->queue_cond_lock); @@ -238,7 +238,9 @@ extern "C" { AssertFatal (nb_events >=0, "epoll_wait failed for task %s, nb fds %d, timeout %lu: %s!\n", - itti_get_task_name(task_id), t->nb_fd_epoll, t->next_timer != UINT64_MAX ? t->next_timer-current_time : -1, strerror(errno)); + itti_get_task_name(task_id), t->nb_fd_epoll, + t->next_timer != UINT64_MAX ? t->next_timer-current_time : -1, + strerror(errno)); LOG_D(ITTI,"receive on %d descriptors for %s\n", nb_events, itti_get_task_name(task_id)); if (nb_events == 0)