From e250afb08ff8b02fd21674b33a8f9b4a2c647265 Mon Sep 17 00:00:00 2001 From: Megvii Engine Team Date: Tue, 23 Mar 2021 10:41:39 +0800 Subject: [PATCH] feat(dnn/cuda): support conv_bias for nchw64 and qint4 GitOrigin-RevId: 1c65ba87d7a2276171addcb8883464ada95306a4 --- dnn/src/common/conv_bias.cpp | 1 + dnn/src/common/convolution.cpp | 2 +- dnn/src/common/tensor_format.cpp | 6 +- .../cuda/conv_bias/cudnn_conv_bias_activation.cpp | 1 + dnn/src/naive/conv_bias/opr_impl.cpp | 58 +- dnn/src/naive/convolution/helper.h | 21 +- dnn/src/naive/elemwise_multi_type/opr_impl.cpp | 11 +- dnn/src/naive/lowbit_utils.cpp | 4 +- dnn/test/common/checker.cpp | 2 +- dnn/test/common/checker.h | 31 +- dnn/test/common/conv_bias.cpp | 15 + dnn/test/cuda/conv_bias_int8.cpp | 405 +-- dnn/test/cuda/conv_test_utils.cpp | 458 ++++ dnn/test/cuda/conv_test_utils.h | 66 + dnn/test/naive/conv_bias.cpp | 2652 ++++++++++++++++++++ dnn/test/naive/elemwise_multi_type.cpp | 26 + 16 files changed, 3322 insertions(+), 437 deletions(-) create mode 100644 dnn/test/cuda/conv_test_utils.cpp create mode 100644 dnn/test/cuda/conv_test_utils.h diff --git a/dnn/src/common/conv_bias.cpp b/dnn/src/common/conv_bias.cpp index 276d0a60..4d33cee7 100644 --- a/dnn/src/common/conv_bias.cpp +++ b/dnn/src/common/conv_bias.cpp @@ -330,6 +330,7 @@ bool check_bias_share_in_channel(const TensorLayout& bias, } else if (format == param::ConvBias::Format::NCHW4 || format == param::ConvBias::Format::NCHW8 || format == param::ConvBias::Format::NCHW32 || + format == param::ConvBias::Format::NCHW64 || format == param::ConvBias::Format::NCHW4_NCHW32 || format == param::ConvBias::Format::NCHW32_NCHW4) { share_in_channel = (bias.ndim == 5 && bias[0] == 1 && bias[2] == 1 && diff --git a/dnn/src/common/convolution.cpp b/dnn/src/common/convolution.cpp index d7d3532b..366618dd 100644 --- a/dnn/src/common/convolution.cpp +++ b/dnn/src/common/convolution.cpp @@ -559,7 +559,7 @@ void ConvolutionBase::check_or_deduce_dtype_fwd(DType src, supported_dst_dtype.push_back( dtype::QuantizedS8(src.param().scale / filter.param().scale)); - } else { + }else { megdnn_throw(ssprintf("unsupported input / filter DType: %s x %s", src.name(), filter.name())); } diff --git a/dnn/src/common/tensor_format.cpp b/dnn/src/common/tensor_format.cpp index c65e5cf8..4e5a1c0d 100644 --- a/dnn/src/common/tensor_format.cpp +++ b/dnn/src/common/tensor_format.cpp @@ -488,10 +488,6 @@ void LowbitsAlignedTensorFormatBase::assert_valid( "bad stride:%s, %zu", layout.to_string().c_str(), layout.stride[i]); } - /// FIXME - if (layout.ndim == 0) { - printf("%s\n", layout.to_string().c_str()); - } megdnn_assert(layout.ndim == 0 || has_dim_unity_stride, "innermost dim not contiguous"); } @@ -553,7 +549,7 @@ bool LowbitsAlignedTensorFormatBase::is_contiguous_spec( if (layout.shape[i] != 1 && layout.stride[i] != expected) return false; auto multiplier = layout.shape[i]; - if (i == layout.ndim - 1) + if (i == static_cast(layout.ndim) - 1) multiplier = round_up(multiplier, m_align_size_in_elements); expected *= multiplier; } diff --git a/dnn/src/cuda/conv_bias/cudnn_conv_bias_activation.cpp b/dnn/src/cuda/conv_bias/cudnn_conv_bias_activation.cpp index b4be7964..fb8b9099 100644 --- a/dnn/src/cuda/conv_bias/cudnn_conv_bias_activation.cpp +++ b/dnn/src/cuda/conv_bias/cudnn_conv_bias_activation.cpp @@ -67,6 +67,7 @@ bool ConvBiasForwardImpl::AlgoCUDNNConvBiasActivation::is_available( } if (param.format == param::ConvBias::Format::NCHW8 || + param.format == param::ConvBias::Format::NCHW64 || param.format == param::ConvBias::Format::CHWN4) return false; if (param.format == param::ConvBias::Format::NCHW32) { diff --git a/dnn/src/naive/conv_bias/opr_impl.cpp b/dnn/src/naive/conv_bias/opr_impl.cpp index 0a7a9cbb..d25e7e88 100644 --- a/dnn/src/naive/conv_bias/opr_impl.cpp +++ b/dnn/src/naive/conv_bias/opr_impl.cpp @@ -6,18 +6,19 @@ * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. */ #include "src/naive/conv_bias/opr_impl.h" #include "src/naive/convolution/helper.h" #include #include "megdnn/dtype.h" +#include "src/common/conv_bias.h" +#include "src/common/opr_delegate.h" #include "src/common/utils.h" #include "src/naive/handle.h" #include "src/naive/lowbit_utils.h" -#include "src/common/conv_bias.h" -#include "src/common/opr_delegate.h" #include "midout.h" MIDOUT_DECL(megdnn_naive_conv_bias_fwd) @@ -32,7 +33,7 @@ void handle_z_inp_and_activation_naive( const TensorND& conv_bias_tensor, const TensorND& z_tensor, const TensorND& dst_tensor, dt_byte* workspace_ptr) { auto res = dst_tensor, z_float = z_tensor; - //!create naive inplace handle + //! create naive inplace handle auto handle = inplace_cpu_handle(2); if (z_tensor.layout.ndim > 0 && z_tensor.layout.dtype.category() != DTypeCategory::FLOAT) { @@ -121,6 +122,7 @@ void forward_bias( auto ret = layout; auto param = layout.dtype.param(); ret.dtype = dtype::Quantized8Asymm(param.scale, param.zero_point); + ret.format = TensorFormat(ret.dtype); return ret; }; TensorND new_src = {workspace_ptr, convert_layout(src.layout)}; @@ -134,6 +136,29 @@ void forward_bias( forward_bias( new_src, new_flt, bias, dst, nullptr, new_filter_meta); } + +template <> +void forward_bias( + _megdnn_tensor_in src, _megdnn_tensor_in filter, _megdnn_tensor_in bias, + _megdnn_tensor_out dst, dt_byte* workspace_ptr, + const ConvBiasForward::CanonizedFilterMeta& filter_meta) { + auto convert_layout = [](const TensorLayout& layout) { + auto ret = layout; + auto param = layout.dtype.param(); + ret.dtype = dtype::QuantizedS8(param.scale); + ret.format = TensorFormat(ret.dtype); + return ret; + }; + TensorND new_src = {workspace_ptr, convert_layout(src.layout)}; + TensorND new_flt = {workspace_ptr + new_src.layout.span().dist_byte(), + convert_layout(filter.layout)}; + int4_to_int8(src, new_src); + int4_to_int8(filter, new_flt); + auto new_filter_meta = filter_meta; + new_filter_meta.dtype = new_flt.layout.dtype; + forward_bias( + new_src, new_flt, bias, dst, nullptr, new_filter_meta); +} } // namespace convolution size_t ConvBiasForwardImpl::get_workspace_in_bytes(const TensorLayout& src, @@ -150,15 +175,17 @@ size_t ConvBiasForwardImpl::get_workspace_in_bytes(const TensorLayout& src, float_workspace_size = 2 * TensorLayout{z, dtype::Float32()}.span().dist_byte(); } + + if ((src.dtype.enumv() == DTypeEnum::Quantized4Asymm || + src.dtype.enumv() == DTypeEnum::QuantizedS4) && + bias.dtype.enumv() == DTypeEnum::QuantizedS32) { + float_workspace_size += + (src.total_nr_elems() + flt.total_nr_elems()) * sizeof(uint8_t); + } if (bias.dtype.enumv() != dst.dtype.enumv()) { - return float_workspace_size + - TensorLayout{dst, bias.dtype}.span().dist_byte(); - } else if (src.dtype.enumv() == DTypeEnum::Quantized4Asymm && - dst.dtype.enumv() == DTypeEnum::QuantizedS32) { - return float_workspace_size + - (src.span().dist_elem() + flt.span().dist_elem()) * - sizeof(uint8_t); + float_workspace_size += + TensorLayout{dst, bias.dtype}.span().dist_byte(); } return float_workspace_size; } @@ -169,7 +196,7 @@ void ConvBiasForwardImpl::exec(_megdnn_tensor_in src, _megdnn_tensor_in filter, const PreprocessedFilter* preprocessed_filter, _megdnn_workspace workspace) { MIDOUT_BEGIN(megdnn_naive_conv_bias_fwd) { - dt_byte *workspace_ptr = workspace.raw_ptr; + dt_byte* workspace_ptr = workspace.raw_ptr; // ============================w * f + b================================ auto filter_meta = @@ -198,7 +225,8 @@ void ConvBiasForwardImpl::exec(_megdnn_tensor_in src, _megdnn_tensor_in filter, DTypeTrait::ctype, \ DTypeTrait::ctype, \ DTypeTrait::ctype>)) - if (0) {} + if (0) { + } DISPATCH(Float32, Float32) DISPATCH(Int8, Int16) DISPATCH(Int8, Int32) @@ -209,6 +237,7 @@ void ConvBiasForwardImpl::exec(_megdnn_tensor_in src, _megdnn_tensor_in filter, DISPATCH_RAW(QuantizedS8, QuantizedS32, QuantizedS32, FLOAT32, (convolution::forward_bias)) + DISPATCH(QuantizedS4, QuantizedS32) #if !MEGDNN_DISABLE_FLOAT16 DISPATCH(Float16, Float16) DISPATCH_RAW(Float16, Float16, Float16, FLOAT32, @@ -254,8 +283,7 @@ ConvBiasForward::Algorithm* ConvBiasForwardImpl::get_algorithm_heuristic( return algo; } -ConvBiasForward::Algorithm* -ConvBiasForwardImpl::get_algorithm_from_desc( +ConvBiasForward::Algorithm* ConvBiasForwardImpl::get_algorithm_from_desc( const AlgorithmDesc& desc) { Algorithm* ret = static_cast(handle())->default_conv_bias_fwd_algo(); diff --git a/dnn/src/naive/convolution/helper.h b/dnn/src/naive/convolution/helper.h index 65617c5c..d498252a 100644 --- a/dnn/src/naive/convolution/helper.h +++ b/dnn/src/naive/convolution/helper.h @@ -162,7 +162,8 @@ void compute2d(_megdnn_tensor_in src, ftype* __restrict fptr, filter_meta.format == Format::NCHW4_NCHW32 || filter_meta.format == Format::NCHW8 || filter_meta.format == Format::NCHW32 || - filter_meta.format == Format::NCHW32_NCHW4) { + filter_meta.format == Format::NCHW32_NCHW4 || + filter_meta.format == Format::NCHW64) { spatial_start = 2; channel_pos = 1; batch_pos = 0; @@ -197,6 +198,8 @@ void compute2d(_megdnn_tensor_in src, ftype* __restrict fptr, } else if (filter_meta.format == Format::NCHW32 || filter_meta.format == Format::NCHW4_NCHW32) { OC *= 32; + } else if (filter_meta.format == Format::NCHW64) { + OC *= 64; } size_t FS_G, FS_OC, FS_IC, FS_SPATIAL; @@ -206,7 +209,8 @@ void compute2d(_megdnn_tensor_in src, ftype* __restrict fptr, filter_meta.format == Format::NCHW4_NCHW32 || filter_meta.format == Format::NCHW8 || filter_meta.format == Format::NCHW32 || - filter_meta.format == Format::NCHW32_NCHW4) { + filter_meta.format == Format::NCHW32_NCHW4 || + filter_meta.format == Format::NCHW64) { // g, oc, ic, fh, fw FS_SPATIAL = 1; FS_IC = FH * FW; @@ -349,6 +353,10 @@ void compute2d(_megdnn_tensor_in src, ftype* __restrict fptr, h * layout.stride[2] + w * layout.stride[3] + (c & 0b11) * layout.stride[4]; } + } else if (filter_meta.format == Format::NCHW64) { + return n * layout.stride[0] + (c >> 6) * layout.stride[1] + + h * layout.stride[2] + w * layout.stride[3] + + (c & 0x3F) * layout.stride[4]; } else { megdnn_assert(filter_meta.format == Format::NCHW4, "invalid conv format"); @@ -432,6 +440,10 @@ void compute2d(_megdnn_tensor_in src, ftype* __restrict fptr, megdnn_throw( "nchw44_dot naive not support this input and output\n"); } + } else if (filter_meta.format == Format::NCHW64) { + return gc_out.cur_grp * FS_G + gc_out.cur_off * FS_OC + + (ic - ic0) / 64 * FS_IC * 64 + + (fh * FW + fw) * FS_SPATIAL * 64 + ((ic - ic0) & 0x3F); } else { return gc_out.cur_grp * FS_G + gc_out.cur_off * FS_OC + (ic - ic0) * FS_IC + (fh * FW + fw) * FS_SPATIAL; @@ -690,6 +702,7 @@ void forward_bias(_megdnn_tensor_in src, _megdnn_tensor_in filter, case param::Convolution::Format::NCHW32: case param::Convolution::Format::NCHW32_NCHW4: case param::Convolution::Format::CHWN4: + case param::Convolution::Format::NCHW64: compute2d(src, filter.compatible_ptr(), dst, filter_meta); @@ -782,6 +795,10 @@ void forward_bias(_megdnn_tensor_in src, _megdnn_tensor_in filter, BIAS_ADD_NCHWx(8); break; }; + case Format::NCHW64: { + BIAS_ADD_NCHWx(64); + break; + }; #define BIAS_ADD_CHWNx(_pack_size) \ do { \ megdnn_assert(dst.layout.is_contiguous()); \ diff --git a/dnn/src/naive/elemwise_multi_type/opr_impl.cpp b/dnn/src/naive/elemwise_multi_type/opr_impl.cpp index 328cacf0..e94c0376 100644 --- a/dnn/src/naive/elemwise_multi_type/opr_impl.cpp +++ b/dnn/src/naive/elemwise_multi_type/opr_impl.cpp @@ -179,7 +179,7 @@ void ElemwiseMultiTypeImpl::dispatch_add_qint_op( auto size = param.size; auto param0 = param[0].layout.dtype .param::dtype>(); - auto dst = dst_tensor.ptr(); + auto dst = tensor_iter_valonly(dst_tensor).begin(); auto dst_param = dst_tensor.layout.dtype .param::dtype>(); @@ -205,7 +205,7 @@ void ElemwiseMultiTypeImpl::dispatch_add_qint_op( .param::dtype>(); auto param1 = param[1].layout.dtype .param::dtype>(); - auto dst = dst_tensor.ptr(); + auto dst = tensor_iter_valonly(dst_tensor).begin(); auto dst_param = dst_tensor.layout.dtype .param::dtype>(); @@ -238,7 +238,7 @@ void ElemwiseMultiTypeImpl::dispatch_add_qint_op( .param::dtype>(); auto param2 = param[2].layout.dtype .param::dtype>(); - auto dst = dst_tensor.ptr(); + auto dst = tensor_iter_valonly(dst_tensor).begin(); auto dst_param = dst_tensor.layout.dtype .param::dtype>(); @@ -272,10 +272,13 @@ void ElemwiseMultiTypeImpl::dispatch_add_qint_op_dst(const ElemParam& param, typename DTypeTrait<_dt>::ctype>(param, dst); \ break; MEGDNN_FOREACH_QUANTIZED_DTYPE(cb) + MEGDNN_FOREACH_QUANTIZED_LOWBIT_DTYPE(cb) #undef cb default: - megdnn_assert_internal(0); + megdnn_assert(0, "not support %s %s\n", + param[0].layout.dtype.name(), + dst.layout.dtype.name()); } } diff --git a/dnn/src/naive/lowbit_utils.cpp b/dnn/src/naive/lowbit_utils.cpp index 786fed21..552bd708 100644 --- a/dnn/src/naive/lowbit_utils.cpp +++ b/dnn/src/naive/lowbit_utils.cpp @@ -6,7 +6,8 @@ * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. */ #include "src/naive/lowbit_utils.h" @@ -40,6 +41,7 @@ void megdnn::naive::int4_to_int8(const TensorND& in, const TensorND& out) { auto out_ptr = static_cast(out.raw_ptr) + out.layout.span().low_byte; + megdnn_assert(in.layout.span().dist_elem() % 2 == 0); for (size_t i = 0; i < in.layout.span().dist_elem(); i += 2) { int8_t cur = in_ptr[i / 2]; out_ptr[i] = cur << 4; diff --git a/dnn/test/common/checker.cpp b/dnn/test/common/checker.cpp index 614d16da..ee39b65c 100644 --- a/dnn/test/common/checker.cpp +++ b/dnn/test/common/checker.cpp @@ -29,7 +29,7 @@ namespace { double error_sum = 0; double error_sum_biased = 0; for (size_t i = 0; i < nr_elem; ++ i) { - ctype iv0 = ctype(*it0), iv1 = ctype(*it1); + ctype iv0 = *it0, iv1 = *it1; float err = diff(iv0, iv1); error_sum += std::abs(err); error_sum_biased += err; diff --git a/dnn/test/common/checker.h b/dnn/test/common/checker.h index 044cdd9c..a175b367 100644 --- a/dnn/test/common/checker.h +++ b/dnn/test/common/checker.h @@ -6,7 +6,8 @@ * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. */ #pragma once @@ -419,13 +420,28 @@ TensorND TensorValueLowbit4(const TensorShape& shape, T dtype, tensor.raw_ptr = static_cast(malloc(tensor.layout.span().dist_byte())); megdnn_assert(values.size() == tensor.layout.total_nr_elems()); - auto ptr = static_cast(tensor.raw_ptr); - for (size_t i = 0; i < values.size(); i += 2) { + auto ptr = tensor.ptr::ctype>(); + size_t i; + for (i = 0; i + 1 < values.size(); i += 2) { U val0 = values[i], val1 = values[i + 1]; megdnn_assert(val0 >= DTypeTrait::min()); megdnn_assert(val1 <= DTypeTrait::max()); - ptr[i / 2] = (val0 & 0xF) | (val1 << 4); + ptr[i / 2] = typename DTypeTrait::ctype((val0 & 0xF) | (val1 << 4)); + } + if (i < values.size()) { + U val0 = values[i]; + megdnn_assert(val0 >= DTypeTrait::min() && + val0 <= DTypeTrait::max()); + if (i + 1 < values.size()) { + U val1 = values[i + 1]; + megdnn_assert(val1 >= DTypeTrait::min() && + val1 <= DTypeTrait::max()); + ptr[i / 2] = typename DTypeTrait::ctype((val0 & 0xF) | (val1 << 4)); + } else { + ptr[i / 2] = typename DTypeTrait::ctype(val0 & 0xF); + } } + return tensor; } @@ -466,7 +482,6 @@ struct ExecutionPolicyAlgoName { template > class AlgoChecker { public: - AlgoChecker(ExecutionPolicyAlgoName name, bool* require_algo = nullptr) : m_policy_name{name}, m_require_algo{require_algo} {} @@ -554,7 +569,8 @@ void construct_sub_execution_policy_heuristic(ExecutionPolicy& policy, opr->param() = Algorithm::deserialize_read_pod(param); if (!policy.algo.valid()) { policy.algo = AlgoProxy::arity>:: - get_algorithm_info_heuristic(opr.get(), layouts).desc; + get_algorithm_info_heuristic(opr.get(), layouts) + .desc; } Algorithm* algo = opr->get_algorithm_from_desc(policy.algo); @@ -563,8 +579,7 @@ void construct_sub_execution_policy_heuristic(ExecutionPolicy& policy, FOREACH_OPR_TYPE_DISPATCH(sub_items, { policy.sub_policy.push_back(ExecutionPolicy{}); construct_sub_execution_policy_heuristic<_Opr>( - policy.sub_policy.back(), _item.layouts, _item.param, - handle); + policy.sub_policy.back(), _item.layouts, _item.param, handle); }); } diff --git a/dnn/test/common/conv_bias.cpp b/dnn/test/common/conv_bias.cpp index c92e89c5..4a1a9605 100644 --- a/dnn/test/common/conv_bias.cpp +++ b/dnn/test/common/conv_bias.cpp @@ -752,6 +752,15 @@ void check_conv_bias(DType src_dtype, DType filter_dtype, DType bias_dtype, checker.set_epsilon(1 + 1e-3) .set_max_avg_error(1e-1) .set_max_avg_biased_error(1e-3); + } else if (src_dtype.enumv() == DTypeEnum::QuantizedS4) { + rng = std::make_unique(-3, 3); + const_rng = std::make_unique(1, 1); + zero_rng = std::make_unique(0, 0); + megdnn_assert(bias_dtype.enumv() == DTypeEnum::QuantizedS32); + bias_rng = std::make_unique(-50, 50); + checker.set_epsilon(1 + 1e-3) + .set_max_avg_error(1e-1) + .set_max_avg_biased_error(1e-3); } else if (src_dtype.enumv() == DTypeEnum::Float16) { rng = std::make_unique(2.f); megdnn_assert(bias_dtype.enumv() == DTypeEnum::Float16); @@ -783,6 +792,12 @@ void check_conv_bias(DType src_dtype, DType filter_dtype, DType bias_dtype, fh = arg.filter[2]; fw = arg.filter[3]; z[1] = arg.filter[0] / 32; + } else if (format == Format::NCHW64) { + hi = arg.src[2]; + wi = arg.src[3]; + fh = arg.filter[2]; + fw = arg.filter[3]; + z[1] = arg.filter[0] / 64; } else { megdnn_assert(format == Format::CHWN4); hi = arg.src[1]; diff --git a/dnn/test/cuda/conv_bias_int8.cpp b/dnn/test/cuda/conv_bias_int8.cpp index 9591e40d..926e7253 100644 --- a/dnn/test/cuda/conv_bias_int8.cpp +++ b/dnn/test/cuda/conv_bias_int8.cpp @@ -20,408 +20,13 @@ #include "test/cuda/utils.h" #include "test/common/tensor.h" #include "test/common/workspace_wrapper.h" +#include "test/cuda/conv_test_utils.h" + -#define V1(x) #x -#define V(x) V1(x) namespace megdnn { namespace test { -namespace { - -#if MEGDNN_WITH_BENCHMARK -struct BenchArgs { - size_t n, ci, hi, wi, co, f, s; -}; - -std::vector get_resnet50_bench_args(size_t batch = 64) { - std::vector args; - args.emplace_back(BenchArgs{batch, 64, 56, 56, 256, 1, 1}); - args.emplace_back(BenchArgs{batch, 256, 56, 56, 32, 3, 1}); - args.emplace_back(BenchArgs{batch, 256, 56, 56, 32, 3, 2}); - args.emplace_back(BenchArgs{batch, 4, 256, 256, 32, 7, 2}); - - args.emplace_back(BenchArgs{batch, 256, 56, 56, 64, 1, 1}); - args.emplace_back(BenchArgs{batch, 64, 56, 56, 64, 1, 1}); - args.emplace_back(BenchArgs{batch, 64, 56, 56, 64, 3, 1}); - args.emplace_back(BenchArgs{batch, 64, 56, 56, 64, 3, 2}); - args.emplace_back(BenchArgs{batch, 256, 56, 56, 64, 3, 2}); - - args.emplace_back(BenchArgs{batch, 256, 56, 56, 512, 1, 2}); - args.emplace_back(BenchArgs{batch, 256, 56, 56, 128, 1, 2}); - args.emplace_back(BenchArgs{batch, 512, 28, 28, 128, 1, 1}); - args.emplace_back(BenchArgs{batch, 128, 28, 28, 128, 3, 1}); - args.emplace_back(BenchArgs{batch, 128, 28, 28, 512, 1, 1}); - - args.emplace_back(BenchArgs{batch, 512, 28, 28, 1024, 1, 2}); - args.emplace_back(BenchArgs{batch, 512, 28, 28, 256, 1, 2}); - args.emplace_back(BenchArgs{batch, 1024, 14, 14, 256, 1, 1}); - args.emplace_back(BenchArgs{batch, 256, 14, 14, 256, 3, 1}); - args.emplace_back(BenchArgs{batch, 256, 14, 14, 1024, 1, 1}); - args.emplace_back(BenchArgs{batch, 256, 14, 14, 1024, 1, 2}); - - args.emplace_back(BenchArgs{batch, 1024, 14, 14, 2048, 1, 2}); - args.emplace_back(BenchArgs{batch, 1024, 14, 14, 512, 1, 2}); - args.emplace_back(BenchArgs{batch, 2048, 7, 7, 512, 1, 1}); - args.emplace_back(BenchArgs{batch, 512, 7, 7, 512, 3, 1}); - args.emplace_back(BenchArgs{batch, 512, 7, 7, 2048, 1, 1}); - return args; -} - -std::vector get_detection_bench_args(size_t batch = 16) { - std::vector args; - args.emplace_back(BenchArgs{batch, 4, 736, 1280, 8, 3, 2}); - args.emplace_back(BenchArgs{batch, 32, 184, 320, 16, 3, 1}); - args.emplace_back(BenchArgs{batch, 16, 184, 320, 32, 3, 1}); - args.emplace_back(BenchArgs{batch, 8, 184, 320, 16, 3, 1}); - args.emplace_back(BenchArgs{batch, 8, 184, 320, 32, 3, 1}); - args.emplace_back(BenchArgs{batch, 64, 92, 160, 32, 3, 1}); - args.emplace_back(BenchArgs{batch, 32, 184, 320, 64, 3, 2}); - args.emplace_back(BenchArgs{batch, 32, 184, 320, 32, 3, 2}); - args.emplace_back(BenchArgs{batch, 32, 92, 160, 64, 3, 1}); - args.emplace_back(BenchArgs{batch, 64, 92, 160, 8, 3, 1}); - args.emplace_back(BenchArgs{batch, 64, 92, 160, 128, 3, 2}); - args.emplace_back(BenchArgs{batch, 128, 46, 80, 32, 3, 1}); - args.emplace_back(BenchArgs{batch, 128, 46, 80, 256, 3, 2}); - args.emplace_back(BenchArgs{batch, 128, 46, 80, 8, 3, 1}); - args.emplace_back(BenchArgs{batch, 64, 92, 160, 32, 3, 2}); - args.emplace_back(BenchArgs{batch, 32, 46, 80, 128, 3, 1}); - args.emplace_back(BenchArgs{batch, 8, 46, 80, 32, 3, 1}); - args.emplace_back(BenchArgs{batch, 64, 23, 40, 256, 3, 1}); - args.emplace_back(BenchArgs{batch, 256, 23, 40, 64, 3, 1}); - args.emplace_back(BenchArgs{batch, 128, 46, 80, 64, 3, 2}); - args.emplace_back(BenchArgs{batch, 256, 23, 40, 8, 3, 1}); - args.emplace_back(BenchArgs{batch, 8, 23, 40, 32, 3, 2}); - args.emplace_back(BenchArgs{batch, 8, 12, 20, 8, 3, 1}); - args.emplace_back(BenchArgs{batch, 8, 12, 20, 8, 3, 2}); - args.emplace_back(BenchArgs{batch, 8, 6, 10, 8, 3, 1}); - return args; -} - -std::vector get_det_first_bench_args(size_t batch = 16) { - std::vector args; - args.emplace_back(BenchArgs{batch, 4, 736, 1280, 16, 3, 2}); - args.emplace_back(BenchArgs{batch, 16, 384, 640, 16, 3, 1}); - return args; -} - -void benchmark_target_algo( - Handle* handle, const std::vector& args, DType src_dtype, - DType filter_dtype, DType bias_dtype, DType dst_dtype, - const char* algo = nullptr, - param::ConvBias::Format format = param::ConvBias::Format::NCHW4) { - megdnn_assert(src_dtype.enumv() == filter_dtype.enumv()); - CUBenchmarker benchmarker(handle); - CUBenchmarker benchmarker_cudnn(handle); - size_t RUNS = 1000; - benchmarker.set_display(false).set_times(RUNS); - benchmarker_cudnn.set_display(false).set_times(RUNS); - -#define CUDNN_VERSION_STRING \ - "v" V(CUDNN_MAJOR) "." V(CUDNN_MINOR) "." V(CUDNN_PATCHLEVEL) - benchmarker_cudnn.set_before_exec_callback( - conv_bias::ConvBiasAlgoChecker( - "DEFAULT:CUDNN:ConvBiasActivation:CUDNN_CONVOLUTION_FWD_" - "ALGO_IMPLICIT_PRECOMP_" - "GEMM" CUDNN_VERSION_STRING)); - - benchmarker.set_dtype(0, src_dtype) - .set_dtype(1, filter_dtype) - .set_dtype(2, bias_dtype) - .set_dtype(3, dst_dtype) - .set_dtype(4, dst_dtype); - benchmarker_cudnn.set_dtype(0, src_dtype) - .set_dtype(1, filter_dtype) - .set_dtype(2, bias_dtype) - .set_dtype(3, dst_dtype) - .set_dtype(4, dst_dtype); - - using Param = ConvBias::Param; - using Format = Param::Format; - // helper function to change format - auto get_tensor_shape = [](TensorShape shape, - Format format) -> TensorShape { - TensorShape ret; - if (format == Format::NCHW4) { - ret = static_cast( - TensorLayout{shape, dtype::Int8()} - .reshape({shape[0], shape[1] / 4, 4, shape[2], - shape[3]}) - .dimshuffle({0, 1, 3, 4, 2})); - } else if (format == Format::CHWN4) { - ret = static_cast( - TensorLayout{shape, dtype::Int8()} - .reshape({shape[0], shape[1] / 4, 4, shape[2], - shape[3]}) - .dimshuffle({1, 3, 4, 0, 2})); - } - return ret; - }; - - for (auto&& arg : args) { - Param param; - param.pad_h = param.pad_w = arg.f / 2; - param.stride_h = param.stride_w = arg.s; - param.format = format; - - size_t ho = infer_conv_shape(arg.hi, arg.f, arg.s, arg.f / 2); - size_t wo = infer_conv_shape(arg.wi, arg.f, arg.s, arg.f / 2); - - benchmarker.set_param(param); - if (!algo) { - benchmarker.proxy()->target_execution_policy.algo.reset(); - } - TensorShape src{arg.n, arg.ci, arg.hi, arg.wi}, - filter{arg.co, arg.ci, arg.f, arg.f}, bias{1, arg.co, 1, 1}, - z{arg.n, arg.co, ho, wo}, dst = z; - float time_in_ms = 0.f; - if (algo) { - time_in_ms = - algo_benchmark, - CUTimer>(benchmarker, - {get_tensor_shape(src, format), - get_tensor_shape(filter, format), - get_tensor_shape(bias, format), - {}, - {}}, - algo) / - RUNS; - } else { - time_in_ms = benchmarker.execs({get_tensor_shape(src, format), - get_tensor_shape(filter, format), - get_tensor_shape(bias, format), - {}, - {}}) / - RUNS; - } - Format format_cudnn = Format::NCHW4; - param.format = format_cudnn; - benchmarker_cudnn.set_param(param); - auto time_in_ms_cudnn = - benchmarker_cudnn.execs({get_tensor_shape(src, format_cudnn), - get_tensor_shape(filter, format_cudnn), - get_tensor_shape(bias, format_cudnn), - {}, - {}}) / - RUNS; - float flo = 2.0 * arg.n * arg.co * ho * wo * arg.ci * arg.f * arg.f / - (1e12); - printf("src=%s, filter=%s, dst=%s, time(algo=%s)=%.2f %.2fTops, " - "time(cudnn)=%.2f %.2fTops, " - "perf(algo=%s)/perf(cudnn)=%.2f\n", - src.to_string().c_str(), filter.to_string().c_str(), - dst.to_string().c_str(), algo, time_in_ms, - (flo / (time_in_ms * 1e-3)), time_in_ms_cudnn, - (flo / (time_in_ms_cudnn * 1e-3)), algo, - time_in_ms_cudnn / time_in_ms); - printf("bench with z tensor\n"); - if (algo) { - time_in_ms = - algo_benchmark, - CUTimer>(benchmarker, - {get_tensor_shape(src, format), - get_tensor_shape(filter, format), - get_tensor_shape(bias, format), - get_tensor_shape(z, format), - {}}, - algo) / - RUNS; - } else { - time_in_ms = benchmarker.execs({get_tensor_shape(src, format), - get_tensor_shape(filter, format), - get_tensor_shape(bias, format), - get_tensor_shape(z, format), - {}}) / - RUNS; - } - time_in_ms_cudnn = - benchmarker_cudnn.execs({get_tensor_shape(src, format_cudnn), - get_tensor_shape(filter, format_cudnn), - get_tensor_shape(bias, format_cudnn), - get_tensor_shape(z, format_cudnn), - {}}) / - RUNS; - printf("src=%s, filter=%s, dst=%s, time(algo=%s)=%.2f %.2fTops, " - "time(cudnn)=%.2f %.2fTops, " - "perf(algo=%s)/perf(cudnn)=%.2f\n", - src.to_string().c_str(), filter.to_string().c_str(), - dst.to_string().c_str(), algo, time_in_ms, - (flo / (time_in_ms * 1e-3)), time_in_ms_cudnn, - (flo / (time_in_ms_cudnn * 1e-3)), algo, - time_in_ms_cudnn / time_in_ms); - } -} - -void benchmark_target_algo_with_cudnn_tsc( - Handle* handle, const std::vector& args, DType src_dtype, - DType filter_dtype, DType bias_dtype, DType dst_dtype, - const char* algo = nullptr, - param::ConvBias::Format format = param::ConvBias::Format::NCHW4) { - megdnn_assert(src_dtype.enumv() == filter_dtype.enumv()); - CUBenchmarker benchmarker(handle); - CUBenchmarker benchmarker_cudnn(handle); - size_t RUNS = 1000; - benchmarker.set_display(false).set_times(RUNS); - benchmarker_cudnn.set_display(false).set_times(RUNS); - - std::unique_ptr> proxy{ - new OprProxy{true}}; - - if (!algo) { - benchmarker.set_proxy(proxy); - } - - benchmarker_cudnn.set_before_exec_callback( - conv_bias::ConvBiasAlgoChecker( - "DEFAULT:CUDNN:ConvBiasActivation:CUDNN_CONVOLUTION_FWD_" - "ALGO_IMPLICIT_PRECOMP_" - "GEMM" CUDNN_VERSION_STRING)); -#undef CUDNN_VERSION_STRING - - benchmarker.set_dtype(0, src_dtype) - .set_dtype(1, filter_dtype) - .set_dtype(2, bias_dtype) - .set_dtype(3, dst_dtype) - .set_dtype(4, dst_dtype); - benchmarker_cudnn.set_dtype(0, src_dtype) - .set_dtype(1, filter_dtype) - .set_dtype(2, bias_dtype) - .set_dtype(3, dst_dtype) - .set_dtype(4, dst_dtype); - - using Param = ConvBias::Param; - using Format = Param::Format; - // helper function to change format - auto get_tensor_shape = [](TensorShape shape, - Format format) -> TensorShape { - TensorShape ret; - if (format == Format::NCHW4) { - ret = static_cast( - TensorLayout{shape, dtype::Int8()} - .reshape({shape[0], shape[1] / 4, 4, shape[2], - shape[3]}) - .dimshuffle({0, 1, 3, 4, 2})); - } else if (format == Format::NCHW32) { - ret = static_cast( - TensorLayout{shape, dtype::Int8()} - .reshape({shape[0], shape[1] / 32, 32, shape[2], - shape[3]}) - .dimshuffle({0, 1, 3, 4, 2})); - } else if (format == Format::CHWN4) { - ret = static_cast( - TensorLayout{shape, dtype::Int8()} - .reshape({shape[0], shape[1] / 4, 4, shape[2], - shape[3]}) - .dimshuffle({1, 3, 4, 0, 2})); - } - return ret; - }; - - for (auto&& arg : args) { - Param param; - param.pad_h = param.pad_w = arg.f / 2; - param.stride_h = param.stride_w = arg.s; - param.format = format; - - size_t ho = infer_conv_shape(arg.hi, arg.f, arg.s, arg.f / 2); - size_t wo = infer_conv_shape(arg.wi, arg.f, arg.s, arg.f / 2); - - benchmarker.set_param(param); - if (!algo) { - benchmarker.proxy()->target_execution_policy.algo.reset(); - } - TensorShape src{arg.n, arg.ci, arg.hi, arg.wi}, - filter{arg.co, arg.ci, arg.f, arg.f}, bias{1, arg.co, 1, 1}, - z{arg.n, arg.co, ho, wo}, dst = z; - // skip testcase which cannot enable nchw32 tensorcore - if (format == Format::NCHW32 && (arg.co % 32 != 0 || arg.ci % 32 != 0)) - continue; - // skip testcase which cannot enable nchw4/chwn4 tensorcore - if ((format == Format::CHWN4 || format == Format::NCHW4) && - (arg.ci % 16 != 0)) - continue; - Format format_cudnn = arg.ci % 32 == 0 && arg.co % 32 == 0 - ? Format::NCHW32 - : Format::NCHW4; - param.format = format_cudnn; - benchmarker_cudnn.set_param(param); - - float time_in_ms = 0.f; - if (algo) { - time_in_ms = - algo_benchmark, - CUTimer>(benchmarker, - {get_tensor_shape(src, format), - get_tensor_shape(filter, format), - get_tensor_shape(bias, format), - {}, - {}}, - algo) / - RUNS; - } else { - time_in_ms = benchmarker.execs({get_tensor_shape(src, format), - get_tensor_shape(filter, format), - get_tensor_shape(bias, format), - {}, - {}}) / - RUNS; - } - float time_in_ms_cudnn = - benchmarker_cudnn.execs({get_tensor_shape(src, format_cudnn), - get_tensor_shape(filter, format_cudnn), - get_tensor_shape(bias, format_cudnn), - {}, - {}}) / - RUNS; - - float flo = 2.0 * arg.n * arg.co * ho * wo * arg.ci * arg.f * arg.f / - (1e12); - printf("src=%s, filter=%s, dst=%s, time(algo=%s)=%.2f %.2fTops, " - "time(cudnn)=%.2f %.2fTops, " - "perf(algo=%s)/perf(cudnn)=%.2f\n", - src.to_string().c_str(), filter.to_string().c_str(), - dst.to_string().c_str(), algo, time_in_ms, - (flo / (time_in_ms * 1e-3)), time_in_ms_cudnn, - (flo / (time_in_ms_cudnn * 1e-3)), algo, - time_in_ms_cudnn / time_in_ms); - printf("bench with z tensor\n"); - if (algo) { - time_in_ms = - algo_benchmark, - CUTimer>(benchmarker, - {get_tensor_shape(src, format), - get_tensor_shape(filter, format), - get_tensor_shape(bias, format), - get_tensor_shape(z, format), - {}}, - algo) / - RUNS; - } else { - time_in_ms = benchmarker.execs({get_tensor_shape(src, format), - get_tensor_shape(filter, format), - get_tensor_shape(bias, format), - get_tensor_shape(z, format), - {}}) / - RUNS; - } - time_in_ms_cudnn = - benchmarker_cudnn.execs({get_tensor_shape(src, format_cudnn), - get_tensor_shape(filter, format_cudnn), - get_tensor_shape(bias, format_cudnn), - get_tensor_shape(z, format_cudnn), - {}}) / - RUNS; - printf("src=%s, filter=%s, dst=%s, time(algo=%s)=%.2f %.2fTops, " - "time(cudnn)=%.2f %.2fTops, " - "perf(algo=%s)/perf(cudnn)=%.2f\n", - src.to_string().c_str(), filter.to_string().c_str(), - dst.to_string().c_str(), algo, time_in_ms, - (flo / (time_in_ms * 1e-3)), time_in_ms_cudnn, - (flo / (time_in_ms_cudnn * 1e-3)), algo, - time_in_ms_cudnn / time_in_ms); - } -} -#endif -} // namespace +namespace conv{ TEST_F(CUDA, CONV_BIAS_INT8_NCHW4_1x1) { require_compute_capability(6, 1); @@ -1410,10 +1015,10 @@ TEST_F(CUDA, BENCHMARK_CUTLASS_CONV_BIAS_INT8_NCHW4_DET_FIRST) { } #endif +} } // namespace test } // namespace megdnn -#undef V1 -#undef V + // vim: syntax=cpp.doxygen diff --git a/dnn/test/cuda/conv_test_utils.cpp b/dnn/test/cuda/conv_test_utils.cpp new file mode 100644 index 00000000..324a5979 --- /dev/null +++ b/dnn/test/cuda/conv_test_utils.cpp @@ -0,0 +1,458 @@ +/** + * \file dnn/test/cuda/conv_test_utils.cpp + * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") + * + * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + */ + +#include "megdnn/oprs/nn.h" + +#include "src/common/utils.h" +#include "src/cuda/cudnn_with_check.h" +#include "test/common/checker.h" +#include "test/common/conv_bias.h" +#include "test/common/tensor.h" +#include "test/common/workspace_wrapper.h" +#include "test/cuda/benchmark.h" +#include "test/cuda/conv_test_utils.h" +#include "test/cuda/fixture.h" +#include "test/cuda/utils.h" + +#define V1(x) #x +#define V(x) V1(x) + +namespace megdnn { +namespace test { +namespace conv { + +#if MEGDNN_WITH_BENCHMARK + +std::vector get_resnet50_bench_args(size_t batch) { + std::vector args; + args.emplace_back(BenchArgs{batch, 64, 56, 56, 256, 1, 1}); + args.emplace_back(BenchArgs{batch, 256, 56, 56, 32, 3, 1}); + args.emplace_back(BenchArgs{batch, 256, 56, 56, 32, 3, 2}); + args.emplace_back(BenchArgs{batch, 4, 256, 256, 32, 7, 2}); + + args.emplace_back(BenchArgs{batch, 256, 56, 56, 64, 1, 1}); + args.emplace_back(BenchArgs{batch, 64, 56, 56, 64, 1, 1}); + args.emplace_back(BenchArgs{batch, 64, 56, 56, 64, 3, 1}); + args.emplace_back(BenchArgs{batch, 64, 56, 56, 64, 3, 2}); + args.emplace_back(BenchArgs{batch, 256, 56, 56, 64, 3, 2}); + + args.emplace_back(BenchArgs{batch, 256, 56, 56, 512, 1, 2}); + args.emplace_back(BenchArgs{batch, 256, 56, 56, 128, 1, 2}); + args.emplace_back(BenchArgs{batch, 512, 28, 28, 128, 1, 1}); + args.emplace_back(BenchArgs{batch, 128, 28, 28, 128, 3, 1}); + args.emplace_back(BenchArgs{batch, 128, 28, 28, 512, 1, 1}); + + args.emplace_back(BenchArgs{batch, 512, 28, 28, 1024, 1, 2}); + args.emplace_back(BenchArgs{batch, 512, 28, 28, 256, 1, 2}); + args.emplace_back(BenchArgs{batch, 1024, 14, 14, 256, 1, 1}); + args.emplace_back(BenchArgs{batch, 256, 14, 14, 256, 3, 1}); + args.emplace_back(BenchArgs{batch, 256, 14, 14, 1024, 1, 1}); + args.emplace_back(BenchArgs{batch, 256, 14, 14, 1024, 1, 2}); + + args.emplace_back(BenchArgs{batch, 1024, 14, 14, 2048, 1, 2}); + args.emplace_back(BenchArgs{batch, 1024, 14, 14, 512, 1, 2}); + args.emplace_back(BenchArgs{batch, 2048, 7, 7, 512, 1, 1}); + args.emplace_back(BenchArgs{batch, 512, 7, 7, 512, 3, 1}); + args.emplace_back(BenchArgs{batch, 512, 7, 7, 2048, 1, 1}); + return args; +} + +std::vector get_detection_bench_args(size_t batch) { + std::vector args; + args.emplace_back(BenchArgs{batch, 4, 736, 1280, 8, 3, 2}); + args.emplace_back(BenchArgs{batch, 32, 184, 320, 16, 3, 1}); + args.emplace_back(BenchArgs{batch, 16, 184, 320, 32, 3, 1}); + args.emplace_back(BenchArgs{batch, 8, 184, 320, 16, 3, 1}); + args.emplace_back(BenchArgs{batch, 8, 184, 320, 32, 3, 1}); + args.emplace_back(BenchArgs{batch, 64, 92, 160, 32, 3, 1}); + args.emplace_back(BenchArgs{batch, 32, 184, 320, 64, 3, 2}); + args.emplace_back(BenchArgs{batch, 32, 184, 320, 32, 3, 2}); + args.emplace_back(BenchArgs{batch, 32, 92, 160, 64, 3, 1}); + args.emplace_back(BenchArgs{batch, 64, 92, 160, 8, 3, 1}); + args.emplace_back(BenchArgs{batch, 64, 92, 160, 128, 3, 2}); + args.emplace_back(BenchArgs{batch, 128, 46, 80, 32, 3, 1}); + args.emplace_back(BenchArgs{batch, 128, 46, 80, 256, 3, 2}); + args.emplace_back(BenchArgs{batch, 128, 46, 80, 8, 3, 1}); + args.emplace_back(BenchArgs{batch, 64, 92, 160, 32, 3, 2}); + args.emplace_back(BenchArgs{batch, 32, 46, 80, 128, 3, 1}); + args.emplace_back(BenchArgs{batch, 8, 46, 80, 32, 3, 1}); + args.emplace_back(BenchArgs{batch, 64, 23, 40, 256, 3, 1}); + args.emplace_back(BenchArgs{batch, 256, 23, 40, 64, 3, 1}); + args.emplace_back(BenchArgs{batch, 128, 46, 80, 64, 3, 2}); + args.emplace_back(BenchArgs{batch, 256, 23, 40, 8, 3, 1}); + args.emplace_back(BenchArgs{batch, 8, 23, 40, 32, 3, 2}); + args.emplace_back(BenchArgs{batch, 8, 12, 20, 8, 3, 1}); + args.emplace_back(BenchArgs{batch, 8, 12, 20, 8, 3, 2}); + args.emplace_back(BenchArgs{batch, 8, 6, 10, 8, 3, 1}); + return args; +} + +std::vector get_det_first_bench_args(size_t batch) { + std::vector args; + args.emplace_back(BenchArgs{batch, 4, 736, 1280, 16, 3, 2}); + args.emplace_back(BenchArgs{batch, 16, 384, 640, 16, 3, 1}); + return args; +} + +void benchmark_target_algo(Handle* handle, const std::vector& args, + DType src_dtype, DType filter_dtype, + DType bias_dtype, DType dst_dtype, const char* algo, + param::ConvBias::Format format) { + megdnn_assert(src_dtype.enumv() == filter_dtype.enumv()); + CUBenchmarker benchmarker(handle); + CUBenchmarker benchmarker_cudnn(handle); + size_t RUNS = 1000; + benchmarker.set_display(false).set_times(RUNS); + benchmarker_cudnn.set_display(false).set_times(RUNS); + +#define CUDNN_VERSION_STRING \ + "v" V(CUDNN_MAJOR) "." V(CUDNN_MINOR) "." V(CUDNN_PATCHLEVEL) + benchmarker_cudnn.set_before_exec_callback( + conv_bias::ConvBiasAlgoChecker( + "DEFAULT:CUDNN:ConvBiasActivation:CUDNN_CONVOLUTION_FWD_" + "ALGO_IMPLICIT_PRECOMP_" + "GEMM" CUDNN_VERSION_STRING)); + + benchmarker.set_dtype(0, src_dtype) + .set_dtype(1, filter_dtype) + .set_dtype(2, bias_dtype) + .set_dtype(3, dst_dtype) + .set_dtype(4, dst_dtype); + benchmarker_cudnn.set_dtype(0, src_dtype) + .set_dtype(1, filter_dtype) + .set_dtype(2, bias_dtype) + .set_dtype(3, dst_dtype) + .set_dtype(4, dst_dtype); + + using Param = ConvBias::Param; + using Format = Param::Format; + // helper function to change format + auto get_tensor_shape = [](TensorShape shape, + Format format) -> TensorShape { + TensorShape ret; + if (format == Format::NCHW4) { + ret = static_cast( + TensorLayout{shape, dtype::Int8()} + .reshape({shape[0], shape[1] / 4, 4, shape[2], + shape[3]}) + .dimshuffle({0, 1, 3, 4, 2})); + } else if (format == Format::CHWN4) { + ret = static_cast( + TensorLayout{shape, dtype::Int8()} + .reshape({shape[0], shape[1] / 4, 4, shape[2], + shape[3]}) + .dimshuffle({1, 3, 4, 0, 2})); + } + return ret; + }; + + for (auto&& arg : args) { + Param param; + param.pad_h = param.pad_w = arg.f / 2; + param.stride_h = param.stride_w = arg.s; + param.format = format; + + size_t ho = infer_conv_shape(arg.hi, arg.f, arg.s, arg.f / 2); + size_t wo = infer_conv_shape(arg.wi, arg.f, arg.s, arg.f / 2); + + benchmarker.set_param(param); + if (!algo) { + benchmarker.proxy()->target_execution_policy.algo.reset(); + } + TensorShape src{arg.n, arg.ci, arg.hi, arg.wi}, + filter{arg.co, arg.ci, arg.f, arg.f}, bias{1, arg.co, 1, 1}, + z{arg.n, arg.co, ho, wo}, dst = z; + float time_in_ms = 0.f; + if (algo) { + time_in_ms = + algo_benchmark, + CUTimer>(benchmarker, + {get_tensor_shape(src, format), + get_tensor_shape(filter, format), + get_tensor_shape(bias, format), + {}, + {}}, + algo) / + RUNS; + } else { + time_in_ms = benchmarker.execs({get_tensor_shape(src, format), + get_tensor_shape(filter, format), + get_tensor_shape(bias, format), + {}, + {}}) / + RUNS; + } + Format format_cudnn = Format::NCHW4; + param.format = format_cudnn; + benchmarker_cudnn.set_param(param); + auto time_in_ms_cudnn = + benchmarker_cudnn.execs({get_tensor_shape(src, format_cudnn), + get_tensor_shape(filter, format_cudnn), + get_tensor_shape(bias, format_cudnn), + {}, + {}}) / + RUNS; + float flo = 2.0 * arg.n * arg.co * ho * wo * arg.ci * arg.f * arg.f / + (1e12); + printf("src=%s, filter=%s, dst=%s, time(algo=%s)=%.2f %.2fTops, " + "time(cudnn)=%.2f %.2fTops, " + "perf(algo=%s)/perf(cudnn)=%.2f\n", + src.to_string().c_str(), filter.to_string().c_str(), + dst.to_string().c_str(), algo, time_in_ms, + (flo / (time_in_ms * 1e-3)), time_in_ms_cudnn, + (flo / (time_in_ms_cudnn * 1e-3)), algo, + time_in_ms_cudnn / time_in_ms); + printf("bench with z tensor\n"); + if (algo) { + time_in_ms = + algo_benchmark, + CUTimer>(benchmarker, + {get_tensor_shape(src, format), + get_tensor_shape(filter, format), + get_tensor_shape(bias, format), + get_tensor_shape(z, format), + {}}, + algo) / + RUNS; + } else { + time_in_ms = benchmarker.execs({get_tensor_shape(src, format), + get_tensor_shape(filter, format), + get_tensor_shape(bias, format), + get_tensor_shape(z, format), + {}}) / + RUNS; + } + time_in_ms_cudnn = + benchmarker_cudnn.execs({get_tensor_shape(src, format_cudnn), + get_tensor_shape(filter, format_cudnn), + get_tensor_shape(bias, format_cudnn), + get_tensor_shape(z, format_cudnn), + {}}) / + RUNS; + printf("src=%s, filter=%s, dst=%s, time(algo=%s)=%.2f %.2fTops, " + "time(cudnn)=%.2f %.2fTops, " + "perf(algo=%s)/perf(cudnn)=%.2f\n", + src.to_string().c_str(), filter.to_string().c_str(), + dst.to_string().c_str(), algo, time_in_ms, + (flo / (time_in_ms * 1e-3)), time_in_ms_cudnn, + (flo / (time_in_ms_cudnn * 1e-3)), algo, + time_in_ms_cudnn / time_in_ms); + } +} + +void benchmark_target_algo_with_cudnn_tsc( + Handle* handle, const std::vector& args, DType src_dtype, + DType filter_dtype, DType bias_dtype, DType dst_dtype, const char* algo, + param::ConvBias::Format format, bool with_cudnn, + const char* change_cudnn_algo, + param::ConvBias::Format change_cudnn_format, + DType change_cudnn_src_dtype, DType change_cudnn_filter_dtype, + DType change_cudnn_bias_dtype, DType change_cudnn_dst_dtype) { + megdnn_assert(src_dtype.enumv() == filter_dtype.enumv()); + CUBenchmarker benchmarker(handle); + CUBenchmarker benchmarker_cudnn(handle); + size_t RUNS = 1000; + benchmarker.set_display(false).set_times(RUNS); + benchmarker.set_dtype(0, src_dtype) + .set_dtype(1, filter_dtype) + .set_dtype(2, bias_dtype) + .set_dtype(3, dst_dtype) + .set_dtype(4, dst_dtype); + + benchmarker_cudnn.set_display(false).set_times(RUNS); + + std::unique_ptr> proxy{ + new OprProxy{true}}; + + if (!algo) { + benchmarker.set_proxy(proxy); + } + if (change_cudnn_algo) { + benchmarker_cudnn.set_dtype(0, change_cudnn_src_dtype) + .set_dtype(1, change_cudnn_filter_dtype) + .set_dtype(2, change_cudnn_bias_dtype) + .set_dtype(3, change_cudnn_dst_dtype) + .set_dtype(4, change_cudnn_dst_dtype); + benchmarker_cudnn.set_before_exec_callback( + conv_bias::ConvBiasAlgoChecker( + change_cudnn_algo)); + } else { + benchmarker_cudnn.set_dtype(0, src_dtype) + .set_dtype(1, filter_dtype) + .set_dtype(2, bias_dtype) + .set_dtype(3, dst_dtype) + .set_dtype(4, dst_dtype); + benchmarker_cudnn.set_before_exec_callback( + conv_bias::ConvBiasAlgoChecker( + "DEFAULT:CUDNN:ConvBiasActivation:CUDNN_CONVOLUTION_" + "FWD_" + "ALGO_IMPLICIT_PRECOMP_GEMM" CUDNN_VERSION_STRING)); + } +#undef CUDNN_VERSION_STRING + + using Param = ConvBias::Param; + using Format = Param::Format; + // helper function to change format + auto get_tensor_shape = [](TensorShape shape, + Format format) -> TensorShape { + TensorShape ret; + if (format == Format::NCHW4) { + ret = static_cast( + TensorLayout{shape, dtype::Int8()} + .reshape({shape[0], shape[1] / 4, 4, shape[2], + shape[3]}) + .dimshuffle({0, 1, 3, 4, 2})); + } else if (format == Format::NCHW32) { + ret = static_cast( + TensorLayout{shape, dtype::Int8()} + .reshape({shape[0], shape[1] / 32, 32, shape[2], + shape[3]}) + .dimshuffle({0, 1, 3, 4, 2})); + } else if (format == Format::NCHW64) { + ret = static_cast( + TensorLayout{shape, dtype::QuantizedS4(1.f)} + .reshape({shape[0], shape[1] / 64, 64, shape[2], + shape[3]}) + .dimshuffle({0, 1, 3, 4, 2})); + } else if (format == Format::CHWN4) { + ret = static_cast( + TensorLayout{shape, dtype::Int8()} + .reshape({shape[0], shape[1] / 4, 4, shape[2], + shape[3]}) + .dimshuffle({1, 3, 4, 0, 2})); + } + return ret; + }; + + for (auto&& arg : args) { + Param param; + param.pad_h = param.pad_w = arg.f / 2; + param.stride_h = param.stride_w = arg.s; + param.format = format; + + size_t ho = infer_conv_shape(arg.hi, arg.f, arg.s, arg.f / 2); + size_t wo = infer_conv_shape(arg.wi, arg.f, arg.s, arg.f / 2); + + benchmarker.set_param(param); + if (!algo) { + benchmarker.proxy()->target_execution_policy.algo.reset(); + } + TensorShape src{arg.n, arg.ci, arg.hi, arg.wi}, + filter{arg.co, arg.ci, arg.f, arg.f}, bias{1, arg.co, 1, 1}, + z{arg.n, arg.co, ho, wo}, dst = z; + // skip testcase which cannot enable nchw32 tensorcore + if (format == Format::NCHW32 && (arg.co % 32 != 0 || arg.ci % 32 != 0)) + continue; + // skip testcase which cannot enable nchw32 tensorcore + if (format == Format::NCHW64 && (arg.co % 64 != 0 || arg.ci % 64 != 0)) + continue; + // skip testcase which cannot enable nchw4/chwn4 tensorcore + if ((format == Format::CHWN4 || format == Format::NCHW4) && + (arg.ci % 16 != 0)) + continue; + Format format_cudnn = arg.ci % 32 == 0 && arg.co % 32 == 0 + ? Format::NCHW32 + : Format::NCHW4; + if (change_cudnn_algo) { + format_cudnn = change_cudnn_format; + } + + param.format = format_cudnn; + benchmarker_cudnn.set_param(param); + + float time_in_ms = 0.f; + if (algo) { + time_in_ms = + algo_benchmark, + CUTimer>(benchmarker, + {get_tensor_shape(src, format), + get_tensor_shape(filter, format), + get_tensor_shape(bias, format), + {}, + {}}, + algo) / + RUNS; + } else { + time_in_ms = benchmarker.execs({get_tensor_shape(src, format), + get_tensor_shape(filter, format), + get_tensor_shape(bias, format), + {}, + {}}) / + RUNS; + } + float time_in_ms_cudnn = 0; + if (with_cudnn) { + time_in_ms_cudnn = benchmarker_cudnn.execs( + {get_tensor_shape(src, format_cudnn), + get_tensor_shape(filter, format_cudnn), + get_tensor_shape(bias, format_cudnn), + {}, + {}}) / + RUNS; + } + + float flo = 2.0 * arg.n * arg.co * ho * wo * arg.ci * arg.f * arg.f / + (1e12); + printf("src=%s, filter=%s, dst=%s, time(algo=%s)=%.2f %.2fTops, " + "time(cudnn)=%.2f %.2fTops, " + "perf(algo=%s)/perf(cudnn)=%.2f\n", + src.to_string().c_str(), filter.to_string().c_str(), + dst.to_string().c_str(), algo, time_in_ms, + (flo / (time_in_ms * 1e-3)), time_in_ms_cudnn, + (flo / (time_in_ms_cudnn * 1e-3)), algo, + time_in_ms_cudnn / time_in_ms); + printf("bench with z tensor\n"); + if (algo) { + time_in_ms = + algo_benchmark, + CUTimer>(benchmarker, + {get_tensor_shape(src, format), + get_tensor_shape(filter, format), + get_tensor_shape(bias, format), + get_tensor_shape(z, format), + {}}, + algo) / + RUNS; + } else { + time_in_ms = benchmarker.execs({get_tensor_shape(src, format), + get_tensor_shape(filter, format), + get_tensor_shape(bias, format), + get_tensor_shape(z, format), + {}}) / + RUNS; + } + time_in_ms_cudnn = 0; + if (with_cudnn) { + time_in_ms_cudnn = benchmarker_cudnn.execs( + {get_tensor_shape(src, format_cudnn), + get_tensor_shape(filter, format_cudnn), + get_tensor_shape(bias, format_cudnn), + get_tensor_shape(z, format_cudnn), + {}}) / + RUNS; + } + printf("src=%s, filter=%s, dst=%s, time(algo=%s)=%.2f %.2fTops, " + "time(cudnn)=%.2f %.2fTops, " + "perf(algo=%s)/perf(cudnn)=%.2f\n", + src.to_string().c_str(), filter.to_string().c_str(), + dst.to_string().c_str(), algo, time_in_ms, + (flo / (time_in_ms * 1e-3)), time_in_ms_cudnn, + (flo / (time_in_ms_cudnn * 1e-3)), algo, + time_in_ms_cudnn / time_in_ms); + } +} +#endif +} // namespace conv +} // namespace test +} // namespace megdnn +#undef V1 +#undef V diff --git a/dnn/test/cuda/conv_test_utils.h b/dnn/test/cuda/conv_test_utils.h new file mode 100644 index 00000000..590f92b0 --- /dev/null +++ b/dnn/test/cuda/conv_test_utils.h @@ -0,0 +1,66 @@ +/** + * \file dnn/test/cuda/conv_test_utils.h + * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") + * + * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + */ +#pragma once +#include "megdnn/oprs/nn.h" + +#include "src/common/utils.h" +#include "src/cuda/cudnn_with_check.h" +#include "test/common/checker.h" +#include "test/common/conv_bias.h" +#include "test/common/tensor.h" +#include "test/common/workspace_wrapper.h" +#include "test/cuda/benchmark.h" +#include "test/cuda/fixture.h" +#include "test/cuda/utils.h" + +#define V1(x) #x +#define V(x) V1(x) + +namespace megdnn { +namespace test { +namespace conv { + +#if MEGDNN_WITH_BENCHMARK +struct BenchArgs { + size_t n, ci, hi, wi, co, f, s; +}; + +std::vector get_resnet50_bench_args(size_t batch = 64); + +std::vector get_detection_bench_args(size_t batch = 16); + +std::vector get_det_first_bench_args(size_t batch = 16); + +void benchmark_target_algo( + Handle* handle, const std::vector& args, DType src_dtype, + DType filter_dtype, DType bias_dtype, DType dst_dtype, + const char* algo = nullptr, + param::ConvBias::Format format = param::ConvBias::Format::NCHW4); + +void benchmark_target_algo_with_cudnn_tsc( + Handle* handle, const std::vector& args, DType src_dtype, + DType filter_dtype, DType bias_dtype, DType dst_dtype, + const char* algo = nullptr, + param::ConvBias::Format format = param::ConvBias::Format::NCHW4, + bool with_cudnn = true, const char* change_cudnn_algo = nullptr, + param::ConvBias::Format change_cudnn_format = + param::ConvBias::Format::NCHW4, + DType change_cudnn_src_dtype = dtype::Int8(), + DType change_cudnn_filter_dtype = dtype::Int8(), + DType change_cudnn_bias_dtype = dtype::Int8(), + DType change_cudnn_dst_dtype = dtype::Int8()); +#endif +} // namespace conv +} // namespace test +} // namespace megdnn +#undef V1 +#undef V \ No newline at end of file diff --git a/dnn/test/naive/conv_bias.cpp b/dnn/test/naive/conv_bias.cpp index c189489a..b4ae4df0 100644 --- a/dnn/test/naive/conv_bias.cpp +++ b/dnn/test/naive/conv_bias.cpp @@ -689,4 +689,2656 @@ TEST_F(NAIVE, CONV_BIAS_NCHW44_DOT) { 126, 165, 156, 207, 191, 141, 209, 172})}); } } + + +TEST_F(NAIVE, CONV_BIAS_QUANTIZED4) { + Checker checker(handle(), /* check_dispatch */ false); + ConvBias::Param param; + param.format = ConvBias::Param::Format::NCHW; + + auto GenTensorValue = [](const TensorShape& shape, + dtype::QuantizedS32 dtype, + std::vector values) { + TensorND tensor; + tensor.layout = {shape, dtype}; + tensor.raw_ptr = + static_cast(malloc(tensor.layout.span().dist_byte())); + megdnn_assert(values.size() == tensor.layout.total_nr_elems(), + "%zu == %zu", values.size(), + tensor.layout.total_nr_elems()); + auto ptr = + tensor.ptr::ctype>(); + for (const auto& v : values) { + *ptr++ = typename DTypeTrait::ctype(v); + } + return tensor; + }; + + std::vector input_values = {4, -6, -5, 1, -3, 0, 3, -4, + -3, -1, 1, -1, -5, -8, 0, 4}, + filter_values = {6, 2, 0, -8, -2, 4, -6, -3, -3, + -5, -3, -6, -2, 1, -2, -4, 5, -5, + -6, 6, 4, -6, 3, -1, 3, 3, -8}, + bias_values = {5, 6, 3}, + z_values = {3, -7, -7, 4, -3, -8, 5, -4, 3, -3, 3, 2}, + output_values = {74, -64, 64, 53, 33, 62, + -9, 34, -79, 31, 11, -39}; + + auto input = TensorValueLowbit4({1, 1, 4, 4}, dtype::QuantizedS4(0.1), + input_values); + auto filter = TensorValueLowbit4({3, 1, 3, 3}, dtype::QuantizedS4(0.1), + filter_values); + auto bias = GenTensorValue({1, 3, 1, 1}, dtype::QuantizedS32(0.01), + bias_values); + auto z = TensorValueLowbit4({1, 3, 2, 2}, dtype::QuantizedS4(0.01), + z_values); + + std::vector output_int4; + auto dtype = dtype::QuantizedS4(0.01); + for (size_t i = 0; i < output_values.size(); i++) { + int result = static_cast( + dtype.param().quantize(output_values.at(i) * 0.01).as_int8()); + output_int4.push_back(result); + } + + auto output = TensorValueLowbit4({1, 3, 2, 2}, dtype::QuantizedS4(0.01), + output_int4); + + checker.set_param(param).exect(Testcase{input, filter, bias, z, {}}, + Testcase{{}, {}, {}, {}, output}); +} + +TEST_F(NAIVE, CONV_BIAS_NCHW64_Q4) { + std::vector + input_values = + {-6, -8, 6, -5, -2, -7, 2, 0, 1, 3, -6, -7, 4, -5, -6, + -2, 5, 5, -5, -1, 1, -1, 4, -6, 2, -1, -6, -3, 2, 0, + 5, -8, 3, 3, -3, -4, -8, 6, 4, -7, 2, -4, -7, 1, -5, + 5, 3, 3, -4, -1, -8, 4, -8, 3, -4, 2, 6, -1, -8, -1, + -6, -6, 6, -7, -4, 5, -3, -1, 6, -6, -5, 0, 1, 1, -5, + -3, -5, 4, -5, 0, -3, 3, -4, -8, -1, 5, -4, -3, 3, -3, + -7, 4, 6, 4, -8, -7, 6, 6, -5, -7, -8, -7, -3, -3, 6, + 5, -4, 1, -1, 2, -5, -5, 4, 5, 5, 4, -3, 3, -5, 1, + -8, -7, -4, 1, -5, 4, -8, 3, -1, 5, -8, -8, -6, -5, 1, + -8, -5, 6, 1, 4, -2, -8, -8, 0, -3, -5, 6, 0, -8, -6, + 5, -8, 3, -6, 5, -5, -2, 1, -4, -7, -1, 3, -2, -7, -8, + -5, -5, -1, -1, -7, -7, -3, 4, -2, -6, 5, -4, -4, 2, 6, + -6, -8, -3, -8, -1, 2, -1, 0, -4, 4, -2, 2, 6, -8, 0, + 1, 0, -6, 4, -3, 6, 1, 2, 5, 3, 0, -7, -5, 6, 0, + -4, 5, -6, -5, -7, -7, 6, -1, -5, 3, -3, 1, 4, -4, -8, + -5, 6, 2, 3, -3, 5, 6, -6, 2, -6, -7, -1, -5, 3, -1, + 5, 5, 3, 6, -2, -6, 6, -8, -2, 1, 3, 3, -5, 2, 0, + 6, -6, -4, -4, 4, 1, -5, -8, -6, 3, -7, -1, 2, 4, 2, + -1, 5, -4, 4, -1, -6, -3, 6, 2, -7, -1, -5, 6, 3, -1, + -2, 4, -7, -7, 3, 5, -7, -7, -8, -1, 5, -1, -7, -7, 0, + 0, 5, -5, -2, -3, 0, -3, 5, -3, -7, 1, -7, -8, -1, 2, + -6, -8, -8, -3, -3, 1, 4, 5, 1, -8, 0, 6, -5, 3, -3, + -2, -8, 0, -2, 3, 6, 4, -1, -6, 3, -5, 2, -3, -1, -8, + 5, 2, -4, 5, -5, -6, -4, -5, 1, -5, -6, -1, 2, -7, 5, + -6, -6, -1, -4, 6, 6, 0, 0, -7, -2, -8, 0, -6, -8, 0, + 2, -3, 5, 5, 1, 4, 3, -4, -7, -5, -4, -1, 5, -2, 5, + 5, -7, 1, 0, -5, 2, -7, -3, -1, 4, -3, -4, -1, -1, 0, + -4, -4, -7, -8, -2, -7, -2, 5, -7, 3, -4, -5, 0, -7, 6, + -6, 0, 0, -7, -8, -7, 5, 4, -4, -7, 2, 1, -7, -7, -6, + -5, -6, -6, 1, 6, 4, -5, 0, 0, 5, 1, 6, 0, 3, -8, + 2, 6, 6, -8, 6, -4, -7, 4, -4, -5, -1, -8, -1, 5, -6, + 4, -8, 5, -8, 3, -3, -4, -4, -8, 2, -3, -3, 2, -4, -3, + -4, 1, 5, 3, 6, 1, -2, -3, -4, -3, -7, 5, -8, 6, 2, + -8, -3, -5, -1, -5, 2, -6, 1, -6, -5, 1, -6, 6, -7, -6, + -3, 1, 2, 0, 1, 1, 4, -1, -4, -3, -8, -7, -5, 0, 6, + 0, 4, -6, -4, -7, 6, -8, 2, -4, 1, -3, 0, 1, 6, -2, + 4, -6, 2, -2, 0, 3, -7, 2, -6, 0, -4, 3, 1, 4, 3, + 1, 4, 1, 4, -8, -7, -5, -1, 5, -5, 4, -1, -4, -5, 1, + 4, 1, 2, 6, 0, -1, 1, -2, -5, -5, 6, 0, 6, -3, -1, + 1, 2, -3, -3, -4, -2, -4, -8, -6, -8, 5, -5, -5, 5, -8, + -7, 2, -4, -6, -3, -7, -6, -5, 0, -6, 0, -7, -7, -3, 2, + -2, -6, 5, 0, 5, 6, 2, 5, -3, -8, 0, 0, 2, 4, 1, + -6, -5, -1, -1, 1, -3, -1, -7, 3, 5, -8, 2, 1, 1, 5, + -8, 0, -7, -6, 6, 3, 5, 5, -2, 2, 0, -3, 3, -6, -5, + 1, -6, 1, 4, 1, 2, 3, -1, 4, -5, -3, 0, 5, -3, -1, + 1, -5, -4, -6, -6, 2, 4, 6, -8, 1, -7, 1, 4, -5, -8, + 0, -5, -2, -6, -7, -5, -8, -4, 0, -4, 5, -4, -5, 3, 5, + -4, 6, 4, 2, -3, 5, -2, 6, 3, 3, 5, -6, -8, -3, 0, + -3, 5, -6, 3, 5, 6, 0, -6, -4, 4, -5, 2, 0, 0, 3, + 0, -6, 2, 5, 0, -7, -7, 4, -3, 2, -6, 6, 5, 5, -6, + -1, 1, -8, 0, 3, 1, -4, 2, -2, -2, 1, 4, 2, -7, 3, + 5, 4, 4, 5, -8, -6, 2, -2, 0, -2, -5, 2, 5, -3, 6, + 0, -2, 0, -6, -4, 6, -7, -7, -5, 1, -3, 3, 2, 3, 4, + -1, -2, -1, -5, -7, -6, -8, -6, 3, 1, 2, 3, 3, -7, 0, + -5, -7, 4, -2, 3, -5, 0, -3, -4, 1, -1, 4, 6, 6, 3, + 6, -1, 1, -4, -4, -2, 4, 3, -6, -3, -8, -6, 6, 5, -8, + -6, -7, -4, -3, 2, 3, 6, 6, 0, 3, -3, 1, -8, 6, -7, + 3, -3, 4, -7, 0, 5, 5, -2, 6, 4, -5, -6, -8, -7, -5, + 3, -2, -8, -7, 6, -6, -3, -2, 0, 2, 0, 3, 4, 6, -7, + 2, -2, 1, -8, -8, 2, 5, 1, -5, 0, 1, -7, 1, -4, -5, + -1, -2, -4, 6, -3, 5, -5, 5, -4, -1, -7, -5, -7, -3, -8, + -1, -7, -6, -7, -4, -2, 5, 3, 1, -6, 2, -2, 5, 2, 3, + -1, 0, -3, 4, 0, 1, 5, 1, 1, -1, -4, -2, -8, -1, -4, + -8, -5, -6, -5, -1, 1, -3, 6, -5, -3, -5, -5, -1, 1, -4, + -5, -4, 4, 2, -7, -7, 4, -2, -4, -7, 4, -5, -6, 5, -3, + 6, 5, -4, 6, -7, -5, 4, -5, 5, -6, 3, -3, -7, -8, 0, + -7, -8, 0, -3, -6, 4, -3, 6, 2, -1, -7, -6, -6, 6, 0, + 0, 3, -6, -5, 3, 6, -8, 5, -1, -8, 1, -8, 6, 0, 1, + -3, -8, -1, -3}, + filter_values = + {5, -5, -6, -7, 6, -4, 0, 4, -1, -6, 2, -7, 3, -6, -5, + -8, -7, 2, -2, -8, 1, 0, -1, 1, -3, 2, 4, 3, 4, -8, + 2, 5, -8, 5, 2, -6, 3, -6, 5, -8, 6, 5, -6, 4, -5, + -5, -3, 6, -2, -2, -6, 2, 3, -2, 6, 5, 3, -8, -8, 4, + -8, -7, -3, 0, -3, 0, -5, -4, -7, 5, 0, 3, -8, 4, 1, + -3, -7, -1, -4, 0, -2, 1, 5, -6, -7, 4, -8, -4, -4, -4, + 3, -4, 0, -1, -6, -1, -5, 3, -8, 0, -5, 4, 4, 2, -7, + -6, -4, 4, 6, -6, -1, 0, 3, -6, -8, 6, 6, 3, 6, -2, + 6, 5, -6, -1, -5, -2, 0, 0, 6, 5, -8, 1, -6, 0, 3, + 4, -1, 2, -4, 2, 4, -7, -8, -8, -8, -4, 2, 4, 6, -7, + 4, -4, -5, 0, -6, -4, 4, -5, 4, 3, 5, -5, -7, -2, -6, + -5, -6, 4, 1, 2, 4, 1, -6, -8, 6, 6, 5, -3, 6, 2, + 3, -1, 4, 0, -3, -2, -3, -4, -7, 3, 3, 0, -5, 4, 5, + 6, 6, -3, -5, -3, 6, -7, 0, -6, -3, 5, -4, -5, -7, 4, + 1, -2, 4, 5, -8, -2, -3, -2, -8, 1, 2, -8, -3, -6, -5, + -8, 0, 5, 5, 4, -1, 2, -3, 3, -7, 3, -4, -2, 1, -2, + -4, -3, 6, -5, -3, 1, -5, -3, 5, -5, -4, -3, 0, -1, -6, + -6, 1, -3, 5, -8, -8, -3, -6, -7, 5, 2, 3, 2, -5, 3, + 2, 1, 0, -3, 2, 4, 1, -4, 4, -6, -1, -6, 0, -2, 1, + -2, 6, 3, -6, -6, 4, -5, -4, -8, -8, -5, 1, -7, 0, 6, + 3, -8, -8, 0, -8, -3, 1, -7, 6, -8, -7, -4, -7, -2, 5, + -7, -5, -4, -4, 0, -3, 6, -7, -2, 6, -7, -5, -7, 5, 6, + 2, 0, 1, -5, -8, -3, -5, -5, 3, 3, -8, -1, -6, -4, 2, + 4, -4, -2, -3, 1, -2, -6, 4, -5, 6, 2, 0, -8, 1, 2, + -5, 4, 3, -2, 5, -8, -6, 3, 3, -1, -6, 4, -3, 6, 3, + 1, 1, 2, 2, 5, 6, -1, -5, -7, -8, -8, -8, 6, 2, -4, + -2, 0, 6, 6, 3, 3, -1, 3, -7, -3, -8, -6, -8, -5, -8, + -2, 5, -8, -4, -6, -3, -6, 5, -6, -1, 5, -3, 5, 3, -4, + -4, -3, -1, -8, 3, -1, 4, -2, 3, 1, 5, -8, -1, 0, 2, + -3, -7, -2, 0, -8, 6, -3, 6, -6, 4, -3, -8, -1, 0, 3, + 1, -6, -7, -5, -8, 2, 3, -4, 1, -1, -8, 3, -7, 1, -5, + -6, 1, 0, -1, 1, 5, 4, -5, -2, 3, 4, -3, -4, -5, 5, + -3, -4, 6, 0, -5, -8, -1, 4, 2, -5, -5, 1, -2, -8, -6, + -3, 3, 4, 2, 0, 6, 3, 3, -8, 4, -1, -5, -2, -1, 6, + -1, 5, 1, -3, 5, 3, 2, -1, -1, 1, -3, 2, 0, -8, 2, + -6, -4, -1, -8, 5, 0, -3, 6, -6, 1, -1, -5, 0, -3, -1, + -3, -8, 2, 2, 3, -8, 2, 1, -7, 5, 4, -2, -7, 2, 2, + 0, 6, -5, -4, 1, 5, 5, -8, -2, -8, -2, -1, 1, -5, -7, + -2, 2, 4, -7, 0, 5, 0, -2, -2, 4, 1, 4, -8, -6, -2, + 4, -1, -2, -5, 1, -5, 6, -7, -4, 0, -3, 6, -3, 4, -6, + 3, -1, -7, 3, 2, 6, -8, 0, 2, 0, -7, 0, -8, 3, -5, + 3, -6, -1, -6, 1, 2, -5, -4, -1, -1, 3, 1, -3, 5, 3, + 2, -2, -2, 3, 3, -4, -5, -5, 4, -3, 0, -4, 3, -3, -3, + -3, -3, -6, 3, 0, 0, 4, -8, 3, 2, -4, -7, 3, 2, -4, + -2, 3, -8, 2, 1, 1, 5, -5, 5, -3, 5, -3, -8, 0, -7, + 0, -6, -3, 6, -5, 3, -6, -2, -2, 0, -8, -7, 0, -6, 4, + 5, -4, 2, -6, -8, -5, 3, 3, -5, -8, -5, -3, -3, 6, 5, + 5, -2, -3, -4, 0, 4, 6, 2, 6, 2, 4, 2, -3, -6, 2, + -8, 1, 2, -1, -1, -7, 2, -6, -6, -8, -1, -2, -7, 2, -6, + 0, -5, 5, -2, 6, 2, 2, -8, -7, -7, 1, -6, -3, -3, -4, + 3, -6, -8, 4, 4, -4, 4, -7, -6, 6, -3, 3, 3, 2, -4, + -1, 2, 2, 3, -8, 2, 5, 2, 3, 4, 0, 6, 3, -5, 3, + -3, 2, 3, 2, -8, -2, 4, -6, 2, -7, -3, 3, 2, -5, -8, + -5, 5, 6, 4, -6, -4, 0, 5, 0, 3, -2, 5, 6, -6, -6, + 1, -7, -6, -4, 3, -5, 1, 0, 6, 4, 6, 2, -2, -7, 1, + 5, 1, -5, 2, 5, -5, 1, 4, -3, -8, 4, 0, 6, -5, -4, + 6, 6, -1, -1, -2, 4, -3, 2, 5, -7, -3, -1, -6, -7, -7, + 6, 3, -2, -3, -8, -5, -8, -5, 5, 0, -7, 0, -8, -4, -5, + -7, 0, -3, 3, -6, 6, -5, -8, -1, 3, -8, 1, -3, 0, 1, + 5, 1, -4, -1, -6, -4, -3, 1, 5, -3, 3, 1, -6, 2, -5, + -2, -5, -3, 4, 3, -5, -4, 1, 2, 2, -1, 1, -5, -7, 5, + 4, 0, -7, 1, -6, 1, 4, -5, 4, -1, -1, 4, -2, -5, -5, + -6, -6, 2, 6, 2, -3, 4, 0, 6, 1, -7, -7, 3, -8, -8, + 3, -7, -7, -2, -3, 4, 3, 5, -4, -3, -2, -1, 0, -8, -6, + -7, 1, 4, -8, -3, 4, -4, -1, 2, -8, -6, 0, 1, 6, -2, + -2, -3, -5, 5, -7, 3, 3, -1, -8, 5, -6, -3, -7, -2, 0, + -5, 2, 4, 0, 4, -4, -5, -8, -7, 1, 5, 0, 5, -8, -8, + 4, 2, -4, -8, -8, 2, 1, -1, -5, 1, -5, -8, 0, 0, 5, + -4, 6, 2, -1, -3, 1, -4, -2, 1, 5, -5, -5, 3, -2, -7, + -8, 1, 2, -6, -2, 1, 6, -5, -5, -4, -5, -8, -6, 2, -7, + -5, -6, 6, -4, 3, -5, -8, 5, -1, 2, 4, 5, -5, 1, 4, + -2, -5, -8, -6, 3, -8, -8, -6, 2, -2, 4, -6, -3, -3, -7, + -6, -6, 1, -7, 3, -1, 1, 1, 4, 0, 4, -5, -2, 2, 3, + 2, 2, -1, -4, -1, 5, 6, 0, -6, -6, 5, -5, -6, -1, -6, + -4, 2, -3, 6, -5, 4, 5, -6, 5, -5, -2, -7, 5, -6, -3, + -8, -5, 6, 3, -3, -5, 1, 2, 5, -7, 5, -2, -2, -4, 4, + -6, -8, -3, 1, 0, -7, -7, 1, 1, 6, -5, -5, 2, 1, 2, + 1, 2, -7, 4, 4, 2, 1, -7, 0, 3, 6, 0, 6, -7, -6, + -5, -4, -6, -5, 0, -3, 0, -3, -6, 6, -3, -5, -1, -6, 4, + -3, 6, -2, 5, 4, 3, 0, 0, 4, 0, 6, -8, -2, -5, 4, + 4, 2, -4, -4, 0, 5, -1, 0, -4, -2, -8, -8, -5, -2, -3, + -3, -4, 6, -2, 3, -1, -6, -5, 2, -3, -3, 6, -2, 1, 6, + 3, 4, -3, -3, -4, -7, 0, -3, -3, -7, 6, 3, -4, -3, -2, + -7, -5, -2, 3, -3, -7, 3, 1, -2, -3, 4, 1, -3, -2, -7, + -6, -7, 1, 0, 1, 4, 4, -3, 6, 4, -2, -8, 0, 2, 6, + -2, 5, -6, -3, -6, 0, 5, 3, 3, 1, -3, 1, 0, 6, -5, + -7, 6, 6, 2, 5, 4, -5, 6, 0, -4, -8, 2, 4, 5, 2, + 0, -8, 4, 2, -6, 6, -1, -8, 4, -4, -2, -6, 5, -4, -3, + -1, 6, -3, 2, 4, -5, 5, 3, -8, -4, 4, 3, 1, 5, -3, + 3, 1, -7, 1, -8, -7, -2, 2, 6, -6, -6, 4, 3, 4, 5, + 4, 5, -8, 6, 3, -6, -4, -3, 1, 5, 2, 5, 1, 5, 3, + -1, 4, -3, -4, -6, -5, -3, -1, 5, -6, -4, -4, -3, -4, -7, + 2, -6, 1, -6, -7, 2, -7, 0, -6, -8, -7, 5, -2, -5, 4, + 3, 4, 3, -1, -4, 5, 2, -7, -5, -2, 3, 4, 3, -7, 6, + -5, -2, 5, -7, 5, -8, 6, 5, -8, -7, -3, 2, 6, -3, -2, + 4, 0, -8, 4, 1, -1, -3, -2, -8, -3, 2, 0, -4, 5, 4, + -7, 6, 2, 4, -8, -7, -7, -8, 6, -2, 5, 5, -2, 6, 5, + -8, -4, -1, 5, -6, -7, 3, 2, 3, 3, -5, -3, 3, -2, 2, + 3, 5, 4, 4, -5, -6, 2, -7, -8, 3, -3, 3, 2, -1, 1, + 5, 4, 1, -1, -5, 0, 5, -4, -1, -6, -8, 0, 0, 0, 2, + -8, -1, 3, 4, -2, -1, 3, -4, -3, -3, -1, 2, -6, -7, -7, + -2, 0, -3, -1, -7, 5, 0, 2, -3, -8, -4, -5, 2, 4, 5, + 1, -7, 2, 0, 6, 4, -3, 5, -5, 1, -1, 2, -3, -1, -8, + -6, 5, -8, 6, 3, -7, 2, 3, -8, 1, -7, -2, -5, -7, -4, + -3, 6, 5, -3, -7, 4, 0, -7, 3, 6, -1, 0, -1, -2, -1, + -2, 6, -6, 3, 1, -6, 3, 6, -7, 6, -8, -4, 2, -4, 5, + 1, -1, 3, 4, 2, -7, 0, -4, 3, -6, 6, 3, -4, -1, -5, + 0, 1, 4, -2, 2, -6, -8, 5, -4, -1, -5, 6, 3, 3, 6, + -3, 3, -6, -4, -7, -2, 1, -4, 5, -5, -5, 3, 5, 3, -8, + 0, 3, 1, -3, 1, 4, 2, 3, -3, -3, 3, 2, 3, -5, 0, + -2, -8, -4, -3, 4, 3, -5, -1, 6, 2, 1, 4, -7, 1, -2, + -4, -7, -3, 3, 0, 0, -7, -8, 3, 5, 3, 1, 2, -2, 1, + -3, 0, 5, -7, 1, 2, -1, -6, -6, -2, 6, -4, 0, 1, -2, + 3, 0, -2, -6, -7, -7, 5, -2, 3, 6, -7, 3, -2, -5, 5, + -3, 1, 2, -2, -3, 5, -4, 0, -4, -2, 4, -7, 3, 0, -8, + -8, 4, -5, -7, -6, -1, 5, -2, 6, -3, -2, 0, 5, 1, 4, + -4, -4, 5, -5, -3, -1, -7, -8, 0, -3, 2, 4, -2, 2, -4, + -3, -1, 5, -7, 6, 4, -2, -5, -4, -4, 2, 5, 4, -2, -7, + -7, 4, -2, -8, 3, 2, 1, 6, -8, -2, 2, -8, -7, -4, 1, + 0, -8, -6, -6, -3, 1, 6, 2, 3, -1, -4, 0, 0, 6, -3, + -6, -3, -2, 0, 0, -7, -6, 6, 6, 2, -4, 4, 0, -1, -4, + -6, 4, 6, 2, -2, 1, 4, -3, 6, 1, -4, -2, 6, -3, 6, + -1, 3, -8, 6, -1, -1, -4, -8, 3, 3, 4, -4, 2, -3, 6, + -6, -2, 4, 5, 6, 2, -4, 3, -5, 1, -2, 1, 5, -8, 3, + -4, -2, -6, 5, 3, -4, 0, 5, 6, 0, -6, 6, -1, -3, 2, + 0, -1, 3, -2, -5, 3, -4, 3, 2, -8, -5, 5, 4, 3, -4, + 2, -3, -7, 3, 6, -5, -2, 4, -3, -6, 1, 0, -3, 4, -1, + -6, -8, 5, 5, -1, -7, -8, 4, -5, 0, 2, 0, -4, 1, 6, + 3, 3, 1, 6, 4, 6, 5, 6, -3, 3, 5, 6, -2, 0, -1, + -7, 1, 3, 1, -1, -5, 5, 5, 0, -5, -2, 0, 6, -6, 6, + 1, 1, -2, 5, -4, 6, -5, -1, 1, -1, -4, 5, 1, 0, 2, + -3, -8, 6, -6, 3, -5, 6, -8, -3, -3, -3, 5, -8, -2, 4, + 4, 5, -6, -2, 4, 1, 1, -1, -3, -7, 0, 6, -6, -6, -3, + 5, -6, 0, -5, 2, 6, 4, 2, -3, 6, -1, 3, -3, 3, -6, + 3, 0, 4, -2, -7, -6, -2, -7, -3, 3, -8, 2, -2, -8, 1, + 6, 6, 3, 3, -6, 2, 3, -4, 2, 0, 0, 5, 6, -5, 5, + -8, -2, -2, -4, 6, -1, -5, 4, -2, -6, -8, -1, -4, -6, 6, + -6, 6, -6, -5, -8, -1, -3, -5, -3, -2, -6, 0, -3, -4, -4, + -4, 1, -4, -6, 3, 4, 2, 5, 6, -8, 3, -6, -4, -8, -2, + 4, -6, 3, 5, 0, -3, -2, -6, 3, 4, -3, 1, -6, -2, 5, + 4, -5, -5, -4, 3, 6, 1, 3, 0, 4, -5, -6, 0, 2, 0, + 5, 2, -8, 6, -8, 5, 6, 5, 1, 6, 2, -4, -6, 1, 4, + -5, -3, -5, 0, 3, 3, 1, 1, 1, -4, -2, -3, 0, -6, -2, + 4, 2, 5, 5, 4, 3, 0, -7, -7, 3, 3, -6, -5, -4, 0, + -4, -4, 4, 6, 5, -4, -5, -4, -8, 4, -8, -7, 6, -7, -2, + -7, 3, 1, 6, -5, 5, -8, -7, 0, 5, -5, 2, 4, 1, -5, + -1, -6, 4, 0, -2, -1, -7, 0, 5, -3, -7, 2, 5, -8, -7, + 4, 1, 0, -7, -4, 1, -1, 3, -6, 6, 4, -7, 3, 3, -5, + 5, -7, -7, -6, 6, 3, -1, 5, 4, -7, 3, 2, 1, -7, -8, + -1, 2, -2, 3, -5, -6, -4, -1, -2, 3, -2, -3, -5, 6, 2, + -5, 0, -4, -8, 6, 4, 3, 4, 4, 0, -2, 5, -6, 1, -8, + -3, -4, -1, -4, -8, 0, -3, -5, 6, -5, 1, 6, 5, -2, -7, + 1, -2, -7, 0, -6, 1, -2, -4, 0, -1, 2, 6, -1, 4, -8, + -5, -8, -1, -7, -2, 0, -7, 5, -4, 6, 5, -2, 2, 5, 1, + -7, -1, 1, 1, -1, 6, -7, -1, 5, 4, -8, 2, 1, 2, 0, + -8, -1, 5, 2, 0, -6, -1, 1, -2, -8, -8, 6, -5, 6, 4, + -1, -8, 3, 4, -7, 4, 0, 1, -1, 6, 6, -7, 1, -5, 5, + 2, -7, -6, -4, -6, -4, 4, -2, 2, -6, -6, -3, -2, 1, -4, + 4, -2, 4, -1, -5, 5, 4, -7, 4, 1, -7, -6, -2, 2, -4, + -8, 5, -3, 3, 3, -8, -1, -6, -7, 0, 0, -7, -7, 3, -6, + 3, -8, -8, 1, 6, -7, -8, -8, 4, 0, -4, 2, -6, 0, 2, + 6, -2, 0, 2, -2, -5, -1, 3, 0, -5, 6, 6, 4, -2, -1, + -3, -1, 3, 3, -3, -4, -8, -2, -7, -4, 3, 4, 4, -2, -2, + 2, -3, -8, -5, 2, 1, 5, -1, -4, 6, 1, -5, 2, -6, 4, + -6, 4, 2, -3, -5, 0, -4, -5, -7, -7, -6, 0, 3, -8, 2, + -8, 5, -2, 0, 5, 3, 4, -1, 1, -5, -6, -1, 2, -6, -7, + -7, -1, 5, -2, 5, -7, -5, -2, 1, 0, 1, 0, 2, 2, 6, + 6, 4, 1, -3, 4, -7, 6, -8, -2, 3, -2, -4, -1, -1, 6, + -6, -7, -2, 2, 0, 5, 6, 0, 4, -1, 5, -8, -8, -4, -6, + -7, 2, -2, -4, -7, -2, -8, 2, -3, 3, -3, -3, -4, -6, -4, + -5, -4, 6, -2, 1, -5, 1, -5, -6, -7, -5, 6, 1, 5, 6, + -4, 0, -2, -8, 6, 3, -4, -5, 5, -8, -3, 6, -3, 1, 5, + 3, -4, -1, 5, -8, 4, -4, 0, -3, 2, -4, -7, 4, -8, -7, + 1, -3, 6, -1, -1, -6, 6, 3, -3, -5, -3, -1, -4, -1, -7, + -3, -7, 5, 0, -2, 3, -3, -6, -5, -8, -2, 2, -7, -3, 5, + -6, 0, 0, -5, -5, -6, 1, 2, -8, 1, 4, -1, 3, 1, -3, + -8, -2, 4, -6, -7, 1, -3, 0, 1, -4, 5, -3, 4, -2, -8, + 5, 3, -3, -4, 5, -8, 0, 2, -4, 6, 3, 0, -1, -1, 4, + -7, -1, -5, -5, 5, -1, -4, 6, -5, 4, -4, 1, 5, -3, -3, + -8, 2, 2, -6, -7, 6, -1, -4, -4, -2, 4, -7, 4, -5, -3, + -7, -5, -2, -3, -7, -3, 5, 5, 0, 4, -4, 0, 6, 4, 4, + -4, -2, 2, -1, 3, 4, -3, 5, 2, 0, 1, 3, 3, 4, -8, + -7, 0, -1, -3, 3, 1, -1, -5, 0, -7, -4, -6, -2, 4, 1, + 2, -2, -1, -5, 3, -1, -5, 2, -1, 2, -8, 5, -8, -5, 4, + -5, -5, -1, -2, -4, 2, -5, 2, -2, 0, 5, 1, -5, -7, 1, + 4, -7, 3, -7, -8, -2, 5, 4, 2, 4, 5, 5, -8, 1, 4, + 0, -4, 0, 3, 6, -5, 6, -8, 0, -7, 5, 0, -4, -2, -1, + -8, -7, -5, -7, 3, 0, 3, -8, 4, -7, -5, 4, 1, -5, -3, + -4, -8, -6, -3, 4, 0, -3, 4, 1, 5, -5, 3, 6, 3, -7, + -7, 5, -3, 4, 6, -1, -1, -1, -2, -7, 6, 1, 2, 0, -6, + -6, -7, -6, -4, -3, 5, -5, 2, 3, 0, 4, -8, 4, -6, 6, + 0, -8, -7, -3, -4, 3, -4, 6, -4, 4, -1, 4, 0, -1, 0, + -2, -5, 3, 5, -7, 2, 3, 3, 6, -3, -7, 1, -2, -3, -4, + 0, 2, -5, -6, 3, -4, -3, 6, -7, 4, -1, 6, -4, 0, -5, + 0, -3, -8, -6, -7, -2, 3, 6, -6, -8, -6, -6, 0, -2, 2, + 1, -5, 4, -2, -8, -5, 4, -7, -1, -8, -2, 1, -7, -3, -4, + 2, -8, 4, 0, -5, 6, -4, -3, 3, -8, -6, -6, 4, 2, -4, + -7, 6, -6, 0, 2, -1, -6, -8, 5, -3, 1, 2, 1, -8, 1, + 1, 4, 4, 2, -1, 6, 0, 6, -8, -8, 3, 3, -6, -3, -8, + -3, 6, -1, -5, 0, -7, 3, 3, -6, 0, -3, -6, 1, -3, -3, + -3, -8, 3, -6, 6, -3, -2, 3, -3, 3, -2, 6, 4, -7, 0, + -6, 6, -5, 3, -8, -2, 6, -4, -5, 1, 0, -2, 1, -3, -6, + 1, -4, -5, 6, 2, -5, -3, 3, -7, 0, -1, -4, -7, 1, -5, + 1, -2, -7, 4, 4, 1, -8, -4, 1, -8, 5, -4, 4, 3, -4, + 1, -6, -6, -6, 5, -5, 3, -7, -5, -8, -1, -1, -4, -6, 5, + -3, 1, -8, 1, -1, -4, -6, 4, 5, 1, 1, 5, -6, 2, -6, + 6, 3, -4, -2, -8, 5, 5, 1, 3, 1, -1, -8, -1, -3, 5, + 6, 5, 4, 0, -1, 4, 1, 4, -8, -4, -3, 0, -5, 0, 4, + 6, 4, 2, -3, -3, 0, -3, 4, -3, 2, -4, 6, -7, 2, -3, + -1, 2, -6, 5, 2, 1, 2, 4, -3, -4, -7, -3, -2, 2, -7, + 2, -7, -4, -1, 1, 5, -6, 3, 4, 4, -3, -6, 0, 5, -5, + -1, -6, 0, -3, 0, 5, -2, -4, -7, 2, -5, 0, -5, 5, 2, + -6, 2, 1, 3, 6, -1, -7, -2, 4, 5, -3, -4, -1, -8, 4, + -2, -4, 2, 5, -6, 3, 0, 3, -1, 4, -3, 1, 4, 0, 6, + 2, -1, 3, 4, 3, -2, 4, 1, -4, -3, -3, -2, 2, 6, 3, + -8, -5, 0, 2, -3, 5, -1, 1, 1, -1, 5, 6, -5, -1, -4, + 3, -4, -3, 3, -4, -6, 6, 2, 1, 0, 4, 0, 3, 2, -6, + -1, 6, 0, 4, -5, -4, -3, 3, 0, 3, -2, 2, 4, -2, 4, + 3, 5, 6, -4, -5, -2, 4, -6, -8, -6, 5, 5, 3, -2, 2, + -3, 4, 4, 6, 2, -1, 3, 6, 2, 2, -1, -7, -2, -6, -3, + 6, -2, 6, -5, 3, 2, -8, -7, 2, -2, 0, -4, 1, 6, -4, + -7, 6, -2, 0, 0, 1, 6, 6, -4, 2, 4, -8, -2, -4, -6, + 0, 0, 5, -6, 4, 4, -5, 0, 5, -4, -7, -8, -4, -5, 4, + -2, -5, -2, -2, -7, -2, -5, -5, -6, -1, 6, -2, -4, -4, -5, + 1, -3, -4, -5, -8, 3, -7, -1, -3, -1, 3, -1, -1, -5, -5, + 4, -3, 5, -2, -5, -7, 6, -1, 4, -3, 6, -1, -3, 2, 2, + -2, 2, -6, -3, -2, 6, -4, 5, -4, 4, -4, 0, -1, -4, 0, + 6, -7, 2, -7, 4, -8, 4, -4, 1, 2, 5, -7, -8, 2, 6, + -4, -5, -4, 0, -2, -7, 6, -4, -7, 6, -2, 4, -2, -7, -5, + 1, -7, 0, 5, 4, 0, -3, 2, 4, -7, 0, -3, -6, -2, -7, + -5, -4, -2, -6, 1, -7, -8, -7, -6, 3, 2, 2, -2, -7, -2, + 5, 5, -4, 3, -1, -3, -8, -5, 4, 2, 0, 0, -3, -3, -4, + -4, 5, 1, 1, -7, -1, -7, -2, -6, -8, -3, -8, -5, 6, 3, + -1, -1, -1, -2, 1, -4, 1, -7, 3, -2, 1, 5, -2, 2, 5, + 3, 5, 3, 0, 0, 4, -8, 3, -5, -5, -6, -3, 2, -5, 2, + -1, 4, -3, 1, 0, 3, -7, -1, 2, -3, -2, 2, -3, -7, -2, + -4, 1, -1, 0, -1, 4, 2, 1, -2, -7, -2, -5, -7, 5, 1, + -3, 1, -2, -5, 2, 4, 6, 0, -4, 5, -3, 1, 5, -8, -8, + 2, -4, -1, 4, 3, -7, -1, -1, -5, -4, -5, 0, 1, 5, 1, + -3, 1, 6, -3, -2, -6, 5, -6, 5, 2, 5, -1, -3, 3, 5, + -1, -5, 3, -1, 6, 4, 4, 1, -7, -2, -3, 3, 1, 0, -2, + 5, 0, 3, -6, 5, -6, -4, -5, 5, -4, -1, -8, -2, 4, 0, + 3, -1, -2, 3, -6, -2, 3, 5, -5, -2, 3, 3, -4, -5, -1, + 2, 6, 1, -5, 5, 4, -6, -4, 1, -1, -6, 6, 6, -3, -4, + -4, 4, 2, -1, 5, -3, -4, 3, -5, -8, -8, 0, 4, -7, -4, + -2, -3, 1, -4, 1, -4, -1, -2, 2, -5, 4, -5, -8, -3, -4, + -8, 3, -2, 3, 0, -3, 1, -7, 1, -5, -4, 1, -4, -2, 4, + 3, 5, 4, 5, 6, 4, -4, 5, 5, 2, 5, -5, 1, 6, 6, + 4, -6, 4, -6, -3, -8, -3, -1, 6, -1, -6, -1, -2, -8, -3, + 1, -3, 6, -2, 5, 0, -4, 5, -3, 1, 0, 0, -4, -1, 3, + -7, -3, -1, 6, 1, -6, -4, -1, -3, -3, 1, 0, 0, 2, 1, + -1, -5, -2, -3, -7, 6, 1, 6, -5, -4, -2, -4, -1, -4, 3, + 0, 3, -4, -3, -2, 0, -2, -6, 1, -2, -2, -1, 0, -5, 6, + 1, -3, -5, 2, -6, -3, -4, 6, -7, 3, -2, 5, -3, -3, -4, + -6, 1, -8, 5, 3, 3, 2, 5, -4, -8, -8, -1, -1, -1, -7, + -2, -7, 3, 1, -8, 0, 0, -7, 4, -2, -7, -4, -2, 5, 4, + 0, 4, 3, 0, 1, 5, 3, 4, 1, -8, -3, 0, 1, 3, -3, + -4, 1, 2, -2, 1, -5, -5, -4, -8, 5, 2, 0, -6, -3, -7, + -7, -2, -8, 6, 0, 6, -6, 5, 6, 1, 6, 2, 3, -6, -6, + -8, 2, -5, -2, 4, -4, -6, -7, -5, -3, 6, -3, -3, -8, 6, + -2, -7, 1, 4, 5, -5, 0, 5, 0, 1, 3, -1, -7, 1, 0, + 6, -6, 1, -4, -1, -7, 0, 3, -4, -7, 6, -2, -5, 4, 2, + -8, -5, -5, -2, 5, -2, 5, -1, 3, -3, 6, -5, -6, 0, 3, + -4, 5, -5, 2, -5, 3, -6, 4, 2, 1, -3, 3, 5, -8, -3, + 2, 2, -1, -8, 6, 4, -3, -7, -4, 3, -7, -3, 4, 5, -4, + 6, -4, 0, -3, 5, -6, 1, -5, 1, -7, -7, 5, -8, -7, -1, + -8, -1, -7, 4, -5, -6, 6, 2, 0, -8, 2, 1, -1, 3, -5, + 6, 5, -6, -7, 1, 6, -8, -7, -3, -4, 0, -1, -4, 6, 5, + 2, 2, 3, 3, -4, 4, -1, 6, -1, 1, 2, -6, 1, 0, -1, + -6, -7, -4, -1, 5, -5, 5, -4, 4, -1, -7, -1, -2, 1, -8, + 3, -2, -1, 2, -3, -1, 3, 1, -8, -4, -5, -5, 2, -2, 5, + -2, 1, 0, -5, 1, -7, -5, -8, -2, 6, 5, 4, 0, -8, 2, + 1, -2, 3, 4, -4, -5, 2, -2, 4, 2, -7, -3, -1, 6, 3, + -1, -3, -8, 0, -1, -3, -3, -6, -3, 2, 3, 2, -8, 6, -6, + 4, -3, 4, 1, -4, -1, -7, -3, -3, 0, -5, -2, -5, -6, -3, + -3, 4, -2, 2, 3, 6, 6, -1, 0, -4, 2, -1, 4, 0, -1, + -8, -4, -6, 0, 1, -4, -4, 0, 1, 2, 1, 3, 2, 4, 3, + 0, -7, 6, -7, -4, -3, -8, -2, -3, 2, 0, 3, 3, -1, 1, + 0, 5, 3, 5, 4, -7, 0, -7, -5, 0, -8, 2, 1, 5, -5, + 3, 0, 3, -8, 3, 1, 6, -8, -6, 3, 2, 5, 2, -2, 2, + 5, -7, -3, -5, -8, -5, -8, -1, -6, 2, -4, 2, 3, 2, -8, + 1, 6, 0, -1, -6, -3, 5, -8, -3, 0, -8, -8, -7, 5, -8, + 0, 0, 6, -4, -1, 3, 6, 3, -1, 1, 1, -6, 1, -1, -7, + -6, -6, 1, -5, 4, -6, -3, 4, -1, -8, -2, 2, -1, 6, -7, + -5, -7, 3, -3, 0, 5, -6, -2, 5, -1, 6, -3, 6, -2, 4, + 0, -6, 0, -7, -6, -6, -5, 1, -8, -5, -1, -8, -8, -4, -2, + 3, -1, -3, -1, -5, -4, 6, 1, 5, -8, -1, 4, 1, 4, -4, + 3, 1, 5, -3, -5, -2, -4, 5, 1, -7, 1, -3, -5, 0, 6, + 6, 1, -6, -7, 3, -3, -3, -8, -8, -4, -5, -7, -6, 6, 0, + 4, -4, -2, -4, -8, -4, 3, 6, 6, -5, -8, -2, 3, -4, 2, + -2, -7, -1, -3, 5, -5, 5, 5, -7, -5, -1, 2, -4, 2, -7, + -3, 6, 4, -4, 2, -1, 5, 1, 2, -6, 5, 4, -6, -4, -5, + -2, 4, -2, -8, 1, 4, 4, 0, -5, 0, 5, 2, 1, -2, -6, + -2, 1, 5, -7, -2, -8, -2, -4, 3, -4, 5, -3, -4, -8, -3, + 1, -7, 0, 3, 6, -1, -6, -7, 5, -1, 6, -4, -1, -6, -8, + -3, 4, -8, -1, -2, 2, -5, -8, -3, -7, -3, -5, 1, -3, 2, + -2, -4, 6, -6, -6, 6, -8, -7, 2, 4, 3, 1, 0, 1, -6, + 3, 1, -1, 2, -5, -6, -4, 1, -4, 2, -3, 0, -2, -5, 2, + -2, -2, -8, -8, 0, 3, -5, -2, -1, 0, -4, 5, 3, -7, -4, + -6, -8, -5, 5, 5, -7, -8, -2, 5, -7, 1, 2, -8, -7, 5, + -8, 4, -3, -5, -7, -2, 6, -3, 2, -2, 2, 2, -1, -7, 6, + -7, -5, -7, 6, -7, 6, 5, 2, -3, 5, -5, 3, -5, 4, 1, + -1, -4, 0, 1, 6, 0, 3, -2, -5, 6, -1, -1, 6, -3, -4, + -1, -1, -8, -8, -7, -4, -3, 2, -1, 6, 4, -7, 6, -8, 2, + -4, -8, 5, 0, 6, -1, -1, 3, 5, 1, -2, 2, 1, -1, -1, + 1, 1, -4, -5, -7, 0, 3, -1, 6, -7, 0, 2, 4, -3, 2, + 6, -8, -3, 1, -2, -4, 3, -1, 0, -1, -2, 4, 2, -4, -5, + -4, 0, 5, -7, -7, 3, -7, -6, -2, 0, -1, 3, 6, 1, 1, + -5, 5, 4, -8, 5, -1, 5, 0, -2, -1, 0, 2, -1, 5, 4, + -7, 3, -3, -3, 0, -5, -5, 2, -7, 2, -5, -8, -4, 3, -3, + 4, -6, -3, -5, -7, -8, 5, 0, -1, 6, 1, 0, -6, -1, 4, + -2, 2, 3, 6, -7, -5, -6, 6, 5, -5, -4, -3, -6, -5, 1, + -3, 2, -5, -4, 2, -3, 6, -8, 5, -5, -2, -7, 1, -3, -2, + -3, 3, 0, 0, 4, -2, 3, 2, -5, -6, -1, -1, -5, 2, 5, + -6, -8, -2, -6, 6, -1, -7, -4, -4, -6, -4, -3, 4, -5, 6, + 3, 1, -1, -4, -4, 3, -6, -6, 6, 1, 2, 2, 4, -1, -4, + -3, -1, 4, -5, -1, 4, -8, 2, -1, 0, -8, 0, -2, -3, 3, + 2, 2, -3, 5, 5, 2, 6, -8, -7, -2, 6, 4, 3, -4, -4, + -2, -6, 0, 2, 1, 5, -6, 4, 5, 1, -2, 4, -4, -5, -5, + -3, -4, 3, -7, -7, -6, -6, 2, 2, -2, -4, -8, -7, 2, 2, + 5, -7, 2, 6, -3, 3, 1, 1, 3, 1, -1, 3, -7, -4, -8, + 3, -6, -5, 6, 0, 1, 5, 4, -4, -6, -7, -2, 3, -4, -8, + 2, 0, -1, -3, -8, 3, 3, -7, 1, -7, 3, -7, -2, 1, 6, + -7, 6, 4, -5, 5, 1, 2, 2, 6, 3, 3, -6, -4, 5, 0, + -3, -2, -8, 1, 6, 5, 5, 0, -3, 2, -8, 6, 5, -7, -7, + 6, 6, 1, 1, -1, 5, -3, 4, -5, -3, -2, -8, -6, -1, -5, + -6, 6, 2, -7, -2, 0, 2, 2, 6, 0, -4, 4, 3, 6, 6, + 3, 3, -2, 5, 5, 3, 1, -5, 2, 2, -3, 3, -6, -6, 3, + -6, 4, 1, -8, -3, -8, -3, 6, -1, 1, 5, -2, -6, -1, 1, + -4, -2, -8, -1, -1, -4, -3, -1, -3, 6, 6, -1, -8, 3, 0, + 3, 5, -4, -1, -5, 5, -8, 2, 0, -3, -4, -3, 3, -3, -3, + 6, -2, -4, -8, -6, 4, -4, -8, -6, 4, -8, 0, 6, -5, -6, + -1, -4, -5, -2, 2, -8, 5, -2, -3, 3, -5, 4, 1, -5, -4, + 2, -5, -1, 1, 0, 1, 2, -7, 3, -6, -6, 2, -6, 2, -8, + -4, -6, 2, 2, 2, 2, -5, -3, 2, -5, -3, 2, -2, -5, 1, + -7, -4, -3, -3, -8, -1, 3, 3, -1, 4, 3, -3, -8, 4, 3, + 0, 2, -7, 1, -8, 1, -7, -6, -6, 4, -7, 5, -3, 0, -1, + -8, 1, 6, -1, -6, 2, -8, 2, -7, 2, -6, 2, 2, 4, 5, + 0, -1, -7, 0, 5, 4, -6, 2, -1, -8, -7, -1, -4, 5, -7, + -1, 6, 0, 1, 2, 6, -4, -7, -5, -6, -8, -2, -7, -8, -6, + 5, -8, 3, 4, -7, 6, -2, -5, 0, 5, -7, -1, -2, 4, 2, + 0, -2, -8, -4, 0, -1, -5, -1, 4, 0, -8, -1, -8, -8, 4, + -6, -6, -1, -7, -7, 0, -6, -6, -8, -2, -3, -5, 2, -3, 4, + 2, 3, 0, -2, -2, -2, -1, 5, -3, 4, -8, 6, 0, -6, -7, + -3, 5, 1, -2, -2, 6, -6, 4, 4, -6, -3, -3, 2, 2, -1, + -4, -8, 4, -4, 6, 5, -1, -1, -1, -6, -3, 0, -6, -5, -5, + 2, -6, 4, -3, -1, -5, -2, -8, 5, 4, 0, 3, 6, -3, 6, + -2, -7, 6, -3, 5, 3, -6, -5, 2, 0, 2, -5, -5, 6, -3, + -6, 0, -1, -4, -3, -5, 0, 3, -6, -1, 4, -2, 1, 1, 4, + 2, -5, -5, 3, -5, 3, -8, 4, 2, -6, -3, -8, 2, -6, 5, + -7, -6, -8, 2, 1, -8, 2, -4, -8, -8, -5, 1, -6, 1, -5, + -6, -5, 4, -3, -4, 3, -6, -1, 3, -8, -3, 6, 2, -5, -2, + 6, -7, -1, 3, 1, 5, 2, 4, 4, 0, 1, -6, -6, 1, -5, + -4, -4, -2, 4, -6, -5, 0, 0, 2, -7, -1, -7, -4, -7, 6, + -7, -6, -2, -2, -2, 4, 1, 1, -8, 4, -8, -5, -4, -7, 2, + 2, 0, -1, -2, 2, 1, 0, -3, 2, 2, 4, 2, 5, -5, -5, + 2, -7, 6, -5, -6, -8, 2, -3, 4, -3, -5, -1, 1, -8, -6, + 5, 5, 0, 4, -5, -5, 1, -7, 1, 2, -1, -2, 3, 1, -1, + -6, 4, 0, -6, -1, -5, -8, -4, 3, 1, -5, 5, 1, -6, -5, + 5, -5, -4, 3, -8, -5, 5, -5, 2, -2, 2, -3, -3, -8, -2, + -1, -6, 6, -1, 6, 1, 3, -6, 6, 5, -4, 1, 4, 4, 4, + 6, 4, 3, 4, 5, -3, -8, -2, 6, 3, -3, 4, -4, 2, 2, + -8, 2, 5, -8, -7, 3, 4, 1, -8, 1, 4, -2, 1, -5, 6, + 4, -8, -6, -2, -3, -7, -6, 3, -2, -1, 6, -5, 4, 0, -7, + -6, 3, 5, -1, 2, 6, 5, -7, 5, -8, -8, -5, -5, -3, -2, + 0, -8, -8, 5, 2, -1, -8, 2, -6, 5, -5, -8, -6, 1, -4, + 1, 4, 6, -2, 0, 1, -2, 4, 2, 6, 3, -3, -4, -8, -6, + -7, -8, 6, -2, 4, 2, -2, 4, -6, 3, -6, 6, 3, 1, -6, + -3, -6, 5, -7, 2, 6, -2, 1, -5, 3, -4, 5, -5, -4, 3, + -1, 6, 1, 2, -7, 5, -3, 1, -8, -5, 1, -1, 5, -2, 1, + 4, -6, 5, 2, -4, -4, 2, 6, 5, 3, 3, 5, -1, 2, -1, + -6, -8, 1, -1, -4, -8, 1, -4, -7, -1, 4, 5, 5, 1, 5, + 4, -4, -6, 1, -2, 4, 0, 4, 1, -4, 5, -5, -1, -5, -7, + -2, 4, -3, 1, -4, -2, -8, -1, 0, 5, -4, -2, -1, -6, 6, + 4, 4, 2, 2, -8, -7, -2, 1, 2, -1, 6, 5, -1, 0, 1, + 0, -6, 2, -2, 4, 4, -1, 3, 4, -8, -6, 4, -7, 4, -4, + -7, -2, 2, 4, 6, -4, 2, -4, 0, 1, 6, 5, -6, 3, -7, + 5, 6, -6, 6, -3, 6, 1, -8, -5, -6, -4, -3, 0, -3, 1, + 5, -6, -2, 6, 3, 4, 6, -5, 0, -8, -2, 5, 3, -7, -7, + -4, -5, 1, 4, -4, 0, -7, -6, -7, -2, -6, -3, 5, 6, -2, + -8, -6, 5, 6, -6, -8, 5, 5, -7, 4, 6, 4, 5, -1, -1, + -1, 2, -4, -2, -7, 2, 6, -3, -1, -2, -6, -5, -3, -6, -7, + -6, 6, 3, 2, -4, 5, -7, -2, 2, 0, -1, 4, -4, 6, -5, + -8, 3, -6, -1, 4, -2, 3, -7, -7, -7, -8, -5, -2, 1, 4, + 5, -1, 2, 2, 5, 6, -8, -3, 2, -4, 1, -2, -3, 1, 0, + 3, -8, -2, 4, -3, -1, 6, -7, 4, 4, 6, 3, -2, -1, -3, + 1, 5, -7, 0, 4, 5, -8, -2, -7, -1, 4, -1, -5, -6, 2, + -6, 0, 5, -6, -4, 1, 3, 2, 1, -4, 6, 4, -2, -1, 6, + -3, -8, 0, 2, 1, 2, 1, 1, -3, -8, -1, 1, -7, 0, -3, + -1, 6, -1, -2, 3, -7, 5, 0, -7, 4, 2, 6, 5, -6, -3, + 2, -7, 5, -8, 2, -3, 5, -6, 0, -2, 5, -6, -1, 0, 5, + 6, -4, 4, -5, 3, 1, 1, 3, -1, -2, -3, 0, -7, -8, 2, + 4, -8, -2, 2, -1, -2, 4, -5, -4, -7, 4, -6, -2, -5, 4, + -6, 5, -2, -3, -2, -2, 0, -3, -2, -8, -5, -3, 0, -2, -8, + -5, 3, -3, -1, 1, 0, 6, 1, -4, -6, -8, -3, -1, -8, -8, + 5, 6, -2, 1, -3, -7, -6, 2, -1, -5, 6, 0, 1, -8, -5, + 3, 0, -6, -8, 6, -3, -6, -4, 2, -4, 5, 1, -1, -2, 5, + 2, -4, -7, -8, 5, -1, -6, 0, 0, -7, -7, 1, -5, -8, 3, + -4, -8, -6, 1, -5, 6, 5, 6, -3, -6, 4, -4, -4, 4, 2, + 2, 2, 0, -4, -3, -2, -1, -8, -5, -4, 1, -6, 0, 6, -5, + 4, 5, -6, -2, 0, 5, -8, -4, -8, 4, 2, -5, 2, -6, -3, + -5, 0, -1, 2, -2, 5, -5, -1, -6, 3, -1, -2, 5, -5, -8, + -8, 5, -7, -7, 3, -5, -3, 2, -1, -3, 4, 0, -1, -4, -4, + -2, -6, 5, -8, 3, 0, 6, 0, -8, -2, -6, -4, -6, 3, -7, + 2, -7, -5, 4, -4, -4, -1, 3, -1, -5, 3, -3, 0, -3, -1, + 2, -7, 2, -1, 4, -6, 1, 1, -4, 1, -4, -8, -1, 0, -2, + -2, 0, -3, 6, -6, 3, 2, 1, -6, 6, -6, 2, 0, 4, -2, + -5, -7, -5, -3, 1, -1, 5, -2, 0, -4, 2, -1, -4, 2, 4, + -1, 0, -2, 0, -5, 6, -3, 3, 1, -1, -6, 0, 6, -1, -2, + -6, 1, 3, -3, 5, -8, -6, -8, -4, 6, 1, 6, -5, -7, -8, + -7, -8, -3, -7, -1, -1, 1, -6, 5, -8, -1, 0, 3, -4, -7, + 5, 2, -3, -4, -5, -8, 0, -4, -1, -5, -4, 0, -4, -1, -1, + -1, -6, -4, 3, -3, 2, -3, -4, -4, 1, -3, 2, 0, -6, 2, + 5, -8, -3, -8, 0, -1, -2, 4, 0, -2, 0, -3, -7, -2, -1, + -7, 6, -6, -8, 3, -6, 0, -1, -1, 2, -4, -7, 0, 0, 6, + 6, -7, 1, 0, -2, -5, 3, 0, 6, 0, 3, -2, -4, 5, 1, + 0, 6, 2, 2, 3, -6, -2, 5, 4, -7, 3, -2, 2, 6, 6, + -7, 6, -7, 5, -5, -2, -4, -3, -5, 2, -8, 5, 0, -6, 5, + -6, 6, -2, -3, -4, -5, -1, -5, -2, -8, -5, -1, 4, 0, -3, + -5, 1, -3, 1, 2, 1, -2, -8, -1, 5, 1, -5, 3, 4, 0, + 6, 5, 2, 2, 6, 4, -7, -8, 2, -1, 1, -3, -6, -2, 3, + -4, -8, -8, -1, -1, 6, 0, -3, -6, -2, -8, 5, -5, -8, -6, + -2, -4, 5, -2, -8, 4, 5, -6, -6, 5, -3, -1, -7, -7, -3, + 0, -7, -5, 1, 3, 0, -7, -5, 4, 6, -3, 2, -2, -1, 0, + -3, 1, -4, -7, -1, -7, -8, 2, 6, 4, -3, 6, 3, -1, 2, + -1, -2, -6, 4, 3, 4, 0, 0, -4, 0, 1, -2, -6, 1, 3, + 4, -4, -8, -6, 5, -5, 2, 5, -6, 1, 4, -3, -3, -2, 1, + -2, -1, 2, -5, 2, -6, 0, 3, -4, 0, -3, 1, 5, 2, -8, + 2, 4, 3, -4, -6, -7, -2, 6, 4, 0, 2, -2, -6, 5, 4, + 3, 6, 5, 1, -7, 1, -5, 5, 3, -8, 2, -8, -3, 6, 0, + 1, 4, 1, 3, -1, 3, 0, 3, 3, -3, 3, -3, -7, -4, 5, + 2, -4, -7, -7, -2, 3, -3, 2, -5, 6, 1, -5, -6, 1, 0, + 2, -3, 3, 0, 2, 6, -7, 2, -8, 0, -3, -3, -1, -3, 3, + 6, 4, -7, -4, -4, 5, -7, -8, -4, 0, -6, 1, -2, 3, 4, + -4, -3, 6, 3, 4, -3, 6, 4, -8, 1, -4, 0, -5, 3, 2, + 2, 5, 4, 5, -7, 1, -2, 4, -1, 6, -4, -1, -8, -5, 3, + -8, -2, -3, -6, -1, 4, -1, -4, 6, -5, -1, 0, 5, -8, -5, + -3, 4, -6, 4, -7, 5, -3, 0, -8, 0, -1, -5, -3, 1, -1, + 2, 5, -2, -3, -1, 0, 4, 0, 0, 5, -2, -4, 6, -3, 6, + -8, 6, 2, -7, -4, -1, 3, 5, -3, -2, 4, -3, 5, 1, 1, + 1, 1, 0, 6, -5, 2, 4, -8, -3, -1, -1, 2, -8, -2, -2, + -5, -8, -8, 0, 1, -1, 3, 1, 3, -7, 0, -2, 2, 0, -8, + -5, 2, 0, 0, 0, -2, 4, -6, 0, -8, 0, 1, -8, 3, 0, + -3, 4, 4, -6, -1, -6, -5, 1, -4, 0, -3, 5, 2, -7, 1, + -6, -1, -4, 3, -2, -1, -2, -4, -6, 0, -3, -7, 1, 3, 5, + 1, -4, -1, 1, -2, 0, 5, -8, 4, -4, -5, -7, 3, -3, -3, + 0, 1, -4, 5, 2, 5, 0, -3, -3, -5, -2, 1, 2, -3, -4, + -8, -3, 6, -6, -3, 0, -6, 3, 6, 0, 6, 1, -7, 5, 2, + -6, -2, -8, 4, 3, -4, -6, 4, -8, 6, -8, 5, 0, -6, 3, + 3, -5, 1, -6, -7, 0, 1, -1, 2, -4, -2, -6, 2, 6, -6, + -4, -3, 1, -8, 2, -1, 4, -4, -7, 6, -6, 3, 5, 2, 5, + 2, -6, -1, -2, -3, 1, -1, 6, -7, 1, 0, 3, 0, 0, -8, + 3, -4, 5, 6, -3, 0, -1, -6, -6, 3, -7, -6, -5, -4, 0, + 5, 3, 1, -5, -8, -6, 3, 4, -6, -3, -3, 0, -8, -3, 2, + -4, -5, 0, 3, 3, -5, 4, -3, -7, -3, 5, 2, -5, -3, -7, + -4, -3, 4, 0, 3, -2, -2, 4, 1, 0, -3, -1, -7, -5, -5, + -3, -8, 4, -2, -8, -6, -3, 3, -3, -4, -3, -2, 6, -7, -7, + 2, -2, 6, 4, -5, -2, 6, -2, -5, 5, 3, -2, -4, 3, -3, + -2, -3, -6, -7, -4, 2, -8, -8, 2, 6, -1, 5, -2, 4, -8, + 3, 6, -6, -7, -4, -7, 1, 4, -8, -4, -6, 5, 4, -8, -1, + -8, -6, -1, 5, 4, -1, 0, 3, 5, 0, 2, -4, -5, -8, 0, + -2, 6, 6, 3, 3, -7, 0, 5, 2, 3, -3, -6, 6, 6, -3, + -4, -6, 4, -5, -5, -2, 6, 0, -1, 5, -3, -4, -8, -7, -5, + -8, -3, 0, 6, -3, 4, 2, 0, 2, 5, 0, -5, -1, -3, 0, + -1, -3, 6, 0, -2, -4, 0, -6, -7, -7, -4, -5, -2, 2, 6, + 4, 5, -8, -8, -1, -3, 1, -7, -1, 5, -3, -4, 0, -3, 1, + 0, 5, -6, 0, 5, -1, -3, 2, -5, 3, -6, 6, 1, -4, 4, + 3, 4, -5, -1, 0, -4, 1, 0, -3, -6, -7, 3, 4, 4, 4, + -1, -8, 1, -6, -7, -8, -1, 2, -6, -8, -8, 5, 2, 4, 1, + -7, -8, -8, 6, 5, -4, 2, -6, 5, 5, -7, -4, 3, -3, 5, + 3, 4, 2, -1, 4, -4, -4, -2, 2, 1, 5, -6, 0, 4, -2, + -8, -8, -1, -3, -7, -2, -1, -1, -6, 5, 5, 5, -6, 4, 0, + -2, -2, 1, -5, -4, 1, -2, 3, 3, -8, -4, -7, -7, -2, -6, + 1, 5, -1, 2, 3, -4, 1, -3, 1, 1, 1, -8, -3, 3, 2, + -7, 5, 1, -1, 0, -1, -7, 0, 3, -3, 2, -5, 1, -3, 1, + 6, 5, -6, -3, -6, 3, -1, 6, -6, -3, 2, 3, -4, -5, -8, + 5, -3, 4, -2, -1, -4, 4, -2, -7, 5, -2, -7, 3, -3, 2, + -1, 4, -1, 2, 5, 3, -7, -2, -5, -5, 3, -7, 5, 0, 5, + -1, -7, -3, -1, 0, -2, -8, 3, 1, -4, -8, -3, 6, 0, -6, + 4, -8, 2, -4, 6, 5, 2, 4, -6, 2, 5, 3, -6, -3, 5, + -4, -7, 0, -8, -6, -1, -2, 0, 5, 6, 0, 3, 2, -1, -3, + -3, 6, 4, 2, -3, -8, 5, -3, -1, -4, 0, -2, 2, 6, -2, + 2, -3, 1, 4, -4, -1, -5, -3, 6, -2, -6, -8, 0, -8, 2, + 4, 0, -3, 3, 0, -3, -6, -5, -3, 6, 5, -1, -2, -6, 1, + -1, 5, -5, -4, -6, -7, 3, -7, 5, 5, 1, 6, 3, -3, -2, + -4, 0, -1, 5, 1, 6, 6, -5, 3, -5, -4, -3, -5, -3, -1, + 3, -5, 6, -1, 4, 4, -1, -5, -3, 5, 2, -7, 2, -8, -6, + -8, -5, 4, 0, -6, 1, -7, 1, -1, 6, 2, 5, 2, -5, 2, + -8, -3, 1, -7, -8, -3, -5, -6, -5, -8, 0, -6, 6, 1, -1, + -6, -4, -6, -3, 6, -3, -4, -3, -7, 4, -7, -4, -7, -1, -6, + 6, 0, 4, -6, -8, -1, 3, 3, 5, 4, 3, -2, 2, 5, 4, + -7, -6, 0, -5, -5, 0, 2, -3, -6, -8, -2, 4, 0, -6, -2, + 6, -2, 5, 3, 3, 0, -6, -3, -1, -6, -3, 6, -2, 5, 0, + 0, -6, 3, 1, 5, -6, 1, -8, -7, 3, 4, -5, -6, 1, -4, + -7, -3, 6, 1, -4, -4, 5, -1, 1, 2, 3, 2, -2, 6, -4, + -2, -5, 3, -3, -7, 3, -8, 0, 0, 1, 6, -2, 2, 3, 1, + -5, 3, -6, -8, 2, -1, -3, -3, 2, -6, -8, -3, -7, 0, 3, + 4, -6, 2, 3, -4, -4, 6, -6, 2, 5, 3, 3, -6, 5, 6, + -5, -7, -5, 5, 3, 4, -6, 4, 6, -4, 2, -8, 5, -8, 2, + -6, 4, -6, 6, 1, -2, 6, -3, -3, -1, -2, -3, -7, -8, -4, + 0, -3, -6, -7, 0, 5, -1, 5, -2, -7, -4, 2, -5, 6, 1, + 4, 0, -4, -2, 5, -2, -4, 4, -5, 2, -3, -6, 6, -7, 4, + -1, 2, 6, 6, 0, 1, 3, -3, -3, 4, 1, -7, 0, 0, -6, + -6, -1, 5, 4, 2, 2, 2, 0, -7, 5, 4, -8, 1, -1, -5, + -1, -1, 2, 0, -4, 6, 1, 4, -2, -3, -4, 2, -8, -6, -7, + -8, -8, -1, -1, -2, -7, -3, -7, 5, -6, 6, 5, -6, 3, 0, + -6, 0, 0, 0, -7, -7, -7, -3, -1, -6, -3, 5, -4, -2, -6, + 1, 3, 2, -7, 0, -1, -8, -2, -3, -4, -7, 4, 1, -7, -1, + 2, -4, 1, -2, -2, -5, 1, -6, -8, -3, -1, -5, -2, 0, 1, + 0, -3, 3, -2, -4, 5, -4, -3, 6, 1, -5, -2, -4, -2, 6, + -8, -6, -4, 2, -3, 6, -2, -1, -4, -7, -1, -6, -5, 4, -8, + -2, 6, 3, -8, 2, -3, -8, -7, 4, 6, 6, 3, 6, 4, -5, + -2, -1, -1, -6, -7, 5, 6, -8, -7, -3, -7, 0, -1, 4, -7, + -6, 0, -1, 6, -3, 5, -6, -4, 6, 4, 6, 3, -6, -4, 6, + 1, -7, -1, -4, -7, 5, -3, -1, -8, -5, -3, 4, 5, -3, -4, + 0, -6, -7, -7, 6, -4, -5, 6, 4, 0, -4, 2, 4, -6, 2, + -6, 3, 1, -4, -8, 6, -4, 4, -7, 4, -2, -2, -7, 6, -4, + 6, 4, 0, 3, 1, 0, 3, 0, -2, 4, -1, -3, 0, 5, -2, + 0, -6, -5, -4, -8, 5, 0, -2, 3, -3, 4, -7, -4, -8, 1, + 0, 4, -6, -7, 0, 1, -6, 4, -5, 5, -2, 0, -5, 1, 4, + -6, 1, -5, -1, -1, -5, -1, -6, 4, 1, -6, 1, -2, 1, 6, + -5, -1, 5, -1, 3, 4, 3, -1, -2, 5, 3, -3, -1, 2, -1, + 0, -1, -3, -5, -6, 6, 5, -4, 1, -6, -1, 5, 1, 0, -2, + -5, -2, 1, -6, 1, -4, 3, 6, 1, -2, -3, -1, 4, -6, 3, + -5, 5, -7, -5, 3, -8, -2, -1, -2, -8, -2, -3, 2, -7, 4, + -7, -1, 4, -6, 6, -3, 5, 6, -6, 1, -7, 3, 1, 1, -1, + 5, 0, 2, -7, 1, -8, 4, -4, -3, -1, 0, -7, 5, -1, 0, + 1, -4, -7, 0, -3, -1, 4, -8, -2, -8, -7, -1, 5, 4, 2, + 5, 4, 6, -1, 5, -2, 4, -3, -7, 0, 6, -6, -1, -1, 3, + -6, -6, 3, 3, -4, 4, 5, -7, -3, -8, 4, -4, 4, -7, 5, + -3, 3, -7, -1, -3, -8, -6, -3, -4, 1, 4, -7, 2, -6, -1, + 0, 4, -4, 6, -7, 2, 0, 2, -1, -5, 2, -5, 5, 1, 3, + 2, 4, 3, -1, 6, -4, 4, 1, 4, 1, 4, -7, 5, 1, 0, + -3, 0, 1, -5, -8, -6, 3, -7, 1, -4, -1, 4, -6, -8, -3, + -1, -2, -5, 5, 4, 3, 0, -8, 1, -3, -1, 3, -5, 6, -6, + -5, 0, -5, 0, -3, 6, 3, -8, -5, -5, -1, 5, -7, -8, -2, + -8, -3, -1, -1, -8, -2, 3, -6, -4, -1, 5, -2, 6, 5, 2, + -3, -6, -7, -3, -3, -5, -4, -6, 0, 4, -7, -6, -7, -5, -3, + 6, -1, 5, 5, -4, -3, -5, -8, 6, -3, 1, 2, -8, 2, -3, + -7, -1, -8, 4, -5, -1, 5, 5, -7, -2, -6, 4, -5, -6, -7, + 3, 1, 2, 5, 1, 1, -1, -4, -6, 0, -2, -2, 5, 5, -8, + -7, 1, 1, -5, 5, -3, -1, 3, 6, 5, -7, -1, 5, -3, 0, + 0, 3, 1, -8, -4, 0, 2, 4, -3, 6, 3, 6, 2, -4, 0, + -6, -4, 0, 1, 6, 3, 6, 5, -2, 3, 6, 4, 5, 5, 6, + 3, 5, -3, 4, -8, 0, 1, 5, 1, -2, -2, -8, 2, 5, -2, + 0, -6, -1, -3, -8, -7, -2, 1, -8, 0, -3, -2, -4, -7, 1, + 0, -5, 5, 4, -7, -6, 5, -8, -4, -6, 4, 1, 1, -5, -6, + -7, 4, -6, 3, 1, 4, 6, 5, -8, -1, 3, -6, 5, 3, 6, + 2, -8, -8, -6, -1, -8, 0, 2, 2, -2, 5, -6, 4, -8, -8, + -5, 1, 0, -6, -6, -1, -1, 2, 1, 0, 3, 0, 0, -5, -2, + 5, -7, -6, -1, 5, 3, -1, 1, 0, 3, -1, 5, -6, -7, -5, + 3, 1, 4, 3, -5, 5, 0, 1, 1, -7, -5, 5, -5, 6, 1, + 6, 1, -4, 5, 2, -7, -8, 3, 0, 4, 5, 4, -4, 2, 3, + -4, 1, 3, 2, 0, 3, 6, 3, -4, -4, -5, 6, 4, -2, 2, + -1, 3, 5, -3, 5, 3, -4, -3, 0, -4, -4, 2, 0, 6, -8, + -4, 5, 5, -2, -2, 1, -7, -3, 5, -4, -2, -7, 0, 4, -1, + -6, 1, 1, -6, 1, 1, -3, -5, 0, 1, -6, 4, -5, -5, 5, + -7, -1, -4, -5, -6, -6, 2, -1, -1, 0, 4, -8, -6, 4, 0, + 4, -4, 0, 1, 2, -2, -1, 1, -6, 1, -8, 0, -5, -2, -4, + 3, -6, -2, 3, 0, 3, -8, -2, -7, -3, 3, 3, 6, 1, 2, + 5, 3, 2, -5, -8, -5, -5, 1, 3, -2, 1, 6, 5, 4, -1, + 4, -3, 6, -7, 1, 6, -8, -1, -3, 4, 2, -2, 5, -2, 1, + 5, 4, 6, 4, -3, -3, 5, 3, -3, -8, 4, -7, -2, -2, -8, + -8, -6, 5, 4, -7, 4, 5, 2, 2, 0, 1, -6, -8, 0, -8, + 1, 4, 3, 1, 1, -1, 4, 1, 5, 0, 2, -3, 6, 2, -5, + 4, 4, -4, -5, 3, -5, 1, 3, -3, 4, 5, -7, 5, 0, -5, + 4, 3, 1, -2, 2, -6, -2, 5, 6, -3, 3, -8, 1, 4, -3, + -8, -5, -5, -1, 0, -4, 0, 6, 4, 5, 3, -1, 3, -1, -8, + -6, 3, 6, -2, -3, -7, 2, -6, -6, 0, 3, -4, 1, -6, 5, + -2, 5, -8, -1, 3, 0, 2, 3, 2, 6, 5, 3, 2, 0, -1, + 4, 5, -6, 5, -5, -4, -5, -8, 5, 5, -1, -2, 5, -8, 0, + -2, 2, 3, 2, 4, 2, -6, -4, -6, -2, -3, -7, -3, 4, -7, + -7, 5, 2, -8, 1, 2, -8, 4, 2, 4, -1, -6, 5, -6, 4, + -5, 0, -3, -5, -1, 0, 0, -3, -7, 1, 3, 6, 6, -7, 6, + -3, 4, 4, -5, 0, -1, 3, -7, 0, -1, -6, -3, -2, 4, 5, + 2, 1, 6, 4, 4, 0, 5, -3, 3, 2, -6, -5, -2, 5, 2, + 0, 6, 3, 4, -1, 3, 0, 6, -2, -4, -3, 6, 5, -5, 6, + -4, -4, 3, -1, -4, 5, 4, -6, 1, 6, -4, -2, 5, 2, 4, + 5, -8, 1, 6, 1, 3, -2, 4, -4, 2, -4, 2, -7, 0, 1, + 3, -1, -5, -5, 2, -5, -5, 4, 4, -3, 2, -4, 5, -7, 4, + 1, -2, 0, -5, -2, 1, -3, -2, -4, 3, 1, 3, -3, 5, -6, + -8, -8, 5, 6, -6, -6, -4, -3, 4, -3, 2, -4, -6, -7, -7, + -1, 4, 1, 0, 3, -4, 3, 6, -2, 1, -2, 0, -1, -5, -1, + -6, 5, 6, 1, 5, -2, 0, 5, 1, 5, 2, 2, -3, -6, -4, + -8, -8, 0, -2, 3, -4, -5, -1, -6, -3, -1, 5, -2, 0, 6, + 3, 2, 5, 2, -8, -2, -8, 0, -1, 1, -8, -5, -1, 2, 1, + 4, 0, -1, -7, 1, -4, -2, 4, -3, -4, -8, 4, -6, 1, 6, + -7, -2, -6, -5, 3, -7, -6, -3, 2, 5, -3, -2, 1, 2, 3, + 3, 4, -2, 2, -2, 0, 2, -8, -1, -5, -4, -4, -4, -7, 3, + 4, 1, -6, -3, 2, -4, 5, -8, -6, -8, 6, -4, 6, 3, -8, + 4, 4, 2, -6, 0, -2, -7, 3, -6, 6, 1, -4, 2, 5, -1, + -2, 2, 3, -7, -3, -5, -3, -4, -5, -2, 2, 1, -1, 1, 6, + -6, -4, -8, 5, -4, -8, 5, -2, 6, 2, -2, 1, 4, 0, 1, + -6, 2, 3, -1, 5, -4, 6, 6, 4, 4, -8, 2, -5, 6, -5, + -3, 3, -7, -6, -8, 5, -7, -8, -8, -1, 2, -2, -1, 6, 3, + 1, 0, 2, -6, -5, -6, 6, 6, 0, -5, 6, -3, -8, 4, -1, + -1, -1, 6, 4, -7, -4, 3, 5, 0, 3, 0, 4, -6, 0, 6, + -7, 6, 6, 2, -4, -3, -1, 0, -5, 6, -3, 2, 1, -3, -8, + -2, 3, 3, 2, -1, 3, 1, -2, -1, -4, -6, 2, 1, -7, 1, + -3, -1, 5, 2, -8, -4, -6, -5, 1, -1, -7, 1, 2, 0, -2, + 1, 5, -3, 6, -7, -6, 4, 5, 0, -4, 6, 2, -6, 1, -8, + 5, 6, -2, 3, -6, -7, -5, 1, -7, -3, 6, 5, -7, -3, -4, + -6, 0, -6, -7, -6, 0, -4, -1, -8, -3, -6, -8, -7, 0, -2, + 1, 2, -6, -8, -3, 0, 0, 2, -3, -6, 1, -5, -1, 5, 6, + -5, 3, -2, 2, 4, 3, 3, 5, 6, 6, -6, 5, -2, 1, 4, + 1, -4, -8, -3, 3, 3, -7, 3, -3, -7, 6, 0, 4, -5, -8, + -3, 5, 1, -8, -2, 5, 5, 0, 1, 0, -8, 3, -7, -5, 3, + 6, -5, -4, -3, -2, 1, 2, -7, -7, 2, 6, 5, -5, -3, -1, + -7, 3, 6, 3, -8, -7, 6, -3, 4, 2, -1, -6, -5, 5, -6, + -4, 4, -6, -5, 2, -3, -8, 2, -6, -1, -8, -4, 0, -3, 5, + -4, 1, 6, -3, -2, -8, -3, -6, -3, -3, -2, 6, 2, -6, -5, + -3, 2, -1, -6, 3, -1, -8, -1, -8, 1, 4, -8, 6, -2, 5, + 6, -5, -6, 4, -2, 5, 0, -1, -5, 3, 6, 5, -5, -6, -5, + -3, 5, -8, 1, 4, -1, -3, 6, 6, -4, 2, -5, 3, 1, 4, + -3, 0, -6, -4, 4, -6, -1, 4, 5, 0, -5, -7, -5, 2, 0, + 0, 2, 0, 1, 5, 0, -2, -5, 6, -3, -4, 0, 2, 4, -7, + -7, -6, 4, -8, 6, -8, 2, -4, 2, -2, 1, -6, 1, 0, 1, + 0, 0, -5, 2, 4, -1, -4, 4, 6, 3, 6, 0, 6, 3, -1, + -1, -8, 3, -2, 2, -1, -2, -7, 0, 2, -4, -8, -3, -3, 4, + 3, -2, -7, 4, -1, 2, 4, -1, -2, -7, 5, -2, 1, 6, 5, + -3, 6, 0, 6, 5, -1, -2, 5, 4, -3, 0, -7, 2, -6, 5, + -4, -6, 3, 0, 4, -5, -4, 4, -2, -8, -2, -7, -8, 1, -4, + -3, -5, -3, 3, -5, -3, 1, -3, -4, -4, 3, 2, -3, -2, -2, + -8, 0, 0, -2, -3, -5, -8, -4, 3, 0, -1, 3, -1, 3, 3, + 0, 4, -4, 0, 1, -3, 1, 1, -3, 0, -4, -7, 4, 2, 3, + 5, 0, 6, -3, 3, -7, 1, -3, -7, 5, -1, -2, -7, 2, -4, + -3, -2, -3, 4, 5, 3, 3, -6, 0, -2, 5, -7, -2, -3, -4, + 3, -4, -1, -3, -4, 6, 3, 3, -4, -8, -4, -7, 4, -1, 1, + 0, -2, 3, -6, -6, -1, -2, -4, -6, 1, -5, -5, 6, 6, -6, + -2, 6, 5, -5, -7, -6, 4, 5, 6, 1, -1, -1, 1, -3, -3, + 0, 4, -5, 1, 6, 6, 0, 3, -2, -5, -6, 3, -8, -3, 2, + -4, 6, 6, 2, 3, -7, 1, -6, -5, -3, -1, -7, 6, -4, -1, + -8, 0, 1, -2, -4, 4, 5, -7, 6, -6, 6, -1, -3, 0, -6, + -2, 1, -1, -4, -2, -6, -4, 3, -8, -7, -5, 5, 6, 2, 4, + 2, -8, 6, -1, -8, -3, -1, -7, 4, 6, 2, 4, 0, 4, 1, + -7, 4, -3, -5, 4, -3, 4, -2, 2, -8, -5, 2, 4, -6, 4, + -3, 2, 0, -1, -2, -3, 0, 3, 4, -4, 4, 5, -4, 2, -2, + 1, -5, -2, -4, -6, 6, -6, 0, -6, 3, -8, 6, -2, -6, 0, + -8, -3, -4, 1, 1, -7, 3, 1, -7, 6, -8, -7, -3, 1, -3, + 5, 4, -1, -3, 2, 2, -7, -3, -1, -2, 2, 6, 4, -8, -5, + -4, 0, -3, 3, 2, 4, -1, -2, -1, 4, 5, -4, -2, -5, -4, + -3, 0, 6, -4, -3, -5, -5, -4, 5, -6, -2, 3, -4, -6, -8, + 3, -1, -7, -8, -1, 6, -5, 4, -1, 3, -7, -4, -8, 2, 2, + -5, 2, 2, 0, -5, 6, 3, -4, -3, 0, -2, -3, -7, -5, -2, + 6, 0, -4, 6, 1, 1, 4, -6, 3, 3, -8, 0, -1, -7, 5, + 5, 4, 1, -7, 4, 0, -1, 6, 2, 5, 1, 2, -7, -7, -6, + 1, -1, -5, -5, 5, -7, -2, -7, 3, -1, -7, -2, 0, -3, 3, + 0, 0, -4, 4, 5, 3, -8, -3, -6, -1, 2, 2, -1, 3, -7, + 5, 0, 4, 3, -1, -8, -7, -5, -5, -5, 2, 0, -3, -3, 1, + -4, 3, 4, 5, 1, 6, -1, -8, -2, 1, -8, -4, -2, 3, -4, + 0, -2, -2, -1, 4, -6, 3, -4, -3, 6, 6, 5, -7, -1, -8, + -2, 2, 6, -7, 6, -3, -2, -1, 4, -7, -2, -6, 2, 5, 6, + 1, 2, 1, -6, -2, 4, -1, 5, -2, -3, -3, 0, -2, 0, 6, + -5, -1, -1, -7, -8, 0, 4, -3, -5, -8, 1, 3, -5, -3, 1, + -8, 4, -7, 4, 6, 3, -3, 6, -2, -5, -7, -3, 0, 0, 2, + -3, 0, 4, 2, -7, -6, 6, 1, -2, -5, 4, -7, 5, -1, -8, + -1, 3, -3, -5, 5, -3, -8, -4, -1, -2, -3, -4, 6, 5, -5, + -8, 5, 5, -1, -1, -3, -5, 6, -8, -6, 2, -5, -4, 0, -4, + -7, -3, -4, -8, -5, 4, -3, 1, -1, -1, -3, -3, -2, -6, 5, + 0, -5, 3, 3, -3, -6, -2, 2, -5, -5, -7, -3, -7, -5, -3, + -1, -6, -2, -7, 2, -8, -4, -8, 3, 5, -1, 2, 2, -4, 1, + -8, 2, -2, -7, -1, 3, -3, -4, -7, 3, -8, 1, 3, -5, -6, + -8, -5, 2, -4, -7, 6, 4, -2, -7, -7, -1, -2, 4, 2, -1, + 3, 5, 2, 1, -2, -5, -7, -1, 1, -1, -7, 6, -7, 0, 4, + 3, -6, 4, -3, 6, -4, 1, 1, -8, 3, 6, -7, 5, -3, -3, + -5, 5, 4, 4, 3, -1, 6, -5, 2, 2, -5, -8, 0, 4, -3, + 0, 1, 5, -6, 2, 6, -3, -3, -7, 0, 0, -4, -1, 1, -3, + -2, 4, 4, -4, -2, -8, -5, -8, 0, -3, -2, -8, -2, -5, 5, + -6, -5, 0, -4, -1, 6, -2, -8, 6, 0, -6, 3, 5, 4, 4, + -1, -2, -1, 0, 5, 0, 0, -8, 4, -3, 6, 5, 6, 4, -3, + 5, -2, 4, -2, -1, -2, 3, -4, -6, -7, 5, -3, -8, -6, 4, + 0, -4, -1, -6, 2, -8, -7, -4, 5, -1, 5, 1, -4, 1, 6, + -1, 2, 6, -3, -4, 2, -5, 3, 2, 5, -6, -2, -4, -7, -1, + -1, -2, -1, -1, -1, -7, 5, -2, -7, 2, 6, 4, -8, -1, -5, + 0, -3, -2, 5, 1, 5, -7, -7, 5, -6, -8, 1, -8, -2, 5, + -1, -2, 3, -4, -5, 4, 4, 0, 0, 6, 3, -7, -8, 6, -7, + -8, 0, 5, 3, -3, 2, -4, -4, 5, -1, 1, -8, 2, -2, 3, + -8, -1, 6, -6, -5, -8, -5, -1, 6, -7, 1, 3, -7, 6, 4, + 1, -4, 1, 4, 0, 5, -7, 5, -4, -2, -8, -3, -2, 1, 2, + -2, 4, 0, 5, -3, -4, 5, 5, -4, -3, 3, -7, -7, 4, 6, + -6, -2, -4, -7, 6, 4, -7, 5, -3, 3, -6, 6, 0, 5, 1, + 0, -1, -3, -1, -4, 5, -1, -5, -1, -3, -1, 0, 5, -6, -1, + -3, 6, 4, -1, -4, -6, 3, 1, -7, -2, 0, 0, -8, 3, -1, + 0, 5, -5, -3, -5, -1, -7, 3, -4, 2, -3, -8, -7, 0, 5, + -7, 0, 5, 6, -8, -2, -8, 4, -8, 0, -7, 3, -6, 3, -8, + 0, 4, 1, 4, -8, 5, -8, -8, -3, 1, 4, -3, 4, -3, 3, + -7, 1, -5, -3, -7, -2, 3, -6, -8, 4, -2, 6, 6, -7, -4, + -4, 2, 1, -1, 0, 6, -2, -5, -7, 4, -8, 6, 2, -1, 2, + 6, 0, -6, -2, 4, 3, 5, -8, 4, 4, 2, -5, 3, 0, 5, + -5, 4, -3, -2, -1, -5, -3, 4, 6, -5, -4, -4, -7, 2, -7, + 5, -6, 1, -7, -7, -4, -8, 3, -6, -1, -3, -2, -1, 3, -5, + -5, 4, 1, -4, 4, -1, -6, 3, -8, -2, 3, 2, -5, -1, 6, + 3, 1, 6, 0, -1, -5, 5, 5, 4, 1, -8, -1, 6, 0, 5, + -5, -4, -6, -3, -4, 3, -6, -7, -6, 5, 0, 6, -8, 5, 3, + 4, -3, 5, -1, 1, 6, 3, -7, 2, -6, 6, -5, 3, 3, -7, + 3, -7, 1, 2, -4, 4, -8, -7, 4, 4, 1, -2, 5, 6, -5, + -4, -6, 3, -3, 5, -3, 3, -8, 4, -5, -7, 2, -2, -3, 0, + -4, 0, -8, 3, -2, 4, 2, 4, 5, 4, 3, -1, 3, 4, 6, + -2, 2, -1, 6, -5, 2, -1, -6, -8, -6, 6, -1, 3, -4, -3, + -1, -2, -7, 3, 0, -6, -1, 1, -8, -5, -6, -7, 2, 5, -3, + 2, 4, 6, -8, -8, 5, -2, -6, -4, 0, -2, -1, 4, 4, -8, + 0, 3, 1, -8, 1, 1, 3, 0, -7, 1, -2, 6, 5, 5, -4, + -3, 4, 5, 1, -4, -5, 2, -2, -4, 2, -6, -2, -3, -6, 6, + -3, 4, -3, 4, -1, -8, 3, -8, -6, 4, -4, 6, 2, 2, -6, + 0, -6, -1, 0, -4, -5, -5, -7, 0, -5, 4, -8, -4, -6, -4, + 1, -6, 4, -3, 5, -6, -1, -7, 2, 2, 1, -3, 2, 4, -6, + 1, 0, -6, -7, 4, 3, -6, -8, -6, -8, 4, 3, -3, -8, -2, + 1, -4, -4, 2, -2, -2, 1, -5, 4, 4, -5, -4, -2, -3, -4, + -2, 6, -3, 1, -1, 2, 3, 3, 4, -2, -2, -4, -6, 4, -3, + 5, 3, 6, -4, -7, 4, 2, -1, -5, 2, -3, 5, -4, 4, -2, + -4, 0, 3, -7, 0, 5, -8, 0, -5, 1, 5, 4, -7, 6, -6, + 2, 1, -4, -3, 3, -5, 0, 3, -7, 0, -8, -6, -7, -4, 0, + -5, 5, 6, 3, 1, 1, 2, -8, 5, 0, 6, 2, -8, -4, -7, + -7, 2, -3, -4, -7, 4, 0, 6, -6, 6, 0, -2, 6, -4, -1, + 4, 6, 6, 2, -5, -7, 3, 4, 0, 2, -6, 5, -2, -4, 5, + 0, -6, -4, -3, -1, -2, -3, 6, -5, -2, -7, 3, 3, -8, -7, + -1, 3, 0, -8, 6, -7, -1, -4, 1, -1, -2, -7, -4, -1, -2, + 4, -4, 5, -3, 2, 2, -2, 4, 2, -5, 0, -1, 1, -4, 3, + 3, -6, -3, 6, 0, 4, -5, 5, -8, -5, 2, -6, -4, -4, -6, + -5, -4, -8, -2, -2, 3, 6, -5, -7, 3, -7, -7, 3, 5, -2, + 1, -6, -6, 0, 2, -8, -7, -2, 0, 3, 4, -2, -2, -3, 4, + -6, 1, 5, -8, -2, -3, -7, 2, -4, -5, -5, -1, -7, -6, -5, + -1, -3, 4, -5, -7, -6, -5, -4, 2, -3, -1, -7, -8, -8, 1, + -5, -3, 0, -8, -4, -4, -7, 4, 4, -4, -7, -7, 1, 1, 5, + 1, -6, 0, 3, 0, 2, 4, -1, 2, 5, -6, -8, 3, -7, -8, + -5, 4, 3, -5, 6, 0, -2, -5, 1, -2, -8, -2, 5, -6, -7, + -6, -3, -7, 0, 5, -4, 3, -1, 3, -8, -2, -3, -6, 0, -4, + -1, -6, 3, 4, -5, 0, 1, 5, 0, -8, -4, 3, -8, 4, -1, + -6, 2, -2, 4, 5, -6, 4, -7, -6, -4, -3, -3, -5, 5, -4, + -3, 5, 2, 2, -5, -5, 3, 1, -2, 5, -3, -4, -8, -6, -8, + -7, -4, 3, -5, 1, -1, -2, -3, -6, 5, -5, -2, 0, 0, 3, + 4, 6, -4, 1, 1, -1, -6, 2, 3, 2, -4, 1, 0, 0, -1, + -7, 5, -1, -3, -5, -7, -8, -2, 1, -6, -4, -8, 0, -4, 5, + 5, -6, 2, -8, -3, 0, -2, -2, -1, 6, 1, 5, -2, 6, 3, + 5, 6, 3, -3, -8, 3, 6, 4, -8, 5, -3, 4, 1, 1, -6, + 3, -4, -8, 2, -6, 6, 6, -5, -1, 5, -4, -8, -4, -6, 6, + -7, 0, -5, 6, -6, -1, 4, 5, 5, -7, -7, 2, 6, 5, 6, + 2, -6, 2, 6, 3, -6, 2, 5, -6, -3, 1, -6, 4, -5, -6, + 1, 3, -5, 1, -4, -2, -2, 2, 2, 5, -4, -7, -2, 4, -8, + 5, -6, -4, -2, -2, -7, -6, -4, -6, -3, 6, 0, -5, 4, 1, + -6, -5, 3, -7, -3, 3, -5, 1, 3, -8, 2, -3, 3, -7, 5, + -6, 5, -2, -2, 4, -5, 3, 1, -3, 2, -8, -5, 2, 0, 2, + 5, -3, -3, -8, 6, 3, -6, -5, -6, 6, -5, -6, -8, -5, 1, + -8, -6, -4, -3, -4, -8, 3, 5, -5, 3, 4, -3, 6, 3, -3, + -4, 1, -1, -3, -6, 6, 3, -3, -6, -5, 4, -1, 5, 0, 3, + 2, -2, -6, -4, -3, 6, 6, -1, -8, 4, -6, 2, 6, -4, 0, + -1, -4, 1, 4, -4, 1, -4, 2, 6, -5, -3, -7, 4, -6, 4, + 4, -5, -6, -7, -6, 1, 2, 0, 2, -8, -7, -8, -8, 0, 0, + 2, -4, -4, -6, 5, -8, -8, -6, 3, 2, 0, 6, -1, 4, 1, + 5, 2, -2, 0, -6, 6, -3, 2, 0, -5, 6, -6, 0, 6, -6, + -8, -7, -3, -2, -8, 0, -3, 6, 4, 1, 6, -4, 3, 5, 2, + -8, 3, -3, -6, -1, 1, 5, -4, -1, -6, 6, 0, -3, 4, 0, + 1, 4, -2, -6, 1, 4, -8, 4, 5, 5, 4, 4, 1, 1, 5, + -6, -4, -8, -4, -1, -8, 6, 1, -7, 1, -2, -6, -2, 1, -4, + 5, 2, 0, -1, -4, -8, -8, 4, -4, -1, -5, -6, -8, -6, -8, + -3, -2, -5, -2, -2, -8, 6, -1, -6, -1, -4, 5, -3, -2, 0, + -4, -1, -1, 0, 1, -6, 5, 3, -3, -4, 1, 4, -6, -8, -5, + 3, -5, 1, -1, -7, 4, -7, -1, -6, -2, -7, 5, -8, -3, -8, + -5, -4, 3, 3, -6, 3, 4, 6, 4, -8, 6, -6, 4, 0, 1, + -7, 1, -2, 4, -1, -1, 1, 3, -1, 1, -8, 2, 1, 0, -8, + -7, 4, -8, -2, -4, 6, -6, -8, -6, -3, 2, 0, -8, 5, 0, + 1, -7, -5, -5, -8, 6, -7, 4, -1, 1, 5, 3, 5, 0, -4, + 5, -8, 6, 5, -8, -8, -3, 1, -1, 4, -2, 2, -5, 1, -4, + -5, -3, 5, 4, -2, 0, -4, 3, -3, -2, 2, 6, 1, 3, -7, + -3, -5, 2, -2, -7, -4, -2, 2, -1, -6, 3, 5, 5, 0, 4, + -8, 2, -8, -2, 3, -7, 2, 4, 2, 2, -3, 4, -3, 1, 2, + 1, 1, -7, 4, 3, -5, 5, -4, 1, 3, 3, -3, 4, -3, 4, + 0, -3, -6, -8, 2, 2, 4, 1, -1, -1, -8, -1, 4, 6, 2, + -1, -2, -1, 3, -4, -7, 0, -4, 2, -8, 5, 4, -4, 5, -6, + -8, -8, -6, -7, -2, -6, -2, -3, -6, -8, 3, -5, -8, -7, -5, + -7, 3, -1, 0, -1, -5, 3, 1, -3, 2, 4, -8, 2, 1, 2, + 5, 2, -4, -4, 1, -7, 5, 6, 0, 4, 6, 5, -3, -1, 4, + 2, -4, 1, -1, -3, -5, 6, 2, -3, -4, -6, -1, 5, 5, -4, + 4, -7, -8, 0, -3, 4, -8, -6, -7, 3, -4, 0, -4, -2, -6, + -8, -5, 4, 3, -6, -6, -1, 5, -1, 4, 4, -3, -4, -8, -3, + 4, 3, 3, 4, 3, 2, 1, -4, 3, -6, 4, 4, 4, 1, -6, + -5, 3, 3, 4, 3, -8, 2, 4, 6, 0, -4, -7, 2, -3, -5, + -7, 0, 3, 5, 4, 2, -2, -1, 2, -2, 5, -7, -4, -3, 0, + -5, 5, -2, 1, 0, 4, -8, -4, 4, 6, -2, -5, 4, 6, 0, + 0, -8, -4, -4, -4, -2, 2, -5, 6, 0, -1, 3, 5, -4, -3, + -8, 0, 5, -2, -2, 1, -6, -7, 4, -6, 6, -2, 2, 1, -8, + 2, 6, 1, -7, 6, 5, 0, -6, -7, -4, -7, 3, -8, 2, -7, + -4, 1, 6, -8, 3, -7, -5, -7, 0, -5, 0, 4, 3, -6, -3, + -6, 5, 1, -6, 6, 1, -6, -3, -6, 1, 6, -5, -1, -1, 3, + -1, 2, 2, -1, 3, 1, 6, 4, -3, -8, -5, 1, 2, -8, -7, + -7, -2, 0, 3, -7, -3, 4, -8, -1, -8, -3, 2, -1, 4, 4, + 3, -8, 6, 3, -2, -4, -4, -3, -6, -3, -6, 1, -4, -1, 3, + -2, -2, -8, -4, -2, 1, -4, -6, -6, -6, 2, 1, -1, 2, -7, + 0, -5, -1, 0, -5, -2, -2, 0, -2, -2, -1, 1, -4, 0, -8, + -8, 5, 6, 5, -2, -8, 6, -8, -6, 3, 0, 5, -3, 1, -8, + -5, -7, -1, -3, 1, 3, 6, -5, -4, 5, -1, -8, -8, 4, -4, + -1, 1, -3, -5, -7, -2, 6, 5, 4, -5, 4, 0, -3, 4, 1, + -1, 6, 2, -4, 6, 4, -6, 4, 3, -8, 3, -4, -3, -7, -4, + -4, 2, 5, 5, -2, 6, 0, 3, -2, -3, 0, -7, -5, -7, 5, + 3, 4, 4, 5, 4, 5, 0, 1, -5, -4, 2, -2, 5, -3, 1, + -3, 5, -1, 6, -4, 6, 4, -1, -1, 3, 1, -7, -6, -1, -6, + 2, -7, -6, 0, 5, -3, -8, -6, -1, -4, -3, -7, -8, 2, -5, + 5, -6, -2, 3, 5, 6, 6, -2, 6, 1, 5, 0, -5, -8, -1, + -1, 1, -4, 0, 2, -3, 0, 1, -3, -5, 3, 3, 4, 6, -6, + -7, -7, -2, 1, 0, -1, 2, 1, 0, 5, 5, 5, -6, 5, -2, + -2, -3, -8, -3, 0, 1, 6, 4, -6, -3, -4, -7, 6, -1, -4, + -8, 3, 3, 3, 2, -3, -7, -6, 3, -7, 4, 2, -8, 4, -8, + 0, -4, -8, -7, 6, 6, -2, 0, 2, 2, -8, -8, 1, -1, -7, + 3, -5, -8, -2, -8, -8, -6, -3, -7, -4, 6, 0, 6, -7, 0, + -3, -8, -4, -3, 0, 4, 5, -3, 5, -1, 3, -2, 2, 5, -6, + -4, 3, -4, 0, -2, 1, -4, -6, -3, -5, -6, 6, -2, 0, 1, + 1, -2, 5, -4, 1, -2, 2, -7, 5, -5, 0, 2, 6, -3, -3, + 2, 0, -4, -6, -3, 5, -8, 0, -5, 0, -1, -7, -1, 1, -3, + -1, -5, 2, -2, -8, -4, 1, -7, 2, 3, -3, -4, -2, 1, 6, + 5, 6, 3, 3, -5, -6, -6, 2, -4, 1, 2, 6, -2, -1, -2, + 6, -1, -5, -7, -1, 2, -5, 4, 1, -5, 6, -8, -7, -3, 0, + 2, 0, -1, -3, 6, -1, -7, 2, -5, -5, -4, -3, -7, -7, -1, + 0, 6, 0, 5, 6, 2, 5, 3, -2, 4, 1, 2, 0, 6, -3, + -1, -6, -1, -3, 1, -8, 3, 0, -8, -8, -8, -3, -7, 6, -3, + 2, -1, -5, -1, 4, 5, 2, -4, 0, -5, -4, -6, -7, -6, 3, + 1, -7, -3, -5, 0, -2, 4, -5, -1, -3, -1, 5, -1, 4, -6, + -5, 4, 1, -1, 2, 3, -4, 6, 5, -8, 0, -3, -5, -3, -7, + -7, 6, -5, -4, -8, 5, -3, 2, 3, 5, -6, -8, -3, -7, -1, + -2, -2, 5, 3, -4, -3, -2, -1, -4, 3, -6, -7, -4, 4, -7, + -2, -7, 0, 6, 1, -4, -1, -8, -3, 3, -8, 1, -3, -6, 5, + 0, 0, -3, -3, -4, -8, 1, -8, -2, -8, -1, 4, 6, 0, -1, + -3, 6, -2, 2, -8, -6, -5, -7, -3, 1, -1, 6, 3, -5, -2, + -7, -5, -8, 1, 0, -5, 2, -5, 1, 3, 6, 1, 3, 4, -3, + 3, -3, -3, -6, 4, -6, 4, -7, 3, -5, -6, 3, -3, -2, -3, + 4, -8, 4, -1, 3, -7, -5, -4, -2, 0, -5, 1, -7, 6, 5, + 3, -5, -3, -3, 4, -3, -1, 3, 1, 2, -5, 3, 1, -8, 4, + -2, -1, 3, 2, -4, -3, -8, -8, -4, -7, 0, -1, 0, -1, 0, + -8, 6, -1, -1, -3, 5, -6, -8, -6, 4, -3, -3, -5, 2, 2, + -6, 1, 1, 0, -5, 3, -7, -2, 0, -6, -7, -6, -1, 0, -4, + 1, -5, 0, -3, 4, -5, -6, 5, 6, 5, 5, 1, -4, 6, -7, + 1, -6, 0, -3, -2, -2, -3, 4, 2, -6, -7, -2, -6, 5, -5, + 4, -2, -8, -1, -6, 2, -4, -2, 6, -4, -5, -1, 0, 5, 0, + -8, 3, 2, 5, 6, 0, -3, 6, -6, -7, 3, -5, -5, -7, -7, + -6, -8, 1, 6, 6, -6, -4, 0, 3, -4, 3, 2, -2, -7, 1, + 3, 3, -3, -4, -2, 3, -2, 6, -5, -2, -3, 6, 0, 1, -1, + 5, -4, 2, -7, 3, 2, -8, -2, -6, 5, -7, -2, 2, 1, 4, + 5, 4, -2, -3, 0, 3, -1, 5, -6, 1, -7, -3, 6, 4, 2, + 1, -4, -5, 0, -6, 2, -5, 1, 1, 1, -3, -5, 3, 3, -8, + -8, 4, -4, -5, -4, 2, -2, 0, 2, 6, -6, 0, -7, 3, -6, + 0, 5, 2, -8, -6, 1, 1, -4, 6, 0, -8, -4, -2, 1, -7, + -7, 6, -8, 5, 1, 4, 3, 0, -5, -1, 5, 2, 4, -5, 6, + 2, -6, -4, 5, 3, 0, -4, -7, -7, -3, 3, 2, -6, -7, -8, + 6, 2, 3, 0, -2, 1, 4, 2, 1, 4, 3, 6, -2, 4, -7, + -7, -3, -7, -5, -1, 0, 2, -6, -8, 3, 1, -7, 2, -4, -2, + 6, 3, -4, 4, 5, 5, -2, -1, 3, 5, -4, -6, 1, -6, -6, + 3, 3, 1, -3, -4, -5, 3, -2, 1, 2, 0, 6, 4, -8, 4, + -5, -6, -5, -2, 2, 2, -1, 1, -7, -6, -7, -2, 1, -2, 1, + -8, -5, -2, 3, 1, 6, -3, -1, 2, 1, -2, -6, 5, -6, 0, + 4, -7, -3, 5, 4, 3, -4, -8, -6, 0, -2, -1, -7, -8, 5, + 1, -1, -8, -6, -2, -5, -7, -2, -8, -8, -7, -2, 0, 4, -2, + -3, 3, -2, 3, 1, -6, -1, -8, 4, -3, -5, 1, 6, -1, 5, + -4, 3, -2, -2, 1, -5, -6, -1, -2, -5, -6, 2, 1, 5, 3, + -3, -8, -6, 3, -2, -8, -4, -1, 3, -7, 3, 2, -8, 3, -1, + 0, 5, 4, 2, -8, 6, 5, -8, 6, -8, -8, -2, -6, 6, -8, + 1, -7, -6, -5, -2, 1, 3, -1, 5, -3, 3, 4, 3, -7, -5, + 1, -2, -4, 3, -2, -1, -4, 3, -6, -4, -3, -4, -1, -1, 0, + 2, -4, -7, 4, 0, 4, -8, 1, -8, 2, 3, 1, 3, 6, -5, + -6, -3, -4, -1, -7, 3, 3, -4, -4, 3, 5, 3, 3, 5, 3, + -5, -8, -7, 6, -7, 5, -1, -5, -7, 4, 2, -4, 0, -4, 5, + 2, -5, 3, 6, 6, 5, -1, -8, 6, -8, -8, -6, 3, -2, -1, + 3, -2, -1, 5, -8, 1, 0, -7, -3, -7, 2, 3, 0, -6, 1, + 2, -4, 3, 6, -8, 0, -5, -4, -5, -5, 0, 1, -8, 1, 5, + 5, 3, 2, -8, 3, 0, 3, 1, -5, 1, 0, -7, -8, 2, 4, + 3, -4, -3, -5, -1, 1, -3, -6, 6, -6, -6, 1, -5, 6, 3, + -6, -6, -5, 1, -8, -2, -1, 5, -2, -8, -4, -1, -8, -7, -8, + 5, 0, -4, -8, -1, -3, 6, 5, 0, 0, 4, -2, -8, 5, 0, + 3, 1, -3, 6, -5, 2, 0, 3, -5, -7, -2, -3, 4, -1, -5, + 6, 2, -6, -6, -3, -6, 0, 5, -3, 5, 4, 5, -7, -8, 4, + -5, 3, 1, 4, 5, -4, 4, 0, 4, -1, -8, 4, -3, 4, 0, + -7, 0, 2, 6, -8, -6, 2, 1, -4, -2, 6, 1, -2, 6, -3, + 2, 4, -8, -4, 0, -2, 4, -5, 6, -1, -6, 3, 5, 4, -4, + 0, 0, 2, 6, -5, 3, -5, 1, -7, 3, -8, 2, 4, 1, -8, + -3, -8, 2, 6, 4, 5, 4, -4, -7, -7, 2, -3, 2, 1, 1, + -5, 5, 3, 5, -6, -2, 0, 6, -8, 3, -6, 1, 2, -5, -1, + -8, 0, -2, 1, -4, 3, -3, 6, 5, -7, 6, -4, -2, -2, -3, + 0, -6, 4, 5, 3, -5, 1, 5, 3, -8, -6, -2, 2, -4, 2, + -5, 2, -7, -4, -6, 6, -1, 0, 0, -4, 5, 4, -8, 1, 6, + -7, 3, 4, 0, -4, -2, -3, 1, -4, -2, -3, -3, 1, -8, 2, + -4, 0, 5, -7, 1, 2, 4, -2, -5, -2, -5, -2, -8, 0, 5, + 6, 1, 2, -3, -2, 1, -2, 1, -4, -3, 0, -4, -2, 1, 1, + 4, -1, -8, -6, 3, 4, -5, 5, 5, 6, -5, -5, -4, 3, 4, + 0, -8, 0, -1, 6, 5, 1, -8, 0, 3, -2, -5, -4, 2, 3, + 3, -4, 0, -6, -6, -3, -4, 5, 0, -8, 6, 5, 3, -8, -3, + 2, -4, 0, -2, -6, 0, 5, -5, -8, 5, -2, 0, 4, 5, 4, + 0, 3, 6, -5, -3, -7, -6, 3, 1, 6, 2, -7, -1, -3, -6, + 3, -6, -1, 6, -5, 6, 4, 2, -2, -2, 3, 2, -3, -5, 1, + 3, 1, -3, -4, 3, 0, -2, -7, 0, -5, -5, -6, -1, -5, -6, + -2, 4, -7, -1, 4, 5, 0, -3, 3, 5, -7, -6, 1, -3, 3, + 3, 4, 0, -7, -4, 6, -1, 0, 4, -8, -5, 5, -8, 4, 1, + -1, -6, 6, -2, 4, -2, 6, 2, -1, -2, 3, 1, -5, -6, -7, + -5, -6, -3, -6, -3, -1, 2, 1, -1, -4, -4, 1, -8, 4, -4, + 2, -4, -6, -8, 3, -8, -1, -1, 4, 0, -1, 4, 6, 4, 5, + -8, 1, 6, -7, 3, -7, -3, -6, 0, 5, -4, 3, 2, -7, -8, + 5, -7, -1, -4, 1, 4, 4, 2, -1, 1, -5, 1, -4, 4, 4, + 4, 2, 2, -8, 0, 0, 5, -4, -1, 3, -1, -4, -4, -6, -3, + -8, 4, 5, 5, -2, -4, -7, -7, 1, -3, 1, -6, 6, 5, -1, + -7, -4, 6, -2, 4, -1, -3, -7, 5, 0, -8, -2, -8, -2, 3, + 1, 1, -6, -3, 2, -1, 0, 5, 1, 3, -5, -6, -8, -6, 4, + -8, -5, 4, 0, -8, 2, 0, -2, 2, -2, -7, -4, 1, 4, -7, + 1, 0, 4, 6, -2, 6, 0, 2, -4, -3, -5, -8, -8, -3, 0, + -7, 3, -8, -8, -2, -2, -3, -7, -6, 4, -3, 3, -1, 6, -7, + 1, 5, 3, -2, -8, 1, 1, 2, -6, 4, -3, -3, 6, -7, 3, + 4, -4, 6, -7, -1, 6, -4, 5, 5, -7, 2, -8, -2, -1, -3, + -8, 2, -1, 4, 2, 3, 0, 2, 5, -6, -7, 2, 0, -6, 4, + 4, -2, 4, -6, 5, 5, 4, -5, 6, 4, -6, -7, -2, -5, 3, + 5, 1, 4, 4, -5, 2, -8, -7, 6, 1, 0, -5, 3, -6, 2, + 0, 5, -8, -7, -7, -8, -6, 0, -5, 6, -7, -5, 1, -5, -1, + -5, -5, -3, 1, 2, 2, 0, -6, 2, 1, -2, -5, -2, -3, 1, + 6, -4, 5, -3, -4, 6, 1, -5, -7, -1, 4, -3, 1, -7, -1, + -2, -4, 6, -7, -2, -5, -2, -4, -3, -1, -6, 1, 4, 1, 3, + 0, 6, -6, -1, 0, -3, 3, -8, 5, 6, -3, -1, 1, -3, 6, + 2, 1, 6, -3, -2, -3, 5, 3, -6, -8, 0, -8, -2, 2, 2, + -2, -3, 6, 5, -1, 3, -4, 5, 3, -2, -5, 0, 5, -2, -5, + 4, 2, -8, 3, 5, -6, 3, 6, -4, -3, -7, 4, -7, -4, -1, + 6, -3, -7, 3, 2, 1, 4, 4, 0, 4, -6, -5, 2, 2, -2, + -8, -6, 3, -4, 2, 0, -1, -5, 5, 5, 3, -4, 1, 0, -8, + 4, -1, 3, -5, -2, 0, -7, -1, -2, -3, 3, 5, 5, -7, -5, + -6, -5, 3, 4, 6, 0, -4, -7, 1, -7, 0, -8, -6, -1, -4, + -7, 5, 0, -6, -8, 5, 3, 6, 3, 6, 2, 1, -5, -5, 5, + 2, 5, -7, -3, 4, 5, -4, -4, -4, 1, 1, 6, 0, -2, -6, + -7, -8, -3, -5, -8, -4, 0, -4, -5, -7, -8, -4, 2, -4, 0, + 1, -5, 6, 2, -1, -7, -2, -7, 6, -5, -3, -4, -3, 3, 5, + -1, -4, -2, 1, 3, 6, 1, -8, -6, -2, -4, 5, -1, 3, 0, + 5, -3, -7, -5, 3, -4, -5, -5, 4, -2, 0, -3, -4, -8, -6, + -3, -8, -8, -3, 5, 6, 5, 3, -6, 4, -7, 2, -3, 6, -8, + 0, 1, 4, 2, -1, -4, -5, 5, 2, -4, -6, -8, 3, 2, -6, + 4, -5, -2, -6, 5, 4, -6, -6, 3, 1, -6, -1, 2, -2, -5, + -5, -3, -1, 4, 5, 0, 1, -4, -4, 2, -8, 6, -5, -4, -3, + -3, 6, -3, -3, 2, 1, -7, 6, 6, 1, -6, -2, 5, -4, -5, + -3, -4, -6, -8, 0, -7, -6, -2, -8, -1, -5, 2, 3, 6, -2, + -3, -2, 4, 1, -3, -4, 1, -6, -5, -1, 5, -8, 0, -7, 0, + 4, 4, 6, -6, 5, 3, -1, 0, -3, -2, -4, -2, -4, 0, -8, + 2, 4, -1, 0, 3, -2, 1, 4, -5, 5, 2, -2, -2, -2, -7, + -4, -6, -4, 2, 4, -3, -4, -3, 6, 2, 1, -8, -4, 6, 2, + 2, 5, -2, 6, -8, -1, 2, -5, 2, 0, 1, -6, -8, -8, -5, + -8, -2, -8, -2, -5, -6, -4, 2, 3, 6, 0, -6, -7, -4, -8, + 3, 2, 4, -6, 1, 6, 3, -2, 4, -3, -2, 5, -6, 3, -8, + -3, 0, -2, -3, -7, 2, -1, 1, -3, -7, -3, 4, 6, -5, -2, + 2, 4, 1, -2, 3, -5, 5, -7, 0, 0, -7, 6, -4, 5, -1, + -4, 6, -5, 5, -4, -5, -2, -5, 4, 1, 5, 6, -5, 0, 3, + -4, 0, 3, 1, 6, -4, 0, -6, -3, 4, -4, -2, -2, -6, -4, + 4, -5, -3, -4, -4, 0, -4, 6, -3, -7, 5, 0, -3, -2, 4, + 6, 3, 6, -8, -3, -4, -8, -3, -3, 4, 6, -2, 2, 5, 0, + 1, -8, -6, 5, 1, -3, -3, -4, -1, 2, -6, 0, -3, -2, 6, + -5, -2, 3, -6, 5, 2, 4, -7, -3, -7, -8, 4, -6, -6, -6, + -8, -5, -6, -3, -3, -3, -7, -3, -1, -1, -2, -4, 0, 1, -5, + 6, -6, -8, -4, 6, -4, -4, -1, 2, 2, -3, 2, 5, 6, -6, + -3, -8, -8, 1, 0, -4, -6, -2, -1, 3, 1, 4, -4, 0, 2, + 4, 4, -6, -6, -7, 5, -8, -7, 5, -8, 6, -6, -6, -8, -1, + -8, -6, -1, -1, -2, 6, 5, -5, -7, -7, 5, 4, 5, 1, -4, + -4, -1, -1, 6, -1, 5, -2, -2, -2, 0, 5, -1, 0, -2, -5, + 4, 5, 0, 3, 6, -4, 0, -3, 3, -3, 6, 5, -7, -4, 5, + 6, -3, 0, 6, 4, -5, -5, 3, 4, -4, -5, 5, 5, -1, -5, + -4, 6, -1, 0, -6, 0, -6, 6, 3, -5, -4, 3, -2, -8, -5, + -7, -8, -1, 6, -3, 5, -1, -4, -2, 3, 4, -4, 6, -4, 1, + 6, -2, -2, 1, -4, -8, 0, 2, 0, 6, -2, -5, 0, -7, -6, + -5, -5, -5, 6, -3, -5, 1, -5, -4, 2, 3, -2, 3, 1, -4, + 3, -6, 4, 0, -3, 6, -3, -7, -2, 5, -1, -5, 4, 1, 2, + 1, 0, -8, 4, 5, -8, 6, 0, -2, -7, 6, -5, -5, -4, -2, + -6, -2, -2, 5, 5, -1, -6, -3, 2, -1, 2, -2, -7, -8, 4, + -3, -3, 5, 2, 1, 3, -8, 4, 2, 6, -4, 1, -2, -5, -3, + 2, -4, 2, -1, 5, 3, -8, 6, 5, 3, -3, 0, -7, 0, -7, + 4, -2, -4, -3, -4, -4, -3, 4, 4, -2, 2, 6, -5, 4, 0, + -8, -4, 4, 1, 5, -5, -2, 0, -8, -5, 6, 3, -7, 6, -5, + -2, 4, 6, 3, -4, -2, -3, -6, 1, 3, 6, 1, -8, 4, 6, + 4, 2, -2, 0, -3, 4, -4, -2, -5, 6, 6, -7, 5, 2, -5, + -8, 4, 2, 1, 5, -6, -5, 3, -7, 4, 5, 4, 5, -2, 6, + -8, -7, 2, -8, -6, -1, -1, 2, -8, 5, -7, -2, 5, -2, 1, + -7, 1, -2, 6, -5, -2, -7, 6, -2, 6, -6, 4, -8, -3, -3, + -3, 5, 2, -8, -2, 6, 4, 0, -2, -6, -6, -3, -3, 3, -7, + 6, -2, -6, 4, 1, 6, -6, 0, 0, -8, -4, -1, -1, 2, -6, + -2, -2, 5, 1, -2, 0, 3, 6, -2, -6, 2, -3, -6, -7, 0, + 1, -2, -2, -8, 0, -6, 1, -2, -6, -7, -2, -7, 2, 6, 4, + 0, -8, -8, 1, -6, -6, 0, -8, 6, -5, 1, -5, 1, 3, -4, + -1, -1, -5, -4, -2, -4, -5, -8, 2, -5, -4, 0, 2, 2, 5, + -3, -6, 3, -5, 6, 6, -2, 5, -4, 3, -8, 2, -1, 2, -5, + 1, 3, 3, -6, -8, 6, -4, 0, -5, 6, 5, 3, -7, -2, -8, + -8, -7, -7, -7, -2, 2, -4, -6, 3, 6, 4, 5, -2, 0, -4, + -7, 2, 1, -2, -6, -1, -1, 1, 2, -8, -2, 2, 2, -7, 1, + -8, 1, -6, -2, 1, 6, -3, 1, -1, 4, 5, -4, -2, -4, 3, + 3, -3, 0, -1, -3, 3, 4, 4, 2, -3, 6, 3, -2, -4, -3, + -5, -4, 3, 2, 1, 2, 5, 5, 4, -5, -3, 5, -1, 6, -4, + -3, -8, -5, 2, -3, -3, -7, -6, 3, -4, -3, -2, 1, 5, 2, + -5, -5, -1, 6, -5, 0, 3, 5, -5, 1, -6, -1, 2, 5, 4, + 2, 6, -4, 2, -6, 1, -5, -5, -3, 0, 0, -8, -6, 0, 6, + 5, 1, -5, 3, -6, 1, -3, -4, 5, -7, 3, -7, 1, -4, 6, + -6, -2, 1, 1, -3, 0, 4, 1, 3, 4, -7, 6, 5, 5, -1, + -7, 4, 1, 5, 5, 5, 0, 2, -7, 5, 2, 5, -3, 2, -5, + 2, -4, -5, -2, -1, 2, -3, 4, 5, 5, -4, -4, 0, -8, -5, + 1, -1, 1, -3, -1, 6, 4, 5, 3, -8, 4, 1, 0, 1, 0, + 6, -7, 4, 6, 6, 4, -1, -3, -2, 2, -8, 0, -5, -6, 0, + -1, 6, 4, 0, -6, -1, 4, -5, 2, 2, 2, -2, 4, 3, 2, + 3, -6, 0, -6, -4, -5, -6, -2, -6, 6, -3, -2, -3, -7, 1, + 0, 5, 6, -8, 1, -2, 4, 1, 2, -1, 1, 1, 4, -2, 5, + -3, 1, 0, 1, -7, 6, -8, -6, 3, -2, -5, 1, -8, 5, -2, + 0, 1, -5, 2, 5, -6, -3, -8, 2, 6, -3, 0, -7, 5, -5, + -8, -3, 4, 0, 2, -8, 4, -3, 1, 3, 5, 4, -6, -4, -7, + -8, 6, -8, -1, 2, 1, 5, -2, -3, 0, 5, -4, -1, -8, -8, + -3, 0, -4, 6, 4, 3, -5, -5, 6, -7, 4, 4, 6, 0, -7, + -3, -2, 3, -1, -6, -1, 2, 2, -6, -3, 3, -5, 6, -1, -4, + 4, -5, -1, -3, -5, -7, 0, 4, 3, 2, -4, -7, -8, 4, 2, + 0, 6, -4, 3, 4, -7, 5, -6, 1, 0, 0, -7, 3, -3, -3, + 3, 2, 0, -4, -6, 2, 0, -3, 0, 5, -2, 6, 5, 0, 2, + -1, -1, -3, -4, -2, 2, 2, 4, -7, 2, 6, 2, 5, 6, -6, + -6, 2, -3, 2, -5, -1, -6, -5, -1, 6, -7, -4, -7, -3, -8, + 5, 2, -6, -2, 3, 5, 2, 3, 1, 2, -3, -4, 3, -8, -3, + -4, -8, 3, 1, -6, 4, -6, -1, -6, -6, 5, -7, -6, 6, -3, + -2, -4, 1, 2, -6, -2, -4, -7, -6, -2, -4, -4, 6, -2, 4, + 2, -2, 5, 3, -1, -7, -7, -7, -4, -1, 6, -3, -4, -2, 5, + -7, 6, 6, -6, -6, -7, 6, -1, 6, -5, 5, 4, -8, 2, 2, + -8, 6, 3, 0, 3, -2, -1, 3, -4, 0, 5, -3, -7, -1, 4, + -8, 1, 5, -6, -3, -4, 6, 4, -3, 1, 0, -1, 0, 3, -1, + -8, -8, -5, 3, -4, -8, 6, 3, 3, 2, 1, -2, -2, 1, 3, + -2, -2, -8, 6, 2, -8, -6, 6, -5, 4, -3, -8, 6, 1, 4, + -6, -2, 2, -7, 5, -5, -2, -8, -1, 1, 3, -5, -1, 3, -2, + 4, 5, 3, -4, 1, 4, -2, -1, 6, -6, -7, 5, -1, 5, 5, + 5, 4, -2, -5, -5, -4, 5, 4, 2, 5, 1, 2, 6, 6, 2, + -6, -3, 2, -3, -6, -4, 1, -2, -2, -1, -8, 1, -5, -4, 5, + 6, -7, 3, 6, 0, 4, 0, -5, 5, 6, -3, -8, -2, -7, -2, + -8, -5, -8, -5, -1, -5, -5, -6, 2, 3, -5, 6, 4, 4, 6, + -1, 4, -7, -8, 1, -3, 6, 6, -7, -2, -5, -8, 4, 5, 1, + -1, 3, -1, 2, -4, -5, -7, -8, 4, -5, 2, -4, -6, -4, -4, + 6, 6, 2, 0, 6, -6, -5, -6, -8, 2, -2, -1, -4, 2, 3, + 2, 6, 4, -8, 3, 0, 2, 5, 0, 6, 4, -4, -1, 1, 1, + -8, -7, 2, -5, -6, 0, 5, 2, -5, -8, -4, -4, 5, 6, 4, + 5, -7, 6, -7, 5, -2, 3, -1, 1, 2, -5, 4, 0, -4, 3, + -3, -2, -5, -6, -5, -1, -2, -7, 4, -3, -4, 5, 3, -4, -5, + -7, -8, -3, 6, -8, 5, -5, -7, 0, 2, 6, -5, 4, -4, -8, + -3, -2, 5, -6, -5, -6, -1, -7, 2, -3, 3, -7, 3, -5, -1, + -2, -1, -8, -6, -2, -5, -1, 6, -2, 6, -2, -1, 0, 5, -1, + 1, -7, 6, -5, 6, 1, -6, 0, -4, 2, 1, -4, -3, -2, -5, + -1, 0, 2, -6, 5, 2, -4, -5, -3, 4, 0, 0, -3, -1, 0, + -2, 5, -3, -6, 0, 0, 6, -5, 5, -8, 1, 1, 0, -4, 0, + 4, 3, -2, 6, -6, -6, 1, -8, -1, 2, -6, -5, -4, -5, -3, + 4, -2, 1, -7, 2, -7, -1, 0, -5, -3, 2, -8, 4, -2, -6, + 3, -4, -6, 0, 0, 0, -8, 5, -7, -7, -6, 2, -6, -1, 1, + 1, 6, -8, 1, 5, 4, 3, 0, 3, 1, 6, -3, -7, -7, 3, + 1, 3, 5, -2, 3, -2, -1, 0, 6, 1, -5, 1, -7, -6, -2, + -4, -4, -2, 1, -6, 4, -6, 2, 2, 3, -1, 1, -6, 3, 3, + 2, 4, 3, -1, 2, -1, 4, 0, -8, -4, -2, 6, -1, -6, 4, + -7, 5, -5, -6, 4, -1, -1, -1, -7, 0, -6, 3, 5, -4, -1, + -3, -4, 1, 2, 1, -5, 5, 4, -2, 1, -7, -7, -4, 5, 5, + -4, -8, 5, -7, -3, -4, -1, -7, 5, 2, 6, -8, 3, 3, 2, + -1, 6, -2, -6, 3, -5, -8, -6, -7, -7, -3, -6, -1, -2, 3, + 1, -4, 3, 4, -2, -7, 4, -7, -3, 0, 2, 3, 2, -1, 3, + 2, -5, -1, 0, -8, 2, 4, -8, -1, 0, -7, -2, 6, -6, 1, + -2, 6, 6, -1, -3, 4, 6, 0, 2, 4, -5, -4, 6, 1, -3, + -5, 4, -4, 3, -7, -1, -7, -2, 2, -1, -4, -6, -6, -7, -5, + 6, -7, -7, -7, -1, 1, -8, -6, 5, -2, 3, 6, -5, 4, -8, + -4, -8, -5, -7, -2, 3, -8, 2, 6, 3, 4, -5, -7, -1, -5, + 4, 5, -4, -8, 6, -8, -1, -2, 4, -3, -1, -7, 2, -6, 6, + 5, 4, 6, 3, -4, 6, 2, -8, -8, 1, -3, 6, -7, 6, -4, + 0, -6, -2, 1, -2, 6, 0, -2, 4, -5, 0, -6, -7, -3, -8, + -7, 5, -5, 4, 6, -5, 2, 3, 3, 5, -7, 1, -2, -8, -1, + -2, -1, -6, -5, 2, -3, -3, -1, 6, -6, -4, 5, 2, 0, -4, + -4, -3, 1, -2, -6, -8, 1, -2, 1, -8, -5, -4, 6, -7, -8, + 5, -4, -2, -3, -7, 3, -5, -5, -8, -5, 2, -5, 0, -4, 5, + -2, -7, -4, -4, 2, 3, -5, 2, -1, -6, 6, -7, -2, 5, -5, + -7, 3, 3, -6, -4, -1, 3, 1, 6, 3, 2, -8, -8, -2, -6, + -8, 1, -5, -6, -4, 1, -7, 2, 3, -2, 2, 0, -1, -4, -7, + 3, -3, -7, 2, 3, -3, -5, -6, 5, 6, 2, 3, -3, 5, -5, + -6, -2, -4, -3, -4, 4, -2, 3, -8, 2, -7, -1, 4, -5, 5, + -8, -2, -3, 6, -6, 6, 5, 0, 4, 0, -4, 3, -5, -3, 5, + 0, 4, 2, 0, -7, 0, 3, -4, 5, -5, 2, 1, 1, 0, -5, + 0, 3, -6, -4, 0, -1, 1, -6, 0, -4, 0, 1, 2, 1, 3, + 3, -1, 3, -5, -8, 1, 6, 0, -6, -4, -4, -7, 6, 2, -1, + -1, 6, -1, -8, -8, 2, -6, -5, 5, 2, 2, -7, 3, -2, -3, + -6, -7, -5, 3, -8, 4, -4, -8, -1, -2, 0, -4, 3, -7, -7, + -2, 5, 5, -7, -1, -5, 2, 2, -3, 4, -4, -8, 0, -8, -2, + -2, 4, -8, 2, 3, -6, 0, -6, 1, -8, 0, -4, -7, -6, -3, + -8, -1, -6, 4, 3, 5, 6, -5, -8, 3, 1, 5, -4, 0, 3, + 5, 2, 1, 6, -7, -7, -4, -5, -5, -6, -5, -6, 6, 5, 0, + 4, -7, 5, -5, 3, 4, 4, 3, 6, 0, -1, -4, -4, -2, -5, + -6, 3, -5, -8, -6, -6, -2, 6, 5, -6, -3, -4, -6, -1, -2, + -7, 3, -8, 4, -1, 3, -2, 1, -2, 1, -8, -6, 1, -2, -6, + 6, 3, 1, -3, -7, -6, 3, -5, 5, -5, 1, -8, -2, -5, 2, + -5, -6, 3, -5, 5, -7, -4, -5, 2, -8, 3, -4, -3, 6, -3, + -1, -3, -1, 0, 6, -2, -2, -7, -2, -7, 2, -6, -7, -1, 6, + 1, 4, -2, -5, -8, -2, -2, 6, 1, 0, 2, 1, 0, 2, 2, + -2, -3, -3, -1, 2, -8, 6, 1, 2, -3, -2, -7, 5, -8, -6, + 0, -4, -1, 2, -4, 3, -2, -8, 2, 3, -3, 6, 4, 0, 5, + -7, -7, 1, 4, 2, 2, -7, -6, -3, 0, -1, 4, 2, -1, -1, + -1, -2, 5, -5, 0, 3, 1, 2, -6, 5, 0, 4, 0, 0, -5, + 6, 5, 1, 3, 6, -8, -7, -3, -6, 6, 1, -6, -5, -8, 1, + 0, -7, 2, -3, -6, 6, -4, 2, 0, -8, -4, -3, -7, 1, 4, + -2, -2, -5, 1, -5, 3, 5, 0, 5, 2, 0, -2, 2, 1, 2, + -3, 2, -1, -4, -6, -3, -2, 3, -2, -3, 6, -4, 2, 0, 3, + -6, -4, -4, 1, -2, 4, -5, -6, -8, 3, 2, -4, 2, 6, -3, + 4, -7, -8, -6, 1, 3, 0, 6, -1, 3, 0, 0, -1, -2, -2, + -7, 1, 4, 6, -1, 1, -6, -7, -8, -4, -8, -2, 1, 1, 5, + -4, -2, -5, 5, -6, -7, 2, 2, -2, -8, -4, 3, 2, -3, 1, + 4, 2, -2, -5, -8, -4, -7, -5, 2, 3, -4, -8, -3, 2, -1, + 4, -3, -4, -3, -4, -7, 2, 4, -6, -4, -3, 0, -6, 3, 5, + -6, 4, -8, -5, 1, 1, 1, 1, 5, 1, 4, 4, -4, -6, 5, + -7, -7, 6, -4, -5, 2, -5, 2, -8, 2, -8, 2, 6, 1, -5, + -3, -4, 5, -6, -7, 0, -6, -2, 4, 2, 6, -1, 3, 2, 5, + 3, 5, 0, 3, -1, 4, 6, 5, 4, 3, -5, 4, -7, 2, 0, + 2, -3, 6, 1, -8, 1, -7, 0, -2, 0, -1, 0, 0, 2, -5, + 3, 5, 1, -2, -2, -7, 2, 0, -5, 1, 6, 4, 5, -1, -8, + -5, -4, -8, -5, -7, -3, -3, 3, -4, -6, -4, 6, 4, -2, -2, + 4, -5, 1, -2, 4, 2, 2, 1, -3, -5, -7, -6, 3, -6, -8, + -5, 4, 3, 1, -5, 6, -6, -3, -1, 1, 5, -8, 3, -4, -1, + -5, 0, 5, 0, 2, 4, 2, -4, -6, -7, 0, 5, 4, 0, 3, + -3, -5, 6, 2, -7, 5, 2, -1, 2, 2, 5, 5, -7, -1, -6, + -3, -8, 5, 6, -2, -7, 3, 0, 3, -8, 5, 4, -5, 2, 2, + -3, 1, -5, -3, 2, 6, -8, 5, 5, -8, 3, -6, -1, -3, 0, + -5, 5, 5, -6, 2, 6, 0, -3, 1, -1, -6, 0, -4, 5, -1, + 3, 3, 4, -6, -4, 5, 4, 4, -4, 5, 4, -3, -2, -1, 6, + 0, -1, -4, 1, -4, 6, -5, -6, -3, 1, -4, -8, -6, 3, -8, + -2, 0, 1, 2, -3, 2, 4, -2, 2, 3, -8, 4, 1, 1, 4, + -5, 6, -2, -2, -2, -6, 4, -7, -1, 0, -5, 2, -3, -8, 4, + -5, -4, 6, -2, 3, -6, -5, -1, -3, 0, -8, -7, 1, 3, -3, + -4, -2, -3, -2, 0, -2, -6, 1, 3, -1, 5, -8, -1, 5, -1, + -1, -1, -8, 2, -5, 6, 3, 2, -3, -2, 5, 2, -3, 0, -6, + 0, -4, -7, -7, -1, 0, -4, -5, -1, 2, 4, -5, 5, -4, 2, + 2, -2, 1, -6, 5, 0, 4, -2, -8, -7, 6, 4, -7, 0, -8, + -5, 3, 5, 1, -3, -5, 4, -4, -5, -3, -7, 3, 0, -1, 2, + 0, -8, -1, -1, -3, -3, 2, -6, 5, -1, 6, -6, 6, -6, 2, + -6, -7, 1, -5, 6, 2, 6, -5, -1, 0, -6, -1, -5, 4, 3, + 5, 5, -2, -6, 3, 3, 4, 4, 2, -4, 2, 1, -8, -3, 0, + 6, -1, -7, -7, 2, 5, 1, -8, 3, -1, -1, -6, -1, 5, 2, + -1, 4, -7, -3, -1, -7, 6, -8, 2, 1, -1, 5, -3, 1, -7, + 4, -3, -5, 4, 6, 1, -7, 3, 1, 3, 6, 6, 1, 5, -1, + -2, 0, -1, 6, -5, 4, 1, 6, -2, 3, 4, -3, 1, -6, 0, + -4, 4, 0, -2, -2, 5, 2, 2, -6, -8, -4, -8, 5, -1, -7, + -1, 6, -4, 3, -8, -1, 3, 0, -4, 3, -7, -7, 6, -6, 2, + 1, 5, -4, 4, -3, 0, -1, 6, -6, 3, 2, 5, -3, -1, 5, + -8, 4, 3, -3, 0, 6, -5, 6, -8, 0, -3, 5, -2, -7, 4, + -5, -5, -4, -3, 0, -5, -2, -8, 1, 2, 3, -8, -8, 0, 1, + -7, 2, 5, -7, 0, 5, -8, 5, -7, -6, 0, 1, -4, -6, -8, + 0, -8, 6, -3, 4, -2, 6, 0, -7, -8, 2, 1, 3, -5, 4, + 3, -3, -1, -1, 0, 3, 5, -6, -5, 1, -2, 6, 6, 6, 5, + -6, -4, 2, 1, 6, 5, -8, 3, -5, -1, 6, -5, 6, 5, 0, + 6, -8, -7, 0, -1, 6, -1, -8, -8, -8, 0, 3, -1, -3, -4, + 3, -1, 4, -7, 0, 0, 0, -4, -4, 0, 1, 0, -1, 0, 4, + 3, -1, 0, 6, -6, 1, -7, -2, -4, 0, -1, -7, 4, 6, 0, + 3, -8, -3, -3, 4, 6, -1, 4, 6, 6, -8, 4, 2, -6, 4, + 6, 2, -7, 2, 2, -8, -5, 1, 2, 0, 4, -8, -5, 4, -3, + 2, -7, 6, 4, -6, -5, -1, 1, 5, 0, -5, 0, 6, 0, -4, + 2, 2, -7, 6, 2, -3, 3, -7, -2, 1, 4, -4, -2, 1, -7, + -5, 5, 0, 1, 3, 4, 4, -6, 4, -7, -1, 2, 2, -6, -6, + -5, 2, 3, 0, 3, -3, 1, -4, -3, -3, -7, 6, 1, 6, -6, + -7, 5, -7, -3, 3, -5, -2, -8, -6, -5, -4, -5, -7, 2, 6, + 2, 1, -1, -1, 3, 3, 1, 5, -6, -4, -8, 3, -6, -4, -4, + -1, -3, 4, -6, 0, 3, 5, -3, -2, -3, 4, 2, 3, 6, 0, + 1, 1, 0, 3, 3, 2, -4, -7, -2, 2, -5, 6, 0, 1, -8, + -4, -4, 5, -7, 4, -1, -2, 4, 3, 3, 3, 1, 6, 3, 6, + -3, -2, -4, -2, 0, 4, 4, -8, 6, 5, -4, 1, 3, 3, -7, + 4, 6, -8, -7, -6, -6, 5, -2, 0, 1, 6, -5, 4, -7, -4, + 1, -2, -3, 2, -7, 6, 0, -8, -5, -5, -7, -8, -8, 2, -2, + 5, 5, -2, 3, 1, -4, 4, -8, -1, 5, 1, 6, 4, -5, 2, + 0, -3, -3, 1, -4, -4, -8, 5, -7, 1, 2, 1, -3, -8, -5, + -2, 4, -3, -2, 0, 2, 2, 2, -3, -8, -5, 1, -3, -8, 5, + 6, -3, 0, -1, -8, -8, 1, -3, 5, -8, 5, -6, 6, -2, -3, + 5, 1, -3, -8, -5, 2, -4, -8, 6, 3, 6, 3, -3, 1, 2, + -6, -3, -3, -7, -2, -3, 5, 1, -4, -4, -7, 5, -3, -4, -5, + -2, -2, -7, -3, 4, 6, -2, 4, 4, -2, 0, 2, -4, -1, -3, + -2, -8, -6, 5, -8, -4, 6, -2, -8, 0, 3, 3, -3, -3, -4, + -1, 2, -8, -1, 3, 4, 1, -5, 4, 6, 6, -7, -2, 4, -1, + -6, -7, 1, 0, -6, 6, -7, -6, -8, -2, -7, -8, 3, 3, -8, + -3, -7, -8, -1, -2, -1, -2, 3, 3, -5, 6, -8, 4, -1, -7, + 6, -5, 1, -5, 3, 5, -8, 4, -3, -3, -2, 4, 0, -7, 5, + 5, 4, -6, -7, -3, 1, 0, -6, 0, -2, -5, -1, -8, -3, -5, + 6, 3, -8, 0, 1, -3, 3, -8, 5, -2, 4, -7, -5, -6, 5, + 6, -1, -8, 4, -2, 5, 5, -5, 2, -6, -3, 2, 2, -4, -4, + 0, -1, -7, -2, -2, -2, 1, 3, -6, -6, 1, -3, -5, 3, 1, + -4, 0, 4, -7, -8, 5, 4, 5, 3, 0, -2, 0, -4, 6, -6, + -5, 1, -2, -5, 5, 3, -8, 0, 5, -7, -2, -4, 2, 4, -5, + 3, 0, -5, 6, -5, -3, -8, -7, 5, -6, 3, -7, -8, 2, -2, + -8, -1, -7, -3, 3, 1, 4, 6, 4, 6, 0, 1, -4, 0, -6, + -8, -6, 5, 2, 5, -8, 4, -2, -7, 0, -2, 0, -1, 5, 1, + -7, -6, -3, 5, -7, -8, 4, -8, 2, 4, -3, 6, -5, -8, 3, + -8, 1, -6, 3, 0, -6, 2, -3, 1, -5, -1, -4, -6, -1, 5, + -3, 0, 3, -6, 2, 0, -5, -3, -4, 5, 5, -3, -1, 1, -5, + 4, -7, -7, 4, 0, 6, 3, -7, 1, -8, -6, 4, -4, -8, 1, + 0, -7, 0, -4, 6, 6, 6, 0, 1, -1, 6, -5, 2, 4, 2, + 3, -4, -5, -5, -8, 2, 1, -2, 4, -8, 6, -7, -3, -4, 0, + -4, -7, 1, 4, 2, -1, 0, -7, 5, 4, 2, -4, -6, 2, -2, + -2, 6, -2, -1, 3, 5, -3, -5, 3, -7, -5, 4, -2, -8, -6, + 3, 2, -5, 1, 1, 0, 5, 0, 2, 5, 5, -6, -3, -6, -1, + -4, -1, -3, 6, 5, -4, -4, 4, 0, 6, 6, -6, -8, -7, 5, + -1, -5, -8, 5, -5, 3, 0, 5, 1, -3, -5, 1, 5, -7, 3, + 2, -8, -8, 2, -2, 2, -7, 3, 6, 0, -4, 3, -6, 0, 4, + 3, 0, 6, -4, -2, 0, -7, -7, 2, 5, 6, -4, 1, -5, -2, + -3, -2, -7, -3, 1, -8, 4, 0, 0, -3, -3, -3, 6, -8, 5, + 0, -2, 5, -3, 2, 3, -5, -4, -8, -3, 1, 2, -8, 1, -5, + 5, 4, 1, 5, 1, -8, -6, -1, 4, -3, -3, -8, 0, 1, -2, + -2, 5, -1, 1, -7, 4, 6, -2, -6, -4, -1, 5, -4, -8, 5, + 5, -8, 5, 6, -5, 6, -5, 1, 1, 2, 2, -1, 0, 1, 3, + 2, 5, -5, 5, -2, 2, -2, -3, -4, -6, 6, 6, 5, 0, -7, + -5, -4, 4, -5, 4, -8, -1, 5, 4, 3, 0, -8, -1, 5, 1, + 6, 4, -7, -6, -2, 5, -8, -3, 3, -5, 3, -2, 4, -6, 4, + 5, -6, -2, 0, 3, -5, -1, -8, 4, -5, 4, 6, 0, 4, -4, + -3, -4, -7, -7, 3, 5, -2, 1, 6, 3, -7, -3, 3, -7, 0, + -2, 5, 2, 1, 3, 3, 5, -3, 2, 2, 3, -8, -7, -8, 3, + -6, 0, 3, -4, 1, 5, -1, 0, 2, 6, -1, -1, -6, 3, -8, + 0, 0, 0, 6, -5, -7, 6, -8, 3, 2, 3, 5, -1, 2, 6, + 3, 4, 6, 2, 1, -1, 0, 5, -7, 3, 3, -1, 5, 4, -7, + 2, -8, -4, -3, 1, 0, 3, -3, -7, -7, 2, -3, -6, -6, -5, + 4, -8, 6, 3, 0, 5, 1, -1, 4, 0, -5, -5, -4, -8, 0, + -5, -3, 0, 3, -5, -5, -1, -3, 0, 4, 3, 3, 0, -1, 6, + -1, 6, -1, -2, -4, 5, -6, 1, 2, 6, 5, -5, 2, -1, -2, + -6, -2, 6, 5, 3, -1, -3, 4, 6, -6, 0, 6, -5, -4, -1, + 1, 6, -5, -4, -8, 3, 2, -1, 4, 0, -7, -5, -5, -3, -7, + 0, -4, -8, 2, 4, 1, 5, -7, 2, 3, 6, 6, 0, -8, -6, + 3, -5, -7, -7, -3, 4, 5, 2, -3, -6, -6, 6, -6, 3, -8, + 3, -4, -6, 1, -6, 1, -8, -2, -4, 1, -8, 4, 1, -7, 3, + 1, -1, 0, 0, -2, 2, -3, 4, -8, 1, -8, -2, -6, -4, 0, + 4, -5, -8, 1, 5, 4, 2, 4, 6, -4, 4, -1, 6, -3, 1, + -7, 0, -7, 3, 6, -7, -8, 2, 3, 2, 3, -6, 3, -1, -7, + 6, -7, -7, -6, -7, -1, 5, -1, -5, -2, 6, 3, 0, -6, -7, + -1, 2, 6, 0, -6, -2, -5, 4, -8, -4, -4, 2, 3, 4, -2, + -6, -5, -7, 1, -5, 2, -4, -8, 2, -2, 6, 3, 2, 6, -2, + -3, -3, -1, 5, -1, 4, -5, -5, 1, -7, -1, 2, 3, 1, -4, + 3, 4, 1, 3, 1, -1, -6, -7, -8, -7, -4, 4, 6, -6, -8, + 6, -6, 3, 0, -2, 5, -4, 0, -1, 3, 3, 0, 6, -6, -4, + 0, -1, -3, -2, -3, 3, 1, 3, 0, 6, 4, 1, 2, -1, -6, + 5, 3, 1, -3, -6, -8, -2, 0, 1, 0, -1, -2, 6, 4, 0, + -1, -5, -5, -5, -7, -4, -3, -7, -3, -8, -7, -2, -3, 6, -3, + 5, -2, -8, 3, -3, -1, 0, -7, -2, -7, -4, 2, 4, -1, 5, + -1, -7, -4, 2, -4, 4, -1, -1, -1, -6, -8, -7, -2, -6, 1, + -7, -4, 1, 3, 0, -6, 5, 5, 2, 1, 5, 3, 6, -1, 6, + -6, -2, 0, 0, 3, -3, -3, 5, 2, 2, -8, -5, -8, 4, 2, + 5, -7, 4, -1, 3, -6, 0, -7, -5, -3, 3, -3, 0, -6, -7, + 5, 6, -1, 3, -7, -2, -1, -4, 5, -7, 6, -7, -3, 4, 5, + -6, 3, -6, 0, 6, -8, -8, -8, -3, 3, -7, 1, -1, -3, 1, + -3, -5, -1, -2, 6, -8, -2, 4, 3, -6, -1, -3, 5, 5, -6, + -3, -3, 3, -5, 0, -5, 6, 2, -1, 1, -6, -7, -6, 2, -7, + 0, -6, 0, 3, -5, 2, -4, 1, 2, -3, 1, -4, -3, -7, -8, + 1, -5, 5, -6, 5, -2, 1, 2, -2, 6, -8, -8, -6, 0, -2, + 3, 0, -2, -3, -5, -1, 4, 6, 3, -1, 4, 5, 4, 3, -5, + 5, -3, 4, 1, -8, -6, -8, -4, 3, 3, 6, 3, 2, 0, -3, + -4, 2, -3, 0, -7, 2, 4, 1, 4, -2, 6, 1, -2, -8, -8, + 6, 3, 0, 3, -6, 1, -5, -2, -8, -2, 1, 4, 1, 4, -3, + 2, 1, -3, -1, -1, -1, 1, -8, 1, 5, 6, -2, -1, -4, -7, + -3, -4, -1, -7, 2, -1, 2, 1, 6, -6, 6, -3, 0, -7, -3, + -6, 4, -6, 1, 4, 5, 5, 4, -5, -1, -4, 0, 5, -6, -4, + -2, -3, 1, 5, -5, -5, 3, 0, -8, 1, -2, -3, 1, 5, -7, + -7, 3, 2, 2, -1, -3, 0, 6, 6, 5, 3, 4, 4, 4, 2, + -1, 4, 6, 6, 2, 5, 1, -4, 2, 2, 2, 0, 3, -7, 5, + 2, -2, -8, 5, -8, 2, -3, -3, -1, -2, -8, 0, 6, 1, 2, + 4, 6, 5, -8, 2, -6, 4, -2, 5, -8, 3, 1, 2, -3, -3, + -3, 1, 3, -6, 0, -8, 5, -6, -6, -6, 1, -6, 0, 6, 2, + 5, -7, 2, 1, -6, -5, 2, -8, -5, -5, -4, -3, -3, -3, 0, + 6, 1, 0, -6, 5, -8, -4, 6, -4, -4, -6, 0, -1, 2, 4, + -2, 0, 0, 3, 0, -3, 6, 6, -7, -2, 6, -8, 0, 1, 3, + 2, 3, 6, -3, 5, -1, -1, 2, -4, -3, 1, 1, -2, 6, 3, + -3, -6, 5, -8, -3, -7, 0, -6, 2, -6, 0, -2, 2, 5, -3, + -8, 1, 1, 2, -7, 0, -6, -5, 4, 6, -7, -3, -5, -6, 2, + 0, -2, -6, 5, 0, -5, -5, 0, -3, 0, 1, 4, 3, -8, -7, + -8, 4, -5, -4, -5, -8, -2, 5, -6, 1, 0, 4, -5, 3, -8, + 6, -8, -7, 2, -8, 4, 1, -2, -1, -5, 0, -8, 4, -8, -5, + 3, -6, -8, -7, -3, -8, 5, 5, 1, -3, 1, 1, -1, -8, 2, + 6, 4, 1, -3, -1, -4, 5, 1, -3, 0, -3, 2, 3, -5, -5, + 1, 6, 2, -7, -1, 3, 1, -2, -3, -8, -5, -6, -2, 0, 2, + -6, -6, -4, -8, -8, 6, -2, 2, 0, 4, 3, 2, 4, -2, 0, + 6, -1, -3, 5, 5, 3, 5, 0, 6, 6, 0, 3, -8, 1, -1, + 2, 6, 0, 6, -2, 1, 5, 1, 5, 0, 0, -5, -3, 4, -5, + 1, -4, 3, -6, -4, 5, -8, -3, 5, -8, -7, -5, -7, -5, -3, + -7, -7, 1, 2, 0, -7, -6, -3, 4, -6, 2, -7, 6, 2, 2, + 0, -2, -5, -7, 6, 4, 1, 5, -7, 2, -7, 0, 3, -2, -6, + 0, -5, 1, -7, 3, -5, -7, 3, -6, -4, -8, -5, 1, 0, 1, + -4, -8, -2, 3, -3, 4, -8, 1, 6, 1, 2, 5, 0, 1, -3, + -1, 6, 2, 4, -1, 1, 1, -5, -6, 3, -5, 3, -5, -3, 5, + 6, 5, -5, -1, -7, 0, 3, 0, 6, -4, 2, -2, 1, -8, -6, + -3, -6, -6, 1, 1, -2, 5, 5, -8, -8, 1, 3, -4, 5, 3, + -6, 2, -5, 6, 4, -4, -4, -3, 0, 6, 0, 4, 3, 3, -8, + -1, 3, 3, -7, -2, 2, 2, 4, 4, -2, 3, -3, 1, -7, -7, + 1, -7, 6, -4, 0, -2, 3, -8, 0, 0, -8, 4, 2, 4, 6, + -3, -1, -1, -1, -7, -8, -1, -7, -6, -7, -1, 5, -7, -8, -8, + -2, 3, 6, 4, -8, 4, 1, -5, 6, -4, -4, 0, -7, 5, 2, + -6, -2, -1, -3, 0, 6, -6, 2, -7, 4, -6, 4, -7, -4, 6, + -1, 3, -8, 3, -4, 2, -3, 2, -5, -3, -7, -3, -4, -3, -8, + 6, -2, -5, -8, -3, -8, -2, 3, 0, 5, -1, 0, 6, -5, 1, + 2, 2, 2, -5, -4, 3, -3, 2, -1, -4, 3, -4, 4, 4, -6, + -2, 3, -3, 1, 5, -2, -8, -1, 2, 4, -6, -2, 3, 2, -4, + 2, -1, -1, -3, 0, 2, 3, -1, 0, 5, -6, -2, 1, 3, -7, + 6, -5, -4, 5, 2, -7, -7, -2, -3, 3, -8, -3, 3, 0, -8, + 3, 4, 3, -7, 5, -4, 6, 4, -6, -7, -4, 2, 0, 4, 2, + 1, 5, -1, 4, 5, -5, 1, 3, -1, -1, -7, -7, 4, -4, -4, + -5, 1, 4, -1, -3, 4, -4, 0, -4, -3, -1, -2, 6, 0, 2, + 2, -5, -8, 0, -5, 2, 3, -7, -1, 6, 6, 5, -4, -3, -8, + -7, 2, 3, 1, 5, -8, 1, 0, 1, -2, 4, -6, -1, 0, -4, + -4, -8, -7, -4, 3, -8, -3, -1, 5, 3, -4, 4, 4, -4, -6, + 1, 0, 0, 5, 6, 4, -5, 1, 1, 5, 5, -3, -2, -8, 5, + -1, -8, -5, 5, -1, -4, -2, -4, -4, -6, -3, -4, 3, -1, -4, + -1, -2, 5, -5, -7, -7, 5, 6, -5, 5, 0, 2, -6, 1, -6, + 3, -8, 5, 0, 6, -6, -1, -5, 3, -4, 4, 4, -8, 5, -2, + 0, 5, 5, -1, -6, -2, 1, 6, -6, 3, 6, 4, 5, -2, -4, + -4, 2, 6, -7, -6, -8, -2, -1, -6, -3, -3, 0, -7, -2, 2, + -8, -3, 4, 1, -2, -1, 0, 6, 1, 4, 5, -2, -5, -7, 3, + -5, -7, 2, 2, -7, -3, -5, -2, 1, 3, -7, 4, 0, -2, -3, + 0, 2, -3, -4, -1, -3, -7, -5, 6, -5, 2, 5, 0, 4, -5, + 5, -5, 1, 6, 4, -3, 2, 0, -5, -6, -3, 1, 6, -2, -4, + -5, -2, -7, -8, 5, -4, -1, 6, -2, -1, 0, -4, 6, 6, 6, + 6, 1, -3, 3, -2, 1, -3, 6, 1, 0, -3, 4, -2, 4, -7, + -7, 5, -8, -1, 5, -3, -6, -5, -3, -2, -7, 5, 0, -8, 5, + 5, 5, -5, 5, 3, -3, 5, 6, 5, -1, 5, 2, -3, 5, 3, + -2, -2, 6, -3, 5, 4, 3, 0, 6, 1, 6, 1, 6, -4, -1, + -5, -7, 0, 0, -8, 4, -2, -5, -2, 2, 3, -6, 2, 5, 1, + 1, 4, -4, 6, 6, -5, -1, -1, 0, -8, -7, -1, -4, -3, 1, + -6, 6, 1, -2, 4, 1, 4, -7, 1, -2, 0, -8, -1, -8, -8, + 6, -1, 0, -5, -3, 5, 2, -2, 3, 3, 0, 0, 2, -1, -2, + 2, 6, 4, 1, 5, -5, -3, 6, 3, -7, 5, 1, -8, 3, 2, + 4, -4, 6, 2, -5, -1, -6, 4, -6, -3, 2, 2, 6, 3, 4, + -5, 6, 5, 0, -7, 0, 1, -6, -8, -2, 1, -3, 0, -5, -5, + -4, 1, 6, -2, 6, -4, -8, 3, 2, -3, -6, 3, -6, 6, -4, + 1, -3, -6, -8, 0, -6, -4, -8, 6, -4, -1, 6, 5, -8, -8, + 2, 0, 4, 3, 3, -5, 6, -3, 5, -3, -8, -2, -5, 0, 6, + -1, 1, -7, 3, 3, -6, -5, -7, 4, -7, -5, -7, 0, 2, 3, + -3, -8, 1, -5, -2, -2, 4, -5, 6, -6, -6, -8, -4, -4, -7, + 6, -8, -7, -8, -4, -6, 0, 4, 6, -3, 0, -1, 6, -2, 3, + 6, 4, -1, 3, 2, 3, -4, -4, -8, 4, -7, -4, 1, 6, 1, + 1, 5, 0, -6, 5, 2, 1, 3, 5, 2, -4, 2, -6, 1, 5, + -5, -4, -7, -2, -3, -5, -1, 0, -7, -3, 1, 3, 4, -7, 1, + -4, -5, -7, -2, 4, 1, 4, -4, 5, -4, 6, 1, -4, -5, -3, + 6, 0, -1, -3, 6, -6, -3, -2, -7, -3, -8, 5, -8, 1, -8, + 3, -1, 6, 3, 6, -4, -7, 1, -7, -4, 1, 2, -8, 2, 2, + 3, -8, -1, -4, 0, 6, -3, -8, 5, 0, -6, 2, -7, -8, -7, + 6, -6, -3, 5, -7, 4, 1, 6, 0, -5, 5, 0, 2, 3, 4, + 6, 1, 0, 3, -7, 5, 2, 6, -4, -3, 2, -8, 5, -2, 6, + -2, -7, -7, -5, -6, -3, 2, -5, 1, -6, 2, 1, -6, -5, -6, + -4, -8, -4, 2, 0, -2, 1, 3, -1, -4, -6, 2, 2, 2, 6, + 0, -4, -1, -4, 5, -3, 3, -6, 4, 2, 0, -2, -1, -5, -8, + -1, 4, 2, 2, 3, 2, -4, 2, -5, 4, 1, -3, 4, 0, 5, + 1, -8, 0, 0, -8, -4, -8, 6, -2, 1, 3, -2, -2, 5, 3, + 1, -2, 5, -5, 0, 2, -2, 1, -8, -8, -8, -3, 5, 2, -3, + 5, 2, -2, 2, -7, 0, -2, 0, 5, -1, 2, 5, -1, 4, -2, + -4, 6, 0, 6, 0, 3, -8, 2, -6, -5, -4, -6, 1, -6, -6, + 5, 5, 4, -5, -3, 6, -2, 4, -4, -2, -4, -2, 6, -2, 4, + 2, -5, 5, 1, -4, -1, 4, 1, -6, -4, -6, -4, 5, -5, -8, + -8, 1, -1, -6, -7, -7, 2, 1, 2, -3, 1, -3, -4, -8, -2, + -4, -2, 4, -5, 0, -5, -5, -1, 4, -8, -6, -4, 2, -4, -6, + -3, -8, 1, -8, -1, -5, 2, -5, 6, 4, -6, 4, -8, 0, -7, + -4, 5, 6, 6, 3, -1, 4, -4, -3, 5, 1, 3, -5, 2, -3, + -3, 2, -7, 0, 4, -7, -3, 3, -5, 6, 2, -5, 0, 5, -2, + 3, -8, -8, -2, 6, -3, 2, 5, -7, 3, -1, 3, -1, 5, 0, + 1, 6, -6, 3, -6, -3, 6, -7, -1, -6, -1, -6, 2, 3, 6, + 5, -6, 6, 3, -2, -5, -5, -7, -2, 5, -4, 0, 3, 1, 2, + -3, 4, 2, 3, 3, 2, 2, -3, -3, 0, 4, -4, 1, 3, -1, + -5, -3, -2, 1, -4, -5, 4, 0, 2, -2, 1, 0, 0, -7, -2, + -7, 6, -7, -1, -6, -7, -8, -2, -5, 3, -8, 6, -2, -8, 2, + 0, -1, 4, -7, -7, -7, -1, 5, -8, -7, 4, -3, 0, -5, -6, + 5, -2, -4, -7, -1, -2, -2, -1, 1, -6, 5, -5, -2, -6, 5, + -1, 4, -6, 1, 0, -7, -8, -6, -6, -5, -1, 3, -8, 4, 0, + 1, 2, 6, 0, -2, 2, 6, 1, 4, 1, -6, 3, -3, 0, -8, + 6, 1, 5, 6, 3, 4, -5, -5, 5, -5, 2, -6, 4, 2, 0, + 4, -6, -7, -5, -2, -1, -6, -5, -5, -2, -2, 3, -8, -2, -6, + 2, 6, -2, -1, -2, 3, -5, 3, -7, 6, 2, 4, 2, -8, 4, + -6, 5, 3, -6, -6, -1, -8, -7, 6, -5, 4, -8, -7, -3, -4, + -4, -1, -5, -7, 2, 1, 6, 1, 2, -8, 2, 3, -8, 2, 2, + -6, 6, 4, 3, -4, 6, -1, -5, -8, 1, -7, -6, -8, 5, 6, + -4, -1, 4, 1, -2, 4, -5, 3, 3, 6, 0, -3, 1, 0, -8, + -1, 0, -5, 4, -4, 1, 6, 1, -6, 5, -5, -1, 3, -3, 3, + -4, -2, -6, -5, 1, 1, 1, 3, -1, -6, -8, 2, -8, -5, 2, + 2, 2, -4, -6, -1, 2, -6, -7, 1, -1, -2, -1, 1, 0, 1, + -4, 1, -5, -5, -6, 3, -1, 4, 0, 4, 2, -1, -4, -3, -2, + -6, 0, -1, 6, -6, -8, 4, -1, 4, -5, -6, -6, 3, -8, -1, + 4, -6, -4, 1, 1, -5, -3, -1, -8, -8, -3, -8, 0, 4, 3, + 4, -3, -1, -6, -1, 4, 4, 1, 6, -1, 1, -1, 6, 0, -7, + -1, -7, -3, -7, -2, -5, -4, -3, -1, 4, -6, -2, -2, -7, -1, + -2, 2, 5, -1, 5, -4, -2, 0, -2, -3, -1, 6, 3, -7, -5, + -1, -4, 2, -7, -4, 6, -5, 2, 3, -4, 1, 5, 0, -4, 1, + -3, 2, 2, -5, 0, 5, 6, 0, -1, -6, -4, 4, -4, -7, -8, + -2, 4, 0, 5, -4, 5, -4, 1, 1, 0, 6, -7, -1, -7, 3, + 0, -7, 6, 0, -5, -5, 6, 1, -5, 5, 6, 5, 3, 6, 5, + -5, 0, -8, 0, 1, -5, -4, -7, -8, 5, 4, 3, -2, 0, -8, + -8, -8, -3, 0, -5, 1, -3, -4, 0, 3, 2, 5, -5, -8, 5, + -3, 0, 6, -3, 3, 5, -2, 3, -7, -4, -1, -7, 3, -2, -2, + -2, 5, 2, 1, 4, 4, -1, -1, 0, -5, 5, -8, 6, 1, -6, + 0, -3, 4, 6, -5, 0, 2, -6, -4, -1, -2, 3, 0, -1, 5, + 5, -3, -5, 5, -5, -6, -5, -7, 4, 3, 0, -1, -6, -3, -6, + -2, -2, -1, 6, -8, -4, 1, -7, -3, -8, -1, 5, -8, -5, 2, + -6, -7, 3, -8, 3, -1, -5, -1, 2, -1, -1, 1, 6, -5, -2, + -7, 3, -3, 4, -7, -2, 2, -8, -5, -7, -3, 5, 6, -4, -7, + 2, 6, -1, 5, -7, -3, -4, -8, 3, -6, 3, -6, 6, 2, -1, + 3, -6, 1, -3, -1, -6, -4, -1, -8, -5, 6, 6, -8, 4, -5, + -5, -7, -1, -4, -5, 0, 1, 4, -1, 3, -1, -3, -5, 0, 6, + 2, 4, 0, -8, 5, 5, -6, 5, 6, 0, 6, -6, -2, -2, 1, + 3, -8, -1, -1, -3, -3, 2, 4, -5, -7, -3, -4, -5, -2, -4, + -8, -2, -6, 6, -7, -8, -4, 6, -5, -6, -4, -2, 5, -2, 1, + 2, 5, -6, -4, 6, -4, -8, 0, 1, 5, -7, -2, -6, -3, -5, + -6, -8, 5, -1, -3, -1, -4, -4, 6, 4, -6, -8, -2, -5, 3, + -3, 1, 6, -3, -4, -3, -5, -3, 2, -6, -6, 0, -4, -5, -8, + -3, -4, -5, 3, -5, -3, 2, 0, 2, 1, 4, -5, 2, -5, -5, + -4, -3, -2, -5, 1, -8, 2, -4, -2, 5, 3, -5, -1, -5, -8, + 5, 1, -2, 0, -2, 4, 6, -5, 6, 3, -8, 3, 6, -1, -5, + -6, 4, 5, 4, 6, -6, 4, -5, -2, 2, 3, -1, -1, -4, -5, + 2, -5, -2, 4, 1, 1, 0, 6, -5, 1, -3, 5, -7, 6, -6, + -6, -5, -2, -1, 3, -1, 2, -4, -5, 3, 0, 5, -8, -4, 6, + 6, -3, -8, 3, 4, 2, 4, 0, -8, 5, -7, -2, 4, 1, -5, + -2, 3, -5, 3, -6, 5, -1, -5, -5, 1, 0, 3, -4, -4, -3, + 0, -2, -8, 6, 4, 0, -4, 5, -6, -7, 1, -2, -1, 2, -6, + 5, 0, -1, -8, 4, -1, 0, 2, -4, -7, 6, -2, 4, -8, 6, + -5, 1, -4, 4, 1, -3, -5, 0, 4, -1, -7, 3, -4, 6, -7, + 3, 2, 5, -6, -2, 3, -1, -5, -1, -4, -1, 3, -4, 0, 4, + -3, 5, -5, 3, -3, 3, -2, 1, -5, -3, 0, 6, -7, -4, -5, + 6, -6, -1, -3, -1, -1, 5, -2, -8, 4, 1, 6, -6, -4, 1, + 2, 0, 3, -7, -5, 2, 1, -6, -6, -3, 4, 1, 2, -6, -4, + 0, -5, 1, -4, 5, -1, -1, -2, -2, -6, -5, -6, -5, 2, -3, + -8, 6, 2, -7, 0, 0, -3, -2, 6, 4, -3, 1, 3, 3, -8, + -7, 0, -3, 5, -6, 6, 5, -7, -2, 0, 3, -2, -4, 0, -4, + -7, 5, -7, -3, 3, 5, -4, -6, 4, 6, 1, -7, -3, 4, 0, + -2, -1, 0, 4, 3, -7, 5, 6, 0, -2, 4, 5, 0, 5, -7, + -4, -8, -6, -4, -7, -1, 0, -8, -1, 3, -7, -5, 1, 2, 3, + 0, 6, -1, -7, 4, -6, 0, 1, -1, -6, -7, 1, -2, -2, -8, + 0, 2, -4, 6, 6, 5, 5, -5, 2, -3, -2, -1, 2, 3, -2, + -2, 4, -7, -7, 3, 1, 6, -5, 0, -4, -8, -6, 6, 0, 0, + -4, 4, 0, 5, 4, -6, -3, -1, -3, -2, -2, -5, -6, 2, -1, + -4, -5, -3, -3, -2, -8, -8, 3, 0, -2, 2, -6, -6, 2, 4, + -3, -3, 2, -4, -7, -7, -2, -6, 0, 6, 3, -7, 4, -6, 3, + -5, 3, -3, -1, -8, -6, -6, -8, 1, -8, 4, -4, 6, 3, 0, + 1, 4, 1, 2, 6, 4, -2, 4, -8, 6, 1, 1, -3, -4, -3, + 6, 3, -5, 0, -2, -5, 5, 5, -8, -2, -6, 5, 2, 0, -7, + 5, 5, 5, -6, 2, -5, 6, 4, -8, 5, 2, 6, 2, 3, 5, + 2, -6, 1, -8, 5, -7, 6, -6, -2, -4, -4, -5, 4, -4, -8, + -6, -5, -3, 6, -4, -6, 0, -3, 4, -8, 1, 6, -2, 4, -5, + -5, -7, -1, -4, -3, -3, 1, 4, -5, 3, -2, -2, 0, 3, -2, + 4, 6, 5, 6, -8, 4, 6, 4, 0, 4, -6, 2, 3, 4, -8, + -3, -8, -6, 0, -1, -3, 4, -6, -3, 4, 6, 4, 0, 5, 0, + 0, -5, -7, 1, 3, 3, -3, 4, 5, -3, -6, -3, -4, -5, 2, + 6, 1, 5, -7, -8, 0, -6, -8, -8, -8, -4, -6, -1, 2, -7, + -1, -6, -8, -2, 6, 5, -3, 2, -8, -1, -6, -5, -4, 3, -7, + 5, -4, -4, 2, -2, -7, -1, 5, -2, -5, -8, 5, 4, -2, -6, + -3, 1, -2, 0, 3, -7, -3, 1, -8, 1, 5, -6, -4, 6, 0, + 4, 4, 5, 3, 1, -3, 1, -7, -7, 0, 4, -1, -6, -3, 5, + -5, 0, -8, 3, -1, 5, -4, -7, 6, -1, 3, -4, 0, 5, -3, + 0, 0, 6, 4, 4, 6, 5, -2, 0, 4, 0, -6, -2, 3, 5, + -3, 6, 1, -2, -5, -2, -4, -7, -5, -3, 3, -7, -6, -4, 0, + -3, 5, -2, -5, 6, -6, 4, -5, -3, 2, -1, -6, -3, -7, 3, + 4, 0, -8, 3, 0, -4, -7, -5, -4, -2, -8, -5, 6, -4, 3, + -6, 0, 3, -1, 3, -2, -5, 2, -5, -7, 6, 1, -5, -2, -8, + -6, -7, -1, -8, 0, -6, -3, 0, -1, 4, -6, -3, 4, -1, -7, + 6, 6, -5, 5, -2, 6, -1, 0, -8, 6, -5, -7, 1, -2, -8, + 4, 3, 1, -2, -4, -5, 6, 2, -6, -2, 6, -8, -8, -6, -1, + -7, -4, 5, -2, -8, -6, -6, -7, -8, -1, 5, -3, 3, -6, -2, + -8, -4, 5, 1, 5, -3, -8, -2, 4, 4, -2, -8, 4, 3, -3, + -7, -5, -1, -2, 5, 3, -7, -6, -3, 6, 2, 1, 6, -6, -8, + -5, 6, -3, 5, -8, -4, -7, -5, 4, -4, 1, -4, -1, 1, -6, + -3, 0, 1, -3, -8, -2, -4, -1, -4, -6, -5, 2, -7, 2, -2, + -2, -2, -3, -6, -1, 4, 2, -7, -6, 5, 5, 2, -7, 1, -6, + 6, 3, 1, -8, -6, 4, -8, 2, 6, -7, -5, 2, -1, -5, 1, + 1, -2, 3, -3, -5, 6, -6, 4, -3, -8, -7, -6, -4, 2, 5, + 2, 6, 2, 3, -5, 0, -7, -1, -7, 1, -1, -5, 6, 1, 2, + 0, -3, 3, 6, -1, -4, -4, -8, -2, 5, 0, 4, -5, -2, 0, + 2, -2, -3, -3, -1, -1, -2, 1, -7, -6, -2, -5, 3, 5, -8, + 6, -2, -6, -5, -1, 6, 0, 0, 6, -6, -3, -6, 6, 4, -1, + -4, 3, -6, 5, 1, -5, -8, 6, 5, -8, -2, 5, -7, -1, -2, + -4, 1, 4, -8, -3, 5, 4, -5, -3, -5, -6, -6, -5, -2, -2, + 0, -4, -4, -5, -7, 2, 5, 2, -3, 5, -8, -6, 1, -3, -2, + -1, 4, -6, -3, -2, -5, 0, 1, -7, -2, 1, 0, -8, 4, -4, + -5, -6, 1, -8, 4, -1, 4, 0, -3, 4, -7, -4, -2, 6, -3, + 4, -5, 0, -4, 0, -5, 5, 6, -3, -3, 0, 0, 4, -2, -5, + 3, 4, -2, -2, -6, -3, -6, 1, -4, 0, 1, 5, -3, -3, -8, + -7, -3, -5, -5, -5, -1, 2, -6, 0, 0, 2, 2, 4, 3, -1, + -5, -7, -5, -1, -5, 2, -6, -4, 0, 1, 5, -5, 1, -8, 4, + -4, -1, 2, -8, 5, 3, -2, -1, -7, 6, -5, -8, -8, -5, 5, + 0, -2, -8, 3, -1, -7, 5, -5, -6, -4, 1, -2, -1, -1, 2, + 2, 3, -5, 1, -6, 3, -7, -2, -1, 6, -3, -8, -8, 4, -8, + 3, -6, 4, -5, 3, -4, 6, -5, 6, -2, 5, 3, 4, 1, -4, + 2, 1, 5, 5, -4, -3, 6, -5, 5, -8, 2, -2, -4, 1, 3, + 2, -6, 6, -8, 3, -5, 3, 3, 5, -2, -3, -4, -5, -2, -1, + 5, 5, -1, -6, -7, 0, 2, 4, -2, -5, 3, 0, -2, 3, -4, + -1, 1, -7, -8, -4, -8, 2, -6, 3, -4, 4, 6, 5, 0, -1, + 4, 3, -6, -6, 0, -2, -5, 3, 4, -8, 0, 6, -3, -1, -5, + -7, 2, -4, 5, -8, 4, 1, -1, -5, 3, -5, 2, -3, 0, 6, + -1, 2, -8, -8, -2, -3, 1, 0, 3, -1, -3, -2, -2, -7, 6, + -3, -8, 4, -6, 0, 2, 5, 5, -7, -8, -4, 3, 1, -4, 2, + -2, 0, -7, -6, -5, 4, 2, -4, 2, 5, 6, -2, 1, -6, -8, + 2, 2, 1, 1, 1, -4, -8, 2, 6, 0, -7, -2, 6, 2, -6, + 6, -6, -3, -5, 3, 4, 3, -7, -5, -5, 4, -4, 0, 2, -4, + 3, -4, 6, -7, 1, 6, -6, 0, -4, -5, 4, 1, 5, -8, -5, + -7, 3, 0, -2, 6, -7, -7, 6, -5, 2, -5, 1, 1, -1, 2, + -5, 6, -7, -4, 5, 0, -1, 5, -1, 5, 6, -5, -7, -5, 3, + -5, 1, 0, 2, 0, 0, 2, -7, -1, -3, 1, 3, -3, -4, 0, + -4, 5, 5, 4, -7, -7, 0, 2, -4, 1, 2, 2, 2, 4, -6, + -2, 6, 0, 4, -1, 4, -5, 3, 1, 6, -5, -3, 5, -7, 0, + 6, -2, -4, -5, -3, 3, -6, -2, 2, 2, -2, -2, -2, -1, -8, + 1, -4, -3, 1, -8, 0, 0, -2, 4, 6, 4, 5, -7, -2, -4, + 6, -4, 3, -5, 0, -6, 3, 2, -3, -4, -2, -4, 0, -8, -3, + -3, -5, 1, -7, -5, -2, 5, -7, 5, -6, 5, -6, 1, 5, -5, + -8, -1, -3, 2, -7, -2, -5, 6, 3, -5, -5, 5, -5, -2, 4, + -1, 1, -2, 0, -5, 2, -6, 4, 4, -3, 5, 6, 4, 0, 0, + 3, -6, -5, 6, -7, 4, -5, -6, -7, -5, -1, -5, 2, -6, 1, + 3, 5, 2, -1, -7, 1, -2, 3, -2, 6, -7, 4, 0, 6, -8, + 6, -7, 4, 6, 1, -6, -5, -7, 3, -4, 2, -1, 2, -8, -7, + -8, 2, -4, 0, -4, 6, -7, -1, 6, 3, -2, -7, -7, -1, -6, + 3, 3, -4, -5, 6, 3, -7, 6, -4, -8, -4, -2, 3, -2, -1, + 3, -2, -4, 4, -4, 1, 4, -5, 0, -1, 6, -6, 6, 5, -8, + -4, -3, -5, -7, 5, -8, -6, -4, -5, -8, 4, 2, 6, 0, -7, + -2, 2, -4, -7, -7, -6, -5, 1, 1, -4, 1, -6, 3, 0, 5, + -4, -4, -2, -3, 2, 3, -5, 4, -3, -1, 0, 5, 5, 2, -8, + -1, 5, 4, -6, 2, 2, 4, -7, 0, -6, -3, -5, 6, -5, -1, + 1, -3, -4, 6, -7, -5, 6, -2, 4, -5, -2, 0, 4, -6, 5, + -3, -3, -5, -7, -7, 6, -5, -6, 5, 4, -1, 4, 3, 0, -8, + -6, -1, 6, 3, 4, -6, 2, 3, 0, -1, -7, 3, 4, -4, 3, + 6, 4, -4, 0, -7, 0, -1, -8, 1, -5, 3, -2, -1, -2, -6, + 4, -1, 4, -5, 1, -8, 6, 3, -5, -7, -1, 5, -6, 2, -4, + -3, -2, 5, 4, -1, 1, -8, 2, 0, -5, 2, 3, -5, -3, -7, + 4, 6, -7, -2, 1, -1, -4, -1, -6, 1, 3, -2, 5, -1, 0, + -3, 6, 0, 3, 3, -6, 4, -2, 4, -7, 5, 6, -1, 2, -4, + -5, -4, -6, -5, 2, 4, -1, -7, -5, 5, 6, 2, 3, -1, -3, + -1, 5, -4, -4, -8, -6, 4, 6, -7, -6, -1, 5, -3, -3, 4, + -1, 1, 3, -2, -1, -6, 4, -6, 4, -5, 0, 1, -4, -8, -8, + -3, 2, 4, 4, -8, -5, -7, 1, -8, -1, 3, 2, -7, -5, 1, + 0, -6, -8, -2, -3, 5, 1, -1, -8, 1, 1, -4, 0, 6, 4, + -8, -8, -2, 3, 3, -8, -8, -8, -4, 2, -8, -4, -8, -3, 2, + 6, 3, 5, -5, 2, -7, 4, 0, -4, -2, -3, 3, -7, -8, -3, + 4, -7, -3, -2, 0, -8, 0, 5, -8, 4, -8, -5, 1, -7, -8, + 0, 2, -8, 5, -5, 2, 0, 2, -3, -7, 1, 0, -4, -5, -3, + 4, -1, 4, 2, -1, 2, 4, -5, 1, -8, 6, 0, -2, 6, -8, + 3, -1, -6, 1, -5, -3, -4, 6, 4, -5, 1, -8, -3, -7, 2, + -8, -2, -6, -8, 0, 1, -7, -2, 4, 2, -8, 6, -3, -1, 5, + 2, 4, -8, 2, 1, -3, 3, 2, -2, 2, 3, 3, 5, 5, -8, + 5, -3, 3, -8, -1, -2, 0, -5, -1, 3, -3, -3, -2, 1, 4, + 4, -3, -5, -2, -5, -3, 0, -8, 4, 5, -4, -8, 0, 4, -3, + -6, 3, -5, -7, -8, 0, 5, -8, -7, -3, 1, 6, -3, 3, -1, + -5, -3, -8, -6, -3, 1, 1, -5, 5, -5, 3, -6, -5, 5, 4, + -3, -6, 1, -5, -5, -8, -6, -6, 4, -6, 5, 1, 5, -1, 6, + 2, 4, -6, -8, -6, 2, -3, -1, -2, 3, -1, -1, -1, 5, 1, + -8, 0, 2, 1, 6, -1, -6, -5, -3, -3, -7, -5, 6, -7, -8, + 2, -2, -4, -4, -1, -7, -5, 5, -7, -5, 4, -8, -3, -3, 2, + 5, -2, 1, 0, 5, -3, 0, 2, -6, -8, -2, -7, 5, 6, 6, + 0, -1, 3, -4, 3, -2, -4, -6, 1, 1, -5, 3, 1, -5, 3, + -3, 6, -6, -4, 2, -6, 2, 3, 0, 4, -3, -5, -3, 4, 4, + -7, -2, -2, 6, 5, 2, 1, 1, 6, 1, 3, -8, 4, -3, -4, + 4, -5, -6, 5, -5, -5, -4, 0, -5, 1, -3, 3, 2, 5, 0, + 0, -2, -7, 3, 4, -4, -2, 5, -1, -6, 2, 1, 0, 3, -3, + -5, 0, 6, -5, -4, 4, -4, 4, 6, -2, 3, -7, -1, -1, 0, + 0, -8, -3, 2, 3, 2, -6, 0, 0, -3, 5, 6, -7, 5, 3, + 0, -7, 4, 3, -5, -7, -7, -3, 0, 5, 2, 1, 5, -5, -2, + 6, -1, -4, 2, -2, 1, -1, 2, 5, 1, 1, -8, -5, -7, 6, + -2, -6, 2, -4, 4, 6, -7, 1, 2, -5, 0, -1, -4, -7, 0, + -2, 4, -7, -7, 6, 0, 5, 2, -8, -3, 2, 4, -8, -1, -3, + 5, 1, -3, -8, 2, 3, 1, -7, 4, -8, 6, -7, -7, -8, -2, + 1, 5, -8, 1, -1, -6, -1, 6, 5, 3, -8, 3, 6, 1, 5, + 2, 2, 1, 0, 4, -3, 6, 6, -1, -8, 0, -5, 3, -3, 6, + -7, 5, -7, 1, 4, 2, -2, 1, -6, -5, 5, -6, 4, 2, 1, + -6, -4, -2, -7, 2, 3, -7, -5, 5, 5, 6, 5, 3, 4, 4, + -3, 0, 2, 0, 4, -6, 0, 5, 6, 2, 1, -2, -6, -8, -5, + 3, 5, 5, -7, -4, 1, 6, 0, 3, 5, -7, 6, -2, 6, 3, + -2, -4, 0, -8, 6, -2, -5, -4, -6, 4, -2, -4, -6, 2, -3, + -6, -7, -4, 1, -8, 1, -8, -1, 3, -4, -6, 0, -1, -4, -1, + 6, -2, 0, 6, -7, -5, -2, -2, -8, -4, 0, 0, -7, 6, -1, + -6, -7, -5, -1, -2, -6, 3, 4, -7, 6, 1, -2, -2, 3, -7, + 4, -4, 5, -4, -4, -7, 1, -3, 6, 1, -8, 4, 3, 6, -6, + -3, 6, 4, -3, 3, -6, 0, -4, -3, 0, 6, -7, 1, -6, 4, + -2, 5, 0, 6, 4, 2, -5, 5, 1, -7, 0, -8, -6, 2, -4, + -5, 4, 4, -1, -6, 4, 0, -2, 6, -2, 2, 4, -1, -3, -5, + -1, 2, -2, -4, -6, -8, -2, 5, 1, -4, -5, -6, -5, 1, 2, + 1, 5, 5, 4, -1, -4, -8, -8, 5, -7, -7, -2, 6, 1, -5, + -5, 0, -1, -6, -6, 3, 0, 1, -8, -2, -6, -8, 4, 6, 0, + -4, -5, -6, 5, 3, -6, -4, 6, 2, 4, -2, -4, -1, -8, -7, + 0, -3, 4, 2, 2, 4, 1, 5, 0, 6, 0, 0, 0, -8, 0, + -2, -4, -5, -2, -1, 6, -2, -4, 5, -8, 5, 5, 0, -5, 4, + -2, 1, 1, -6, 3, 1, -5, 6, 4, -5, 3, -4, -7, -1, -8, + 6, -8, -5, 3, 4, -7, 3, 2, -7, -6, 6, -3, 1, 0, -2, + -7, -8, -6, -5, -2, 4, 0, 4, -7, -8, 5, 3, 0, 4, -7, + -2, 0, 5, 1, 4, -2, -5, 0, -3, -2, 3, -7, -3, -8, 6, + 5, -3, 6, 2, 5, -1, 3, -7, -1, 5, -3, 6, 4, -1, -4, + 2, -5, -6, 4, -5, -3, 4, -2, 4, -6, 3, 1, -5, 2, 1, + -2, -2, 2, -8, 2, -6, 0, -7, -3, 2, 0, -7, -6, -1, -8, + -6, 4, -2, -7, -7, -5, -5, 6, 0, 2, 2, 4, 0, 0, -6, + 0, 3, -7, -4, -7, -4, 5, 6, 1, 0, 0, -1, -2, -8, 3, + -4, -1, -2, 1, -4, -6, 3, -3, 1, -5, 1, -7, -8, -5, -2, + 3, 3, 1, 0, 4, -1, 0, -2, 4, 0, 3, 2, 6, 4, 6, + 0, -6, -3, -3, -8, -7, 5, -7, -1, -5, -6, 2, 6, 3, 6, + -8, 2, -8, -1, 5, 6, 6, 5, -3, 4, 3, -8, 3, 0, 5, + 3, 4, -8, 6, 1, -8, 3, -8, -8, -1, 0, -8, 2, -6, 1, + 4, -5, -4, 4, -7, 2, -4, 5, 1, -4, -4, 0, 1, 5, 6, + 4, -2, -8, -6, 4, 2, 5, -3, 6, -4, -2, 0, -4, 0, -7, + -3, 3, -2, -1, -5, 3, -3, 6, -8, 1, 2, -5, -8, 6, -4, + 6, 2, -7, 3, 1, -7, 1, 5, 6, -1, -7, 1, 4, -2, -1, + -5, 5, 5, 4, 4, -8, 4, -5, 1, -2, 2, -2, 6, -5, -6, + -1, 1, -3, -8, -8, 1, 0, -2, -6, -1, -2, 5, -5, -8, 4, + -4, 6, 1, -3, -5, -8, 1, -2, -5, -1, 0, -2, 6, 1, 3, + -4, 6, 1, -8, -6, -2, 1, -2, -3, -1, -7, -8, -5, 6, -4, + -1, 3, -7, -3, -7, 1, -4, 4, -5, 1, -3, 5, -6, 2, 1, + 1, -1, 3, -1, 3, 2, 2, -8, 1, 6, -5, -5, 1, -5, -2, + -6, 1, -3, 5, -2, -6, -4, -6, -7, -8, -4, -3, 0, -7, 0, + -1, 5, -5, -5, 1, 2, -2, 4, -6, -6, -4, 2, -1, 0, -1, + -3, -1, 4, 1, -6, -3, -5, 2, -7, -8, -1, 6, -4, 2, -4, + -7, 0, -8, 6, 5, 4, 1, 2, 2, 1, 3, -2, 2, 1, -1, + 4, 2, -4, 2, 4, -2, 6, 3, -5, -4, -6, 4, -8, -1, 5, + 2, -8, -2, 6, 3, -7, -7, 4, 3, -5, 6, 2, -5, -4, -7, + 4, -8, -6, -7, 5, 3, 6, -5, 4, -4, -8, 1, 0, -2, 1, + -4, -8, 5, -3, -7, 6, -8, 4, 3, -5, -4, -3, 5, -8, 2, + -4, -4, 5, 1, -1, 3, -8, -5, 3, 0, 4, 0, -2, 2, 6, + -4, -3, -6, 3, 1, 3, 0, -4, -7, 4, -7, -2, -3, 0, -8, + -2, -4, 3, -5, -8, 3, 2, 4, -1, -6, -8, 0, -2, 6, -5, + 2, -5, -8, -1, 5, 1, -8, 5, -5, 2, -7, -5, -7, 5, -8, + -7, 2, -3, 2, -8, -4, 0, -5, -3, 6, 2, -1, -6, -3, -2, + 3, 3, -3, 4, -6, -5, 2, 6, -7, -1, -2, -1, -1, -3, -3, + -7, 6, -3, 1, 0, -3, -4, 3, -6, -4, -6, 6, 0, -4, 2, + -4, -1, 6, -5, 5, -4, -4, -2, 6, -1, -1, 2, -2, 1, 5, + -1, -4, -3, -3, -6, -8, 6, -1, -6, -6, 6, 2, 3, -3, 1, + 2, 0, -2, -3, 3, -3, 1, -6, -6, -4, 3, 0, -7, 6, 6, + -7, 4, -2, 5, -8, -6, 0, -5, 6, 5, -2, -2, -3, 2, 6, + -7, 1, 6, 1, -7, -3, -5, -8, -5, 1, -6, -5, -8, -7, 6, + -2, -3, 5, -2, -5, -1, -8, -2, -3, 2, 3, -7, -2, -6, 5, + -2, 4, -8, -2, 2, 6, -7, 4, 0, -3, -3, 2, 1, -7, -2, + 2, -5, -5, -3, -3, -8, 2, -8, 4, 3, -5, -6, 4, -6, 1, + -2, -5, -4, -3, 4, 1, -3, -6, 0, -7, -4, 2, -1, 2, -7, + 1, 2, -6, 1, -4, 5, 1, 5, -3, 0, 0, 1, 4, 5, 5, + 0, -8, -3, -6, 2, -7, 5, 4, 6, -5, -8, 2, -1, 3, 2, + 6, -7, -7, -8, 0, -1, 4, 2, -5, -4, 6, 1, -4, 3, 0, + -6, 4, -4, -7, -6, -5, 2, -2, -1, 1, -2, 0, 6, -4, -3, + -3, 5, -3, -7, 0, 3, -8, -7, 4, -6, -3, 6, -3, 1, -2, + 2, 2, -2, 2, 6, 0, -4, -3, 4, 5, 4, -3, -1, 1, 2, + 6, 1, 6, -6, 0, -5, 2, 2, 6, -7, -3, 6, -3, -3, 2, + 3, -1, 6, -8, 6, -4, -8, -1, 4, 6, 3, -5, 6, 3, 0, + 0, -7, -4, 6, -7, 6, -1, -1, -8, 5, -1, 3, -6, 1, 4, + -1, 5, 2, 5, 0, -7, 1, -6, -8, 6, 2, -4, -4, -4, -5, + -7, -3, -8, 3, -3, -1, -5, 4, -2, -1, 0, 4, -4, -5, -7, + -6, -7, -8, 2, 1, -7, 0, 4, -6, -8, -7, 2, 0, 1, -5, + 4, 2, 0, 0, 0, -5, -2, -1, 0, 0, -4, -5, -8, -2, -1, + -6, -8, 2, 1, 0, -6, 2, -3, 0, -8, -6, -4, 3, -8, 2, + 5, 4, 1, 0, 3, -3, -8, -2, -1, -3, -2, 5, -3, -7, -6, + 2, -6, 6, -2, -3, -8, -4, 2, 0, 6, -6, 1, -2, 4, 1, + 0, -8, -3, -5, -6, -6, -8, 4, -5, -6, -8, -5, -4, 0, -1, + -1, 5, -6, -6, 4, -3, -2, -8, -6, -3, 3, -7, -3, -5, -4, + -4, -8, -5, -6, 4, -2, 4, 0, 4, -1, -3, -8, 1, -5, 1, + -1, 5, -4, -2, 4, -4, 5, -7, -4, 4, 1, 5, -5, 6, 6, + 3, -8, 3, -2, 3, -2, 4, -3, 5, 3, 4, 3, 0, 5, 1, + 3, -2, -3, -2, 2, -1, 4, -3, 3, 1, 2, -8, 5, 6, 1, + -6, -2, -1, 4, -3, 0, -6, -7, 4, 3, 6, 4, 5, -3, -5, + -4, 5, 2, 1, 4, -3, -4, 6, -8, 2, 2, -3, -1, 5, 0, + -2, -2, -3, -1, -8, 6, 6, 4, -8, 0, 1, 4, 1, -2, -8, + -2, -8, -6, 3, 0, -6, 1, 6, 5, 1, -2, -1, -4, 6, -4, + -2, -7, 4, -4, 0, -3, -4, -3, 1, 4, 2, -1, 0, -5, -4, + 5, -8, 3, -7, -1, -8, 1, -5, -8, -5, -6, -1, 5, 5, 1, + -5, 3, -5, -5, 0, 4, -5, -7, 1, 2, -6, -1, -1, 6, 0, + 3, -5, -3, 1, 0, -3, -4, 0, 3, -7, 4, -3, -2, 2, -4, + 2, 5, 4, -7, -1, 4, -6, 3, -7, 1, 1, -3, 4, 0, -1, + 4, -5, 0, 2, -8, 2, 5, 3, -3, -8, -5, -4, -2, -6, 3, + 6, -7, -2, 4, -6, -6, 3, 4, -3, 4, -1, 5, 4, -1, -7, + 6, -6, -7, 5, -4, -8, 3, -4, 5, 4, -4, -3, -4, -5, 6, + -2, -3, -5, -4, 3, 4, 6, -1, 5, -3, -6, 6, 5, 5, 4, + -1, -1, 4, -1, 5, 3, -8, 0, -3, -7, 0, 0, -4, -6, -7, + 6, -2, 1, 6, 3, -5, 3, 2, 0, -1, 3, -4, -5, 6, 6, + 0, -3, -3, -2, -8, -5, -3, -6, 0, 3, -2, -7, 2, -1, -4, + 6, -4, -6, -3, -8, 6, -3, 4, -1, -7, -5, -6, 1, 2, 4, + 1, -3, -4, 3, 4, -8, -4, -3, -2, 3, -8, -8, 1, -6, -5, + 1, 6, -3, -2, 6, 6, 6, 4, 4, -5, -2, 3, 0, -3, 6, + 4, -4, 2, -4, 0, 3, -3, -4, 2, -8, -8, 3, -8, -8, 1, + -3, -3, -8, -2, 1, -1, -2, 5, 5, 6, 2, 3, 3, -4, -6, + -5, 5, -4, 3, 4, 3, -4, -1, -8, 2, 2, 4, 2, 6, -5, + -1, -2, -5, 3, -8, 1, -3, -1, -1, 6, -7, 5, -4, -7, -7, + 3, -5, -5, 6, -5, 1, 1, -7, 1, 5, 3, -3, 0, -4, -7, + -8, 3, -2, -4, 2, -7, 3, -8, 1, 5, -2, 4, -6, 0, -8, + 6, -7, 0, -3, -7, 2, -8, -5, 6, -3, -3, -6, 1, 1, -8, + 0, 4, -3, 4, -3, 1, -8, -6, 2, 4, -5, 2, -4, -3, -6, + 1, 6, -6, -7, -6, -6, -2, 4, -4, -5, -3, 1, 5, 5, -4, + -2, -7, 3, -7, -8, -1, -1, 3, 3, 1, -6, 6, -7, -3, -7, + 3, -2, -4, -7, -4, -7, -3, 3, 6, -2, -8, 2, 0, -7, -3, + -7, -6, 2, 3, -1, -2, -7, -6, -4, 0, -2, 5, -2, -5, -6, + -1, -7, -8, 3, 2, 6, 2, -6, -6, -8, -8, 4, 4, -5, 4, + -4, -4, -4, 0, 6, -2, -6, 6, 1, 1, 0, 2, -8, -8, -5, + -2, -6, -3, 1, -4, 0, 5, 3, -8, -1, -5, 1, -3, 6, -3, + -5, 2, -8, -2, -1, 3, 2, -3, 6, -2, -2, -5, -3, -6, 1, + 2, 4, 5, -3, -5, -5, -6, -4, -6, -8, 4, 5, -8, 2, -3, + 5, 1, -7, 0, 5, 4, -5, -5, 3, -1, -3, -3, 1, -8, -6, + 2, -7, 2, 4, 2, 0, 2, 6, -4, 4, -7, 5, 5, 1, -3, + -2, -1, 1, 0, 0, -4, -3, -5, 5, -2, 1, -1, -2, 3, 0, + -4, 4, 5, -1, 2, 4, -3, -8, 4, 5, 2, 4, -8, 4, -6, + 3, -2, 4, 5, -7, -7, -6, -1, 4, -4, -2, -7, 2, 6, -5, + -6, 2, 2, -1, 0, -7, -6, -6, -3, 4, -1, -3, 2, 0, -1, + 2, -3, 6, 4, -1, -3, -8, -2, -2, 5, 3, 2, -6, 6, -6, + 0, 4, -8, 3, -3, 5, -1, -1, -3, -4, 0, -6, -3, -6, 5, + -7, -6, -5, -3, 0, -6, 1, -7, 2, 2, -2, -8, 1, -8, -4, + -8, 0, -7, -6, -1, -4, 2, 0, 2, 1, -6, -1, 1, 0, -1, + -8, 4, -8, -4, -2, -4, 2, -4, 0, -2, 5, -6, -2, 4, 3, + -5, -3, -6, -2, 5, -7, -7, -5, -3, 2, 0, 1, -8, -7, 0, + -4, 6, -5, -7, 6, 5, -4, -2, 4, 1, -3, 1, 0, -4, 1, + -1, 3, -8, 3, 1, 5, -2, 3, 0, 4, -8, 6, 2, 0, -8, + 1, -7, -3, -4, 2, -5, 4, -7, -3, 1, -8, -2, -3, -7, -1, + -5, 4, 1, -4, -8, -4, 2, 6, 4, 4, 4, 2, 4, -5, -5, + 1, -1, 6, -8, -5, -3, -2, 2, -2, 3, 6, 6, -1, -2, 5, + -5, -2, -3, 4, 1, 3, -2, 0, -4, 0, 3, -8, -1, 5, -4, + -4, 3, 0, -8, 6, -4, -8, -4, 6, -1, -6, -7, -3, 2, -4, + 6, -5, -5, -7, 5, 0, -3, 0, 0, -3, 4, 0, 0, -7, -1, + 1, 3, 1, 1, -1, -7, 6, -8, 6, 3, -5, -2, -1, 0, 6, + -5, -1, -7, 0, 4, -2, -4, -2, 5, -3, -4, 0, 1, -8, -6, + 0, -7, 3, -2, 5, -2, 0, -5, -5, 3, -4, 1, -1, -1, 0, + 3, -7, 3, -1, -7, 4, 1, -4, 0, 4, 1, 6, 3, 4, -5, + 5, 2, -7, -1, 4, 4, 1, 4, 5, -2, 1, -6, 4, 1, 4, + -8, -3, -1, -7, 2, 2, 5, -6, 4, -5, -1, -4, -6, -3, 4, + -4, -3, 5, 0, -2, 0, 6, 2, 5, -8, 6, 2, -4, 5, -5, + -6, -7, -2, -7, -4, -6, -8, -5, -7, 0, 5, 5, 5, -7, -5, + -7, 1, 6, 5, 1, -1, -1, -1, -8, 6, -4, 4, 2, -2, -5, + -3, -3, 6, -1, 6, 5, -3, -8, 1, -7, -3, -8, -1, -5, -7, + 4, -3, -7, 2, -5, -3, 1, 3, -3, 3, 5, 4, 3, -1, -6, + -2, 0, 4, -5, 1, 2, 0, -2, 6, 5, 2, -2, -3, 6, -1, + 2, -5, 6, -1, -4, 3, 6, 3, -3, -4, 3, -2, 0, 5, 0, + 3, 1, -6, 0, 3, -7, 5, -3, -5, 3, 3, 3, 0, 1, -4, + 5, -3, -6, 0, 3, -3, -7, -3, -4, 3, 0, -8, -2, 0, -3, + -3, 5, 5, 0, -6, -5, -2, -4, -6, -8, 2, -6, -1, -7, -5, + 2, -6, 1, -6, -1, -2, -3, 2, -5, -8, 6, 1, -2, -6, -7, + 2, 3, 5, 0, -5, -7, -3, 2, 4, 6, 5, 5, 3, -7, 2, + -8, 1, -6, -1, -3, -5, -6, 5, -3, -5, -4, 2, 5, 4, 1, + 3, 0, -6, 4, 2, 6, 4, 1, 5, -8, 1, -4, 3, -5, 5, + -3, 2, -3, -8, 5, -8, -8, -6, -4, -2, -5, 0, -4, 1, 0, + -2, -5, 0, -8, -5, 2, -6, -1, -1, 6, -8, -4, -1, -4, -1, + 5, -2, 4, -1, 0, -8, -4, 2, 3, -4, -7, -2, -8, 2, -5, + -8, 0, -6, 1, 2, -2, 6, -3, 5, -3, 1, 4, -6, 1, -5, + 1, 0, 6, -8, 6, -1, 3, 4, 3, -1, 2, -3, 3, -2, -7, + -3, -8, 6, -4, -4, -5, -6, 3, 4, -7, -2, 0, 6, 5, -8, + 6, -5, -8, -3, -6, -3, 6, -1, -3, -2, 6, 1, -5, -4, -7, + 5, -4, 4, 0, -5, -5, -2, 5, 1, -8, -5, -8, -1, -5, 6, + -1, -8, -1, -7, -4, -6, -1, 2, 2, -7, -3, 3, 3, -8, -6, + -1, 5, -8, -5, -5, -2, -3, -3, 0, -8, -7, 1, -4, -3, -4, + -2, 6, -5, -2, -2, -4, 0, -2, 0, 2, -2, -7, -4, 5, -5, + 0, 6, -4, -6, 0, 2, 6, 1, -6, -6, 3, -6, -3, -3, 6, + 6, 5, 1, 6, 5, 3, -6, 3, 1, -7, 4, 6, -2, 5, 6, + -3, 6, -2, -1, -7, -8, 0, 0, -2, -2, 3, -7, -3, 3, 1, + -5, 4, -4, -5, 5, 1, -8, -5, 4, 0, -4, 1, 5, -2, 1, + -3, -5, -3, 6, -7, 6, -5, -6, 3, 0, -5, 1, 5, 0, 4, + -8, -8, -5, 3, 2, -5, -2, -7, 1, 6, 2, -2, -8, -4, -1, + 1, -8, 2, 4, -1, 5, -7, 0, 1, -8, 1, -8, 1, 6, -8, + 1, -7, 4, 1, -3, -7, 0, 6, 5, 0, -7, -6, -3, -4, -7, + -7, -8, 1, 5, -2, -4, -4, -2, 3, 4, 5, -5, 1, -3, 5, + 5, 6, -3, -2, -7, 4, -5, -2, -5, -5, -4, -7, -6, 3, 1, + -4, -1, 4, -1, 6, -6, 5, -1, -5, -7, -1, -5, -2, 2, -1, + 4, -4, 4, 1, -1, 1, 2, 0, 0, 1, 5, -6, 5, 5, 2, + 0, -8, -3, 3, 4, 5, 2, 5, -5, 0, -8, 5, 2, 5, 5, + -7, 3, -4, 0, 5, -6, -3, -8, -2, -7, 0, 2, 3, -8, 2, + 4, -2, -4, -7, 5, -6, -3, 6, -5, -5, -5, 6, -1, -5, -7, + 1, -6, 4, 2, 6, 0, -7, 4, -4, 4, -1, -2, -2, -7, 1, + -1, 6, 3, 0, -4, -1, -4, -2, -8, -5, 2, 0, -6, -2, 5, + 4, -1, -4, -8, -4, -3, 0, -1, 6, 4, 2, -5, -3, 0, 6, + -8, -4, 4, 1, -5, 3, 2, -3, -1, -4, -8, -6, -7, -7, 1, + -4, 6, -7, -8, -7, 6, 6, 3, -4, -2, 1, 1, 0, 4, 4, + -2, 3, 5, 6, -1, 4, 6, 1, -1, 0, 1, 0, -5, -5, -7, + -4, -3, 5, -6, 3, 6, 4, 5, -8, -7, 6, 0, 5, -1, 3, + 6, 0, 2, -7, -2, -5, 0, -2, -7, 5, 4, -7, 1, -5, -2, + -3, -7, 4, -5, 2, -1, -3, -4, -6, -8, 3, -8, -7, -2, -6, + -5, 6, -6, 0, -2, 1, 3, -5, -6, -2, 6, 2, 6, -4, 3, + 6, -5, -7, -1, -2, 2, -4, -1, 0, 6, 2, 4, 6, -5, 2, + 4, 3, -2, 3, -5, -7, 1, -2, 6, -5, -4, 1, -5, 0, 1, + -1, 2, 2, 1, 6, 1, -7, 6, -3, -7, -7, -5, 0, 3, 2, + 0, 2, -2, -1, -4, -3, -1, -4, -3, 1, -8, 0, 6, -1, 5, + -4, 5, 5, -4, -3, 1, 2, 1, 6, -6, 5, 3, 0, -3, 0, + -1, 4, -3, -3, 2, 5, -8, -4, -4, 2, -4, 1, -6, 4, 0, + -3, -2, -6, 4, -1, 3, 2, -6, 5, 5, 0, -8, -3, 0, 2, + -1, 4, -4, -2, -5, -6, -6, -3, -6, -8, -5, -8, -5, -1, 3, + -5, -7, 0, 2, 6, -1, -3, -6, -7, -7, 6, 1, 2, -3, 2, + -2, -6, 5, 2, 3, 0, -4, 0, -5, -7, -5, -4, 6, 2, -1, + -6, 6, -4, -6, 1, -4, 1, 5, -7, -6, -2, -7, 5, 0, 2, + -7, 4, 3, 0, 0, -5, -4, 3, 6, 1, -8, -8, -1, -8, 1, + 4, -4, -3, 3, 4, -7, -2, -5, -3, 1, -4, -4, 4, 3, -8, + 6, -5, -1, 6, -5, -5, 5, -1, -6, -7, 4, -5, -2, -5, -2, + 5, -8, 4, 3, -5, 2, 2, -6, 3, 3, -4, -3, 5, 6, -8, + -5, 0, 5, -8, -7, 1, -6, -7, -2, -6, -5, 4, 6, -2, 6, + -4, 1, -2, 0, -4, 2, -7, -5, 6, -2, 0, 0, -1, -6, 3, + -7, -2, 5, 6, -1, 6, -5, -5, -3, 6, -7, 5, 3, -8, 3, + 6, -1, 5, -5, 3, -6, -3, 1, -1, -1, -2, 0, -1, 3, 5, + 1, -8, -3, -1, -3, -3, -4, 4, 4, 4, 0, -7, -1, -4, -8, + -1, 6, 3, 0, -2, -6, 3, -5, 3, -4, 5, 5, -4, -5, -2, + 5, -7, -8, 0, -7, 5, 5, -3, 3, 4, -4, -5, 4, -4, 1, + 0, -7, 5, -7, -4, 4, -5, 0, 0, -2, -4, -5, 1, -5, 5, + -5, 3, 1, -2, 6, -5, 2, 1, 0, 2, -8, 6, 6, 1, -1, + -2, 2, -4, -7, 6, 5, -3, -2, 2, 0, 6, 5, -4, -3, -1, + 5, 0, 4, 6, -7, -5, -6, 2, 2, -2, 0, 0, 0, 1, -5, + 2, -7, 6, 0, 6, 0, -2, 4, 1, -7, -7, 3, -4, -1, -3, + 5, 3, -3, 0, -8, 1, -3, -3, 2, 1, 0, 4, 2, 5, -8, + -1, -6, -1, -5, -1, -2, 6, 3, -1, 5, -6, -6, 2, 1, -4, + -8, -1, -2, -6, 5, -3, -5, 3, -7, -7, -8, 4, 2, 2, 6, + -7, -4, -4, -4, -1, 1, 5, -5, -8, 0, 1, -1, 6, -7, -2, + 4, -5, -3, 3, -7, 6, -6, -2, -6, 2, 6, -7, -6, -6, 5, + 3, 4, -4, -7, 2, 3, -7, -7, -2, -1, -1, -8, -4, 2, -6, + 6, -6, -6, -6, -1, -7, -1, 1, 2, -4, -6, 1, 0, 6, 5, + 6, -1, -5, 4, -6, 4, -1, 2, 3, -5, -5, -4, -8, -7, -1, + -3, -2, -8, 0, -7, 6, 6, -6, 4, -8, 0, -7, 5, -7, 3, + 5, 1, -2, -4, 3, -5, 6, -7, 5, 2, 3, -8, 0, 3, 0, + -8, -5, 4, 5, 5, 4, 2, -6, -8, 1, 5, 5, -4, -7, 1, + -1, -3, -3, -7, 0, 3, -5, 5, -3, -5, -6, 2, -3, -8, -1, + 1, -3, -4, -4, 2, -8, -3, -2, 2, 6, -4, 1, 3, -5, 2, + 0, -5, -6, -3, -6, -1, 1, -8, -3, -7, -6, -4, -1, 1, -2, + -2, -3, 0, 5, -3, -6, 1, -3, 4, 5, 5, 5, -5, 6, -2, + -4, 0, 5, -5, -6, -1, 6, 5, -2, -2, 6, -7, -8, -4, -1, + -6, -1, 5, 6, -5, 3, 6, -7, -5, 2, 2, -4, 2, 5, 3, + 6, -4, 6, -5, 0, -8, -2, -4, -8, 0, -3, -4, -6, 2, 5, + 6, 4, -5, -4, -1, -3, 1, -2, 1, 0, -8, -4, 5, 0, -5, + 1, 1, -2, 4, -8, -5, 2, -7, 3, 5, -8, 6, -6, -1, 0, + -1, 3, 2, 4, 4, -2, -5, 1, 5, -2, 5, -8, 4, -1, -4, + 3, -3, -6, -6, -5, -5, -3, 6, 4, -5, 6, 2, 3, -6, -6, + -2, -6, 2, -1, -2, -3, -6, 5, 0, 1, 3, 3, -1, -4, 5, + -1, -8, -5, -5, -2, 0, -6, -1, 1, -3, 1, 5, -5, 3, 1, + 0, 3, -5, 4, 5, -2, -5, 2, -8, -7, 2, 2, -7, 1, 1, + -5, 4, 6, 3, -6, -8, 4, -5, 1, -1, 4, 3, -2, 3, -4, + 6, 0, -6, -2, 4, -4, -2, -3, 6, 1, -8, 3, 6, -2, -7, + 0, -5, 5, 0, -6, -2, 3, 3, 2, 3, 1, -4, 5, 3, 6, + -4, 1, 3, -2, -7, 0, 5, -1, -2, -7, 5, 3, 3, -6, -4, + 3, 6, 2, -5, 0, -5, -5, -1, 4, 4, 0, 3, 3, -2, 2, + 3, -1, -4, -1, -6, 2, -2, -7, 0, -4, -6, 5, 1, -8, -4, + 4, 3, -6, -5, -5, 2, -7, 5, -4, -2, -6, 0, 1, -6, 6, + -2, -6, -3, -2, -3, 5, 3, 2, 0, -1, -3, 6, 6, -2, -2, + -4, 6, -4, -5, 4, -2, 1, -8, -1, 4, 1, -2, -5, -5, -1, + 3, 5, 4, -8, 3, 1, 0, 5, 6, -3, -6, 4, 6, -8, -4, + -5, -4, 4, 1, -7, -2, 5, 6, 1, 5, 1, -5, -8, -3, -8, + 0, 6, -1, -8, 2, 1, 1, -6, 1, 5, -6, 3, -1, -4, 3, + 0, -2, -6, -7, -3, 5, 6, -1, -5, -5, -3, 0, 4, -1, -1, + -2, -4, -5, -6, 6, -4, 3, -5, 4, -6, -3, -6, 6, 6, 4, + -6, 3, -3, -7, -2, -8, -3, -1, -8, -4, -5, 3, 6, -1, 2, + 3, -4, 3, -1, -4, -8, -2, 5, 4, 6, 4, 2, 4, -2, 4, + 4, -6, -1, 3, -4, -2, -7, 2, -1, -7, 5, 1, -7, 5, -6, + 6, -4, 5, -5, 1, -6, -6, -1, 5, -7, 5, 1, -3, -6, 1, + 4, -2, -8, 2, -5, -7, -5, -8, -1, -6, 1, 1, -7, -6, -7, + -1, 6, 3, -2, 2, -3, 1, 4, -4, -5, -3, -8, -7, 6, -4, + 6, 4, 1, 5, -5, -4, -5, -4, 6, -5, -1, 5, -5, -2, 6, + -8, 2, 0, -6, 4, 5, -6, 4, -8, -1, 0, 0, 6, -7, 0, + 5, 2, 1, -4, -1, 3, 0, 5, 4, -2, 3, 5, 4, -4, 4, + -5, 6, -7, -6, -6, 6, 2, -5, -2, 4, 0, 5, -6, 5, 0, + 3, 0, 0, 2, -2, 4, 5, -6, -1, -4, -2, 1, -2, 5, -4, + 1, -2, -1, -5, 4, -6, -8, -4, 3, -7, 2, 2, 6, -7, 0, + 5, -7, 5, -2, -7, -8, 5, -3, 4, -5, 2, 5, 1, -6, 0, + -1, -1, 5, -7, -6, -4, -7, -4, -7, -6, 1, 1, 6, -2, -7, + -7, 6, 3, -2, 6, 3, 4, 4, 1, 5, 0, 4, 0, 1, 5, + -6, -3, 3, 1, -4, -4, -5, -5, -1, 3, -1, -5, -3, 3, -2, + 6, 2, 3, -6, -6, 4, -8, 2, -5, -4, -8, -3, -6, -1, -1, + 3, -2, -1, 0, 2, -4, 5, 2, -4, -3, -2, -3, -2, -5, -2, + 3, -6, 2, 3, 5, -2, 0, 2, 6, 2, 6, -8, 1, -5, 3, + -4, 6, -2, -5, 1, -6, 1, 5, 3, -7, -2, 6, 1, 0, 1, + 0, -2, 5, 5, -8, -2, -8, -1, -8, -2, -8, 0, 4, 3, 3, + 0, 6, 5, 4, -1, 3, 3, -7, -4, -7, -6, 4, 5, -5, -4, + 0, -7, -6, 0, 5, 4, -1, 2, 0, -5, -3, 4, -3, -8, 5, + 3, 5, 0, -8, 6, 5, 0, -8, -5, -8, -5, -6, 0, 1, 4, + 6, -4, -3, -8, -3, 4, -1, 6, -8, 6, -5, 5, -2, 5, -7, + -6, -5, -4, -2, -4, -3, 0, -8, 4, -5, -4, -2, -3, -5, -6, + -1, -7, 3, -1, 4, -7, -3, -4, -5, -4, -3, -4, 1, 3, 0, + -5, 1, 1, 2, 1, 6, 6, -4, -3, 0, 5, -7, 6, 4, 1, + -3, -5, -8, 3, 2, 1, -8, -1, 5, -5, -5, 1, -2, 1, -7, + -2, 5, 4, 2, 4, 4, -2, 0, 5, 4, 2, -3, 0, 3, -1, + 0, 2, -2, 3, 3, 6, -4, 3, -6, 4, 2, 3, 6, 1, 6, + -4, -8, 6, -3, 4, 6, 4, 1, -6, -4, -2, 0, -5, -5, -3, + 0, 0, -8, 4, 5, -2, -8, 5, -5, -8, 3, -6, 1, 3, 0, + -5, 3, 0, -7, 0, -4, -7, -1, -6, -6, -6, -4, -7, 0, 2, + -7, 6, 0, -7, -3, 0, 4, 1, -4, -2, -7, 3, 2, -6, 3, + -6, 1, -1, 4, 1, 4, 1, -1, 6, 1, 2, -6, -5, -3, 0, + -4, 5, -3, 5, 5, -6, -1, 1, 4, -4, -6, -4, 5, -4, -7, + -7, 0, -3, 5, -1, 0, 4, -5, 4, -4, -3, 4, -6, 5, 3, + -3, 5, 2, 2, 1, -5, -3, -7, 1, -2, 2, 6, -7, -3, 2, + -4, -6, 0, -6, 6, 2, 2, -4, -7, -4, 3, -3, -1, 2, 1, + -7, -7, 1, 5, 2, 5, 4, -8, -6, 1, -3, -3, 6, -4, -5, + -3, -2, -8, 4, -5, 3, -5, 5, -6, -2, -6, 0, 3, 0, 1, + -2, 5, -1, -1, -5, 5, 3, 4, -8, -2, -8, 2, 2, -1, 3, + -5, -4, 2, 6, 1, -2, -4, 6, -6, -6, -7, -5, 4, -4, 2, + 5, 1, -5, 1, -2, -3, -4, 6, 5, 2, -2, 4, 5, 4, -4, + -5, -6, 1, 0, -2, 6, -6, 3, -8, -5, -4, -5, -4, -5, 4, + 3, -6, -2, 6, -1, -2, -8, -8, -5, -7, 2, 1, -5, 3, 1, + -7, 4, 0, 4, 4, 6, 6, -3, 2, 2, -7, -4, -5, -4, 0, + 4, 3, -4, -8, 5, 3, 4, 0, 3, 4, -2, 1, 4, -7, 2, + -4, 5, 5, -4, -1, -1, 1, 6, -8, -5, -6, 6, 2, -8, -8, + 3, 4, 1, -4, 2, -8, 5, -3, 6, 1, -3, 3, -2, -2, -7, + 2, 2, -6, 3, -7, 4, -4, 5, 1, -5, 3, -6, -6, 1, 0, + 2, -1, -1, -5, -7, 4, 2, -7, 6, 5, -5, -4, -5, -6, 0, + -4, 4, -2, 6, -6, -8, 6, -4, -1, 2, -5, -5, -8, 2, -8, + -7, -7, -5, -3, 6, -8, -3, 2, 3, -8, -3, 1, -3, 6, -8, + -6, 0, 6, -5, 6, 4, 2, -8, -5, -5, -3, -2, -7, -3, -1, + -3, 5, -2, -3, -1, -1, 2, -7, -8, 6, 6, -4, 2, 1, -3, + 6, 0, 2, -3, -7, 0, -4, -8, 5, 1, 5, 6, -8, -8, 6, + 1, 0, 1, 2, -7, -5, -7, -8, 4, 1, 3, -3, 6, 3, 2, + 5, -2, -5, -7, -6, -3, 3, -4, -6, 0, 1, -3, 5, 2, 2, + -8, -2, 1, -3, -3, 0, 5, 0, -6, -6, 4, 3, 6, 2, -3, + -3, 2, 6, 0, -7, -5, 0, -1, 0, -5, -6, 0, 1, -7, 2, + -3, -4, -2, -7, 5, 3, 4, 4, 0, 3, -5, 2, -3, -5, 2, + -2, -8, -2, -7, 0, -3, -3, 3, -3, -7, 4, -5, -8, 4, -2, + 2, -6, 6, 2, 6, 1, 3, 3, -7, -4, 6, -6, -6, 2, 2, + 3, 1, -1, -8, -7, -2, 4, -4, 0, 2, -8, 3, -4, -7, 6, + 6, 3, -8, 3, -6, 1, -6, 4, 1, 3, 2, -1, -7, 2, -4, + 0, 2, -7, -2, -8, 6, 0, -1, 3, -2, -8, 4, 2, -7, 3, + 3, -2, 5, 5, -1, -1, 6, -1, 4, -7, 4, 0, 0, 6, -8, + 6, -6, -3, -8, 4, -8, 4, 1, -3, -1, -5, 6, 4, -4, 3, + 4, 3, -8, -8, -3, -2, 2, 1, -1, 1, -6, 2, -5, 1, 0, + -6, 2, 2, 4, 3, 6, 2, 3, 1, 5, -1, 1, 2, -6, -5, + -3, 5, 5, -4, 0, 3, -3, 1, -4, -8, 2, -7, -4, -5, -4, + 3, -6, 0, 1, 6, -1, -5, 3, -5, -7, 2, 1, 1, 2, 5, + -7, 2, -8, -7, 5, 0, 2, -4, -5, -2, -7, 2, -4, -1, -5, + 0, 5, -7, -5, 6, 2, -4, -4, -3, 3, 4, 0, -3, 0, -3, + 5, 1, 1, -7, -6, -6, -2, -6, 6, -5, 5, -8, -5, -2, 5, + -3, -3, -7, -4, -7, 0, 1, 5, 2, -4, 2, 1, -7, -6, 6, + 3, 6, -2, 3, -3, -8, -3, -5, -7, -5, -6, -7, -2, 6, -4, + -4, -2, -8, 0, -2, 2, 3, -7, -1, -4, 2, 2, 2, -1, 1, + -4, 5, -7, -2, 6, -3, -8, -7, -7, 2, 0, 0, 5, 0, -7, + 6, -4, 0, 2, -1, -4, 5, -4, -5, -7, 1, 1, 3, -4, -5, + 6, -7, 2, -7, -4, 1, -7, -7, -1, -4, 2, -2, -3, 4, 6, + -8, -1, -3, -6, -2, -1, -4, 5, -4, -6, 0, -5, 4, 5, -5, + 5, -8, -8, -7, 4, 1, 1, -6, 2, -7, -5, 3, 6, -7, -3, + 0, 4, 2, -7, -5, -8, 4, -2, 5, -1, 2, 6, -1, 4, -1, + 6, -1, -1, -3, 6, -1, 3, 0, -3, 0, 2, -2, -5, -3, -2, + 2, -6, 0, 1, -7, -4, -1, 6, 0, 1, -4, -6, 5, 2, 0, + -7, 5, -6, -7, -4, -2, 5, 3, -8, 2, 1, -1, -8, -2, -4, + -4, -6, 5, 5, 1, -4, 3, -3, -7, 4, 4, 0, -8, -6, 0, + 4, -5, -8, 5, 2, -1, -4, 6, -1, -4, -4, -7, -2, 4, 5, + -7, -3, -8, -6, 0, -1, -5, 5, -2, 1, 4, -6, -2, 6, -3, + -4, 1, 4, 1, -3, -6, -7, -1, 0, 4, 2, 6, -7, 3, -1, + -5, -6, 6, -6, -7, 1, -6, 4, -1, -5, 5, 4, 0, -3, -8, + -6, 5, -5, -5, 1, -1, 5, -7, 3, -8, 0, -7, 6, -6, 5, + 2, 3, -6, 6, 6, -3, -5, -5, 5, -6, -8, -8, -8, -2, -2, + -4, -6, -1, -8, 6, 6, -5, 6, -8, 0, -3, 5, -2, 6, 2, + 5, -7, 5, -1, -3, 2, -5, -3, -6, 2, 5, 3, 5, 0, -2, + -5, 6, 3, -7, 4, 0, -1, -1, 2, -3, -4, -4, -4, 1, -5, + -8, -2, -7, -2, 3, -6, -6, 0, -3, -3, -1, -8, -7, 0, 3, + -5, -4, 5, 6, -7, 4, 5, -4, -7, -3, -3, 2, 5, -1, 1, + 3, 5, 6, 2, 0, -1, -6, 2, -7, 1, -2, 0, -5, -6, 6, + -8, -1, -5, 4, -5, 2, 3, 2, -3, 6, 2, 2, -3, 4, 4, + 4, 5, 2, 4, -7, 5, -1, 3, -3, -7, -7, -7, 2, 3, -6, + 1, -3, 0, -7, 3, -6, -2, 3, -3, -8, 0, 2, 3, 5, -3, + -1, 4, -6, 1, -8, -8, 6, -7, 5, 6, 3, -7, -6, 6, -4, + 5, -8, -3, -5, 1, -4, -6, -4, -7, 3, 1, -1, 0, 5, -7, + -2, -7, -8, -3, -3, -8, 0, 2, 0, 6, 2, 2, 1, 1, -8, + 6, 1, -3, 0, -3, 3, -1, -4, 2, 5, 3, -1, 3, -3, -1, + -8, 4, -6, 6, -1, -7, -7, -8, 2, 6, -8, 0, 1, -4, -1, + 0, -5, -5, 1, 2, -1, -1, -4, -3, 0, 2, -2, 2, 6, -4, + -3, 5, 2, 1, -1, 0, -4, -5, -2, 4, -2, 2, -3, -8, -8, + -2, 5, 6, 4, 6, 2, 1, -8, 0, -1, -8, -2, -8, -1, -4, + 5, -5, 4, -5, 1, 6, -6, 2, 2, 2, -7, -1, 3, -6, -1, + 0, 3, 4, -5, 5, -7, 5, -4, -3, -2, -8, 1, -4, -4, -4, + -8, 0, -5, 4, -2, 4, 5, -1, -6, 3, 1, 2, -5, 3, -1, + -7, -3, 0, 2, -1, -2, -2, 0, 0, -3, -3, 2, 6, -4, 6, + -2, -2, 3, -6, -6, -4, -2, -1, 2, 5, -3, 2, 0, -8, -4, + 2, 0, -5, 2, -3, 1, -1, 4, 1, -2, 1, 0, -7, -4, -6, + -1, 2, -8, -4, -5, -4, 2, -5, -1, -7, -5, 2, 5, -3, -7, + 4, 2, -8, 3, -6, -2, 6, -3, -8, -2, -7, -3, -5, -3, -5, + 2, -2, 3, -4, -3, -3, 6, -2, 4, -6, -4, -5, 4, -6, 0, + 5, 1, 0, 4, -3, -2, 3, -3, -7, -8, 0, -4, -3, -6, -5, + 2, -1, 0, -3, -6, 5, -7, 2, -7, 3, 5, -4, -2, 5, 5, + 6, 3, -5, 4, 2, -3, -6, 3, 4, 4, -1, 6, -2, 1, -8, + -6, 6, -4, 5, -2, 0, -3, -1, -4, -5, -3, 6, 1, -6, -6, + -5, 1, -8, -7, 6, 5, -8, -7, -3, 2, -1, -8, -3, 5, -2, + 6, 4, -3, -2, -5, -1, -5, -5, -2, 6, 4, 3, -3, 0, -1, + -2, -2, -7, -7, 1, 4, -2, -5, 0, 6, -7, -1, -8, 5, 2, + 2, -7, -4, 4, -3, -6, -2, 1, 6, -5, -5, 2, 6, -2, -6, + 2, 4, -7, 1, 2, -7, -2, 1, -3, -7, 6, -8, -7, -2, -2, + 4, -1, 4, -2, -8, 3, -7, 5, 1, -4, -3, 6, -1, -5, -6, + 3, -6, -1, 4, 1, 6, -5, 1, -5, -4, 4, 2, -6, 3, 3, + 3, -1, -6, 4, -8, -3, 0, 1, -5, -1, -1, -7, 2, 3, -1, + 2, -4, -6, 3, -2, -5, -8, 2, -6, 2, -1, 0, 6, -5, -5, + 1, 4, -5, 4, 0, -8, -1, 2, -1, 0, -1, 3, -4, -3, 5, + 3, -3, 1, 2, 5, -8, -5, -3, 1, -3, -2, 5, 6, -7, -1, + -3, 3, -1, 2, -4, -2, 4, -1, -7, 2, -5, -2, -8, 1, -4, + 4, -1, -1, -4, -4, 2, 6, 4, 0, 4, 4, -2, 5, 1, 0, + 6, 6, 2, -8, 0, -5, -4, -8, -2, 0, -3, 4, -7, -6, -5, + -4, -5, -2, -3, -5, -7, 0, 0, 1, 2, 5, 3, 0, 0, -6, + -4, -2, 5, -5, -5, -2, -6, 5, 6, -5, 3, 2, 3, 5, -6, + 2, 5, 2, 5, 0, -6, 0, -8, 1, -6, -4, 1, -5, 4, -6, + 5, -7, 5, -7, 1, 5, -2, 2, -7, 0, -5, 3, -5, -2, -4, + -1, -3, -1, -2, 0, -1, 6, 5, 2, 5, 3, -3, 3, 6, 4, + 0, 0, 4, 3, -6, -2, 0, -8, -8, -8, -5, -5, -7, -2, 5, + 4, -6, -6, -8, 3, -2, 4, 4, -3, 4, -4, 1, -3, 6, -5, + 2, -2, 2, -5, 3, 3, 0, 2, 4, 1, -2, -3, -4, 5, 4, + 6, 6, 6, -2, -6, -1, -8, -3, 6, -2, 3, -6, -5, -2, 4, + -2, 6, 6, -6, -4, -2, 5, 0, -1, 5, 0, -7, -5, -2, 5, + -6, -2, -1, -3, -6, -5, -8, -1, 2, 0, 4, 3, -1, -2, 5, + 6, -3, 5, -8, 4, -4, -5, -1, 2, 4, 2, 0, 1, 0, -3, + 3, -8, -7, -8, -5, 5, -2, -3, -2, -6, 2, -4, -3, -4, 1, + 2, 2, 1, -1, -7, -5, 1, -3, -3, -2, -7, -7, -7, 1, 5, + -4, -4, -6, -2, 2, -7, -6, 3, -1, 3, 5, -7, -1, 3, 1, + -7, 2, -4, 3, 5, -2, -8, 0, -4, 6, -5, 6, 6, -6, 5, + -8, -4, -5, 3, -2, 4, 4, -2, 3, -6, -7, 4, -1, 0, -6, + 6, 0, -4, -7, 3, -5, -5, 2, 3, -5, 6, -4, 4, -8, -4, + -8, -8, -7, -8, 6, 0, -2, 2, 4, 0, 6, 1, -4, -8, 6, + -6, -5, 3, -4, 0, 2, -6, 0, 0, -2, -7, -8, 3, 5, -8, + -1, 1, -4, 4, -5, 2, -4, -7, -2, 0, -6, -5, 4, -6, -3, + -1, -4, -3, -5, -6, -5, 1, 6, 4, -7, 5, -1, -4, 6, -5, + -3, -6, -7, -3, 5, 4, 4, 4, -6, 5, -7, -5, 3, -4, 4, + 0, 4, -6, 6, -7, 0, -3, 6, -4, -8, 4, 6, 0, -7, -7, + -2, 0, -3, -5, 3, -4, -4, 3, -1, 4, 6, -2, 2, -5, -6, + 0, 4, -3, -5, -7, 3, 2, 3, 3, -4, 1, -1, -1, 5, -8, + 4, -3, 5, -2, -1, -6, 3, 6, -1, -2, -2, -7, 0, 0, -2, + -3, -3, -5, -6, -4, 5, 5, 1, 4, -2, -7, 5, -7, -8, 2, + 2, -7, 6, -1, -2, 2, -5, -6, 3, -8, -6, 0, 4, 6, 3, + 4, 5, -8, -2, 0, 6, 1, -8, 3, 0, 4, -7, -8, -8, 4, + -2, 6, 0, -6, -7, 2, -3, 2, 0, 2, -6, 4, -3, 6, -2, + 2, 0, -4, -6, 2, 1, -7, -1, 4, -4, 6, 1, -3, 5, -7, + -5, -2, -8, -6, 0, -2, -3, 6, -8, -3, 2, -1, -7, 0, -8, + -7, 6, -4, 2, 0, -8, -2, -4, -3, -2, -1, -2, 6, -8, 5, + -2, 4, -8, 3, 3, 5, 0, -7, 4, 4, -4, 2, 0, 3, -7, + -8, -5, -1, 3, 2, 3, -8, -3, -6, -8, 4, -5, 2, 5, -8, + -3, 0, -7, 2, -2, -4, 3, -7, 3, 6, 3, -2, 5, 4, 5, + 6, -5, 1, -8, 4, 4, -1, -2, 0, -7, -6, -3, 5, 6, 1, + 2, -5, -8, -1, -1, 4, -6, -2, -6, 6, 3, -5, -7, -7, -3, + 2, -3, 5, -7, -6, -6, 5, -3, 4, -2, 5, 5, -1, -1, 1, + 1, 2, -3, -2, -4, -8, -7, 6, 0, 5, 1, 4, -5, -7, -3, + 3, 2, -8, 1, 5, -8, 3, -2, -3, 1, 4, -2, 6, -3, 5, + -3, -2, -4, -6, 6, -4, -3, -8, -1, -6, -4, 5, -5, 6, -2, + -2, 3, 0, 3, 4, -6, 4, 3, -1, -6, -3, -5, 3, -5, -4, + -1, 4, 2, -5, 0, -3, 2, -7, -5, -2, -2, 4, -1, -7, 1, + 4, 2, -7, -6, -7, -8, 0, -3, -4, 0, -5, -5, 3, 2, 6, + 0, -5, -6, 4, 6, -1, 5, 2, -6, 2, -3, -8, 4, 5, -8, + -7, 1, -3, -1, -2, -1, -6, -3, -5, -2, -7, -4, -3, 0, -8, + -3, 5, -6, 2, 5, 5, -3, -8, -7, -1, -3, 1, 6, -6, 3, + -5, -3, 6, 2, 2, -1, 2, -8, 6, -7, -7, 1, 1, 5, -1, + -6, -7, -5, 3, 1, -3, 6, -6, 0, -4, -6, -1, -2, 5, -6, + -4, 5, -6, -5, 3, 4, -5, 0, -2, 6, 1, 3, -2, 1, -7, + 5, 3, -1, 6, -7, -5, 1, 5, -6, -6, -1, 2, 3, -2, 5, + 3, -4, 6, -2, 0, 3, -1, 0, 3, 3, -3, -2, 2, 1, -6, + -2, 1, 0, 6, -8, -4, -6, 4, -6, -3, 1, -7, -3, -2, -5, + -6, 0, -6, 3, -6, -8, 6, 4, -5, 3, 6, 6, -2, -3, -7, + 1, -6, -1, 6, 4, 5, -4, -5, -1, 0, -7, -5, -5, 5, 6, + -7, -7, 0, -3, 6, 1, -2, -1, 5, 1, -5, 6, 4, 6, 0, + -2, -8, -6, 3, -6, -4, -2, -6, 5, -5, 4, -4, -8, -7, 2, + 4, -6, 0, 4, 6, 1, -3, 1, -5, 5, -7, 3, 6, 2, -8, + -5, 1, 5, 5, -1, 0, 0, -2, -4, 0, 3, -8, 1, -2, -4, + -4, -8, 3, 4, 1, -5, -4, 2, 0, -4, 5, -4, 3, 5, -1, + 5, 1, -4, 5, 3, -7, -5, -7, -2, 3, 6, 1, 5, -3, -4, + -5, -1, -8, -4, 6, -3, -6, -1, 2, -3, -8, -8, 5, -6, -4, + 2, -4, -4, 6, -7, -6, -8, -8, 5, -4, -2, 6, 3, -4, -7, + 0, -8, -2, 2, -2, 3, -5, -4, -5, -4, 6, 0, 2, 2, 5, + -6, 5, 4, 6, 5, -2, 3, -2, 1, -5, 6, -4, 4, 5, -8, + -6, -3, 2, -5, -6, -3, -7, -7, 3, -5, -7, -7, 1, 5, -5, + -3, 1, -6, 6, 2, 1, -1, 3, 0, -1, -5, 1, -1, 5, -3, + -6, -8, -3, -4, -7, 3, 0, -2, 4, -6, 6, 5, -2, -1, 2, + 6, 2, 1, -5, -1, -7, -8, 0, 6, 3, 2, 1, -1, 2, 6, + -6, 0, -1, 5, 4, 3, -1, -2, -7, 3, -2, -2, -2, -4, 5, + 0, -6, 6, 2, -4, 3, -7, 1, 3, 3, -5, 3, -2, -6, 2, + 1, -4, -4, -4, -3, -1, 3, -2, 3, 2, 6, -5, 5, 4, -5, + -4, -7, 5, -8, -6, 2, 1, 4, 1, -8, -7, 3, 0, -2, 6, + -8, -5, 3, 2, -5, -5, -1, -1, -8, -8, 0, 3, -2, -6, 4, + -6, 2, -1, -7, 4, 3, 1, -2, 0, 0, 4, -3, 6, 5, 3, + -7, -4, 5, -5, -1, 4, -4, 5, -3, -4, 6, 1, 0, -1, -1, + 2, 0, -2, 5, 6, -8, -2, 3, -4, 5, 4, -6, -3, -4, 6, + -2, 1, -3, 0, 3, -3, 6, -4, 5, -1, -2, 2, -2, 5, -4, + -8, -7, -8, -2, 2, -3, -5, 3, 1, 5, -6, 5, 5, -7, 0, + -5, 0, 0, -8, -4, -1, 2, -2, 6, -5, 6, 6, 0, 2, 4, + 4, 2, 5, 6, -1, -6, -3, -5, 1, 5, -3, -5, 4, 0, 1, + 4, 2, 1, -8, -6, 3, 4, -8, 2, 1, 2, -2, -1, -1, -8, + 6, 1, -8, -1, 6, -4, 1, 4, -5, 2, -2, -8, 4, -3, 1, + -4, -4, 6, -7, 0, -8, 4, -4, -6, -5, 3, 1, 4, -5, -4, + 0, 6, -1, -8, -7, 0, -6, 0, 1, -4, 2, 4, 6, -7, 4, + 2, 1, -7, 2, -7, 4, 6, 2, -6, -2, -7, 6, -8, 5, 2, + -7, -5, -7, -5, 6, -5, -7, 4, 5, 4, -6, 1, 6, 4, -1, + -6, -8, -4, -2, 1, -5, -2, 5, -2, 0, 2, -1, -1, -8, -8, + -6, -4, -6, -5, 5, -5, 1, -7, 2, -6, 5, -2, 1, 6, 6, + -3, -7, 3, -4, 2, 6, 6, 6, -2, -7, -8, 5, 5, 3, 2, + -1, -8, 2, 1, 5, -1, -7, -8, -4, 1, 5, 3, 6, -4, 2, + 3, 5, -3, 3, -4, -6, 0, 4, -4, -7, -7, -7, -4, -2, -1, + 5, 6, 2, 1, -1, -2, -1, 6, 5, -3, -6, -4, -3, 0, 4, + -5, -4, 1, -5, -7, -4, 4, 4, -6, 5, 3, -1, 0, -1, -7, + 0, 6, -5, 6, -7, 4, -5, 6, -8, 4, -7, 1, 6, -3, -1, + 3, -7, 5, 2, -1, -3, 6, -3, -4, -4, -3, -1, 3, -4, -6, + 5, 2, 4, -2, 2, -7, -6, 1, -6, 1, 2, -7, -2, 1, 1, + 1, -2, -4, 4, 2, -1, -6, -2, 1, 5, -3, -3, 6, -5, 0, + 3, 2, -5, -7, 5, 1, -1, -7, -8, 2, -4, 3, 2, 1, 5, + -4, 6, -6, -3, 5, 4, -4, -2, 6, -5, 3, 2, -1, 5, -1, + 6, -6, -6, -7, 3, 3, 6, 2, 4, -1, -7, -8, -1, 2, -2, + -8, -4, -8, -4, -4, 2, -8, 5, -7, 0, 1, 5, -1, -5, 5, + 0, -2, -8, 0, -4, -3, -3, 0, -8, -1, -6, -5, -2, -3, -7, + 0, -5, 4, -1, -5, 3, -2, 6, -5, 1, -4, 1, -7, -6, -2, + 0, 3, -8, 1, 2, -7, 6, 2, -7, 0, 4, -8, -3, 5, 2, + 5, -3, 2, -5, -7, -5, 3, -3, -3, -4, -1, -8, -8, -8, -5, + 6, 2, -1, 5, -1, 4, 1, 4, -4, 0, -4, -2, -1, -7, 6, + 3, 1, 6, 6, 5, 5, 4, -2, -3, 6, -6, 2, 5, -2, -8, + -5, 3, -1, -1, -7, 6, -4, 6, 1, -1, -1, -8, -7, 2, -4, + -6, 5, 2, 0, -5, -6, 3, -6, -4, -5, -5, -6, -7, -7, 6, + 1, 3, 4, 3, 0, 1, -1, -1, 1, -8, 2, -3, -4, -1, 4, + 3, 6, -8, 0, -1, -3, -4, 3, -6, 6, -4, 1, 5, 6, -8, + 4, -4, 1, -5, -6, -3, -2, -2, -6, 6, 4, 0, -5, 5, -8, + -5, -3, -4, -8, 4, -4, 0, 0, -7, 3, 5, 0, -5, 5, -5, + -2, 3, 4, -3, -7, 5, 1, -8, 6, -4, 6, 6, 0, 0, 1, + -3, -3, 1, 1, 6, -1, -3, 0, -2, -8, 5, -7, 6, 2, -5, + 6, 5, -3, 6, -1, -7, 0, 6, -2, -1, -1, -5, -3, 4, -6, + 1, 2, -3, -4, -4, 4, -7, 1, -8, -7, 2, 5, -5, 5, 2, + 3, 4, 1, -3, -7, -6, 0, -5, -2, -6, -2, -4, -6, 6, 6, + -7, 5, 1, 5, 3, -6, -1, 3, -4, 2, -1, -1, -3, -1, 4, + 3, -1, -3, 5, -5, -8, 1, 5, -7, 4, 0, 3, 6, 0, -4, + 2, -4, -1, -4, -8, -2, -8, 6, 4, -4, 4, 0, 5, -8, -4, + 4, 5, 2, 2, 1, 6, 4, -5, -2, 5, -3, 0, 4, -1, -6, + 2, -7, -3, 6, -3, 4, -6, 3, -3, 5, -4, 5, -7, 5, -4, + -5, 6, -7, -8, 0, -1, 6, -7, -7, 3, -3, -8, -1, 4, 3, + 1, 2, -8, -3, -3, -2, -2, 4, -4, 0, 1, 5, -5, 0, 5, + 4, -1, 0, 6, -6, -8, -8, 1, 5, -3, -6, -7, -4, -8, -8, + -4, -3, -5, -7, -2, -6, -5, 1, -3, -7, 4, -5, 6, 3, -5, + -8, 1, -2, 3, 2, -1, -2, 5, 5, -3, -4, 6, -6, 5, 3, + 2, -1, 1, -6, -5, -2, 0, -5, -3, -6, 3, -8, -3, -5, -5, + 6, 0, 3, -3, -7, 0, -8, -8, 6, -1, -4, 0, 5, -1, 4, + 5, 5, -2, 5, -3, -1, 0, -4, -1, 1, 5, 6, 6, 3, 1, + 4, -2, 3, -3, 5, 5, -3, 5, -4, 3, 0, -8, -4, -4, 5, + 0, 4, 4, 5, -7, -1, -5, 0, -3, 6, 0, -4, 4, 3, 0, + -2, -4, -1, -6, 1, 2, -4, -6, -3, 4, 2, -2, 4, -7, -2, + -7, -6, -5, -7, 5, 6, 0, -7, 5, 1, -3, -5, -7, -2, 5, + -2, 2, 0, -3, -3, -2, -1, 6, 2, 2, -4, -6, -7, 3, -5, + 1, -2, -3, -1, 1, 2, 0, 1, 1, 0, 1, -1, 5, 4, -2, + 2, -1, -5, 5, 0, -4, 3, 0, -3, 4, -4, -7, 1, 3, -7, + -5, -7, -1, 6, 5, -7, 2, 2, -5, -3, 1, 5, -6, 2, 5, + 4, -8, 4, 4, 2, 6, 5, 6, 0, 2, -8, -4, 3, 2, 6, + -5, 2, 3, -8, -4, 1, 6, 2, -3, 3, 3, 1, -1, -5, -4, + 2, 1, -4, 4, 5, -3, -8, 3, 6, -2, -3, 1, -6, 1, 5, + 6, 4, -5, 2, -8, 6, -4, -5, 4, -8, -5, 1, -1, -5, -7, + 1, -2, -7, -1, 4, 4, 5, 0, -8, -5, 6, -4, -5, -6, 6, + 5, -1, 5, 5, -6, -1, -6, -1, 6, 4, 0, -4, 1, 1, 4, + 4, -7, 6, 5, -2, -8, 5, -5, 2, -7, 4, -8, 5, -7, 1, + 1, 1, -8, -3, 0, 6, -1, -4, -4, -7, 5, 4, 6, -6, -6, + 5, -2, 1, 4, 0, 4, -6, -8, -4, -6, 2, 0, -4, -7, -2, + 1, 1, -4, 5, 1, -6, -8, 3, 5, -5, 5, -2, 4, 1, -8, + -1, 4, -6, -6, -6, 0, 4, 3, -7, 2, -6, 5, 3, 1, 3, + -8, 4, -1, 1, -6, 4, 3, -2, 4, -2, -7, -4, 1, -7, -4, + 2, -6, -5, -7, -7, 3, 3, -6, 6, -1, -6, -8, 5, -6, -1, + -3, 4, 2, 2, -6, -8, 1, -6, -1, -2, 2, 1, 4, 0, -6, + -1, 0, -8, 1, -5, 4, -4, -3, 6, -8, -6, 4, 4, -7, -7, + 2, -8, 6, -6, -6, -8, -6, 6, -3, 5, 2, 5, 2, 2, 4, + -1, -7, -6, -7, -1, -5, 6, -7, -5, -1, 5, 0, -4, -1, -1, + -5, -8, -3, 4, -5, 2, -2, 3, -8, 4, 5, 6, -6, 3, -7, + -3, 6, 4, -3, 2, 1, -5, -7, 5, -1, 4, 0, -3, 5, 5, + -7, 4, -8, -4, -8, -7, 1, -3, 6, -3, 2, -7, 0, -2, 5, + 2, 2, -4, 1, 4, -6, -3, 6, 2, 0, 0, 0, 6, 4, 2, + 2, -8, -8, 2, -8, 5, -3, -8, -2, -7, 3, -4, 3, -2, 5, + 4, 1, -8, 3, -3, 6, -5, 0, -3, -5, -2, 6, 1, 6, -7, + -2, -2, -7, 4, -1, 6, 1, 1, -3, -2, -6, -7, 2, 4, 6, + 6, 5, 3, 2, -1, -1, 5, 0, 0, -1, 2, 1, 4, -3, -1, + 5, -1, -3, -4, 0, -6, -7, -1, 4, 3, 0, 1, -4, 4, 5, + 5, 0, -8, 1, 6, 4, -5, -6, -1, 1, -3, -8, 2, -7, -6, + -3, -7, -2, -5, 6, 3, -7, 2, -6, -1, 1, -3, -3, 6, -8, + -1, 5, 0, 4, 0, 0, 6, 5, 3, 6, -1, 5, -4, 4, 0, + 3, -2, 4, 4, -7, -1, -7, 5, -8, -6, 1, 1, -6, -3, 5, + 5, -7, -5, 5, 2, 6, -4, 2, -1, 5, -1, -3, -2, 2, -3, + 0, -3, 2, -7, 5, 3, -4, -1, -8, 0, -5, 6, -2, -5, 1, + 2, -1, -4, -5, -6, 3, -3, -1, -6, -5, 6, 5, -4, -7, 0, + 2, 0, -4, -4, 1, 4, 1, -7, 5, -3, 0, 4, 5, 6, -2, + -1, 6, 2, 3, -7, 3, -2, -8, 4, 5, -8, -3, -1, -4, -8, + -5, 2, -2, 0, 0, 0, -4, -2, 3, 0, -8, 5, 2, -1, -5, + -5, -7, -7, -2, 5, 2, -3, 4, -3, 4, 6, -2, 0, -4, 6, + -2, -6, -5, 6, -5, -5, 0, -3, -2, 6, 0, 5, 4, -3, 5, + -4, -3, -3, 0, -7, 4, -5, 3, 1, 2, 0, 5, 6, 2, -3, + 0, -3, -4, -1, 6, -3, -7, 1, 4, -1, -3, 4, -8, -6, 6, + 6, 0, -6, 6, -8, -8, -5, 2, -5, 4, -7, 6, -5, -8, 3, + -8, 6, 2, 5, 4, 5, 2, 4, -3, -8, 0, 5, 2, 2, 0, + -1, 5, 0, -8, 3, -2, 5, 0, 6, -1, 5, -5, -2, 4, -2, + -2, -1, -5, -4, -8, -1, 1, -1, 2, 4, 4, 6, 3, 2, -7, + -6, -6, 1, -6, -1, -2, 0, -4, 0, -5, -7, -4, 4, -6, 3, + -1, 6, -3, -2, -6, -2, -5, -5, 6, 6, 0, 5, 1, 0, 5, + 3, 2, -2, -3, -1, -5, -7, 2, -4, 4, 3, 6, 2, 6, 3, + 6, 6, -5, 0, 0, -1, -7, -4, -3, 6, 5, -5, -5, 3, 4, + -1, 4, 0, -5, -1, -8, 1, -1, -2, -6, 3, -2, -3, 6, 3, + 6, -8, -2, -7, -1, -6, -8, -4, 6, 4, 2, 3, 2, -7, 0, + -5, 6, -8, -7, -3, -8, -1, -6, -7, -5, 1, -1, -4, -7, -5, + -3, -5, -5, -6, 2, -7, -6, 2, 1, 0, -7, -5, 6, 3, 3, + -5, -2, -4, -3, -8, -2, -6, 4, -6, -3, 3, -3, -4, 1, -2, + -3, -7, 4, 0, -3, 1, -4, 4, 6, -8, 3, 1, -4, 1, -1, + -8, -6, 0, -4, 2, 6, -5, 5, -8, 3, -6, -8, 5, -8, -6, + -4, 3, -2, 4, 5, 6, -5, -2, -6, -5, 6, 4, -7, 5, 4, + 5, -5, -4, 1, -2, -7, -7, -7, 6, 2, -6, 4, -3, -2, -2, + -5, 4, -7, 6, 0, 6, 2, -4, -1, -2, -2, -2, 5, 1, -3, + 4, 5, -6, -3, 3, 6, -5, 2, 5, 5, 0, 1, 1, 1, -5, + -7, -6, 6, 2, 3, -8, 2, 2, -2, 3, 3, 5, -4, -1, -8, + 4, 1, 0, 2, 3, -5, -8, 2, -5, -1, 1, -1, 3, -8, -7, + 4, -4, 0, 2, -3, -4, -7, -6, 0, 4, -3, -1, -1, 4, -6, + 3, 3, -5, -4, -1, -1, -3, -3, 4, -4, 2, -6, -5, 6, -3, + 0, -6, -7, -6, -4, -5, 0, 1, -2, -4, -1, 2, -5, 0, 0, + 4, -8, 3, -4, -2, -8, -4, -7, 6, 0, 0, 3, -1, 3, -2, + -1, 5, 0, -3, -6, 6, -3, 5, -3, 4, -6, -7, -1, -1, 4, + 4, -4, 2, -3, -8, -4, -1, 2, -2, 0, 6, -8, -5, -6, 5, + -3, -7, 2, -3, -7, -7, -1, 5, -5, -3, 1, -2, 3, -2, -2, + 4, -6, 6, -4, -3, -2, -2, 3, 0, 5, -6, 4, -6, -7, 2, + -7, -2, 6, -7, -2, -2, -2, 6, 3, -5, 0, 0, 5, -7, 0, + 0, 5, -3, 6, -1, 0, -6, 4, -5, -7, -4, 0, 2, 2, -6, + 2, 3, -8, 6, 4, -5, -7, -2, 0, 6, -8, 1, -1, 6, -4, + -8, 5, -4, 3, -2, -2, 5, 1, -6, -5, 6, -2, -5, -1, 4, + -5, 4, 6, 5, 5, -3, -4, -7, 3, 4, 4, -8, 4, 3, 0, + -1, 5, 2, 1, -6, -2, -3, 2, 4, -3, -4, 4, -4, -5, -7, + 3, -3, 3, -7, -3, 0, 3, -1, 4, 0, 6, 4, 5, 6, -6, + -6, -8, -7, -4, -8, -4, 1, -5, -5, -7, -8, -3, -7, 0, -2, + 0, -3, 5, 3, -8, 0, -5, -3, 5, 0, 5, -2, 3, -2, 3, + -7, 0, -7, -7, 4, -5, 3, -7, 1, 6, -1, 0, 2, 6, 3, + 3, 4, -4, -7, -7, 5, 4, -5, -2, 5, -8, -7, 1, 5, -2, + -8, -2, -3, 2, -5, 6, 6, 2, -7, 1, -6, 4, -1, 6, -3, + -2, 5, -4, -8, 4, -1, -5, -8, -1, 4, -4, 5, 6, -3, 3, + -4, 0, -3, -5, -7, -5, -8, -8, 4, -5, 6, -1, 1, -6, -1, + 1, -5, -2, 6, 6, 3, -7, -3, -3, 5, 4, -5, -4, 6, 4, + -1, 5, -1, 6, -2, -5, -3, -8, 1, -8, 3, 0, -4, -4, 6, + -1, -6, 2, 0, 6, -7, 6, -5, -6, -8, -6, 3, 5, -6, 6, + 3, 4, -8, -8, -4, 2, -7, 3, 2, -2, -6, -1, -1, 6, -3, + -4, 6, -3, 1, -2, -5, 2, 6, -6, 1, -2, 0, -1, 5, -1, + 5, 0, 2, -7, 4, 4, -8, -8, -4, 3, 2, -4, -3, 3, 4, + 5, -3, -8, 6, -8, -3, 2, 4, -6, 0, -3, -4, -5, -7, -4, + -5, -2, 0, -2, -5, 3, 0, 6, -8, -6, 4, -1, -6, -7, 3, + 5, -2, -3, 2, -3, -5, -8, -3, 2, 3, -7, -6, 0, 3, -6, + -2, 3, -8, 2, 3, 2, -5, -2, 1, 3, 4, -5, -3, 6, 6, + -7, 2, -5, -2, -5, 5, -6, 6, 3, 3, -6, 3, -8, 3, -6, + -3, 1, -5, -8, -4, 0, -2, -7, -6, -5, 4, -8, -8, -1, 6, + 3, -2, -1, 6, -8, 2, 3, -3, 0, -3, 2, 2, 3, 6, -5, + 3, -4, 3, 4, -1, 6, -2, 0, -8, 3, -4, -4, -7, 6, 2, + -1, -2, -8, -1, 6, -5, 0, 6, 0, -5, -6, -2, 6, -8, -7, + -6, 6, 6, -2, 1, 6, -7, 4, -1, -5, 1, 2, 1, -5, -7, + -4, 1, 3, -8, 4, 4, -2, 5, -1, 4, -4, -4, -8, 1, -5, + 3, 5, 4, -2, -8, -3, -5, 0, -1, 1, 0, 6, 2, -5, -2, + -8, -2, -6, 5, 1, 3, 5, -2, -1, 0, -3, 6, -8, 4, 2, + -6, 4, 4, -8, 4, -5, -4, -5, 4, -8, 5, 6, 4, -5, -8, + -7, -1, 5, 2, 1, -6, 6, 6, -2, 3, -8, 4, -7, 1, -6, + -4, 0, -3, 3, 4, -5, -3, -6, 0, 4, 5, -6, 3, -7, -2, + 3, 6, -3, 5, -5, -4, 3, 2, -1, 0, 0, -7, -4, -1, -1, + -6, -5, 1, -5, -8, -8, 2, 0, 6, -2, 4, -7, -4, 2, -2, + 6, -4, -4, 1, 6, -6, 4, -7, 6, -5, 2, 5, 6, -1, 1, + 0, -6, 0, -8, -7, -7, -8, -4, 3, -7, -7, -3, 5, -6, -8, + -6, 2, 3, -4, 5, -1, -7, -4, -2, -6, 1, -7, -1, -7, -8, + -2, 2, -8, -5, 6, 6, -8, 3, -5, -5, -7, 1, 4, -1, -1, + 3, 2, 6, 5, 2, -3, 2, -3, -8, -5, -8, -6, 4, -1, 0, + -4, 3, -2, -3, 4, 1, 0, -8, -5, 6, 3, 4, 2, -2, -5, + -4, 1, 4, 4, 0, -5, 3, -2, -3, 3, 0, -7, 4, 3, 5, + 2, 4, 4, -5, -3, 6, 0, -1, 1, -7, 5, 6, -5, 2, -4, + -5, 5, 2, 5, -5, 6, -5, -3, -5, 3, 4, -8, -4, 4, 1, + -2, -8, 4, -3, -3, 5, -8, 4, 2, -8, -3, -7, 5, 4, -4, + 4, -6, 3, -6, 6, -1, -4, -4, -7, -8, -2, -4, 3, -3, 1, + 2, 5, -1, -1, -1, 6, 5, -8, 0, 5, 5, 6, -1, 5, -5, + 5, 0, 5, 4, -2, 0, -3, -2, -1, -8, 0, -8, 0, 2, -4, + -1, -8, -1, 4, -8, -3, 6, -7, 5, -8, -5, 4, 6, -3, -6, + 1, 4, -8, -2, -3, 5, 1, 6, 5, 5, -8, -4, -5, -2, -8, + 4, -7, -7, 0, 4, 6, 1, -8, 6, -2, -8, -5, 3, -2, 3, + 3, 6, -4, 4, -7, -6, -7, 3, 2, 4, 4, 4, -8, 5, 4, + -4, 6, 3, -5, -4, 0, 3, 5, -7, -7, -5, -6, 4, 0, 2, + -4, -2, -3, -5, -1, 5, 1, -7, -4, 1, 3, 5, -4, -8, 2, + -5, 2, 5, 4, -2, -6, -1, 1, -7, -2, -2, -7, 5, -5, -4, + -5, -1, -6, 4, -6, -6, 2, 2, -2, -2, 3, 0, -4, 4, 2, + 1, 3, -5, -7, 2, 4, -5, -2, 6, 3, -5, 0, -1, -4, 6, + -3, 6, -7, 4, 3, 4, 5, 1, 2, 1, 1, -5, 2, -5, -1, + -4, -3, 4, 6, 3, -7, -6, 4, -2, 3, -2, -2, -1, -3, 2, + -6, -4, -1, 6, 0, 4, -6, 2, -4, 3, 2, 1, -7, 0, 3, + -4, 2, -5, -6, -2, -5, -8, -8, -5, 6, -6, 3, -7, 3, 4, + -6, 4, -8, 0, 4, -2, 2, -3, -8, -5, 1, 1, 1, -6, -7, + -3, 6, -5, 3, 6, -2, -8, 4, -5, 0, 3, -6, -7, 5, -8, + 4, -4, -2, -4, -3, 5, 6, 4, -6, -1, -2, 3, -1, -5, 4, + -5, -2, 2, 4, 0, -5, 1, -3, 3, -3, -7, -4, 0, -6, 5, + 5, 2, -5, -1, -3, -4, -4, 2, 6, -8, -7, -3, -4, -8, 2, + 0, -1, -8, -6, -3, 2, -7, 0, -5, -7, -7, 2, -3, -1, 2, + 6, -5, -3, 0, -8, -8, 5, 5, 0, -2, -2, 0, 6, 2, -7, + 5, -2, -8, -7, -7, 4, 0, 1, 2, -8, -5, -6, -6, -8, -7, + -6, 4, 1, -2, 6, -8, -1, 0, -1, -7, 5, 6, 0, -4, -4, + -1, 4, -4, -7, 0, 2, -8, 3, 5, 6, 1, 5, -8, 5, -8, + -8, -1, -7, -7, 5, -7, 1, -8, -3, 2, 6, 2, 5, -1, -4, + -1, 6, -5, 6, 5, -4, 5, -8, 4, -6, 6, 5, 4, -5, 3, + -6, 3, 4, -5, 2, 4, -3, 2, -2, 1, -3, 0, -3, -8, 0, + -6, 0, -2, 5, 3, -2, -1, 1, -3, 2, -2, 6, -1, -7, 1, + 1, -2, 4, -5, -7, -8, -1, -4, -6, -3, 5, 3, 2, -1, -2, + 0, -2, 5, -6, 5, -3, -6, 6, -1, -3, 5, 6, 1, -7, -1, + 3, -2, -6, 5, 3, 5, 3, -7, -1, -4, -6, -6, 4, 6, 0, + -7, -3, 4, -4, -2, -7, 0, -3, -1, 6, 3, 1, 0, -7, 2, + 5, 2, 3, 1, -5, 6, -5, 3, -2, 6, 0, 1, 6, -5, -4, + -8, -1, -2, 6, -6, 6, 1, -8, -6, -6, -2, -6, -5, -8, 4, + -6, -1, 2, -2, -4, 0, -1, 5, 4, -2, -4, 3, -8, -6, 6, + -6, -1, 5, -5, 3, 4, 4, -1, -5, 2, -8, -4, -7, -5, 1, + -2, -2, 2, 6, 5, 4, -6, 4, -8, -7, 4, -3, -5, 5, 5, + 5, -6, -2, 6, -7, -5, -6, -6, 2, -5, -4, -8, 3, 2, -4, + -1, 0, -8, -4, -3, -3, 5, -3, -5, -2, -4, 6, -7, -3, -5, + -1, -1, 0, -5, 2, -2, 5, -7, -7, -5, 1, -7, -8, 1, 1, + -1, 2, -6, 1, 6, -8, -4, -2, -7, -3, 0, -7, 6, 6, -4, + -8, 0, -7, 4, 4, -6, -7, -7, 0, -6, -6, 5, -6, 5, -8, + 0, -6, -7, -3, 0, -1, 5, -5, -6, 0, -6, 0, 0, -8, -2, + 2, 6, 2, -3, -4, 4, 6, -4, -2, 2, -7, 4, 2, -2, -1, + -8, 0, -2, -4, 3, 4, -2, 5, 4, 4, -1, 3, -8, -3, 0, + -6, -7, -1, 6, 2, -5, -2, 5, -5, -7, 2, 1, 1, 5, 0, + 3, 4, -4, -1, -6, 4, -7, -6, -3, 1, 5, -4, 1, -6, 4, + -3, 4, -7, 3, 3, -8, 4, -3, -8, -1, -8, -4, 2, 4, 4, + -8, 6, 2, -4, -5, 3, -1, 5, 0, -4, 0, 4, -2, 0, 3, + -6, -6, 4, -1, -2, 2, 6, -8, -7, -6, 6, 0, 2, -3, -4, + -8, 4, -4, 2, 5, 3, -8, 5, -4, 1, 4, 5, 0, 4, -8, + 2, -3, 4, -6, 3, 3, -3, -1, -7, -8, -2, 0, 6, -6, -5, + -8, -5, 2, 5, -1, 5, -4, -2, -2, 0, 1, -4, 4, -2, -4, + 4, 2, 2, -3, 1, 5, 2, -3, -5, -2, -6, -8, -1, 0, -6, + 6, 3, 4, -2, 6, -5, -5, -4, -4, -5, 3, 1, -2, -6, 3, + -7, -4, -6, 6, 4, 4, 2, -3, -1, -6, 2, -1, 5, -6, 1, + 4, -1, -6, 1, 6, -5, 4, 4, 2, -3, 0, -6, -4, -2, 5, + 6, -6, 6, -5, -7, -4, -3, -8, 1, 0, -3, -2, -7, -5, 1, + -7, -2, -2, 0, -8, -1, -2, -6, 5, 2, -3, -5, -7, 6, -3, + -1, -4, 1, -7, 2, -6, 3, 5, 4, 4, -5, -8, -8, 3, -4, + -3, 2, 6, 5, -5, 0, 3, 5, -2, 3, -1, 3, 0, -2, 0, + 1, -1, -2, -5, 4, 5, 2, 0, -6, -2, 6, 1, -2, 5, -8, + -4, 6, 5, -8, 3, -7, -5, -3, 3, -4, 0, -4, -1, 1, -4, + 4, 3, 3, 4, -7, 0, 4, -8, 6, -6, -2, -2, -1, 6, 1, + 3, -4, 5, 3, -6, 6, 3, -4, -2, -1, -3, 0, -6, 1, -4, + -7, 2, -7, -1, -7, 5, -5, 6, 0, 0, -1, 0, 0, 0, -4, + 4, -3, -8, 3, -7, -7, -1, -7, 6, -1, -1, -1, 4, -7, 3, + 5, -7, -5, 0, -8, -4, 2, 1, -7, -7, -6, -3, -4, 5, 6, + 2, -6, -6, -6, -4, 1, -4, 1, -8, -5, 5, 0, -3, 2, 1, + -8, 0, -2, -7, -4, 4, 3, 2, -1, -1, 0, 3, -7, -8, -8, + 1, -2, -1, 6, -5, 2, -3, 6, 2, -3, 4, 2, -4, -8, -5, + -8, -2, 6, 4, -3, 5, -5, 1, 2, 6, -7, -5, -2, -8, -4, + 5, 6, 3, -1, 4, 4, 6, 2, 1, -3, 5, -7, -4, 4, -8, + -1, -8, 1, -8, -1, 0, 0, 0, 2, -8, -3, 6, 0, 1, -2, + 1, -6, -1, -2, -7, -8, 5, -6, -5, 5, 0, 0, -8, 2, 6, + -7, -4, 5, -2, 4, -2, 0, -1, 2, -5, -5, -5, 2, 6, 4, + -4, 3, 6, 3, -7, -2, -8, 5, 0, 5, -5, 2, -4, 1, -1, + -1, 0, -7, -6, -4, -5, -4, -5, 1, -7, 2, -3, 6, -6, 5, + -6, -8, -7, -8, -4, 1, 5, -1, 0, -2, 2, -3, -8, 0, -8, + -3, 0, -1, -3, 2, 4, -5, 4, -8, -7, 2, -8, 0, -2, 4, + -7, -7, 2, -5, -6, -5, 5, 2, 1, 2, -2, -7, 0, -7, -7, + 3, -1, -8, 0, -5, -7, -8, 3, 3, 3, 2, 4, 2, -5, 0, + 6, -3, 6, -1, 0, 0, -8, 1, -1, -3, 4, -1, 3, 0, 5, + -8, -1, 5, -6, -2, -3, -8, -6, 3, 6, -2, -2, -2, -5, -8, + 6, 0, 5, 4, -8, 6, -1, 5, -6, 4, 0, -6, -5, -1, 3, + -3, 6, -2, 0, 1, 2, -8, 0, 3, 4, -8, -1, -4, -7, 1, + -1, 2, 2, -2, -1, 0, -8, -7, 0, 1, -2, 0, 3, 6, -2, + -2, 6, -3, -1, -5, -4, -2, -8, -7, 0, -5, 1, -8, -7, -1, + -2, -8, -4, -4, -5, -1, -8, 3, 3, 4, 1, 4, -3, -7, 5, + -7, -5, -5, -5, -5, -3, 3, 1, 6, 4, 4, 5, 3, -3, 4, + 6, 3, 6, 3, 3, -2, -2, 4, -8, 0, -7, -6, -1, 0, -7, + -1, -5, -8, 3, -8, -5, -1, -6, 4, -6, -4, -8, 3, 0, -3, + 2, -2, 1, -1, 4, -4, -2, 5, -2, 4, 1, -2, 5, 1, 5, + 0, -6, 0, 3, -4, 6, -2, -4, 0, -2, -3, -8, 3, -5, -7, + -5, -1, -3, -5, -3, 0, -8, -5, 4, -6, 5, 2, 0, -5, 5, + -8, -7, -5, -6, -2, -4, -7, 1, 6, 3, -7, 1, -3, 4, -4, + -3, -7, -6, 1, -6, 6, -6, 5, 0, 3, -5, 4, 4, 1, 0, + -7, -5, -3, -6, 1, -2, -5, -5, 5, 4, 6, -7, -6, -6, -2, + -8, -6, -7, -6, 2, -6, -7, -8, -4, 0, -1, 2, 2, -2, -7, + -1, 6, -6, -4, 2, -4, 0, 1, 5, 4, 6, 6, 0, 0, 1, + 0, -1, -2, -5, 4, 4, 1, 6, -8, 5, -6, 4, -1, -8, 4, + 4, -4, 3, -7, 0, 5, -5, -2, 0, -3, 5, -3, -6, -8, 2, + -5, 5, -1, 6, -5, -3, -6, -5, 4, 2, -6, -2, -4, 3, -1, + 2, -4, 4, 5, -5, -1, -1, -6, -1, -2, -8, -2, 0, 2, -6, + 3, 5, 6, 0, -1, -3, -5, 0, -1, -6, 2, 5, -5, -2, -1, + -7, -2, -1, -4, -8, -4, -7, 2, 4, 5, 3, -2, 1, 3, -1, + -8, -4, -4, -8, -7, -6, -5, -7, 4, -3, -8, -5, -3, 2, -2, + -5, 6, -7, 0, 4, -3, -5, -3, 1, -2, -4, -7, 1, -4, -8, + -3, -2, -3, -8, -3, -4, 0, 1, 4, 2, -7, -2, -4, -1, -7, + -4, -8, -6, 3, 1, 2, -6, 2, -1, -5, 6, 6, -1, -4, 5, + 3, 6, 3, 4, 2, 3, 3, 4, -1, 3, -4, 1, -4, -6, 2, + -4, -7, 1, -7, -7, 1, -7, 4, -1, 2, -5, 2, -6, 1, -2, + -7, 6, -2, 6, -7, -3, 3, -1, 1, -2, 4, -1, 3, 3, 3, + -3, -2, 5, 6, 0, -1, -8, 2, 4, -2, 2, -6, -1, -5, 3, + 1, -6, -4, -4, 6, -2, 3, 5, -3, -2, 5, -1, -2, -8, -4, + 0, 4, 4, -7, -7, -1, -6, -1, 3, -8, 6, 5, -4, 2, 2, + -5, 6, -7, 5, -3, 4, 1, 5, -8, -3, 5, -7, 1, -3, -6, + 3, 6, 1, -7, 0, 5, 0, -4, 2, 6, 2, -5, 6, 2, -1, + -7, 4, 4, 1, 0, 6, 1, 3, -5, 2, 1, -1, -3, -1, -3, + 5, 5, -7, 0, -2, -8, -8, -2, 0, 3, 3, 5, 1, -3, -3, + -8, 3, 1, 4, 0, -5, -5, 2, -5, 2, -5, -4, 6, -2, -8, + 2, -5, 3, -3, 1, 2, -6, 5, 2, 2, 3, -8, 4, -2, 6, + 1, 5, 5, 5, 6, 3, 6, 0, 2, 5, 5, 4, 4, -1, -5, + 4, -4, -8, -8, -2, 5, 6, 3, -2, 1, 5, 5, 3, 0, -7, + -3, -1, -7, 4, -8, -1, 0, -2, 0, -3, 2, -3, -6, 0, 2, + -1, 1, 0, 1, 1, 4, -5, -6, 3, -4, -3, 4, 5, -6, 4, + -2, 3, -5, 3, -6, -4, 4, -4, 3, -2, 4, -7, -5, -4, -7, + -7, 0, -1, 3, -1, -4, 2, -3, -5, -5, -1, -7, -3, -1, 6, + -1, -2, 0, -5, 2, 6, 2, -3, -2, 4, -6, -4, 6, 6, 5, + -6, 3, 6, -6, 5, -1, 1, 1, 5, 4, -4, -2, -4, -1, 1, + -5, 3, -6, 2, 2, -6, 1, 3, -4, -8, 3, 0, -7, -8, -7, + -1, 5, 5, 5, 2, -3, 4, 5, 1, 0, -6, -7, 6, -6, -5, + -4, -7, -2, -1, 0, -1, -4, -4, 3, 5, 6, -3, -3, -6, -8, + -2, -2, 5, -2, -8, -8, -3, -7, 0, -6, -5, 2, 4, -4, 1, + -6, -4, -5, 4, 5, -2, -8, 1, 6, -4, -8, -7, 2, -2, 0, + 1, 5, 0, -6, -7, 0, -7, -5, -1, 0, 2, 3, 1, -7, 6, + -3, 4, -5, -2, 1, -6, -8, -5, -3, 6, -1, 1, -4, -8, 5, + -3, 5, 1, 1, -7, 3, 0, -2, -5, -7, 2, 4, -7, 2, -1, + -7, 4, 3, 5, 2, -2, 0, 4, -3, 0, -8, 0, -7, 1, 4, + 4, -4, 1, 6, -7, -4, -1, -2, -7, 5, -1, -8, -5, -3, -6, + 5, -5, 1, 6, -1, -8, -8, -5, 2, -2, 4, -1, -3, -3, -2, + 6, -4, -7, -7, -5, 2, -2, -2, -6, -4, 3, -4, 3, 0, -8, + 3, -3, -3, -7, 3, 1, -1, -2, -2, -3, -5, -4, 0, 1, -8, + -1, 5, 1, -1, -6, 1, 6, 3, -6, -3, 6, 0, -1, -4, 4, + 4, 4, -2, -7, 4, 3, 1, -2, 4, -5, -3, -3, 6, -2, 2, + -8, -5, 5, -3, -3, 0, -3, -3, -5, 0, -5, 4, -4, 4, -2, + -3, -8, 2, 6, 3, -8, 5, -5, 0, 1, 1, -7, 2, -8, -6, + -3, -5, 1, 5, 3, -1, -6, -2, 1, -8, 5, -5, -8, 2, 4, + 3, 3, -7, -7, -6, -3, -5, 6, -2, 1, 1, 6, -3, -3, 4, + -8, -7, -7, -7, 0, -8, 5, -2, -5, -3, 1, -6, -8, 4, 6, + 4, -2, -7, 4, -1, -5, -5, 2, -1, 1, -8, -2, -4, 6, -8, + -1, -6, 1, 5, 2, -2, -4, 0, -6, 4, 0, -5, 3, -8, 2, + 3, -5, 2, 1, -1, -8, 2, -5, -7, 2, 0, 4, 5, 1, -6, + 5, 3, 3, -4, -5, 2, 2, -6, -8, -4, 4, -5, 4, -1, -5, + -8, -6, 0, -5, -8, -7, 4, -4, 0, -7, -4, 4, 6, -2, -2, + -5, -4, 5, 6, 5, -5, -3, 3, 2, 5, -2, -4, 2, -3, 4, + 0, -1, 3, -4, 3, 6, 0, 4, 5, -4, -2, 4, -8, -4, 5, + 4, -1, 5, -1, -3, 3, -2, 3, 5, -5, -7, 6, -6, 2, -8, + -8, -2, -7, -8, 4, -4, -3, -3, 2, 4, -6, -8, -4, -2, -8, + -3, -6, -4, 1, -7, 0, 3, 4, -4, 0, 2, -8, 1, 2, 0, + -2, 2, -7, -4, 6, 5, -8, 1, 5, -6, 0, -5, 6, -6, 6, + 5, 1, 0, -1, -4, -8, -6, -6, -4, 1, 5, -3, -3, -6, -8, + -6, 2, -1, 6, -4, -6, -6, 2, 0, 4, 3, 4, 6, 5, 5, + -3, 3, 1, 3, -5, 1, -7, -4, 0, -6, -8, -6, -1, 4, 3, + 2, -8, 2, 5, 2, 6, 4, 5, -7, 6, -5, 2, 6, -7, 4, + 3, 5, -4, -1, -6, -3, -1, 4, -3, 3, -6, 5, -2, -3, -7, + 5, 3, -5, 2, -1, -6, 0, -7, 1, 0, 2, 6, -3, 1, 4, + 5, -6, 1, -1, -7, 6, -8, -2, 5, 6, -2, 2, 3, -8, -3, + 1, 3, 4, -4, -7, 1, -3, -8, -3, -4, -4, -2, 0, 5, -3, + -8, -1, -1, 4, -4, -7, -7, 0, 0, -8, 4, -8, -8, 5, -2, + 0, -3, -3, -2, 4, 3, -5, -4, -3, -6, -1, 3, 5, 2, 0, + -7, -6, 0, 1, 5, -5, -4, -7, -4, -6, -4, -4, -6, 3, 3, + 5, -5, 3, 5, -1, -8, -4, -3, 5, -8, -1, 0, -2, -5, -3, + 0, -2, -7, -4, 4, 2, 2, -8, -8, 4, -3, -7, 5, 5, -1, + -8, 1, -7, 1, 3, -7, 3, 0, 6, 0, 6, -8, 2, -4, -3, + -6, -1, 0, -3, 0, -1, -6, 5, -3, -5, 2, -1, 4, -1, 4, + 2, 5, -1, 2, 6, -2, 0, 1, 3, -8, -1, 2, 5, -3, -6, + -1, 5, -7, 6, -1, -1, -8, -5, 6, 2, 3, -3, -8, -1, 6, + 3, -2, 3, -7, -7, 3, 6, 2, 2, -3, 1, -3, -1, 1, 3, + 4, 6, 0, -1, 1, -5, -8, 5, -7, 1, 4, 5, 1, -7, 4, + 1, -5, 6, -4, -6, -3, -5, -2, -1, -1, 5, 5, 0, -8, -1, + -4, -2, -3, 0, -6, -4, 6, -4, 0, -6, 1, 3, -1, 2, -5, + -7, -4, 0, -6, 4, 4, 5, 0, 3, 6, 2, -6, 4, 1, -6, + 5, 3, -2, -3, -5, 6, 4, -7, -1, 0, 0, 6, -5, -3, -4, + 5, 2, -7, -8, 2, 1, -2, -2, -4, -3, 2, -8, -7, -7, -6, + -1, -6, -1, -3, -2, 5, -6, 1, 1, -3, -1, -2, 5, 4, 0, + 2, 5, 3, 2, 2, -4, -3, -8, 1, -2, 2, -6, -3, -3, 1, + 5, 2, -4, -2, 2, 4, 6, -6, 0, 6, -4, 1, -1, 6, -5, + 2, -8, -2, 5, -1, -3, -1, 6, -1, 5, -8, 4, -1, -1, 1, + -4, 0, -1, -3, 6, -4, 4, 5, 4, 6, 3, 2, -6, -6, -3, + 1, 0, 2, -1, -7, -7, -5, 0, -7, 2, -5, 0, -1, 1, 0, + 0, 0, -6, 0, 6, 6, -6, 1, -5, -5, 0, 4, -3, 2, 2, + -5, 3, -8, 0, 5, 0, -1, -2, -4, -4, -6, 4, -6, 3, -4, + -5, -2, 1, -5, 6, -7, -1, -6, -2, 4, 1, 6, 2, -3, 5, + 6, -2, 2, -2, 0, -3, 4, -1, -4, -5, -2, 4, 6, 4, 4, + 5, -4, -7, -7, 1, -8, -8, 0, -8, -5, -5, -5, 2, -2, -8, + 2, 5, -4, 3, 6, 1, 2, 0, 0, -8, -2, -8, 2, -7, 5, + -8, -5, -1, -7, -1, 6, -7, 1, 6, 1, -8, 0, -4, 3, -1, + -6, 4, 0, -4, 1, -2, 1, -4, -3, 5, 1, -6, -7, 4, 6, + -2, 0, 1, -1, 2, -6, -5, -4, 4, -8, 3, -1, 5, 2, 2, + 3, -1, -6, 1, 2, -6, 6, 2, -4, -1, -3, -6, -6, -8, -5, + 6, -5, -1, -6, -4, 2, -8, -6, 0, 2, 4, 1, -3, -1, -8, + -8, -8, 4, -3, 6, -3, -6, 5, 1, -1, 0, -6, 0, -3, -2, + -8, -5, 3, 2, 4, -8, 3, -4, -4, -3, -8, 4, -3, -1, 0, + 3, -6, 5, -2, 1, 4, -5, 4, -4, -6, -8, 3, -4, 2, -1, + -8, 2, -4, -7, 6, -8, -8, -6, -1, 2, 1, 5, 6, -3, -5, + 6, 6, 6, 6, -5, 0, -7, 5, -3, 2, -2, 1, -3, 1, -7, + -5, -8, 4, -1, 3, 4, -5, -7, -6, 0, -6, 6, 0, -4, -1, + -3, 6, -4, 5, 5, -3, 0, -5, -1, 5, -6, 2, -2, -6, -1, + 1, -2, -6, -5, 6, -2, 5, -3, -2, -6, 4, -2, 0, 5, -2, + -1, -8, -2, -1, 1, -5, -6, -3, -3, 5, -1, 0, 5, -7, -3, + -5, 1, -3, -8, 2, 0, -4, -6, 4, -6, 6, -7, -6, -2, -2, + -7, 0, 6, 3, -7, -7, 5, 4, 6, -7, 4, -3, 4, 0, 6, + 1, 3, 4, 3, -6, -5, 3, -6, 6, 1, 5, 5, -4, -6, -6, + 4, -2, -3, 0, -6, 0, 3, 6, -4, -2, -3, 5, -2, 3, -3, + -4, 0, -3, -3, -4, 6, 0, -2, 1, -3, -2, 6, -7, -3, 3, + 0, 1, 0, 2, -2, 5, 5, -6, 5, -1, -1, 2, 3, -1, 0, + 1, -4, -8, 4, -8, 4, -1, 6, 5, 2, 0, -7, 5, -3, 5, + -6, -7, -2, -7, 2, 2, -2, -5, -3, 5, 0, 0, 0, 6, -1, + -4, 2, -4, 5, -8, 2, 1, -3, 2, -2, -6, 2, 0, 0, -4, + 2, -8, 4, 1, -3, -5, -6, 2, 5, -4, -4, 4, 0, 3, -7, + -6, -8, 2, 1, -5, 0, 2, 3, -3, 3, -7, -6, -2, -2, -5, + -4, 2, -6, 4, -8, -7, -6, 1, -6, 1, -5, -8, 6, 4, 3, + -3, -8, 3, -3, 3, 3, 3, 0, 3, -7, 4, -6, -4, 1, 1, + -7, -5, -3, 2, -5, -1, -2, -7, 3, -1, 5, -3, -8, -8, -5, + -1, -7, -7, -7, -2, -7, 1, -2, 6, 3, -5, -6, 5, -2, -8, + -6, -8, 1, -6, -5, -4, 0, 1, -3, -5, -2, -6, -2, 6, 5, + 2, -8, 4, -7, 2, -7, 0, -1, 2, -4, 4, 1, 0, -8, -8, + 6, 1, 4, 4, 2, -1, -1, -3, -8, -8, 6, -1, -5, 0, 3, + 0, -5, -3, 1, 5, -4, -7, 1, -8, 4, 2, -7, 1, 2, 0, + 4, 6, -2, -5, -4, 4, 1, -3, -8, 0, -7, -5, 1, 2, 2, + 6, 6, 5, -1, 0, 1, -6, 5, -2, -1, 4, 0, 3, -6, 6, + -1, -7, -6, 1, -2, 3, -6, -8, 0, -7, -4, 1, 2, 2, -8, + -4, -2, -4, -7, -2, -3, -6, -6, -4, 0, -5, -7, 1, 4, -7, + 6, -2, 1, 3, -7, 3, 0, 0, -7, 4, -3, 1, 6, 5, -2, + 6, -1, -3, 2, -5, -7, -5, 0, 6, -8, -2, 4, 1, 5, 4, + 3, -2, -8, -4, 1, 0, 0, 1, -2, -6, 4, -7, -3, -3, -7, + -6, -2, 6, -1, -6, -8, -3, 2, -4, 0, 6, 4, 5, 5, 4, + -5, 3, -1, -4, 6, 5, -7, -5, 1, 2, -7, -8, 3, -7, 3, + -5, 4, 4, -3, 0, 1, 1, 0, 2, -6, 3, 4, -4, -5, 0, + 3, 6, 6, 4, -1, 4, -6, -3, 5, -8, 0, -6, 0, -1, -7, + -7, -2, -8, 1, 3, -4, -1, 6, -8, -8, -4, -4, -6, -3, 3, + -7, -1, 4, -5, -6, -4, -8, 1, -8, 5, 2, -5, 5, 5, 6, + -8, -8, -7, 0, -7, 1, -8, -7, -3, 2, 1, 3, -4, 5, -2, + 1, -5, -4, -5, -1, 1, -8, 6, 6, -2, -5, -6, -3, 6, -8, + -2, 1, -3, -4, -7, 5, -3, -1, -4, -4, 1, -3, -5, 6, -2, + -6, 0, -7, -6, -4, 2, 6, -3, 2, -2, 6, 2, 0, -8, 2, + 3, 5, 1, -5, -6, -6, -2, 5, 0, 4, 6, 4, 5, 4, -1, + -8, 0, -1, -7, -5, -2, 0, 3, 2, -8, 3, 2, -6, 4, -4, + -1, -3, -5, -1, 5, 6, -7, 4, 4, -4, -2, 1, -2, 3, -2, + -8, 1, -4, -2, -4, 5, 3, -5, -8, -6, -4, -2, -1, -8, 3, + -4, 3, 6, 1, -7, 0, 5, -3, 5, 3, -5, 6, 4, 6, -2, + -6, 3, -8, 0, -7, -8, 1, 2, 3, 3, -7, 0, -6, 6, 5, + 0, 6, 6, 1, -6, -5, -5, -2, 1}, + bias_1 = {-3, 6, -6, -8, -5, 1, 6, 6, -4, -6, -3, 1, 5, + -2, -1, -4, 6, 2, -5, -1, -3, 6, -2, -8, 2, -8, + -3, 0, 0, 0, -6, -7, 6, 4, 2, -8, -3, 4, 1, + -4, -3, -4, -1, -7, -8, -4, -6, 4, -3, -8, 1, -2, + -4, 2, -1, 4, -4, -3, 5, 5, -8, 5, -4, 2}, + output_values = { + 7, 7, 4, 0, 7, 7, 7, 7, 7, 7, 7, 5, 3, 4, 5, 7, 7, + 7, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 5, 7, + 7, 7, 7, 7, -2, 7, 7, 4, 7, 7, 7, 1, 5, 7, 5, 7, 7, + 7, 7, 6, -1, 6, 7, 5, 7, 7, 7, 7, 6, 0, 7, 7, 3, 5, + 4, -2, 5, 6, 3, 6, 7, 4, 3, 3, 2, 7, 6, 3, 3, 7, 0, + 7, 6, 7, 7, -1, 5, 7, 7, -1, 5, 7, 5, 7, 7, 7, 7, 7, + 7, 6, 2, 7, 7, 7, 7, 0, 2, 7, 7, 7, 1, 7, -4, 7, 7, + 6, -2, 5, 7, 7, 3, 7, 7, 7, 7, 6, 3, 3, 6, 7, 7, 1, + 7, 7, 7, 6, 7, 4, -1, 1, 7, 4, 4, 7, 7, 0, 7, 7, 7, + 5, 7, 7, 7, 4, 5, -3, -3, 5, 6, 7, 2, 7, 7, 7, -2, 5, + 7, 6, 7, 4, 7, 7, 7, 7, 7, 7, 6, 3, -1, 7, 3, 5, 7, + 7, 4, 7, 4, 7, 2, 7, 1, 2, 2, 4, 2, 7, 6, 7, 6, 3, + 3, 7, -2, 7, 3, 7, 7, 4, 7, 2, 3, 7, 7, -4, 7, 7, 3, + 3, 6, 6, 7, 0, 1, 7, 7, 7, 7, 7, 5, 7, 0, 7, 7, 7, + 7, -3, 5, 7, 7, 7, 7, 1, 5, 4, 4, 7, 7, 7, 7, 7, -1, + 6}; + + Checker + checker(handle(), false); + using Param = ConvBiasForward::Param; + Param param; + param.format = Param::Format::NCHW64; + checker.set_param(param); + + auto GenTensorValue = [](const TensorShape& shape, + dtype::QuantizedS32 dtype, + std::vector values) { + TensorND tensor; + tensor.layout = {shape, dtype}; + tensor.raw_ptr = + static_cast(malloc(tensor.layout.span().dist_byte())); + megdnn_assert(values.size() == tensor.layout.total_nr_elems(), + "%zu == %zu", values.size(), + tensor.layout.total_nr_elems()); + auto ptr = + tensor.ptr::ctype>(); + for (const auto& v : values) { + *ptr++ = typename DTypeTrait::ctype(v); + } + return tensor; + }; + + auto input_64 = TensorValueLowbit4({1, 1, 4, 4, 64}, + dtype::QuantizedS4(0.1), input_values); + auto fliter_64 = TensorValueLowbit4({64, 1, 3, 3, 64}, + dtype::QuantizedS4(0.1), filter_values); + auto bias1_64 = + GenTensorValue({1, 1, 1, 1, 64}, dtype::QuantizedS32(0.01), bias_1); + + auto output_64 = TensorValueLowbit4( + {1, 1, 2, 2, 64}, dtype::QuantizedS4(1), output_values); + + checker.set_param(param).exect( + Testcase{input_64, fliter_64, bias1_64, {}, {}}, + Testcase{{}, {}, {}, {}, output_64}); +} // vim: syntax=cpp.doxygen diff --git a/dnn/test/naive/elemwise_multi_type.cpp b/dnn/test/naive/elemwise_multi_type.cpp index 4423420f..71681fd4 100644 --- a/dnn/test/naive/elemwise_multi_type.cpp +++ b/dnn/test/naive/elemwise_multi_type.cpp @@ -147,8 +147,23 @@ TEST_F(NAIVE, ELEMWISE_QUANTIZED_MODE_UNARY) { checker.execs({{10, 4, 5, 6}, {}}); checker.execs({{1, 4, 5, 6}, {}}); checker.execs({{1, 4, 5, 1}, {}}); + + checker.set_dtype(1, dtype::QuantizedS4(0.35f)); + checker.execs({{3, 4, 5, 6}, {}}); + checker.execs({{10, 4, 5, 6}, {}}); + checker.execs({{1, 4, 5, 6}, {}}); + checker.execs({{1, 4, 5, 1}, {}}); } } +TEST_F(NAIVE, ELEMWISE_QUANTIZED_MODE_UNARY_Q4) { + using Param = ElemwiseMultiType::Param; + + Checker checker(handle()); + checker.set_param(Param::Mode::QRELU); + checker.set_dtype(0, dtype::QuantizedS32(1.f)); + checker.set_dtype(1, dtype::QuantizedS4(1.f)); + checker.execs({{3, 4, 5, 6}, {}}); +} TEST_F(NAIVE, ELEMWISE_QUANTIZED_MODE_BINARY) { using Param = ElemwiseMultiType::Param; @@ -225,6 +240,13 @@ TEST_F(NAIVE, ELEMWISE_QUANTIZED_MODE_BINARY) { checker.execs({{10, 4, 5, 6}, {10, 4, 5, 6}, {}}); checker.execs({{1, 4, 5, 6}, {20, 4, 5, 6}, {}}); checker.execs({{1, 4, 5, 1}, {2, 1, 1, 2}, {}}); + + checker.set_dtype(2, dtype::QuantizedS4(0.35f)); + checker.execs({{3, 4, 5, 6}, {3, 4, 5, 6}, {}}); + checker.execs({{10, 4, 5, 6}, {10, 4, 5, 6}, {}}); + checker.execs({{1, 4, 5, 6}, {20, 4, 5, 6}, {}}); + checker.execs({{1, 4, 5, 1}, {2, 1, 1, 2}, {}}); + } } @@ -275,6 +297,10 @@ TEST_F(NAIVE, ELEMWISE_QUANTIZED_MODE_TERNARY) { checker.set_dtype(3, dtype::QuantizedS32(0.35f)); checker.execs({{3, 4, 5, 6}, {3, 4, 5, 6}, {3, 4, 5, 6}, {}}); checker.execs({{10, 4, 5, 6}, {10, 4, 5, 6}, {10, 4, 5, 6}, {}}); + + checker.set_dtype(3, dtype::QuantizedS4(0.35f)); + checker.execs({{3, 4, 5, 6}, {3, 4, 5, 6}, {3, 4, 5, 6}, {}}); + checker.execs({{10, 4, 5, 6}, {10, 4, 5, 6}, {10, 4, 5, 6}, {}}); } }