diff --git a/app/build.gradle b/app/build.gradle index 2f17554..16a7745 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "com.uns.maincar" minSdk 26 targetSdk 32 - versionCode 23 - versionName '2.1.2' + versionCode 24 + versionName '2.1.3' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" externalNativeBuild { diff --git a/app/release/app-release.apk b/app/release/app-release.apk index 62daf06..abcc991 100644 Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 44104e3..cba671d 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "attributes": [], - "versionCode": 23, - "versionName": "2.1.2-beta", + "versionCode": 24, + "versionName": "2.1.3-beta", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/assets/lpr/CharacterRecognization.caffemodel b/app/src/main/assets/lpr/CharacterRecognization.caffemodel new file mode 100644 index 0000000..d424408 Binary files /dev/null and b/app/src/main/assets/lpr/CharacterRecognization.caffemodel differ diff --git a/app/src/main/assets/lpr/CharacterRecognization.prototxt b/app/src/main/assets/lpr/CharacterRecognization.prototxt new file mode 100644 index 0000000..91aa29e --- /dev/null +++ b/app/src/main/assets/lpr/CharacterRecognization.prototxt @@ -0,0 +1,123 @@ +input: "data" +input_dim: 1 +input_dim: 1 +input_dim: 30 +input_dim: 14 +layer { + name: "conv2d_1" + type: "Convolution" + bottom: "data" + top: "conv2d_1" + convolution_param { + num_output: 32 + bias_term: true + pad: 0 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "activation_1" + type: "ReLU" + bottom: "conv2d_1" + top: "activation_1" +} +layer { + name: "max_pooling2d_1" + type: "Pooling" + bottom: "activation_1" + top: "max_pooling2d_1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + pad: 0 + } +} +layer { + name: "conv2d_2" + type: "Convolution" + bottom: "max_pooling2d_1" + top: "conv2d_2" + convolution_param { + num_output: 64 + bias_term: true + pad: 0 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "activation_2" + type: "ReLU" + bottom: "conv2d_2" + top: "activation_2" +} +layer { + name: "max_pooling2d_2" + type: "Pooling" + bottom: "activation_2" + top: "max_pooling2d_2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + pad: 0 + } +} +layer { + name: "conv2d_3" + type: "Convolution" + bottom: "max_pooling2d_2" + top: "conv2d_3" + convolution_param { + num_output: 128 + bias_term: true + pad: 0 + kernel_size: 2 + stride: 1 + } +} +layer { + name: "activation_3" + type: "ReLU" + bottom: "conv2d_3" + top: "activation_3" +} +layer { + name: "flatten_1" + type: "Flatten" + bottom: "activation_3" + top: "flatten_1" +} +layer { + name: "dense_1" + type: "InnerProduct" + bottom: "flatten_1" + top: "dense_1" + inner_product_param { + num_output: 256 + } +} +layer { + name: "relu2" + type: "ReLU" + bottom: "dense_1" + top: "relu2" +} +layer { + name: "dense2" + type: "InnerProduct" + bottom: "relu2" + top: "dense2" + inner_product_param { + num_output: 65 + } +} + +layer { + name: "prob" + type: "Softmax" + bottom: "dense2" + top: "prob" +} \ No newline at end of file diff --git a/app/src/main/assets/lpr/HorizonalFinemapping.caffemodel b/app/src/main/assets/lpr/HorizonalFinemapping.caffemodel new file mode 100644 index 0000000..1af5863 Binary files /dev/null and b/app/src/main/assets/lpr/HorizonalFinemapping.caffemodel differ diff --git a/app/src/main/assets/lpr/HorizonalFinemapping.prototxt b/app/src/main/assets/lpr/HorizonalFinemapping.prototxt new file mode 100644 index 0000000..21726dd --- /dev/null +++ b/app/src/main/assets/lpr/HorizonalFinemapping.prototxt @@ -0,0 +1,95 @@ +input: "data" +input_dim: 1 +input_dim: 3 +input_dim: 16 +input_dim: 66 +layer { + name: "conv1" + type: "Convolution" + bottom: "data" + top: "conv1" + convolution_param { + num_output: 10 + bias_term: true + pad: 0 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu1" + type: "ReLU" + bottom: "conv1" + top: "conv1" +} +layer { + name: "max_pooling2d_3" + type: "Pooling" + bottom: "conv1" + top: "max_pooling2d_3" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + pad: 0 + } +} +layer { + name: "conv2" + type: "Convolution" + bottom: "max_pooling2d_3" + top: "conv2" + convolution_param { + num_output: 16 + bias_term: true + pad: 0 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu2" + type: "ReLU" + bottom: "conv2" + top: "conv2" +} +layer { + name: "conv3" + type: "Convolution" + bottom: "conv2" + top: "conv3" + convolution_param { + num_output: 32 + bias_term: true + pad: 0 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "relu3" + type: "ReLU" + bottom: "conv3" + top: "conv3" +} +layer { + name: "flatten_2" + type: "Flatten" + bottom: "conv3" + top: "flatten_2" +} +layer { + name: "dense" + type: "InnerProduct" + bottom: "flatten_2" + top: "dense" + inner_product_param { + num_output: 2 + } +} +layer { + name: "relu4" + type: "ReLU" + bottom: "dense" + top: "dense" +} diff --git a/app/src/main/assets/lpr/SegmenationFree-Inception.caffemodel b/app/src/main/assets/lpr/SegmenationFree-Inception.caffemodel new file mode 100644 index 0000000..311ee17 Binary files /dev/null and b/app/src/main/assets/lpr/SegmenationFree-Inception.caffemodel differ diff --git a/app/src/main/assets/lpr/SegmenationFree-Inception.prototxt b/app/src/main/assets/lpr/SegmenationFree-Inception.prototxt new file mode 100644 index 0000000..8419763 --- /dev/null +++ b/app/src/main/assets/lpr/SegmenationFree-Inception.prototxt @@ -0,0 +1,454 @@ +input: "data" +input_dim: 1 +input_dim: 3 +input_dim: 160 +input_dim: 40 +layer { + name: "conv0" + type: "Convolution" + bottom: "data" + top: "conv0" + convolution_param { + num_output: 32 + bias_term: true + pad_h: 1 + pad_w: 1 + kernel_h: 3 + kernel_w: 3 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "bn0" + type: "BatchNorm" + bottom: "conv0" + top: "bn0" + batch_norm_param { + moving_average_fraction: 0.99 + eps: 0.001 + } +} +layer { + name: "bn0_scale" + type: "Scale" + bottom: "bn0" + top: "bn0" + scale_param { + bias_term: true + } +} +layer { + name: "relu0" + type: "ReLU" + bottom: "bn0" + top: "bn0" +} +layer { + name: "pool0" + type: "Pooling" + bottom: "bn0" + top: "pool0" + pooling_param { + pool: MAX + kernel_h: 2 + kernel_w: 2 + stride_h: 2 + stride_w: 2 + pad_h: 0 + pad_w: 0 + } +} +layer { + name: "conv1" + type: "Convolution" + bottom: "pool0" + top: "conv1" + convolution_param { + num_output: 64 + bias_term: true + pad_h: 1 + pad_w: 1 + kernel_h: 3 + kernel_w: 3 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "bn1" + type: "BatchNorm" + bottom: "conv1" + top: "bn1" + batch_norm_param { + moving_average_fraction: 0.99 + eps: 0.001 + } +} +layer { + name: "bn1_scale" + type: "Scale" + bottom: "bn1" + top: "bn1" + scale_param { + bias_term: true + } +} +layer { + name: "relu1" + type: "ReLU" + bottom: "bn1" + top: "bn1" +} +layer { + name: "pool1" + type: "Pooling" + bottom: "bn1" + top: "pool1" + pooling_param { + pool: MAX + kernel_h: 2 + kernel_w: 2 + stride_h: 2 + stride_w: 2 + pad_h: 0 + pad_w: 0 + } +} +layer { + name: "conv2" + type: "Convolution" + bottom: "pool1" + top: "conv2" + convolution_param { + num_output: 128 + bias_term: true + pad_h: 1 + pad_w: 1 + kernel_h: 3 + kernel_w: 3 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "bn2" + type: "BatchNorm" + bottom: "conv2" + top: "bn2" + batch_norm_param { + moving_average_fraction: 0.99 + eps: 0.001 + } +} +layer { + name: "bn2_scale" + type: "Scale" + bottom: "bn2" + top: "bn2" + scale_param { + bias_term: true + } +} +layer { + name: "relu2" + type: "ReLU" + bottom: "bn2" + top: "bn2" +} +layer { + name: "pool2" + type: "Pooling" + bottom: "bn2" + top: "pool2" + pooling_param { + pool: MAX + kernel_h: 2 + kernel_w: 2 + stride_h: 2 + stride_w: 2 + pad_h: 0 + pad_w: 0 + } +} +layer { + name: "conv2d_1" + type: "Convolution" + bottom: "pool2" + top: "conv2d_1" + convolution_param { + num_output: 256 + bias_term: true + pad_h: 0 + pad_w: 0 + kernel_h: 1 + kernel_w: 5 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "batch_normalization_1" + type: "BatchNorm" + bottom: "conv2d_1" + top: "batch_normalization_1" + batch_norm_param { + moving_average_fraction: 0.99 + eps: 0.001 + } +} +layer { + name: "batch_normalization_1_scale" + type: "Scale" + bottom: "batch_normalization_1" + top: "batch_normalization_1" + scale_param { + bias_term: true + } +} +layer { + name: "activation_1" + type: "ReLU" + bottom: "batch_normalization_1" + top: "batch_normalization_1" +} +layer { + name: "conv2d_2" + type: "Convolution" + bottom: "batch_normalization_1" + top: "conv2d_2" + convolution_param { + num_output: 256 + bias_term: true + pad_h: 3 + pad_w: 0 + kernel_h: 7 + kernel_w: 1 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "conv2d_3" + type: "Convolution" + bottom: "batch_normalization_1" + top: "conv2d_3" + convolution_param { + num_output: 256 + bias_term: true + pad_h: 2 + pad_w: 0 + kernel_h: 5 + kernel_w: 1 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "conv2d_4" + type: "Convolution" + bottom: "batch_normalization_1" + top: "conv2d_4" + convolution_param { + num_output: 256 + bias_term: true + pad_h: 1 + pad_w: 0 + kernel_h: 3 + kernel_w: 1 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "conv2d_5" + type: "Convolution" + bottom: "batch_normalization_1" + top: "conv2d_5" + convolution_param { + num_output: 256 + bias_term: true + pad_h: 0 + pad_w: 0 + kernel_h: 1 + kernel_w: 1 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "batch_normalization_2" + type: "BatchNorm" + bottom: "conv2d_2" + top: "batch_normalization_2" + batch_norm_param { + moving_average_fraction: 0.99 + eps: 0.001 + } +} +layer { + name: "batch_normalization_2_scale" + type: "Scale" + bottom: "batch_normalization_2" + top: "batch_normalization_2" + scale_param { + bias_term: true + } +} +layer { + name: "batch_normalization_3" + type: "BatchNorm" + bottom: "conv2d_3" + top: "batch_normalization_3" + batch_norm_param { + moving_average_fraction: 0.99 + eps: 0.001 + } +} +layer { + name: "batch_normalization_3_scale" + type: "Scale" + bottom: "batch_normalization_3" + top: "batch_normalization_3" + scale_param { + bias_term: true + } +} +layer { + name: "batch_normalization_4" + type: "BatchNorm" + bottom: "conv2d_4" + top: "batch_normalization_4" + batch_norm_param { + moving_average_fraction: 0.99 + eps: 0.001 + } +} +layer { + name: "batch_normalization_4_scale" + type: "Scale" + bottom: "batch_normalization_4" + top: "batch_normalization_4" + scale_param { + bias_term: true + } +} +layer { + name: "batch_normalization_5" + type: "BatchNorm" + bottom: "conv2d_5" + top: "batch_normalization_5" + batch_norm_param { + moving_average_fraction: 0.99 + eps: 0.001 + } +} +layer { + name: "batch_normalization_5_scale" + type: "Scale" + bottom: "batch_normalization_5" + top: "batch_normalization_5" + scale_param { + bias_term: true + } +} +layer { + name: "activation_2" + type: "ReLU" + bottom: "batch_normalization_2" + top: "batch_normalization_2" +} +layer { + name: "activation_3" + type: "ReLU" + bottom: "batch_normalization_3" + top: "batch_normalization_3" +} +layer { + name: "activation_4" + type: "ReLU" + bottom: "batch_normalization_4" + top: "batch_normalization_4" +} +layer { + name: "activation_5" + type: "ReLU" + bottom: "batch_normalization_5" + top: "batch_normalization_5" +} +layer { + name: "concatenate_1" + type: "Concat" + bottom: "batch_normalization_2" + bottom: "batch_normalization_3" + bottom: "batch_normalization_4" + bottom: "batch_normalization_5" + top: "concatenate_1" + concat_param { + axis: 1 + } +} +layer { + name: "conv_1024_11" + type: "Convolution" + bottom: "concatenate_1" + top: "conv_1024_11" + convolution_param { + num_output: 1024 + bias_term: true + pad_h: 0 + pad_w: 0 + kernel_h: 1 + kernel_w: 1 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "batch_normalization_6" + type: "BatchNorm" + bottom: "conv_1024_11" + top: "batch_normalization_6" + batch_norm_param { + moving_average_fraction: 0.99 + eps: 0.001 + } +} +layer { + name: "batch_normalization_6_scale" + type: "Scale" + bottom: "batch_normalization_6" + top: "batch_normalization_6" + scale_param { + bias_term: true + } +} +layer { + name: "activation_6" + type: "ReLU" + bottom: "batch_normalization_6" + top: "batch_normalization_6" +} +layer { + name: "conv_class_11" + type: "Convolution" + bottom: "batch_normalization_6" + top: "conv_class_11" + convolution_param { + num_output: 84 + bias_term: true + pad_h: 0 + pad_w: 0 + kernel_h: 1 + kernel_w: 1 + stride_h: 1 + stride_w: 1 + } +} +layer { + name: "prob" + type: "Softmax" + bottom: "conv_class_11" + top: "prob" +} + diff --git a/app/src/main/assets/lpr/Segmentation.caffemodel b/app/src/main/assets/lpr/Segmentation.caffemodel new file mode 100644 index 0000000..208269d Binary files /dev/null and b/app/src/main/assets/lpr/Segmentation.caffemodel differ diff --git a/app/src/main/assets/lpr/Segmentation.prototxt b/app/src/main/assets/lpr/Segmentation.prototxt new file mode 100644 index 0000000..45c6829 --- /dev/null +++ b/app/src/main/assets/lpr/Segmentation.prototxt @@ -0,0 +1,114 @@ +input: "data" +input_dim: 1 +input_dim: 1 +input_dim: 22 +input_dim: 22 +layer { + name: "conv2d_12" + type: "Convolution" + bottom: "data" + top: "conv2d_12" + convolution_param { + num_output: 16 + bias_term: true + pad: 0 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "activation_18" + type: "ReLU" + bottom: "conv2d_12" + top: "activation_18" +} +layer { + name: "max_pooling2d_10" + type: "Pooling" + bottom: "activation_18" + top: "max_pooling2d_10" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + pad: 0 + } +} +layer { + name: "conv2d_13" + type: "Convolution" + bottom: "max_pooling2d_10" + top: "conv2d_13" + convolution_param { + num_output: 16 + bias_term: true + pad: 0 + kernel_size: 3 + stride: 1 + } +} +layer { + name: "activation_19" + type: "ReLU" + bottom: "conv2d_13" + top: "activation_19" +} +layer { + name: "max_pooling2d_11" + type: "Pooling" + bottom: "activation_19" + top: "max_pooling2d_11" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + pad: 0 + } +} +layer { + name: "flatten_6" + type: "Flatten" + bottom: "max_pooling2d_11" + top: "flatten_6" +} +layer { + name: "dense_9" + type: "InnerProduct" + bottom: "flatten_6" + top: "dense_9" + inner_product_param { + num_output: 256 + } +} +layer { + name: "dropout_9" + type: "Dropout" + bottom: "dense_9" + top: "dropout_9" + dropout_param { + dropout_ratio: 0.5 + } +} +layer { + name: "activation_20" + type: "ReLU" + bottom: "dropout_9" + top: "activation_20" +} +layer { + name: "dense_10" + type: "InnerProduct" + bottom: "activation_20" + top: "dense_10" + inner_product_param { + num_output: 3 + } +} + + + layer { + name: "prob" + type: "Softmax" + bottom: "dense_10" + top: "prob" +} \ No newline at end of file diff --git a/app/src/main/assets/lpr/cascade.xml b/app/src/main/assets/lpr/cascade.xml new file mode 100644 index 0000000..3ce94d4 --- /dev/null +++ b/app/src/main/assets/lpr/cascade.xml @@ -0,0 +1,19154 @@ + + + + BOOST + HAAR + 13 + 51 + + GAB + 9.9900001287460327e-001 + 5.0000000000000000e-001 + 9.4999999999999996e-001 + 1 + 100 + + + 0 + 1 + ALL + + 20 + + + <_> + 8 + -1.9158077239990234e+000 + + <_> + + 0 -1 344 -8.1478752195835114e-002 + + + 6.2639594078063965e-001 -8.1564724445343018e-001 + + + <_> + + 0 -1 701 -1.2957378290593624e-002 + + + 7.7114331722259521e-001 -4.9504086375236511e-001 + + + <_> + + 0 -1 687 -9.2470366507768631e-003 + + + 8.1202191114425659e-001 -2.8070560097694397e-001 + + + <_> + + 0 -1 614 1.2374955229461193e-002 + + + -2.5367051362991333e-001 7.3795551061630249e-001 + + + <_> + + 0 -1 299 -4.7858944162726402e-003 + + + 7.1150565147399902e-001 -3.0462509393692017e-001 + + + <_> + + 0 -1 297 3.8920845836400986e-003 + + + -2.8375166654586792e-001 7.3174893856048584e-001 + + + <_> + + 0 -1 814 -8.8258963078260422e-003 + + + 7.5333666801452637e-001 -1.9880458712577820e-001 + + + <_> + + 0 -1 845 -6.7375516518950462e-003 + + + 7.5299704074859619e-001 -2.3570337891578674e-001 + + + + + + <_> + 12 + -2.2599112987518311e+000 + + <_> + + 0 -1 577 -1.4449171721935272e-002 + + + 5.5890566110610962e-001 -7.6307392120361328e-001 + + + <_> + + 0 -1 364 -3.8289055228233337e-002 + + + 5.1702296733856201e-001 -5.7946079969406128e-001 + + + <_> + + 0 -1 124 -1.4895259402692318e-002 + + + 6.1277741193771362e-001 -3.2827928662300110e-001 + + + <_> + + 0 -1 579 8.3044255152344704e-003 + + + -3.3253005146980286e-001 7.2171914577484131e-001 + + + <_> + + 0 -1 314 6.0594235546886921e-003 + + + -3.2760250568389893e-001 4.9508789181709290e-001 + + + <_> + + 0 -1 699 -6.8011749535799026e-003 + + + 6.6238498687744141e-001 -2.4112002551555634e-001 + + + <_> + + 0 -1 295 -1.1183910071849823e-002 + + + 7.1757602691650391e-001 -2.0989039540290833e-001 + + + <_> + + 0 -1 767 1.3139605522155762e-002 + + + -1.8845251202583313e-001 6.7252415418624878e-001 + + + <_> + + 0 -1 689 -6.1739999800920486e-003 + + + 6.3675141334533691e-001 -2.4877758324146271e-001 + + + <_> + + 0 -1 230 -9.2421043664216995e-003 + + + 6.5140277147293091e-001 -2.1352872252464294e-001 + + + <_> + + 0 -1 48 -1.0526084899902344e-001 + + + -9.0194213390350342e-001 1.8239501118659973e-001 + + + <_> + + 0 -1 281 1.2764739990234375e-001 + + + 1.6771897673606873e-001 -7.7668786048889160e-001 + + + + + + <_> + 14 + -2.6526770591735840e+000 + + <_> + + 0 -1 829 -1.3842798769474030e-002 + + + 4.1735208034515381e-001 -7.4295550584793091e-001 + + + <_> + + 0 -1 97 1.4765590429306030e-002 + + + -5.1845699548721313e-001 5.0078016519546509e-001 + + + <_> + + 0 -1 21 3.1671046745032072e-003 + + + -3.2739469408988953e-001 5.1253867149353027e-001 + + + <_> + + 0 -1 812 -9.5202140510082245e-003 + + + 7.1236211061477661e-001 -2.3344238102436066e-001 + + + <_> + + 0 -1 703 -1.2149499729275703e-002 + + + 6.4311891794204712e-001 -2.5991156697273254e-001 + + + <_> + + 0 -1 385 -1.0172967612743378e-001 + + + -7.3093742132186890e-001 2.3339104652404785e-001 + + + <_> + + 0 -1 858 -6.2750680372118950e-003 + + + 6.4128917455673218e-001 -2.3738093674182892e-001 + + + <_> + + 0 -1 518 1.5905253589153290e-002 + + + -2.3312157392501831e-001 5.6561905145645142e-001 + + + <_> + + 0 -1 873 -5.6511810980737209e-003 + + + 6.3098442554473877e-001 -2.2128470242023468e-001 + + + <_> + + 0 -1 229 1.0334834456443787e-002 + + + -1.6205528378486633e-001 7.1688497066497803e-001 + + + <_> + + 0 -1 373 -1.4500595629215240e-002 + + + 5.2634650468826294e-001 -2.5339555740356445e-001 + + + <_> + + 0 -1 720 8.4515195339918137e-003 + + + -1.9005575776100159e-001 6.2645190954208374e-001 + + + <_> + + 0 -1 519 1.6612716019153595e-002 + + + -1.9349065423011780e-001 6.6134274005889893e-001 + + + <_> + + 0 -1 561 1.0179553180932999e-002 + + + -1.9179263710975647e-001 6.1396795511245728e-001 + + + + + + <_> + 16 + -2.2411971092224121e+000 + + <_> + + 0 -1 344 -9.5315366983413696e-002 + + + 2.0634920895099640e-001 -7.6994550228118896e-001 + + + <_> + + 0 -1 577 -1.1904314160346985e-002 + + + 4.6030580997467041e-001 -4.5124572515487671e-001 + + + <_> + + 0 -1 736 8.0967023968696594e-003 + + + -2.9279080033302307e-001 5.1358801126480103e-001 + + + <_> + + 0 -1 766 -1.4768393710255623e-002 + + + 6.9709998369216919e-001 -1.9789521396160126e-001 + + + <_> + + 0 -1 332 -7.3709283024072647e-003 + + + 6.4356821775436401e-001 -1.9384047389030457e-001 + + + <_> + + 0 -1 331 7.4571794830262661e-003 + + + -2.0553122460842133e-001 6.7929607629776001e-001 + + + <_> + + 0 -1 943 5.8717206120491028e-003 + + + -1.9075798988342285e-001 6.3178658485412598e-001 + + + <_> + + 0 -1 563 -6.3720787875354290e-003 + + + 6.1133956909179688e-001 -1.9197526574134827e-001 + + + <_> + + 0 -1 185 -1.7508253455162048e-002 + + + 5.5003905296325684e-001 -2.0409923791885376e-001 + + + <_> + + 0 -1 539 -4.2271558195352554e-003 + + + 5.9483224153518677e-001 -2.0080061256885529e-001 + + + <_> + + 0 -1 919 5.0116949714720249e-003 + + + -1.8873518705368042e-001 5.8758223056793213e-001 + + + <_> + + 0 -1 298 8.4183514118194580e-002 + + + 1.9158974289894104e-001 -7.3058295249938965e-001 + + + <_> + + 0 -1 776 4.5591969974339008e-003 + + + -2.1568548679351807e-001 5.4940956830978394e-001 + + + <_> + + 0 -1 776 -3.6774221807718277e-003 + + + 6.5714693069458008e-001 -2.3908025026321411e-001 + + + <_> + + 0 -1 844 1.3156082481145859e-002 + + + -1.6889381408691406e-001 5.4372692108154297e-001 + + + <_> + + 0 -1 508 1.2298718094825745e-002 + + + -1.7204846441745758e-001 5.3114622831344604e-001 + + + + + + <_> + 20 + -2.3278577327728271e+000 + + <_> + + 0 -1 684 -4.2540580034255981e-002 + + + 2.4365724623203278e-001 -7.2478657960891724e-001 + + + <_> + + 0 -1 317 -2.1006479859352112e-002 + + + 3.9405155181884766e-001 -5.1031738519668579e-001 + + + <_> + + 0 -1 13 1.2750471010804176e-002 + + + -2.6155433058738708e-001 5.3219014406204224e-001 + + + <_> + + 0 -1 12 -1.0928934812545776e-001 + + + -7.9762983322143555e-001 1.6522131860256195e-001 + + + <_> + + 0 -1 742 -8.2451943308115005e-003 + + + 6.1570894718170166e-001 -1.6545474529266357e-001 + + + <_> + + 0 -1 651 -6.1263595707714558e-003 + + + 6.5689104795455933e-001 -1.6943360865116119e-001 + + + <_> + + 0 -1 650 5.0333887338638306e-003 + + + -1.9622130692005157e-001 5.7385104894638062e-001 + + + <_> + + 0 -1 34 1.0666935704648495e-002 + + + -2.1881586313247681e-001 4.5024806261062622e-001 + + + <_> + + 0 -1 291 -1.0632696561515331e-002 + + + 6.3769024610519409e-001 -1.6428084671497345e-001 + + + <_> + + 0 -1 237 -1.4020981267094612e-002 + + + 6.1583393812179565e-001 -1.6708594560623169e-001 + + + <_> + + 0 -1 765 1.2589931488037109e-002 + + + -2.0485720038414001e-001 4.7809442877769470e-001 + + + <_> + + 0 -1 753 -1.3003132306039333e-002 + + + 6.5572524070739746e-001 -1.6035726666450500e-001 + + + <_> + + 0 -1 222 -5.7425271719694138e-002 + + + -8.2782661914825439e-001 1.4296714961528778e-001 + + + <_> + + 0 -1 833 -3.7263054400682449e-003 + + + 4.9777820706367493e-001 -2.1036401391029358e-001 + + + <_> + + 0 -1 825 1.2980616651475430e-002 + + + -1.7779336869716644e-001 6.1292153596878052e-001 + + + <_> + + 0 -1 276 -3.4886042121797800e-003 + + + 4.1184583306312561e-001 -2.0970273017883301e-001 + + + <_> + + 0 -1 813 -1.1452829465270042e-002 + + + 5.6084501743316650e-001 -1.5244032442569733e-001 + + + <_> + + 0 -1 321 3.7844986654818058e-003 + + + -2.8913837671279907e-001 2.7224406599998474e-001 + + + <_> + + 0 -1 876 -4.7596222721040249e-003 + + + 5.2785235643386841e-001 -1.5034112334251404e-001 + + + <_> + + 0 -1 896 -1.7377159092575312e-003 + + + 5.5644094944000244e-001 -2.0121455192565918e-001 + + + + + + <_> + 28 + -2.3750255107879639e+000 + + <_> + + 0 -1 347 -1.0104553401470184e-001 + + + 1.3032685220241547e-001 -7.3142945766448975e-001 + + + <_> + + 0 -1 596 -1.8494745716452599e-002 + + + 5.6178814172744751e-001 -3.3690422773361206e-001 + + + <_> + + 0 -1 629 1.0897371917963028e-002 + + + -2.6694682240486145e-001 4.6661883592605591e-001 + + + <_> + + 0 -1 839 8.4953904151916504e-003 + + + -2.0583645999431610e-001 4.6663123369216919e-001 + + + <_> + + 0 -1 44 6.3092201948165894e-002 + + + 1.2652839720249176e-001 -7.4331611394882202e-001 + + + <_> + + 0 -1 305 -4.8850802704691887e-003 + + + 5.1036185026168823e-001 -1.7127794027328491e-001 + + + <_> + + 0 -1 295 -1.2086534872651100e-002 + + + 5.3874844312667847e-001 -1.7047831416130066e-001 + + + <_> + + 0 -1 163 -4.0194295346736908e-002 + + + 6.0334587097167969e-001 -1.8293543159961700e-001 + + + <_> + + 0 -1 265 -9.7945984452962875e-003 + + + 4.8900371789932251e-001 -1.7746040225028992e-001 + + + <_> + + 0 -1 597 6.7133754491806030e-003 + + + -1.8603576719760895e-001 4.9050629138946533e-001 + + + <_> + + 0 -1 128 1.5135381370782852e-002 + + + 1.5555633604526520e-001 -6.6330802440643311e-001 + + + <_> + + 0 -1 480 7.4470564723014832e-003 + + + 1.2465479969978333e-001 -6.3456755876541138e-001 + + + <_> + + 0 -1 559 -1.7742723226547241e-002 + + + 4.8904901742935181e-001 -1.6264849901199341e-001 + + + <_> + + 0 -1 821 -1.5695080161094666e-002 + + + 4.1306030750274658e-001 -1.9036959111690521e-001 + + + <_> + + 0 -1 819 -4.3798778206110001e-003 + + + 4.8768985271453857e-001 -1.5558160841464996e-001 + + + <_> + + 0 -1 836 -4.8424974083900452e-003 + + + 4.6657896041870117e-001 -1.6847038269042969e-001 + + + <_> + + 0 -1 90 7.4649546295404434e-003 + + + -1.7167872190475464e-001 4.3042477965354919e-001 + + + <_> + + 0 -1 883 5.1524871960282326e-003 + + + -1.4530055224895477e-001 4.7056230902671814e-001 + + + <_> + + 0 -1 890 9.8812151700258255e-003 + + + -1.4264582097530365e-001 5.0057184696197510e-001 + + + <_> + + 0 -1 393 -3.0181273818016052e-002 + + + -6.5408444404602051e-001 1.0674032568931580e-001 + + + <_> + + 0 -1 694 9.2962123453617096e-003 + + + -1.4381234347820282e-001 4.9470436573028564e-001 + + + <_> + + 0 -1 77 -7.6252631843090057e-003 + + + -5.2033776044845581e-001 1.3706678152084351e-001 + + + <_> + + 0 -1 801 -1.1497072875499725e-002 + + + 3.4252560138702393e-001 -1.9132094085216522e-001 + + + <_> + + 0 -1 670 -4.4177635572850704e-003 + + + 4.6443006396293640e-001 -1.3389693200588226e-001 + + + <_> + + 0 -1 647 -2.4282713420689106e-003 + + + 4.1310977935791016e-001 -1.3224220275878906e-001 + + + <_> + + 0 -1 686 1.0079141706228256e-002 + + + -1.3342842459678650e-001 5.5696302652359009e-001 + + + <_> + + 0 -1 570 3.5632357001304626e-002 + + + 9.1464981436729431e-002 -7.0863521099090576e-001 + + + <_> + + 0 -1 840 -1.9085695967078209e-003 + + + 2.6823535561561584e-001 -1.9665902853012085e-001 + + + + + + <_> + 34 + -2.5052807331085205e+000 + + <_> + + 0 -1 268 1.5469970181584358e-002 + + + -6.7369276285171509e-001 3.0393996834754944e-001 + + + <_> + + 0 -1 700 -2.2830318659543991e-002 + + + 4.9829742312431335e-001 -3.5193654894828796e-001 + + + <_> + + 0 -1 521 1.8841657787561417e-002 + + + -2.1037499606609344e-001 4.8866468667984009e-001 + + + <_> + + 0 -1 262 1.1541565880179405e-002 + + + -1.8598809838294983e-001 5.2916365861892700e-001 + + + <_> + + 0 -1 219 -2.4122973904013634e-002 + + + 5.2869701385498047e-001 -1.6163693368434906e-001 + + + <_> + + 0 -1 6 1.4711560681462288e-002 + + + -2.5017279386520386e-001 3.2298168540000916e-001 + + + <_> + + 0 -1 520 -1.5706669539213181e-002 + + + 5.0967657566070557e-001 -1.5732303261756897e-001 + + + <_> + + 0 -1 948 -4.1158739477396011e-003 + + + 4.9462157487869263e-001 -1.2155625224113464e-001 + + + <_> + + 0 -1 770 -1.0694706812500954e-002 + + + 6.1407995223999023e-001 -1.2956763803958893e-001 + + + <_> + + 0 -1 387 -3.6484465003013611e-002 + + + 3.1439977884292603e-001 -2.2812500596046448e-001 + + + <_> + + 0 -1 345 5.4322574287652969e-002 + + + -8.7467961013317108e-002 7.1243762969970703e-001 + + + <_> + + 0 -1 250 -8.9914854615926743e-003 + + + 3.7887179851531982e-001 -1.7758503556251526e-001 + + + <_> + + 0 -1 52 1.5299601480364799e-002 + + + 1.5142892301082611e-001 -5.4104751348495483e-001 + + + <_> + + 0 -1 792 -6.0345130041241646e-003 + + + 3.8750106096267700e-001 -1.7849484086036682e-001 + + + <_> + + 0 -1 610 -2.0873975008726120e-003 + + + -5.5879276990890503e-001 1.3142852485179901e-001 + + + <_> + + 0 -1 642 -2.0619889255613089e-003 + + + -5.1919680833816528e-001 1.0321786254644394e-001 + + + <_> + + 0 -1 259 3.6544300615787506e-002 + + + -1.6965624690055847e-001 3.9208900928497314e-001 + + + <_> + + 0 -1 382 1.4528267784044147e-003 + + + -3.4218248724937439e-001 1.8518145382404327e-001 + + + <_> + + 0 -1 196 -2.6956547051668167e-002 + + + -8.3279663324356079e-001 7.7962644398212433e-002 + + + <_> + + 0 -1 533 -1.0518556460738182e-002 + + + 4.5597425103187561e-001 -1.4934070408344269e-001 + + + <_> + + 0 -1 740 5.4534617811441422e-003 + + + -1.5347433090209961e-001 3.5846599936485291e-001 + + + <_> + + 0 -1 534 -5.6011183187365532e-003 + + + 3.6314359307289124e-001 -1.5886513888835907e-001 + + + <_> + + 0 -1 927 1.0399374179542065e-002 + + + -1.1159978061914444e-001 4.9891829490661621e-001 + + + <_> + + 0 -1 41 2.6076715439558029e-002 + + + -2.1667334437370300e-001 2.5659701228141785e-001 + + + <_> + + 0 -1 715 -7.3732812888920307e-003 + + + 5.8327084779739380e-001 -1.0727929323911667e-001 + + + <_> + + 0 -1 882 -5.6875580921769142e-003 + + + 4.0847277641296387e-001 -1.2561751902103424e-001 + + + <_> + + 0 -1 891 1.3321589678525925e-002 + + + -1.2537255883216858e-001 4.4824957847595215e-001 + + + <_> + + 0 -1 168 -1.8619614839553833e-001 + + + -7.1703630685806274e-001 7.7993653714656830e-002 + + + <_> + + 0 -1 190 3.3796064555644989e-002 + + + -1.3172915577888489e-001 4.1404765844345093e-001 + + + <_> + + 0 -1 530 4.0178038179874420e-003 + + + -1.8571788072586060e-001 2.7401688694953918e-001 + + + <_> + + 0 -1 555 1.6669608652591705e-002 + + + 7.5644508004188538e-002 -6.8869042396545410e-001 + + + <_> + + 0 -1 406 4.7584358602762222e-002 + + + 8.2619942724704742e-002 -5.8818364143371582e-001 + + + <_> + + 0 -1 537 2.5073587894439697e-003 + + + -1.4251622557640076e-001 3.3965954184532166e-001 + + + <_> + + 0 -1 638 1.4513431116938591e-002 + + + -1.4366999268531799e-001 3.2603174448013306e-001 + + + + + + <_> + 42 + -2.4546041488647461e+000 + + <_> + + 0 -1 340 -9.4746887683868408e-002 + + + 1.1788145639002323e-002 -7.5736826658248901e-001 + + + <_> + + 0 -1 577 -1.5985764563083649e-002 + + + 3.4271994233131409e-001 -3.7916901707649231e-001 + + + <_> + + 0 -1 630 1.9708804786205292e-002 + + + -2.2393602132797241e-001 4.9053853750228882e-001 + + + <_> + + 0 -1 96 1.6178630292415619e-002 + + + -2.0412905514240265e-001 3.4104099869728088e-001 + + + <_> + + 0 -1 319 1.0606624186038971e-001 + + + -1.0737416148185730e-001 6.7443412542343140e-001 + + + <_> + + 0 -1 83 -6.7316116765141487e-003 + + + 3.4080076217651367e-001 -2.2706831991672516e-001 + + + <_> + + 0 -1 634 4.0689492598176003e-003 + + + -1.4782951772212982e-001 4.1778662800788879e-001 + + + <_> + + 0 -1 686 -1.3378994539380074e-002 + + + 6.8167924880981445e-001 -1.0507009923458099e-001 + + + <_> + + 0 -1 786 -1.8129471689462662e-002 + + + 5.0995999574661255e-001 -1.3223616778850555e-001 + + + <_> + + 0 -1 646 -8.9250747114419937e-003 + + + 5.0829160213470459e-001 -1.0886437445878983e-001 + + + <_> + + 0 -1 711 6.1906888149678707e-003 + + + -1.1881013214588165e-001 4.9430772662162781e-001 + + + <_> + + 0 -1 575 -3.4704633057117462e-002 + + + -6.8778192996978760e-001 9.2318676412105560e-002 + + + <_> + + 0 -1 189 -9.7849890589714050e-003 + + + 2.0124578475952148e-001 -2.8525698184967041e-001 + + + <_> + + 0 -1 479 1.4655515551567078e-003 + + + 1.0351686179637909e-001 -6.3454014062881470e-001 + + + <_> + + 0 -1 513 -3.5405270755290985e-002 + + + -7.6147061586380005e-001 6.0781378298997879e-002 + + + <_> + + 0 -1 23 9.1620441526174545e-003 + + + 8.2090407609939575e-002 -5.3804397583007813e-001 + + + <_> + + 0 -1 838 6.7096878774464130e-003 + + + -1.1302943527698517e-001 4.6365195512771606e-001 + + + <_> + + 0 -1 820 -1.0268911719322205e-002 + + + 5.8097857236862183e-001 -1.0859654098749161e-001 + + + <_> + + 0 -1 441 2.9750142246484756e-002 + + + 9.3299955129623413e-002 -5.4268807172775269e-001 + + + <_> + + 0 -1 726 -5.5990684777498245e-003 + + + 4.9949660897254944e-001 -1.0594012588262558e-001 + + + <_> + + 0 -1 714 4.8061953857541084e-003 + + + -1.1477116495370865e-001 4.3569833040237427e-001 + + + <_> + + 0 -1 637 -4.0460027754306793e-002 + + + -7.7711206674575806e-001 7.3132880032062531e-002 + + + <_> + + 0 -1 53 4.5344540849328041e-003 + + + -1.6310065984725952e-001 3.0750447511672974e-001 + + + <_> + + 0 -1 479 -1.4339694753289223e-003 + + + -5.2921229600906372e-001 8.8739573955535889e-002 + + + <_> + + 0 -1 396 -4.5565411448478699e-002 + + + -7.4928385019302368e-001 4.8912040889263153e-002 + + + <_> + + 0 -1 330 -8.3342632278800011e-003 + + + 4.6582534909248352e-001 -1.0161897540092468e-001 + + + <_> + + 0 -1 834 -1.0381949134171009e-002 + + + 3.0994066596031189e-001 -1.3267418742179871e-001 + + + <_> + + 0 -1 831 1.6984764486551285e-002 + + + -9.9871687591075897e-002 4.9527561664581299e-001 + + + <_> + + 0 -1 376 -1.3278885744512081e-003 + + + 3.6983770132064819e-001 -1.1738168448209763e-001 + + + <_> + + 0 -1 760 -3.1804253812879324e-003 + + + -8.9759206771850586e-001 4.3921347707509995e-002 + + + <_> + + 0 -1 828 -1.9149896688759327e-003 + + + 1.9146692752838135e-001 -2.0268803834915161e-001 + + + <_> + + 0 -1 841 -1.8405792070552707e-003 + + + 2.1319428086280823e-001 -1.8382850289344788e-001 + + + <_> + + 0 -1 259 3.5366363823413849e-002 + + + -1.2205254286527634e-001 3.0300119519233704e-001 + + + <_> + + 0 -1 354 -3.7630870938301086e-003 + + + 3.0492320656776428e-001 -1.2932489812374115e-001 + + + <_> + + 0 -1 732 -1.1243980843573809e-003 + + + -4.9750825762748718e-001 8.0560393631458282e-002 + + + <_> + + 0 -1 749 -2.2356058470904827e-003 + + + -6.7946660518646240e-001 5.2887793630361557e-002 + + + <_> + + 0 -1 536 -2.2717624902725220e-002 + + + 4.2686942219734192e-001 -1.0260385274887085e-001 + + + <_> + + 0 -1 280 9.2372611165046692e-002 + + + 7.9670898616313934e-002 -5.2335608005523682e-001 + + + <_> + + 0 -1 658 -1.0431142151355743e-001 + + + -7.4446302652359009e-001 4.6288352459669113e-002 + + + <_> + + 0 -1 944 7.4872868135571480e-003 + + + -1.1977240443229675e-001 3.1791850924491882e-001 + + + <_> + + 0 -1 228 -2.4358350783586502e-002 + + + 1.7944122850894928e-001 -2.0157346129417419e-001 + + + <_> + + 0 -1 47 4.9624212086200714e-002 + + + -1.0701860487461090e-001 3.7854740023612976e-001 + + + + + + <_> + 50 + -2.6502745151519775e+000 + + <_> + + 0 -1 431 2.1381884813308716e-002 + + + -7.6310330629348755e-001 -7.8235723078250885e-002 + + + <_> + + 0 -1 623 9.7743803635239601e-003 + + + -3.8874423503875732e-001 2.9614463448524475e-001 + + + <_> + + 0 -1 19 2.9336847364902496e-002 + + + -2.1392610669136047e-001 4.4257661700248718e-001 + + + <_> + + 0 -1 645 1.2054111808538437e-002 + + + -1.2168737500905991e-001 6.5890479087829590e-001 + + + <_> + + 0 -1 392 1.1729352176189423e-002 + + + -1.2235984951257706e-001 4.8555457592010498e-001 + + + <_> + + 0 -1 588 -1.0436945594847202e-003 + + + -6.1764669418334961e-001 1.1390741914510727e-001 + + + <_> + + 0 -1 71 -2.5775061920285225e-002 + + + -6.0323065519332886e-001 1.2372459471225739e-001 + + + <_> + + 0 -1 872 -4.0599796921014786e-003 + + + 3.5508742928504944e-001 -1.9819863140583038e-001 + + + <_> + + 0 -1 643 -1.9134972244501114e-002 + + + 4.7154670953750610e-001 -1.4655594527721405e-001 + + + <_> + + 0 -1 483 6.5218633972108364e-003 + + + 1.2207052111625671e-001 -6.0890328884124756e-001 + + + <_> + + 0 -1 757 -1.4126582071185112e-002 + + + 3.3305764198303223e-001 -1.8242211639881134e-001 + + + <_> + + 0 -1 565 -8.3793615922331810e-003 + + + 4.6099957823753357e-001 -1.0809499770402908e-001 + + + <_> + + 0 -1 455 -1.2584301875904202e-003 + + + -5.1634973287582397e-001 1.0520447790622711e-001 + + + <_> + + 0 -1 203 -5.1234811544418335e-002 + + + -7.5237458944320679e-001 5.3416907787322998e-002 + + + <_> + + 0 -1 584 1.6728173941373825e-002 + + + -1.4094479382038116e-001 3.8169395923614502e-001 + + + <_> + + 0 -1 184 -4.5198453590273857e-003 + + + 3.0100575089454651e-001 -1.6970130801200867e-001 + + + <_> + + 0 -1 686 1.0796479880809784e-002 + + + -1.1680302023887634e-001 4.6733006834983826e-001 + + + <_> + + 0 -1 860 5.4673422127962112e-003 + + + -1.3090577721595764e-001 3.4922021627426147e-001 + + + <_> + + 0 -1 902 6.2447679229080677e-003 + + + -1.0570991784334183e-001 4.4209754467010498e-001 + + + <_> + + 0 -1 892 -8.6985006928443909e-003 + + + 4.4582247734069824e-001 -1.1208640784025192e-001 + + + <_> + + 0 -1 86 5.8012232184410095e-002 + + + 5.6753028184175491e-002 -7.8348731994628906e-001 + + + <_> + + 0 -1 158 -1.9159330055117607e-002 + + + 2.1710830926895142e-001 -2.1206925809383392e-001 + + + <_> + + 0 -1 346 1.4331589639186859e-001 + + + -6.5506041049957275e-002 8.3924996852874756e-001 + + + <_> + + 0 -1 327 -7.4841668829321861e-003 + + + 4.4598889350891113e-001 -8.4189794957637787e-002 + + + <_> + + 0 -1 585 -3.1711272895336151e-002 + + + -6.8312811851501465e-001 6.7834347486495972e-002 + + + <_> + + 0 -1 543 -1.0442961938679218e-003 + + + -5.5244719982147217e-001 6.7180506885051727e-002 + + + <_> + + 0 -1 806 7.9750344157218933e-003 + + + -1.4685039222240448e-001 2.7911156415939331e-001 + + + <_> + + 0 -1 775 9.7797568887472153e-003 + + + -1.0445457696914673e-001 3.9583787322044373e-001 + + + <_> + + 0 -1 552 1.3288496062159538e-002 + + + -1.1733970791101456e-001 3.2855752110481262e-001 + + + <_> + + 0 -1 528 -1.5873706433922052e-003 + + + -6.4394426345825195e-001 5.9831541031599045e-002 + + + <_> + + 0 -1 538 4.1341055184602737e-003 + + + -1.4766456186771393e-001 2.6551467180252075e-001 + + + <_> + + 0 -1 75 4.7469654236920178e-004 + + + -2.4220904707908630e-001 1.7033961415290833e-001 + + + <_> + + 0 -1 780 1.6357531771063805e-002 + + + -7.4449680745601654e-002 5.1059716939926147e-001 + + + <_> + + 0 -1 512 -3.0519803985953331e-002 + + + -6.1357855796813965e-001 6.4341634511947632e-002 + + + <_> + + 0 -1 388 7.8287199139595032e-002 + + + -9.1953203082084656e-002 4.5058310031890869e-001 + + + <_> + + 0 -1 426 2.6628788560628891e-002 + + + -1.2955492734909058e-001 2.6968446373939514e-001 + + + <_> + + 0 -1 187 4.6231731772422791e-002 + + + -8.5953183472156525e-002 4.0568628907203674e-001 + + + <_> + + 0 -1 248 -2.1837819367647171e-003 + + + 2.9953801631927490e-001 -1.1820212751626968e-001 + + + <_> + + 0 -1 551 -7.5804558582603931e-004 + + + -3.7147358059883118e-001 9.4888158142566681e-002 + + + <_> + + 0 -1 557 1.9615942612290382e-002 + + + 7.7175915241241455e-002 -4.4386270642280579e-001 + + + <_> + + 0 -1 758 2.4940725415945053e-003 + + + -1.3974383473396301e-001 2.5393635034561157e-001 + + + <_> + + 0 -1 363 2.0674080587923527e-003 + + + -1.6579771041870117e-001 2.1392273902893066e-001 + + + <_> + + 0 -1 307 -7.3546944186091423e-003 + + + 3.6300283670425415e-001 -9.0012907981872559e-002 + + + <_> + + 0 -1 822 -4.5008827000856400e-003 + + + 2.7234289050102234e-001 -1.1618893593549728e-001 + + + <_> + + 0 -1 863 2.6555648073554039e-003 + + + -1.3339768350124359e-001 2.3308847844600677e-001 + + + <_> + + 0 -1 713 6.8732965737581253e-003 + + + 5.5398836731910706e-002 -5.7269740104675293e-001 + + + <_> + + 0 -1 541 -1.3697329908609390e-002 + + + 2.9575833678245544e-001 -1.1314996331930161e-001 + + + <_> + + 0 -1 499 3.1671333126723766e-003 + + + -1.5514299273490906e-001 2.1296086907386780e-001 + + + <_> + + 0 -1 74 3.9301186800003052e-002 + + + 3.7740129977464676e-002 -8.7064558267593384e-001 + + + <_> + + 0 -1 438 5.0326753407716751e-003 + + + 3.8631703704595566e-002 -6.6628092527389526e-001 + + + + + + <_> + 37 + -2.2784059047698975e+000 + + <_> + + 0 -1 284 -6.8839386105537415e-002 + + + 3.8505528122186661e-002 -7.2149914503097534e-001 + + + <_> + + 0 -1 622 4.6330597251653671e-003 + + + -2.7918994426727295e-001 5.7365530729293823e-001 + + + <_> + + 0 -1 769 -2.2597890347242355e-002 + + + 5.4445463418960571e-001 -1.5445226430892944e-001 + + + <_> + + 0 -1 651 8.1817107275128365e-003 + + + -1.3576838374137878e-001 5.7550191879272461e-001 + + + <_> + + 0 -1 663 1.9931606948375702e-002 + + + -8.6917184293270111e-002 6.9753867387771606e-001 + + + <_> + + 0 -1 125 -1.6835592687129974e-002 + + + 2.9909837245941162e-001 -2.1280159056186676e-001 + + + <_> + + 0 -1 811 1.3076540082693100e-002 + + + -1.0236994922161102e-001 6.2949544191360474e-001 + + + <_> + + 0 -1 809 6.2367517966777086e-004 + + + -2.5327861309051514e-001 2.4867674708366394e-001 + + + <_> + + 0 -1 609 1.2028571218252182e-003 + + + 1.3679966330528259e-001 -6.4433771371841431e-001 + + + <_> + + 0 -1 272 1.3981487601995468e-002 + + + -1.6557806730270386e-001 4.5303794741630554e-001 + + + <_> + + 0 -1 224 -1.5312875621020794e-002 + + + 3.9820623397827148e-001 -1.4350801706314087e-001 + + + <_> + + 0 -1 502 -1.5315772034227848e-003 + + + -4.6908026933670044e-001 1.1392414569854736e-001 + + + <_> + + 0 -1 586 -1.2515729293227196e-002 + + + 4.2320749163627625e-001 -1.1944464594125748e-001 + + + <_> + + 0 -1 15 9.7349435091018677e-003 + + + -2.1135130524635315e-001 2.4544763565063477e-001 + + + <_> + + 0 -1 578 8.9689850807189941e-002 + + + 6.3219323754310608e-002 -6.4908504486083984e-001 + + + <_> + + 0 -1 683 -1.1183234862983227e-002 + + + 4.5843327045440674e-001 -1.1428884416818619e-001 + + + <_> + + 0 -1 609 -1.3516875915229321e-003 + + + -6.4720195531845093e-001 8.4523022174835205e-002 + + + <_> + + 0 -1 338 -3.5038506612181664e-003 + + + 2.3362815380096436e-001 -2.2096297144889832e-001 + + + <_> + + 0 -1 676 -2.2360668517649174e-003 + + + 3.7134209275245667e-001 -1.3087964057922363e-001 + + + <_> + + 0 -1 672 1.1475373059511185e-002 + + + -9.9598348140716553e-002 4.7512599825859070e-001 + + + <_> + + 0 -1 693 -4.1206870228052139e-003 + + + 3.7730529904365540e-001 -1.3486868143081665e-001 + + + <_> + + 0 -1 386 -1.0615207254886627e-002 + + + 5.6163507699966431e-001 -8.6019508540630341e-002 + + + <_> + + 0 -1 912 1.3644450809806585e-003 + + + 9.1222301125526428e-002 -5.7370740175247192e-001 + + + <_> + + 0 -1 211 -4.0528293699026108e-002 + + + -7.1112531423568726e-001 5.6328568607568741e-002 + + + <_> + + 0 -1 598 -2.6628528721630573e-003 + + + -5.7514446973800659e-001 6.4672872424125671e-002 + + + <_> + + 0 -1 804 1.6719421837478876e-003 + + + -1.0937304049730301e-001 4.6537923812866211e-001 + + + <_> + + 0 -1 391 -7.5402572751045227e-002 + + + -7.1920621395111084e-001 6.3679412007331848e-002 + + + <_> + + 0 -1 752 4.1434019804000854e-003 + + + -1.2251268327236176e-001 3.5859704017639160e-001 + + + <_> + + 0 -1 656 1.0901679052039981e-003 + + + 9.0319603681564331e-002 -4.9077373743057251e-001 + + + <_> + + 0 -1 548 9.7664669156074524e-003 + + + -1.1890622228384018e-001 3.7789806723594666e-001 + + + <_> + + 0 -1 20 1.3128603994846344e-001 + + + 9.1950289905071259e-002 -4.8608726263046265e-001 + + + <_> + + 0 -1 160 5.0870995037257671e-003 + + + -3.0447667837142944e-001 1.5393695235252380e-001 + + + <_> + + 0 -1 695 1.1608509812504053e-003 + + + 6.8402722477912903e-002 -5.7240855693817139e-001 + + + <_> + + 0 -1 463 -8.3964206278324127e-003 + + + -5.6654578447341919e-001 6.1527676880359650e-002 + + + <_> + + 0 -1 853 -9.2788469046354294e-003 + + + 5.3486818075180054e-001 -7.9918831586837769e-002 + + + <_> + + 0 -1 194 4.0858805179595947e-002 + + + -6.0392327606678009e-002 5.3097963333129883e-001 + + + <_> + + 0 -1 875 1.1207645758986473e-002 + + + -7.6901644468307495e-002 4.6894967555999756e-001 + + + + + + <_> + 43 + -2.3281440734863281e+000 + + <_> + + 0 -1 799 1.6143361106514931e-002 + + + -5.9869056940078735e-001 5.8244681358337402e-001 + + + <_> + + 0 -1 316 -1.4507154002785683e-002 + + + 2.7806228399276733e-001 -4.9415421485900879e-001 + + + <_> + + 0 -1 374 7.1883820928633213e-003 + + + -2.1741701662540436e-001 3.9910879731178284e-001 + + + <_> + + 0 -1 601 -6.3224318437278271e-003 + + + 4.9661168456077576e-001 -1.4284123480319977e-001 + + + <_> + + 0 -1 309 7.3951724916696548e-003 + + + -1.3306735455989838e-001 5.4774791002273560e-001 + + + <_> + + 0 -1 620 5.7926801964640617e-003 + + + -1.7347626388072968e-001 3.3524274826049805e-001 + + + <_> + + 0 -1 628 -8.1796385347843170e-003 + + + 4.4341480731964111e-001 -1.1987159401178360e-001 + + + <_> + + 0 -1 644 3.1394532416015863e-003 + + + -7.6400212943553925e-002 5.3360211849212646e-001 + + + <_> + + 0 -1 803 5.8109681122004986e-003 + + + -1.1512878537178040e-001 4.4279125332832336e-001 + + + <_> + + 0 -1 787 -1.5480478759855032e-003 + + + 4.6037110686302185e-001 -1.1494978517293930e-001 + + + <_> + + 0 -1 139 -3.2716423273086548e-002 + + + -6.3845193386077881e-001 1.0197243094444275e-001 + + + <_> + + 0 -1 547 7.7531556598842144e-003 + + + -2.0599687099456787e-001 2.4387344717979431e-001 + + + <_> + + 0 -1 312 1.0081732273101807e-001 + + + -8.3307094871997833e-002 6.0089951753616333e-001 + + + <_> + + 0 -1 303 1.8065905198454857e-002 + + + -8.5330262780189514e-002 5.1092010736465454e-001 + + + <_> + + 0 -1 227 1.2447070330381393e-002 + + + 7.5348034501075745e-002 -7.0691746473312378e-001 + + + <_> + + 0 -1 26 1.1250283569097519e-002 + + + -2.8157770633697510e-001 1.4611217379570007e-001 + + + <_> + + 0 -1 461 6.3989013433456421e-002 + + + 5.5644407868385315e-002 -8.0775284767150879e-001 + + + <_> + + 0 -1 532 1.2037818320095539e-002 + + + -1.6155177354812622e-001 2.6092258095741272e-001 + + + <_> + + 0 -1 531 -6.7794714123010635e-003 + + + 4.1026043891906738e-001 -1.1167341470718384e-001 + + + <_> + + 0 -1 662 -6.8837543949484825e-003 + + + 3.2057675719261169e-001 -1.2521778047084808e-001 + + + <_> + + 0 -1 568 -5.6298770941793919e-003 + + + 3.7114644050598145e-001 -9.6118465065956116e-002 + + + <_> + + 0 -1 501 -1.4044784940779209e-002 + + + 2.3923584818840027e-001 -1.4994344115257263e-001 + + + <_> + + 0 -1 209 -4.2415991425514221e-002 + + + -7.0631259679794312e-001 5.3350944072008133e-002 + + + <_> + + 0 -1 633 1.1271872790530324e-003 + + + -1.0572738200426102e-001 4.0252980589866638e-001 + + + <_> + + 0 -1 655 1.6750365030020475e-003 + + + 6.3855156302452087e-002 -6.4757323265075684e-001 + + + <_> + + 0 -1 617 8.0223847180604935e-003 + + + -1.3372656702995300e-001 3.1646871566772461e-001 + + + <_> + + 0 -1 302 -7.6437788084149361e-003 + + + 3.6533179879188538e-001 -1.0963398963212967e-001 + + + <_> + + 0 -1 864 1.9589535077102482e-004 + + + -1.8541762232780457e-001 1.9759687781333923e-001 + + + <_> + + 0 -1 235 -1.4239229494705796e-003 + + + 2.4031755328178406e-001 -1.5697695314884186e-001 + + + <_> + + 0 -1 796 8.4227584302425385e-003 + + + -8.4527194499969482e-002 4.2389118671417236e-001 + + + <_> + + 0 -1 797 -6.9234715774655342e-003 + + + 3.8057762384414673e-001 -9.1416321694850922e-002 + + + <_> + + 0 -1 588 -1.8704653484746814e-003 + + + -6.4613032341003418e-001 5.7689383625984192e-002 + + + <_> + + 0 -1 260 -2.7793958783149719e-002 + + + 1.8243275582790375e-001 -1.8460384011268616e-001 + + + <_> + + 0 -1 780 -1.9853528589010239e-002 + + + 7.5294703245162964e-001 -5.5559452623128891e-002 + + + <_> + + 0 -1 231 -9.3498677015304565e-002 + + + -4.5725339651107788e-001 8.2762040197849274e-002 + + + <_> + + 0 -1 233 -5.1207490265369415e-002 + + + -6.2534767389297485e-001 4.8502899706363678e-002 + + + <_> + + 0 -1 407 1.1575517710298300e-003 + + + -1.9439546763896942e-001 1.6855290532112122e-001 + + + <_> + + 0 -1 24 -1.7103100195527077e-002 + + + -5.6425410509109497e-001 5.8622561395168304e-002 + + + <_> + + 0 -1 731 -1.7147272592410445e-003 + + + -4.4655910134315491e-001 6.4384043216705322e-002 + + + <_> + + 0 -1 704 -2.4417929351329803e-002 + + + -4.3452578783035278e-001 7.0416867733001709e-002 + + + <_> + + 0 -1 572 3.7648410070687532e-003 + + + -9.9933244287967682e-002 3.3911246061325073e-001 + + + <_> + + 0 -1 353 -1.0104919783771038e-002 + + + 3.4629023075103760e-001 -8.8539779186248779e-002 + + + <_> + + 0 -1 712 5.0981063395738602e-003 + + + 5.5100377649068832e-002 -6.0317450761795044e-001 + + + + + + <_> + 50 + -2.3480093479156494e+000 + + <_> + + 0 -1 343 -3.9326027035713196e-002 + + + 1.5673981979489326e-002 -7.0409429073333740e-001 + + + <_> + + 0 -1 465 -8.4042851813137531e-004 + + + 2.2963143885135651e-001 -4.5338386297225952e-001 + + + <_> + + 0 -1 768 1.2317419983446598e-002 + + + -2.4286352097988129e-001 3.4696686267852783e-001 + + + <_> + + 0 -1 799 1.2345131486654282e-002 + + + -1.2295535951852798e-001 5.7723248004913330e-001 + + + <_> + + 0 -1 334 -1.0166198946535587e-002 + + + 3.6376756429672241e-001 -1.5697406232357025e-001 + + + <_> + + 0 -1 2 1.6935718012973666e-003 + + + -1.6952106356620789e-001 3.3476638793945313e-001 + + + <_> + + 0 -1 355 2.4814529344439507e-002 + + + -5.2621126174926758e-002 6.6913032531738281e-001 + + + <_> + + 0 -1 595 -7.9641379415988922e-003 + + + 4.5105281472206116e-001 -1.0256277024745941e-001 + + + <_> + + 0 -1 923 -8.0780440475791693e-004 + + + 3.4726995229721069e-001 -1.4011415839195251e-001 + + + <_> + + 0 -1 886 -4.2634975165128708e-002 + + + 3.9254909753799438e-001 -9.5705978572368622e-002 + + + <_> + + 0 -1 645 -1.1309007182717323e-002 + + + 5.3030455112457275e-001 -9.1078959405422211e-002 + + + <_> + + 0 -1 660 -5.3997440263628960e-003 + + + 4.4208008050918579e-001 -8.9016474783420563e-002 + + + <_> + + 0 -1 922 8.0034844577312469e-003 + + + -7.7505834400653839e-002 4.6123340725898743e-001 + + + <_> + + 0 -1 70 -2.1929096430540085e-002 + + + -5.1349323987960815e-001 8.5143901407718658e-002 + + + <_> + + 0 -1 457 -1.1585029773414135e-002 + + + -5.9067147970199585e-001 5.3899347782135010e-002 + + + <_> + + 0 -1 940 1.5154580585658550e-002 + + + 4.7417007386684418e-002 -6.2853425741195679e-001 + + + <_> + + 0 -1 425 3.6063842475414276e-002 + + + 7.1829482913017273e-002 -5.8649080991744995e-001 + + + <_> + + 0 -1 377 -1.2515364214777946e-003 + + + 1.8929110467433929e-001 -1.8165642023086548e-001 + + + <_> + + 0 -1 443 -1.1191211640834808e-002 + + + -6.1874210834503174e-001 6.0382697731256485e-002 + + + <_> + + 0 -1 892 -1.0454729199409485e-002 + + + 3.9079114794731140e-001 -9.7279526293277740e-002 + + + <_> + + 0 -1 474 -1.3280634302645922e-003 + + + -4.3977957963943481e-001 8.6543120443820953e-002 + + + <_> + + 0 -1 884 -6.5715098753571510e-003 + + + 3.8899809122085571e-001 -9.9507912993431091e-002 + + + <_> + + 0 -1 802 -4.8141209408640862e-003 + + + 2.7240043878555298e-001 -1.1941614747047424e-001 + + + <_> + + 0 -1 611 -4.9042850732803345e-003 + + + 3.4554582834243774e-001 -1.0440594702959061e-001 + + + <_> + + 0 -1 589 4.1131088510155678e-003 + + + 6.2906242907047272e-002 -6.3577443361282349e-001 + + + <_> + + 0 -1 564 -1.4377808198332787e-002 + + + 2.6160046458244324e-001 -1.3126534223556519e-001 + + + <_> + + 0 -1 659 -7.9730991274118423e-003 + + + 2.8418624401092529e-001 -1.1802970618009567e-001 + + + <_> + + 0 -1 632 1.2750998139381409e-002 + + + -1.2246144562959671e-001 2.9994803667068481e-001 + + + <_> + + 0 -1 550 1.2405896559357643e-003 + + + 6.8871341645717621e-002 -4.7651088237762451e-001 + + + <_> + + 0 -1 864 1.9797214190475643e-004 + + + -1.8686980009078979e-001 1.7104914784431458e-001 + + + <_> + + 0 -1 773 -5.9868812561035156e-002 + + + -7.4281668663024902e-001 4.0871854871511459e-002 + + + <_> + + 0 -1 20 1.7117856442928314e-001 + + + 3.9691232144832611e-002 -6.0849416255950928e-001 + + + <_> + + 0 -1 583 -6.0836132615804672e-003 + + + 2.6707777380943298e-001 -1.1131492257118225e-001 + + + <_> + + 0 -1 37 -1.6043212264776230e-002 + + + -7.1336209774017334e-001 4.1814558207988739e-002 + + + <_> + + 0 -1 721 -3.5733331460505724e-003 + + + -5.9263443946838379e-001 4.1711769998073578e-002 + + + <_> + + 0 -1 251 4.8501053825020790e-003 + + + -1.7411983013153076e-001 1.6949725151062012e-001 + + + <_> + + 0 -1 932 -2.4870643392205238e-003 + + + 3.5093098878860474e-001 -8.0437563359737396e-002 + + + <_> + + 0 -1 679 5.4334278684109449e-004 + + + 7.2410888969898224e-002 -4.1958642005920410e-001 + + + <_> + + 0 -1 399 -6.7315630614757538e-002 + + + -6.9776558876037598e-001 3.6959640681743622e-002 + + + <_> + + 0 -1 848 -1.5508693642914295e-002 + + + 4.7738686203956604e-001 -6.2411848455667496e-002 + + + <_> + + 0 -1 240 9.8924851045012474e-003 + + + 3.8795292377471924e-002 -7.5121307373046875e-001 + + + <_> + + 0 -1 626 -1.9304422894492745e-003 + + + -6.6471725702285767e-001 3.2116148620843887e-002 + + + <_> + + 0 -1 877 -1.0774823604151607e-003 + + + 1.5463894605636597e-001 -1.6525565087795258e-001 + + + <_> + + 0 -1 938 2.0380350761115551e-003 + + + -8.5884653031826019e-002 3.1941527128219604e-001 + + + <_> + + 0 -1 296 2.6121754199266434e-003 + + + 4.5351639389991760e-002 -6.1592888832092285e-001 + + + <_> + + 0 -1 360 -2.4895587936043739e-002 + + + 1.9662404060363770e-001 -1.3288022577762604e-001 + + + <_> + + 0 -1 540 9.4352923333644867e-003 + + + -7.7825613319873810e-002 3.3150759339332581e-001 + + + <_> + + 0 -1 475 3.4190870821475983e-002 + + + 4.5858692377805710e-002 -6.1435216665267944e-001 + + + <_> + + 0 -1 685 -5.5097185075283051e-002 + + + -4.9892291426658630e-001 4.7548539936542511e-002 + + + <_> + + 0 -1 287 3.8485769182443619e-003 + + + -2.1700088679790497e-001 1.1295168846845627e-001 + + + + + + <_> + 61 + -2.4126377105712891e+000 + + <_> + + 0 -1 344 -9.5382995903491974e-002 + + + -4.5056518167257309e-002 -7.4383479356765747e-001 + + + <_> + + 0 -1 696 -1.7865713685750961e-002 + + + 2.4200576543807983e-001 -3.4111279249191284e-001 + + + <_> + + 0 -1 66 -1.7819929867982864e-002 + + + -5.8606600761413574e-001 1.0216028243303299e-001 + + + <_> + + 0 -1 369 1.1929270811378956e-002 + + + -1.3082079589366913e-001 4.3198430538177490e-001 + + + <_> + + 0 -1 677 -2.1402675658464432e-002 + + + -7.3706889152526855e-001 7.2057045996189117e-002 + + + <_> + + 0 -1 880 2.0411442965269089e-003 + + + -1.9257834553718567e-001 2.6624691486358643e-001 + + + <_> + + 0 -1 560 -9.2984475195407867e-003 + + + 3.9710593223571777e-001 -1.1857020854949951e-001 + + + <_> + + 0 -1 870 -4.1869636625051498e-003 + + + 4.2139983177185059e-001 -1.1628517508506775e-001 + + + <_> + + 0 -1 173 1.0577079653739929e-001 + + + 6.7847460508346558e-002 -7.5728106498718262e-001 + + + <_> + + 0 -1 458 2.3821401409804821e-003 + + + -1.7424334585666656e-001 2.4778348207473755e-001 + + + <_> + + 0 -1 365 1.7058081924915314e-002 + + + -1.0784839093685150e-001 4.7589403390884399e-001 + + + <_> + + 0 -1 607 8.4047149866819382e-003 + + + -1.6299639642238617e-001 2.5596112012863159e-001 + + + <_> + + 0 -1 669 6.4883893355727196e-003 + + + -1.0720382630825043e-001 3.8739699125289917e-001 + + + <_> + + 0 -1 719 1.3821164146065712e-002 + + + -1.0847893357276917e-001 3.7734055519104004e-001 + + + <_> + + 0 -1 730 6.3344044610857964e-004 + + + 1.0369951277971268e-001 -4.1177383065223694e-001 + + + <_> + + 0 -1 649 2.5448631495237350e-002 + + + -1.0093591362237930e-001 4.0250420570373535e-001 + + + <_> + + 0 -1 628 -6.6858739592134953e-003 + + + 3.2515993714332581e-001 -1.2071736156940460e-001 + + + <_> + + 0 -1 847 1.5770105645060539e-002 + + + -8.7370425462722778e-002 4.2094638943672180e-001 + + + <_> + + 0 -1 442 -6.1724921688437462e-003 + + + 3.5812416672706604e-001 -9.5346152782440186e-002 + + + <_> + + 0 -1 456 -2.5777951814234257e-003 + + + -4.5544171333312988e-001 9.0092077851295471e-002 + + + <_> + + 0 -1 535 -2.6305086910724640e-002 + + + -6.4864850044250488e-001 4.1219502687454224e-002 + + + <_> + + 0 -1 542 8.0740137491375208e-004 + + + 4.7109395265579224e-002 -6.0955244302749634e-001 + + + <_> + + 0 -1 68 1.4135822653770447e-002 + + + -1.9197317957878113e-001 1.6882354021072388e-001 + + + <_> + + 0 -1 294 -9.4971470534801483e-003 + + + 3.6509966850280762e-001 -9.9222034215927124e-002 + + + <_> + + 0 -1 542 -7.4699660763144493e-004 + + + -4.7985881567001343e-001 6.8735912442207336e-002 + + + <_> + + 0 -1 500 1.6889899969100952e-002 + + + -1.3929726183414459e-001 2.3301121592521667e-001 + + + <_> + + 0 -1 779 2.3306370712816715e-003 + + + -8.4623180329799652e-002 3.3656537532806396e-001 + + + <_> + + 0 -1 778 8.7781455367803574e-003 + + + -1.1189370602369308e-001 2.9142591357231140e-001 + + + <_> + + 0 -1 99 -1.5908680856227875e-002 + + + 1.9325265288352966e-001 -1.6028961539268494e-001 + + + <_> + + 0 -1 744 1.9255496561527252e-002 + + + 7.6108239591121674e-002 -3.9211651682853699e-001 + + + <_> + + 0 -1 914 5.0490582361817360e-003 + + + -8.9932329952716827e-002 3.1994494795799255e-001 + + + <_> + + 0 -1 603 -2.4455685634166002e-003 + + + -6.3004231452941895e-001 4.6506922692060471e-002 + + + <_> + + 0 -1 89 6.4034629613161087e-003 + + + -1.2222797423601151e-001 2.2714875638484955e-001 + + + <_> + + 0 -1 88 -3.1981021165847778e-003 + + + 2.8711226582527161e-001 -1.0478579252958298e-001 + + + <_> + + 0 -1 732 1.7579109407961369e-003 + + + 5.1840141415596008e-002 -5.7752221822738647e-001 + + + <_> + + 0 -1 526 -2.6384353637695313e-002 + + + -7.5548434257507324e-001 3.1215203925967216e-002 + + + <_> + + 0 -1 482 1.3470241427421570e-001 + + + 4.5115962624549866e-002 -4.8610612750053406e-001 + + + <_> + + 0 -1 855 -2.5868147611618042e-002 + + + -4.9144035577774048e-001 5.0334099680185318e-002 + + + <_> + + 0 -1 164 1.0719317197799683e-001 + + + -1.4267221093177795e-001 1.7969062924385071e-001 + + + <_> + + 0 -1 781 -1.5155045315623283e-002 + + + 4.2710477113723755e-001 -6.6483244299888611e-002 + + + <_> + + 0 -1 728 -3.8210965692996979e-002 + + + -6.1093688011169434e-001 4.7181066125631332e-002 + + + <_> + + 0 -1 257 1.7748951911926270e-002 + + + -6.6903516650199890e-002 4.1605830192565918e-001 + + + <_> + + 0 -1 272 -1.3678016141057014e-002 + + + 3.2274204492568970e-001 -8.7739549577236176e-002 + + + <_> + + 0 -1 81 1.4629539102315903e-002 + + + -1.1059324443340302e-001 2.4449653923511505e-001 + + + <_> + + 0 -1 754 6.4607188105583191e-003 + + + -8.1396102905273438e-002 3.1605172157287598e-001 + + + <_> + + 0 -1 574 -8.4974901983514428e-004 + + + 1.5621511638164520e-001 -1.6912016272544861e-001 + + + <_> + + 0 -1 332 -6.4049977809190750e-003 + + + 2.2254464030265808e-001 -1.1970910429954529e-001 + + + <_> + + 0 -1 410 4.8453146591782570e-003 + + + -1.0080187022686005e-001 2.5552451610565186e-001 + + + <_> + + 0 -1 694 1.0576892644166946e-002 + + + -7.1883767843246460e-002 3.2368022203445435e-001 + + + <_> + + 0 -1 652 -2.0271514076739550e-003 + + + 2.1205350756645203e-001 -1.4773385226726532e-001 + + + <_> + + 0 -1 379 1.2130783870816231e-003 + + + -2.2663643956184387e-001 1.0520290583372116e-001 + + + <_> + + 0 -1 419 -7.9384088516235352e-002 + + + -4.4897699356079102e-001 4.9417987465858459e-002 + + + <_> + + 0 -1 31 4.3571349233388901e-003 + + + 3.1063990667462349e-002 -6.9149738550186157e-001 + + + <_> + + 0 -1 750 1.9707549363374710e-003 + + + 4.4843826442956924e-002 -4.5625826716423035e-001 + + + <_> + + 0 -1 788 6.2818843871355057e-003 + + + -9.5382869243621826e-002 2.6746883988380432e-001 + + + <_> + + 0 -1 789 -1.3252656906843185e-002 + + + 4.0820258855819702e-001 -6.0815874487161636e-002 + + + <_> + + 0 -1 60 5.0364276394248009e-003 + + + 9.0342856943607330e-002 -2.5253733992576599e-001 + + + <_> + + 0 -1 492 8.9537240564823151e-003 + + + 3.2092411071062088e-002 -7.0339488983154297e-001 + + + <_> + + 0 -1 546 6.8814970552921295e-002 + + + -7.1046918630599976e-002 3.6507198214530945e-001 + + + <_> + + 0 -1 544 -1.2149440124630928e-002 + + + 3.3089646697044373e-001 -6.6771849989891052e-002 + + + <_> + + 0 -1 50 1.9094728631898761e-003 + + + -1.3490848243236542e-001 1.6960476338863373e-001 + + + + + + <_> + 72 + -2.3490672111511230e+000 + + <_> + + 0 -1 371 1.4795187860727310e-002 + + + -7.0123827457427979e-001 -2.0484872162342072e-002 + + + <_> + + 0 -1 612 2.6377664878964424e-002 + + + -3.5620382428169250e-001 2.4889869987964630e-001 + + + <_> + + 0 -1 165 -1.1034142225980759e-002 + + + 2.0675517618656158e-001 -3.3259147405624390e-001 + + + <_> + + 0 -1 692 -9.2857871204614639e-003 + + + 4.4594430923461914e-001 -1.4160791039466858e-001 + + + <_> + + 0 -1 313 1.1126287281513214e-001 + + + -7.9181507229804993e-002 6.0241782665252686e-001 + + + <_> + + 0 -1 751 3.0388862360268831e-003 + + + -1.9209611415863037e-001 2.5241580605506897e-001 + + + <_> + + 0 -1 874 -2.0801391452550888e-002 + + + 4.0978202223777771e-001 -9.8037041723728180e-002 + + + <_> + + 0 -1 892 1.0280778631567955e-002 + + + -9.6344605088233948e-002 4.6578553318977356e-001 + + + <_> + + 0 -1 894 -5.4509467445313931e-003 + + + 3.7336015701293945e-001 -1.0564301162958145e-001 + + + <_> + + 0 -1 376 -1.8031136132776737e-003 + + + 3.5322296619415283e-001 -1.2390857189893723e-001 + + + <_> + + 0 -1 763 -4.7199074178934097e-003 + + + 4.1106048226356506e-001 -9.3251600861549377e-002 + + + <_> + + 0 -1 323 -6.1694663017988205e-003 + + + 3.3520108461380005e-001 -1.2836365401744843e-001 + + + <_> + + 0 -1 83 -6.9639906287193298e-003 + + + 2.1963912248611450e-001 -1.8814907968044281e-001 + + + <_> + + 0 -1 683 -1.2535721994936466e-002 + + + 3.8960403203964233e-001 -9.2547819018363953e-002 + + + <_> + + 0 -1 690 -1.6924859955906868e-002 + + + 3.6892804503440857e-001 -9.4779089093208313e-002 + + + <_> + + 0 -1 54 1.6596701461821795e-003 + + + -1.9850541651248932e-001 1.8709312379360199e-001 + + + <_> + + 0 -1 55 2.7687277644872665e-002 + + + 7.0031657814979553e-002 -4.7238609194755554e-001 + + + <_> + + 0 -1 120 -1.1841375380754471e-002 + + + 2.6792368292808533e-001 -1.2015427649021149e-001 + + + <_> + + 0 -1 261 -1.1048562824726105e-002 + + + 3.6024233698844910e-001 -1.0290746390819550e-001 + + + <_> + + 0 -1 7 -6.2395762652158737e-002 + + + -5.7112109661102295e-001 6.2251534312963486e-002 + + + <_> + + 0 -1 115 1.6063985228538513e-001 + + + -7.0866517722606659e-002 4.5665851235389709e-001 + + + <_> + + 0 -1 232 2.1094676852226257e-001 + + + 4.6763692051172256e-002 -7.0770156383514404e-001 + + + <_> + + 0 -1 358 -3.6897901445627213e-003 + + + 3.7905600666999817e-001 -8.1804625689983368e-002 + + + <_> + + 0 -1 434 1.9055651500821114e-002 + + + -1.0166674852371216e-001 2.7208462357521057e-001 + + + <_> + + 0 -1 947 -2.0279071759432554e-003 + + + 3.1354761123657227e-001 -8.6894899606704712e-002 + + + <_> + + 0 -1 571 1.0916183236986399e-003 + + + 7.6082363724708557e-002 -3.2986941933631897e-001 + + + <_> + + 0 -1 405 -5.5616937577724457e-002 + + + -5.0169217586517334e-001 4.7203768044710159e-002 + + + <_> + + 0 -1 600 -2.1859644912183285e-003 + + + -4.1108477115631104e-001 5.6136883795261383e-002 + + + <_> + + 0 -1 422 6.1606548726558685e-002 + + + 3.8405187427997589e-002 -6.3146471977233887e-001 + + + <_> + + 0 -1 562 4.4989854097366333e-002 + + + -7.8799270093441010e-002 3.5685274004936218e-001 + + + <_> + + 0 -1 900 1.4128099195659161e-002 + + + -5.1783677190542221e-002 4.5928877592086792e-001 + + + <_> + + 0 -1 503 -2.2787526249885559e-002 + + + -4.2496410012245178e-001 5.9822574257850647e-002 + + + <_> + + 0 -1 82 1.0302955284714699e-002 + + + -1.5051785111427307e-001 1.8300771713256836e-001 + + + <_> + + 0 -1 733 -1.7985476879402995e-003 + + + -5.0104391574859619e-001 5.1810134202241898e-002 + + + <_> + + 0 -1 783 -1.0919184423983097e-003 + + + 1.6831028461456299e-001 -1.5063883364200592e-001 + + + <_> + + 0 -1 221 6.8745255470275879e-002 + + + 2.5853699073195457e-002 -8.8202834129333496e-001 + + + <_> + + 0 -1 92 8.0964900553226471e-003 + + + -1.4373345673084259e-001 1.6309750080108643e-001 + + + <_> + + 0 -1 669 -9.0615758672356606e-003 + + + 4.4120463728904724e-001 -5.8328684419393539e-002 + + + <_> + + 0 -1 780 1.5157302841544151e-002 + + + -6.2339264899492264e-002 3.7585461139678955e-001 + + + <_> + + 0 -1 852 -9.6248798072338104e-003 + + + 3.3618140220642090e-001 -7.2854258120059967e-002 + + + <_> + + 0 -1 264 -2.6485668495297432e-003 + + + -3.6842566728591919e-001 7.0426821708679199e-002 + + + <_> + + 0 -1 793 -2.5783948600292206e-002 + + + -4.3915954232215881e-001 4.4346898794174194e-002 + + + <_> + + 0 -1 691 3.8045123219490051e-002 + + + 2.0367870107293129e-002 -9.1361635923385620e-001 + + + <_> + + 0 -1 885 6.5762884914875031e-003 + + + -7.7705778181552887e-002 2.7798372507095337e-001 + + + <_> + + 0 -1 527 1.4522124081850052e-002 + + + -1.5169607102870941e-001 1.6986666619777679e-001 + + + <_> + + 0 -1 263 -2.9386302456259727e-002 + + + 1.5261377394199371e-001 -1.4140434563159943e-001 + + + <_> + + 0 -1 252 -1.8363123759627342e-002 + + + 5.7111293077468872e-001 -4.9465496093034744e-002 + + + <_> + + 0 -1 674 -5.1241345703601837e-002 + + + -5.5350369215011597e-001 4.6895623207092285e-002 + + + <_> + + 0 -1 277 2.9151788912713528e-003 + + + -9.0461745858192444e-002 2.4859617650508881e-001 + + + <_> + + 0 -1 749 1.7963855061680079e-003 + + + 4.5411933213472366e-002 -5.4377090930938721e-001 + + + <_> + + 0 -1 198 4.7771027311682701e-003 + + + -1.8385021388530731e-001 1.1213029175996780e-001 + + + <_> + + 0 -1 850 -1.1631837114691734e-003 + + + 1.9307336211204529e-001 -1.0863032937049866e-001 + + + <_> + + 0 -1 739 -6.7155435681343079e-003 + + + 3.4966903924942017e-001 -5.8376740664243698e-002 + + + <_> + + 0 -1 195 -6.6494196653366089e-002 + + + 3.4874725341796875e-001 -5.7571310549974442e-002 + + + <_> + + 0 -1 750 -1.8951734527945518e-003 + + + -5.0567263364791870e-001 4.2631916701793671e-002 + + + <_> + + 0 -1 832 -4.3506296351552010e-003 + + + -5.0467538833618164e-001 3.8686964660882950e-002 + + + <_> + + 0 -1 725 5.5216029286384583e-003 + + + -8.3722010254859924e-002 2.5723373889923096e-001 + + + <_> + + 0 -1 727 1.4174621552228928e-002 + + + -5.2497696131467819e-002 4.3525427579879761e-001 + + + <_> + + 0 -1 25 1.1252675205469131e-002 + + + -1.3312049210071564e-001 1.6167336702346802e-001 + + + <_> + + 0 -1 67 7.9240947961807251e-003 + + + -1.1959484219551086e-001 1.6835211217403412e-001 + + + <_> + + 0 -1 784 1.0558717185631394e-003 + + + -1.2297991663217545e-001 1.5906786918640137e-001 + + + <_> + + 0 -1 615 4.5906797051429749e-002 + + + 3.6611214280128479e-002 -5.4427564144134521e-001 + + + <_> + + 0 -1 702 -9.5631275326013565e-003 + + + 2.2376507520675659e-001 -9.2235445976257324e-002 + + + <_> + + 0 -1 290 -1.7671093344688416e-002 + + + -6.2817609310150146e-001 3.3949319273233414e-002 + + + <_> + + 0 -1 764 -1.7188221681863070e-003 + + + 2.0224046707153320e-001 -1.0232327878475189e-001 + + + <_> + + 0 -1 367 1.5140373259782791e-002 + + + -5.6504372507333755e-002 3.4895980358123779e-001 + + + <_> + + 0 -1 366 -2.8949489817023277e-002 + + + 3.1860530376434326e-001 -6.4782403409481049e-002 + + + <_> + + 0 -1 937 1.1647377163171768e-002 + + + -3.6289941519498825e-002 5.4892385005950928e-001 + + + <_> + + 0 -1 741 -7.8217741101980209e-003 + + + 2.0226673781871796e-001 -9.2000789940357208e-002 + + + <_> + + 0 -1 800 -8.4432046860456467e-003 + + + 1.7921546101570129e-001 -1.0415823757648468e-001 + + + <_> + + 0 -1 854 -1.5566672198474407e-002 + + + 3.9981749653816223e-001 -5.3077172487974167e-002 + + + <_> + + 0 -1 587 -1.2464943341910839e-002 + + + 2.2552676498889923e-001 -9.0897649526596069e-002 + + + + + + <_> + 77 + -2.2761957645416260e+000 + + <_> + + 0 -1 402 -2.0046032965183258e-002 + + + 2.7538803219795227e-001 -6.1105114221572876e-001 + + + <_> + + 0 -1 430 9.1837458312511444e-003 + + + -4.0790805220603943e-001 2.0902955532073975e-001 + + + <_> + + 0 -1 21 4.2203110642731190e-003 + + + -2.1331593394279480e-001 2.8156790137290955e-001 + + + <_> + + 0 -1 673 -1.4000188559293747e-002 + + + 5.4547309875488281e-001 -9.6670299768447876e-002 + + + <_> + + 0 -1 926 -7.1464567445218563e-003 + + + 4.6416798233985901e-001 -9.1218575835227966e-002 + + + <_> + + 0 -1 389 -1.0070230066776276e-001 + + + -6.6349637508392334e-001 7.1100234985351563e-002 + + + <_> + + 0 -1 95 1.0696215555071831e-002 + + + -1.9745405018329620e-001 2.0773608982563019e-001 + + + <_> + + 0 -1 149 -3.5202980041503906e-002 + + + -7.6735103130340576e-001 5.0265740603208542e-002 + + + <_> + + 0 -1 311 7.4009604752063751e-002 + + + -7.4828110635280609e-002 5.6469208002090454e-001 + + + <_> + + 0 -1 849 3.9156894199550152e-003 + + + -1.3954170048236847e-001 2.7583837509155273e-001 + + + <_> + + 0 -1 335 -5.3920033387839794e-003 + + + 3.0497005581855774e-001 -1.1606794595718384e-001 + + + <_> + + 0 -1 861 3.7412224337458611e-003 + + + -7.9430311918258667e-002 4.4621026515960693e-001 + + + <_> + + 0 -1 868 7.1699996478855610e-003 + + + -1.0092698037624359e-001 3.4257224202156067e-001 + + + <_> + + 0 -1 256 2.1885338425636292e-001 + + + 5.8548614382743835e-002 -6.5264624357223511e-001 + + + <_> + + 0 -1 771 -5.3951903246343136e-003 + + + 2.4228222668170929e-001 -1.3535094261169434e-001 + + + <_> + + 0 -1 695 -1.1738229077309370e-003 + + + -4.7875782847404480e-001 6.8366907536983490e-002 + + + <_> + + 0 -1 666 2.1457400172948837e-002 + + + -7.1118980646133423e-002 4.5637446641921997e-001 + + + <_> + + 0 -1 309 1.2115674093365669e-002 + + + -5.8202955871820450e-002 4.6163806319236755e-001 + + + <_> + + 0 -1 273 -1.8007406964898109e-002 + + + 3.2520860433578491e-001 -8.0533631145954132e-002 + + + <_> + + 0 -1 837 -1.2486811727285385e-002 + + + 4.1279473900794983e-001 -5.1714207977056503e-002 + + + <_> + + 0 -1 820 -6.8574929609894753e-003 + + + 2.6760685443878174e-001 -1.0764075815677643e-001 + + + <_> + + 0 -1 823 1.5099495649337769e-002 + + + -7.4429087340831757e-002 4.6331611275672913e-001 + + + <_> + + 0 -1 418 5.6357895955443382e-003 + + + 4.3343700468540192e-002 -6.8444931507110596e-001 + + + <_> + + 0 -1 496 -3.8149006664752960e-002 + + + -5.0210982561111450e-001 4.6030189841985703e-002 + + + <_> + + 0 -1 488 6.9609917700290680e-002 + + + -1.1487975716590881e-001 2.4527166783809662e-001 + + + <_> + + 0 -1 718 -1.4793819282203913e-003 + + + -4.9200877547264099e-001 5.0612244755029678e-002 + + + <_> + + 0 -1 279 1.5615550801157951e-003 + + + -1.4539672434329987e-001 1.8345473706722260e-001 + + + <_> + + 0 -1 444 -7.9339537769556046e-003 + + + -6.9242167472839355e-001 3.2313633710145950e-002 + + + <_> + + 0 -1 69 3.8695998489856720e-002 + + + 3.5442691296339035e-002 -5.8349174261093140e-001 + + + <_> + + 0 -1 27 3.4779291599988937e-002 + + + -1.5399172902107239e-001 1.6672950983047485e-001 + + + <_> + + 0 -1 411 1.0367618873715401e-002 + + + -1.0087994486093521e-001 2.7080667018890381e-001 + + + <_> + + 0 -1 924 -1.2352936901152134e-003 + + + 2.6111871004104614e-001 -8.5407368838787079e-002 + + + <_> + + 0 -1 641 -3.8098993245512247e-003 + + + -6.4659863710403442e-001 3.7423413246870041e-002 + + + <_> + + 0 -1 137 1.4491343870759010e-002 + + + 1.9647786393761635e-002 -9.1479778289794922e-001 + + + <_> + + 0 -1 394 -8.3385318517684937e-002 + + + -7.1166336536407471e-001 2.2575991228222847e-002 + + + <_> + + 0 -1 780 -1.9848600029945374e-002 + + + 5.5954068899154663e-001 -4.1730873286724091e-002 + + + <_> + + 0 -1 241 -2.0697467029094696e-002 + + + 3.3735945820808411e-001 -6.2523342669010162e-002 + + + <_> + + 0 -1 300 -1.1017382144927979e-002 + + + 2.6414296030998230e-001 -1.0402554273605347e-001 + + + <_> + + 0 -1 78 2.7749380096793175e-003 + + + -1.7511576414108276e-001 1.1715058237314224e-001 + + + <_> + + 0 -1 648 -1.5251778066158295e-002 + + + 4.3819862604141235e-001 -4.5249339193105698e-002 + + + <_> + + 0 -1 108 1.1041477322578430e-002 + + + 3.4502815455198288e-002 -6.0594552755355835e-001 + + + <_> + + 0 -1 112 -1.2095808982849121e-002 + + + 2.3661912977695465e-001 -9.1371931135654449e-002 + + + <_> + + 0 -1 157 2.7025766670703888e-002 + + + -8.9995227754116058e-002 2.4357070028781891e-001 + + + <_> + + 0 -1 253 2.0237984135746956e-002 + + + -8.2986801862716675e-002 2.5786581635475159e-001 + + + <_> + + 0 -1 179 -2.5734171271324158e-002 + + + -8.0328714847564697e-001 2.3963116109371185e-002 + + + <_> + + 0 -1 898 -7.0260283537209034e-003 + + + 3.1706759333610535e-001 -6.8345665931701660e-002 + + + <_> + + 0 -1 785 8.9800115674734116e-003 + + + -1.0068616271018982e-001 1.8837621808052063e-001 + + + <_> + + 0 -1 16 7.1165725588798523e-002 + + + 2.9139470309019089e-002 -7.1776688098907471e-001 + + + <_> + + 0 -1 491 1.2540835887193680e-002 + + + 2.8786318376660347e-002 -5.7155269384384155e-001 + + + <_> + + 0 -1 686 1.4826809987425804e-002 + + + -5.3431484848260880e-002 3.7567591667175293e-001 + + + <_> + + 0 -1 756 -2.0885471254587173e-002 + + + -5.5986213684082031e-001 3.5628255456686020e-002 + + + <_> + + 0 -1 395 -4.4493626803159714e-002 + + + -6.0325270891189575e-001 2.8809506446123123e-002 + + + <_> + + 0 -1 469 -1.1605422478169203e-003 + + + 1.3856917619705200e-001 -1.3231372833251953e-001 + + + <_> + + 0 -1 10 1.0227273404598236e-001 + + + -6.3532300293445587e-002 3.1242474913597107e-001 + + + <_> + + 0 -1 134 -2.9290396720170975e-002 + + + 1.9631637632846832e-001 -1.1773347854614258e-001 + + + <_> + + 0 -1 249 -2.7526013553142548e-002 + + + -5.4162657260894775e-001 3.7284608930349350e-002 + + + <_> + + 0 -1 192 -6.8295732140541077e-002 + + + -6.8661803007125854e-001 2.2030472755432129e-002 + + + <_> + + 0 -1 65 3.7252403795719147e-002 + + + 1.4609245583415031e-002 -9.1920310258865356e-001 + + + <_> + + 0 -1 748 1.5438124537467957e-003 + + + 3.9837431162595749e-002 -3.8516902923583984e-001 + + + <_> + + 0 -1 361 1.8146948888897896e-002 + + + -8.1836819648742676e-002 2.2508986294269562e-001 + + + <_> + + 0 -1 153 -2.9618924017995596e-003 + + + 1.7523658275604248e-001 -1.1428176611661911e-001 + + + <_> + + 0 -1 591 1.8150422722101212e-002 + + + 3.3836413174867630e-002 -5.2116078138351440e-001 + + + <_> + + 0 -1 4 -3.3758711069822311e-002 + + + 3.9958250522613525e-001 -4.5763287693262100e-002 + + + <_> + + 0 -1 79 -1.4841533266007900e-003 + + + 1.6825924813747406e-001 -1.0908807814121246e-001 + + + <_> + + 0 -1 255 1.3028753455728292e-003 + + + -1.0276191681623459e-001 1.8539939820766449e-001 + + + <_> + + 0 -1 920 1.0365190915763378e-002 + + + -3.8271062076091766e-002 4.6489492058753967e-001 + + + <_> + + 0 -1 917 6.0222409665584564e-003 + + + -6.5577961504459381e-002 2.7879896759986877e-001 + + + <_> + + 0 -1 105 1.0119758546352386e-001 + + + -2.8418583795428276e-002 5.9041601419448853e-001 + + + <_> + + 0 -1 9 7.1856275200843811e-002 + + + 2.8918648138642311e-002 -7.6654183864593506e-001 + + + <_> + + 0 -1 921 2.6606030762195587e-002 + + + -6.2962368130683899e-002 3.0662769079208374e-001 + + + <_> + + 0 -1 384 1.5946386381983757e-002 + + + -5.4566886276006699e-002 3.1234565377235413e-001 + + + <_> + + 0 -1 493 -8.2057155668735504e-003 + + + 2.1779660880565643e-001 -8.3498664200305939e-002 + + + <_> + + 0 -1 270 1.2946184724569321e-002 + + + 3.5179842263460159e-002 -5.1891100406646729e-001 + + + <_> + + 0 -1 141 -8.8035371154546738e-003 + + + -4.6259808540344238e-001 3.4376677125692368e-002 + + + <_> + + 0 -1 477 -4.6518794260919094e-004 + + + -2.6353842020034790e-001 6.2585823237895966e-002 + + + <_> + + 0 -1 743 2.4100966751575470e-002 + + + 2.1097198128700256e-002 -7.4997889995574951e-001 + + + <_> + + 0 -1 170 -6.7410841584205627e-003 + + + -8.7101519107818604e-001 1.3417764566838741e-002 + + + + + + <_> + 88 + -2.2931215763092041e+000 + + <_> + + 0 -1 400 -3.4661620855331421e-002 + + + 2.1858149766921997e-001 -6.1113607883453369e-001 + + + <_> + + 0 -1 130 -8.0369092524051666e-002 + + + 2.4827747046947479e-001 -3.6355212330818176e-001 + + + <_> + + 0 -1 911 2.5022951886057854e-003 + + + -2.3158867657184601e-001 2.7031692862510681e-001 + + + <_> + + 0 -1 946 -6.8189981393516064e-003 + + + 4.1294625401496887e-001 -1.2155807018280029e-001 + + + <_> + + 0 -1 459 3.2973052002489567e-003 + + + -1.9231098890304565e-001 2.4345158040523529e-001 + + + <_> + + 0 -1 484 -6.6328542307019234e-003 + + + -5.9019386768341064e-001 6.9055899977684021e-002 + + + <_> + + 0 -1 318 4.7803454101085663e-002 + + + -5.1415871828794479e-002 5.9312266111373901e-001 + + + <_> + + 0 -1 350 1.3619948178529739e-002 + + + -1.3920906186103821e-001 2.6931121945381165e-001 + + + <_> + + 0 -1 383 -3.7001757882535458e-003 + + + -2.6682609319686890e-001 1.4955024421215057e-001 + + + <_> + + 0 -1 481 1.5951462090015411e-002 + + + 3.0041305348277092e-002 -6.7943179607391357e-001 + + + <_> + + 0 -1 478 2.3432243615388870e-003 + + + 4.9472317099571228e-002 -7.3165643215179443e-001 + + + <_> + + 0 -1 423 -4.0219593793153763e-003 + + + -3.9633533358573914e-001 8.4367558360099792e-002 + + + <_> + + 0 -1 942 1.3890343718230724e-002 + + + -1.1078495532274246e-001 3.0365592241287231e-001 + + + <_> + + 0 -1 777 -1.2505413033068180e-003 + + + 2.0580539107322693e-001 -1.3080060482025146e-001 + + + <_> + + 0 -1 132 1.0764427483081818e-001 + + + 7.7789157629013062e-002 -3.3906123042106628e-001 + + + <_> + + 0 -1 631 4.3811961077153683e-003 + + + -1.1201550066471100e-001 2.5211933255195618e-001 + + + <_> + + 0 -1 686 -1.2142172083258629e-002 + + + 3.7872961163520813e-001 -7.7070862054824829e-002 + + + <_> + + 0 -1 865 -4.4353669509291649e-003 + + + 2.1270920336246490e-001 -1.2447933107614517e-001 + + + <_> + + 0 -1 619 1.4904401032254100e-003 + + + 5.6515082716941833e-002 -5.1137989759445190e-001 + + + <_> + + 0 -1 792 -1.4859709888696671e-002 + + + 4.4488805532455444e-001 -6.3839435577392578e-002 + + + <_> + + 0 -1 515 2.5369194336235523e-003 + + + -1.4258751273155212e-001 1.8267530202865601e-001 + + + <_> + + 0 -1 558 -3.8392089772969484e-003 + + + 2.3361504077911377e-001 -1.1508828401565552e-001 + + + <_> + + 0 -1 717 1.1982237920165062e-003 + + + 4.8276327550411224e-002 -4.9198591709136963e-001 + + + <_> + + 0 -1 378 -1.8510858062654734e-003 + + + 1.4056424796581268e-001 -1.6454231739044189e-001 + + + <_> + + 0 -1 918 -1.2120591476559639e-002 + + + 3.7157261371612549e-001 -6.2530189752578735e-002 + + + <_> + + 0 -1 401 1.1447809636592865e-002 + + + 4.1043214499950409e-002 -5.2705597877502441e-001 + + + <_> + + 0 -1 511 -1.4917021617293358e-002 + + + 4.0471947193145752e-001 -5.6559596210718155e-002 + + + <_> + + 0 -1 472 3.1782940030097961e-002 + + + 3.1669221818447113e-002 -7.1189236640930176e-001 + + + <_> + + 0 -1 204 2.8533251024782658e-003 + + + -1.3680589199066162e-001 1.5116590261459351e-001 + + + <_> + + 0 -1 780 -2.0387873053550720e-002 + + + 5.3041487932205200e-001 -3.6561626940965652e-002 + + + <_> + + 0 -1 225 1.6838125884532928e-002 + + + -7.6846949756145477e-002 2.3742672801017761e-001 + + + <_> + + 0 -1 109 6.1867576092481613e-002 + + + 3.4019146114587784e-002 -5.8948117494583130e-001 + + + <_> + + 0 -1 36 1.9018281251192093e-002 + + + -8.8034287095069885e-002 2.8218820691108704e-001 + + + <_> + + 0 -1 288 9.3320291489362717e-003 + + + 3.1055718660354614e-002 -6.0995835065841675e-001 + + + <_> + + 0 -1 553 -1.7446001293137670e-003 + + + -3.1894925236701965e-001 5.7640552520751953e-002 + + + <_> + + 0 -1 497 -3.7551252171397209e-004 + + + -2.9193779826164246e-001 6.5971598029136658e-002 + + + <_> + + 0 -1 906 -3.6254348233342171e-003 + + + -5.2228099107742310e-001 3.2974440604448318e-002 + + + <_> + + 0 -1 49 3.1154025346040726e-003 + + + 3.4256361424922943e-002 -4.9392226338386536e-001 + + + <_> + + 0 -1 761 -6.5814116969704628e-003 + + + -8.5536497831344604e-001 1.7195183783769608e-002 + + + <_> + + 0 -1 154 3.6019994877278805e-004 + + + -1.1677443981170654e-001 1.4939773082733154e-001 + + + <_> + + 0 -1 42 2.1521452814340591e-002 + + + 6.1724990606307983e-002 -3.0582705140113831e-001 + + + <_> + + 0 -1 304 -3.1574545428156853e-003 + + + 2.7675440907478333e-001 -7.9728044569492340e-002 + + + <_> + + 0 -1 608 6.8585420958697796e-003 + + + -4.5498296618461609e-002 4.0476050972938538e-001 + + + <_> + + 0 -1 201 2.3597612977027893e-002 + + + -6.8263813853263855e-002 2.7455106377601624e-001 + + + <_> + + 0 -1 182 4.1193626821041107e-002 + + + 2.7521848678588867e-002 -7.5676482915878296e-001 + + + <_> + + 0 -1 133 -1.2081373482942581e-002 + + + -6.3366323709487915e-001 2.1798284724354744e-002 + + + <_> + + 0 -1 716 -4.3834196403622627e-003 + + + 2.2090788185596466e-001 -8.4348171949386597e-002 + + + <_> + + 0 -1 619 -9.1258285101503134e-004 + + + -3.3701941370964050e-001 5.0720885396003723e-002 + + + <_> + + 0 -1 675 -8.5975639522075653e-003 + + + 1.1742196232080460e-001 -1.5156917273998260e-001 + + + <_> + + 0 -1 904 -7.4663115665316582e-003 + + + 4.0097141265869141e-001 -4.4417705386877060e-002 + + + <_> + + 0 -1 193 1.2276999652385712e-002 + + + -7.3920600116252899e-002 2.5140073895454407e-001 + + + <_> + + 0 -1 283 -2.6504354551434517e-002 + + + 1.3177506625652313e-001 -1.5368436276912689e-001 + + + <_> + + 0 -1 359 -2.9700677841901779e-002 + + + -5.3993326425552368e-001 3.4572057425975800e-002 + + + <_> + + 0 -1 549 -1.0448409244418144e-002 + + + 4.0107232332229614e-001 -4.6194877475500107e-002 + + + <_> + + 0 -1 274 5.0177536904811859e-003 + + + -6.5788470208644867e-002 2.5757649540901184e-001 + + + <_> + + 0 -1 509 2.3238372057676315e-002 + + + 2.3455925285816193e-002 -7.7699542045593262e-001 + + + <_> + + 0 -1 908 -4.9220167100429535e-002 + + + 3.9117750525474548e-001 -4.7477778047323227e-002 + + + <_> + + 0 -1 936 -9.7046373412013054e-003 + + + 3.3891412615776062e-001 -5.0453528761863708e-002 + + + <_> + + 0 -1 856 1.6913980245590210e-002 + + + 4.0467191487550735e-002 -4.3838000297546387e-001 + + + <_> + + 0 -1 129 -7.5155749917030334e-002 + + + -6.0346192121505737e-001 2.7455519884824753e-002 + + + <_> + + 0 -1 436 1.1202652007341385e-002 + + + 2.4983508512377739e-002 -5.8596074581146240e-001 + + + <_> + + 0 -1 266 -3.9950847625732422e-002 + + + -5.3495115041732788e-001 2.9331879690289497e-002 + + + <_> + + 0 -1 1 7.1143209934234619e-003 + + + 3.1055316329002380e-002 -5.1785355806350708e-001 + + + <_> + + 0 -1 930 -2.7165055274963379e-002 + + + 3.4092447161674500e-001 -4.8697970807552338e-002 + + + <_> + + 0 -1 135 1.5079226344823837e-002 + + + -1.2215464562177658e-001 1.3460277020931244e-001 + + + <_> + + 0 -1 842 5.4478123784065247e-003 + + + -9.0178862214088440e-002 1.9025686383247375e-001 + + + <_> + + 0 -1 381 -7.4798073619604111e-003 + + + 2.4245217442512512e-001 -6.8944938480854034e-002 + + + <_> + + 0 -1 412 2.9248408973217010e-002 + + + -8.9382030069828033e-002 1.9680260121822357e-001 + + + <_> + + 0 -1 613 -5.1055247895419598e-003 + + + -4.0537586808204651e-001 4.3955769389867783e-002 + + + <_> + + 0 -1 417 -5.7464219629764557e-002 + + + -7.8487586975097656e-001 1.8840260803699493e-002 + + + <_> + + 0 -1 682 -1.3099622447043657e-003 + + + 1.2043049931526184e-001 -1.2602043151855469e-001 + + + <_> + + 0 -1 409 -1.0759031400084496e-002 + + + 4.6101579070091248e-001 -3.9381790906190872e-002 + + + <_> + + 0 -1 440 -4.4700078666210175e-002 + + + -4.9018231034278870e-001 3.9805438369512558e-002 + + + <_> + + 0 -1 697 2.6103520765900612e-002 + + + 3.3186998218297958e-002 -4.4388863444328308e-001 + + + <_> + + 0 -1 722 -3.0565187335014343e-003 + + + -3.1978246569633484e-001 4.8716515302658081e-002 + + + <_> + + 0 -1 113 6.5829858183860779e-002 + + + 1.8730893731117249e-002 -7.3743104934692383e-001 + + + <_> + + 0 -1 57 2.5423550978302956e-003 + + + 6.1064947396516800e-002 -2.3935855925083160e-001 + + + <_> + + 0 -1 755 -1.7830528318881989e-002 + + + 3.3646425604820251e-001 -4.3943304568529129e-002 + + + <_> + + 0 -1 223 5.9305625036358833e-003 + + + -6.8004354834556580e-002 2.1438401937484741e-001 + + + <_> + + 0 -1 156 -4.7256931662559509e-002 + + + 2.3610806465148926e-001 -7.9913109540939331e-002 + + + <_> + + 0 -1 146 1.7100328579545021e-002 + + + -4.8104494810104370e-002 3.4734794497489929e-001 + + + <_> + + 0 -1 174 -3.4349232912063599e-002 + + + 1.6535361111164093e-001 -8.9516580104827881e-002 + + + <_> + + 0 -1 370 1.6256177332252264e-003 + + + -7.9110637307167053e-002 1.9441387057304382e-001 + + + <_> + + 0 -1 724 -1.8217334523797035e-002 + + + 4.5723637938499451e-001 -3.1193139031529427e-002 + + + <_> + + 0 -1 749 2.1156244911253452e-003 + + + 2.7684733271598816e-002 -5.4580938816070557e-001 + + + <_> + + 0 -1 169 -2.6387263089418411e-002 + + + 2.4881765246391296e-001 -5.7665079832077026e-002 + + + <_> + + 0 -1 18 4.5990861952304840e-002 + + + -1.2064179033041000e-001 1.2435591220855713e-001 + + + <_> + + 0 -1 523 1.0681749880313873e-001 + + + 5.0562918186187744e-002 -3.4403973817825317e-001 + + + + + + <_> + 85 + -2.2744355201721191e+000 + + <_> + + 0 -1 252 1.6897995024919510e-002 + + + -6.9196498394012451e-001 -5.5616941303014755e-002 + + + <_> + + 0 -1 862 1.1701794341206551e-002 + + + -2.7923116087913513e-001 3.9880016446113586e-001 + + + <_> + + 0 -1 618 2.7141885831952095e-002 + + + 1.4071331918239594e-001 -4.8508083820343018e-001 + + + <_> + + 0 -1 949 -1.4755494194105268e-003 + + + 3.7315878272056580e-001 -1.4565770328044891e-001 + + + <_> + + 0 -1 464 1.5615923330187798e-003 + + + -9.6974156796932220e-002 3.6338686943054199e-001 + + + <_> + + 0 -1 292 -3.5046115517616272e-002 + + + 6.5541946887969971e-001 -6.3480094075202942e-002 + + + <_> + + 0 -1 471 -2.7439640834927559e-003 + + + -4.4147095084190369e-001 8.3881981670856476e-002 + + + <_> + + 0 -1 128 1.3140615075826645e-002 + + + 6.2391642481088638e-002 -5.2230197191238403e-001 + + + <_> + + 0 -1 624 -2.3408148437738419e-002 + + + -5.7339686155319214e-001 6.4651705324649811e-002 + + + <_> + + 0 -1 878 1.9269579788669944e-003 + + + -1.3906709849834442e-001 2.6013106107711792e-001 + + + <_> + + 0 -1 510 9.1457850066944957e-004 + + + 8.7518453598022461e-002 -4.9381819367408752e-001 + + + <_> + + 0 -1 76 -9.2652775347232819e-003 + + + -4.3321701884269714e-001 5.2230410277843475e-002 + + + <_> + + 0 -1 437 -2.0753231365233660e-003 + + + -5.0082236528396606e-001 6.1019111424684525e-002 + + + <_> + + 0 -1 791 1.9411731045693159e-003 + + + -7.8411623835563660e-002 3.5945037007331848e-001 + + + <_> + + 0 -1 774 -1.2042262824252248e-003 + + + 2.4952164292335510e-001 -1.1495979875326157e-001 + + + <_> + + 0 -1 428 4.5398853719234467e-002 + + + 4.9534358084201813e-002 -5.7811236381530762e-001 + + + <_> + + 0 -1 243 1.6548346728086472e-002 + + + 4.0716260671615601e-002 -5.4614287614822388e-001 + + + <_> + + 0 -1 747 -2.6393149048089981e-002 + + + -6.4222121238708496e-001 3.5461250692605972e-002 + + + <_> + + 0 -1 315 -7.9056806862354279e-003 + + + 2.7603831887245178e-001 -9.6884578466415405e-002 + + + <_> + + 0 -1 294 -8.6138453334569931e-003 + + + 3.4293037652969360e-001 -9.2569984495639801e-002 + + + <_> + + 0 -1 220 1.2120688334107399e-002 + + + 4.1071321815252304e-002 -5.9789633750915527e-001 + + + <_> + + 0 -1 213 -2.3794029839336872e-003 + + + 1.7102584242820740e-001 -1.3294184207916260e-001 + + + <_> + + 0 -1 667 1.5191107988357544e-002 + + + -5.9681247919797897e-002 3.9729467034339905e-001 + + + <_> + + 0 -1 497 -9.4484502915292978e-004 + + + -4.9290084838867188e-001 4.8412941396236420e-002 + + + <_> + + 0 -1 110 -7.5291972607374191e-003 + + + -4.4807717204093933e-001 4.6233657747507095e-002 + + + <_> + + 0 -1 226 2.0139738917350769e-002 + + + -8.7880477309226990e-002 2.5611591339111328e-001 + + + <_> + + 0 -1 934 -6.2278993427753448e-003 + + + 3.8167408108711243e-001 -5.7190407067537308e-002 + + + <_> + + 0 -1 485 -1.4294605702161789e-002 + + + 2.2094787657260895e-001 -1.0475759208202362e-001 + + + <_> + + 0 -1 707 -5.4574096575379372e-003 + + + 2.4806049466133118e-001 -8.7989374995231628e-002 + + + <_> + + 0 -1 928 1.1277779936790466e-002 + + + -6.8190395832061768e-002 3.0197840929031372e-001 + + + <_> + + 0 -1 193 1.2542145326733589e-002 + + + -7.4142687022686005e-002 2.5129452347755432e-001 + + + <_> + + 0 -1 161 -1.0840824991464615e-001 + + + -6.1061251163482666e-001 3.2729376107454300e-002 + + + <_> + + 0 -1 403 1.5083145117387176e-003 + + + -7.0102758705615997e-002 3.0823647975921631e-001 + + + <_> + + 0 -1 745 -6.4324252307415009e-002 + + + -7.6457482576370239e-001 2.8049679473042488e-002 + + + <_> + + 0 -1 635 -1.0857153683900833e-002 + + + 3.0212178826332092e-001 -6.9806925952434540e-002 + + + <_> + + 0 -1 93 5.6619346141815186e-002 + + + -1.2564770877361298e-001 1.7084783315658569e-001 + + + <_> + + 0 -1 576 -2.4015609174966812e-002 + + + -4.6767771244049072e-001 4.4055789709091187e-002 + + + <_> + + 0 -1 554 1.6571693122386932e-002 + + + -1.5079098939895630e-001 1.3097193837165833e-001 + + + <_> + + 0 -1 452 -1.3210725039243698e-002 + + + 4.0740290284156799e-001 -4.6674277633428574e-002 + + + <_> + + 0 -1 121 -9.6322391182184219e-003 + + + -3.4347525238990784e-001 5.1074773073196411e-002 + + + <_> + + 0 -1 155 1.2867329642176628e-002 + + + -9.5492877066135406e-002 1.9662295281887054e-001 + + + <_> + + 0 -1 915 2.5710439309477806e-002 + + + 2.4007089436054230e-002 -7.1648633480072021e-001 + + + <_> + + 0 -1 116 -7.6815150678157806e-003 + + + -6.2318617105484009e-001 2.3343794047832489e-002 + + + <_> + + 0 -1 709 -3.0568044167011976e-003 + + + 1.6469573974609375e-001 -1.0857288539409637e-001 + + + <_> + + 0 -1 35 7.0850662887096405e-002 + + + 2.7203138917684555e-002 -6.5618228912353516e-001 + + + <_> + + 0 -1 639 -1.9809347577393055e-003 + + + -6.1460441350936890e-001 2.4520153179764748e-002 + + + <_> + + 0 -1 236 7.0611112751066685e-003 + + + -7.4253976345062256e-002 2.5537955760955811e-001 + + + <_> + + 0 -1 186 3.0076294206082821e-003 + + + -9.6944920718669891e-002 2.4430949985980988e-001 + + + <_> + + 0 -1 172 -3.0732229351997375e-002 + + + -6.0257941484451294e-001 2.9267333447933197e-002 + + + <_> + + 0 -1 450 1.6364458948373795e-002 + + + 2.3035932332277298e-002 -6.2698912620544434e-001 + + + <_> + + 0 -1 114 1.4988467097282410e-001 + + + -4.8197094351053238e-002 3.9452686905860901e-001 + + + <_> + + 0 -1 197 -8.2194441929459572e-003 + + + 1.0664895921945572e-001 -1.8545584380626678e-001 + + + <_> + + 0 -1 84 -8.2502886652946472e-003 + + + 1.2596343457698822e-001 -1.4223846793174744e-001 + + + <_> + + 0 -1 73 1.3518449850380421e-002 + + + 7.5415953993797302e-002 -2.6633748412132263e-001 + + + <_> + + 0 -1 446 -1.4376571401953697e-002 + + + 3.4983170032501221e-001 -4.7824632376432419e-002 + + + <_> + + 0 -1 602 1.2734688818454742e-002 + + + -5.0567589700222015e-002 3.5038754343986511e-001 + + + <_> + + 0 -1 857 -1.3710462953895330e-003 + + + 1.8082229793071747e-001 -9.6974305808544159e-002 + + + <_> + + 0 -1 306 -2.6267360895872116e-002 + + + 4.1006618738174438e-001 -4.0112689137458801e-002 + + + <_> + + 0 -1 59 2.1102664992213249e-002 + + + 2.7978396043181419e-002 -5.8651155233383179e-001 + + + <_> + + 0 -1 909 -1.4474790543317795e-002 + + + 3.6871808767318726e-001 -4.5918777585029602e-002 + + + <_> + + 0 -1 817 7.2440858930349350e-003 + + + -7.5330309569835663e-002 2.0376025140285492e-001 + + + <_> + + 0 -1 815 1.0546022094786167e-002 + + + -6.1415266245603561e-002 3.0458399653434753e-001 + + + <_> + + 0 -1 101 5.5407796055078506e-002 + + + 2.5191115215420723e-002 -6.5944659709930420e-001 + + + <_> + + 0 -1 91 9.4949062913656235e-003 + + + -1.5944498777389526e-001 1.0568149387836456e-001 + + + <_> + + 0 -1 925 -6.2020965851843357e-003 + + + 2.7509790658950806e-001 -6.5234497189521790e-002 + + + <_> + + 0 -1 507 1.3317565619945526e-001 + + + 2.2181767970323563e-002 -7.3483341932296753e-001 + + + <_> + + 0 -1 448 2.5796357076615095e-003 + + + 1.9557425752282143e-002 -6.5313297510147095e-001 + + + <_> + + 0 -1 390 3.4660965204238892e-002 + + + -5.1162503659725189e-002 3.2590973377227783e-001 + + + <_> + + 0 -1 30 9.5607116818428040e-002 + + + -2.4739582091569901e-002 5.7837259769439697e-001 + + + <_> + + 0 -1 148 1.6605708748102188e-002 + + + 5.7055354118347168e-002 -3.5466542840003967e-001 + + + <_> + + 0 -1 123 1.1670887470245361e-002 + + + -8.0407410860061646e-002 1.9471745193004608e-001 + + + <_> + + 0 -1 208 1.0822312906384468e-002 + + + 2.6732437312602997e-002 -5.8917897939682007e-001 + + + <_> + + 0 -1 708 2.7245271950960159e-002 + + + 3.0616169795393944e-002 -4.8082390427589417e-001 + + + <_> + + 0 -1 217 -1.3694438338279724e-001 + + + -4.8311397433280945e-001 3.3773597329854965e-002 + + + <_> + + 0 -1 899 -1.4758360339328647e-003 + + + 2.5075155496597290e-001 -6.7788824439048767e-002 + + + <_> + + 0 -1 275 2.7167074382305145e-002 + + + 2.5224637240171432e-002 -6.3691717386245728e-001 + + + <_> + + 0 -1 657 1.8945746123790741e-002 + + + -5.7760879397392273e-002 2.6149269938468933e-001 + + + <_> + + 0 -1 102 1.2368987500667572e-001 + + + -3.2363165169954300e-002 4.5130741596221924e-001 + + + <_> + + 0 -1 43 3.9710897952318192e-002 + + + -3.0226422473788261e-002 4.6590203046798706e-001 + + + <_> + + 0 -1 136 -3.6290191113948822e-002 + + + 3.6348423361778259e-001 -4.1874047368764877e-002 + + + <_> + + 0 -1 846 2.5501720607280731e-002 + + + 3.5494077950716019e-002 -4.5727846026420593e-001 + + + <_> + + 0 -1 772 5.3392872214317322e-003 + + + -6.0394711792469025e-002 2.5488924980163574e-001 + + + <_> + + 0 -1 950 7.9108221689239144e-004 + + + 5.4109033197164536e-002 -2.7065926790237427e-001 + + + <_> + + 0 -1 929 -1.6701441258192062e-002 + + + 4.8040628433227539e-001 -3.0404916033148766e-002 + + + <_> + + 0 -1 566 7.1975095197558403e-003 + + + -7.0362947881221771e-002 1.9959311187267303e-001 + + + + + + <_> + 100 + -2.2887177467346191e+000 + + <_> + + 0 -1 286 -1.6051483154296875e-001 + + + 9.3009121716022491e-002 -6.5350115299224854e-001 + + + <_> + + 0 -1 623 1.2457310222089291e-002 + + + -3.1717920303344727e-001 2.3368784785270691e-001 + + + <_> + + 0 -1 29 2.3608796764165163e-003 + + + -2.9248744249343872e-001 1.8054312467575073e-001 + + + <_> + + 0 -1 339 1.4379444532096386e-002 + + + -5.7956293225288391e-002 7.6479458808898926e-001 + + + <_> + + 0 -1 871 6.8126469850540161e-003 + + + -1.4748461544513702e-001 2.3818431794643402e-001 + + + <_> + + 0 -1 247 4.3051101267337799e-002 + + + 8.7559670209884644e-002 -7.2269368171691895e-001 + + + <_> + + 0 -1 867 -5.0154160708189011e-002 + + + 3.1918609142303467e-001 -1.3582608103752136e-001 + + + <_> + + 0 -1 212 -3.1796738039702177e-003 + + + 2.7597072720527649e-001 -9.0522617101669312e-002 + + + <_> + + 0 -1 677 -1.2342665344476700e-002 + + + -3.9158377051353455e-001 5.3565893322229385e-002 + + + <_> + + 0 -1 897 1.1861260049045086e-002 + + + -6.1517983675003052e-002 3.6472269892692566e-001 + + + <_> + + 0 -1 252 -2.1985735744237900e-002 + + + 6.5143728256225586e-001 -4.0598560124635696e-002 + + + <_> + + 0 -1 63 -1.2279948219656944e-002 + + + 2.1631649136543274e-001 -1.2024078518152237e-001 + + + <_> + + 0 -1 640 8.2167033106088638e-003 + + + -9.4497188925743103e-002 2.4828021228313446e-001 + + + <_> + + 0 -1 357 1.0111754760146141e-002 + + + -3.3160492777824402e-002 6.2502938508987427e-001 + + + <_> + + 0 -1 924 -7.7025225618854165e-004 + + + 2.3218974471092224e-001 -1.0222402960062027e-001 + + + <_> + + 0 -1 467 -1.4080689288675785e-003 + + + 1.3447046279907227e-001 -1.6994857788085938e-001 + + + <_> + + 0 -1 140 1.0420590639114380e-002 + + + 2.9845444485545158e-002 -7.5183397531509399e-001 + + + <_> + + 0 -1 356 1.3691674917936325e-002 + + + 2.8088988736271858e-002 -5.7496672868728638e-001 + + + <_> + + 0 -1 155 1.7491653561592102e-002 + + + -9.8534837365150452e-002 2.2351761162281036e-001 + + + <_> + + 0 -1 762 7.4883676134049892e-003 + + + -9.7045794129371643e-002 2.0625646412372589e-001 + + + <_> + + 0 -1 104 -8.4146633744239807e-003 + + + -4.8472663760185242e-001 4.1302844882011414e-002 + + + <_> + + 0 -1 342 3.0617808923125267e-002 + + + -3.7334404885768890e-002 6.1179280281066895e-001 + + + <_> + + 0 -1 326 1.6346010379493237e-003 + + + -1.8315000832080841e-001 1.0951925814151764e-001 + + + <_> + + 0 -1 901 -1.1816060170531273e-002 + + + 3.0801647901535034e-001 -6.1308264732360840e-002 + + + <_> + + 0 -1 351 -1.0661455802619457e-002 + + + 3.3249661326408386e-001 -5.0642840564250946e-002 + + + <_> + + 0 -1 84 -9.6190627664327621e-003 + + + 1.3975782692432404e-001 -1.3763442635536194e-001 + + + <_> + + 0 -1 289 -1.2881286442279816e-002 + + + 3.6742180585861206e-001 -5.0860747694969177e-002 + + + <_> + + 0 -1 824 1.3589482754468918e-002 + + + -5.1274802535772324e-002 3.1885984539985657e-001 + + + <_> + + 0 -1 234 4.6852193772792816e-003 + + + -7.2946086525917053e-002 2.5181108713150024e-001 + + + <_> + + 0 -1 432 1.9752513617277145e-002 + + + -1.4621073007583618e-001 1.2726816534996033e-001 + + + <_> + + 0 -1 454 3.6341309547424316e-002 + + + 2.4868825450539589e-002 -6.9947302341461182e-001 + + + <_> + + 0 -1 636 -1.1957485694438219e-003 + + + 1.5675933659076691e-001 -1.1705233156681061e-001 + + + <_> + + 0 -1 40 -9.9432021379470825e-003 + + + -3.4487789869308472e-001 4.9324721097946167e-002 + + + <_> + + 0 -1 269 6.0083293356001377e-003 + + + 3.3568043261766434e-002 -4.3638321757316589e-001 + + + <_> + + 0 -1 14 9.6278168261051178e-002 + + + 4.0310282260179520e-002 -3.9266702532768250e-001 + + + <_> + + 0 -1 154 4.3072472908534110e-004 + + + -1.0427023470401764e-001 1.4397470653057098e-001 + + + <_> + + 0 -1 504 -4.7720400616526604e-003 + + + -4.4805496931076050e-001 3.4855298697948456e-002 + + + <_> + + 0 -1 87 -1.0016669984906912e-003 + + + 1.3649077713489532e-001 -1.2140301614999771e-001 + + + <_> + + 0 -1 254 2.3308012634515762e-002 + + + 3.6392133682966232e-002 -4.5537215471267700e-001 + + + <_> + + 0 -1 802 -4.8546120524406433e-003 + + + 1.5793082118034363e-001 -9.6185155212879181e-002 + + + <_> + + 0 -1 795 -6.5906550735235214e-003 + + + 3.2166856527328491e-001 -4.9290131777524948e-002 + + + <_> + + 0 -1 126 -2.7226015925407410e-002 + + + 2.8352561593055725e-001 -5.1984444260597229e-002 + + + <_> + + 0 -1 938 5.5622356012463570e-003 + + + -3.3917389810085297e-002 4.3498530983924866e-001 + + + <_> + + 0 -1 534 -5.8775981888175011e-003 + + + 1.7455618083477020e-001 -8.4790699183940887e-002 + + + <_> + + 0 -1 627 -1.1768937110900879e-003 + + + -4.4403216242790222e-001 3.4572694450616837e-002 + + + <_> + + 0 -1 625 1.4337021857500076e-003 + + + -8.8692568242549896e-002 1.6940893232822418e-001 + + + <_> + + 0 -1 51 1.3953970745205879e-002 + + + 3.9221145212650299e-002 -3.8308286666870117e-001 + + + <_> + + 0 -1 106 5.3161740303039551e-002 + + + -3.9227265864610672e-002 4.0637263655662537e-001 + + + <_> + + 0 -1 916 1.1670306324958801e-002 + + + -6.2661647796630859e-002 2.2897149622440338e-001 + + + <_> + + 0 -1 524 -8.5611653048545122e-004 + + + -3.1393322348594666e-001 4.4154506176710129e-002 + + + <_> + + 0 -1 362 3.1659279484301805e-003 + + + -1.0416875034570694e-001 1.4386938512325287e-001 + + + <_> + + 0 -1 94 9.2105150222778320e-002 + + + 2.5259945541620255e-002 -6.3980853557586670e-001 + + + <_> + + 0 -1 681 2.2438270971179008e-003 + + + 2.9625944793224335e-002 -4.4926467537879944e-001 + + + <_> + + 0 -1 592 -1.4502200298011303e-002 + + + 2.3043723404407501e-001 -6.8583212792873383e-002 + + + <_> + + 0 -1 17 3.1762875616550446e-002 + + + -1.1820482462644577e-001 1.3017164170742035e-001 + + + <_> + + 0 -1 372 8.3491904661059380e-003 + + + -5.4794549942016602e-002 3.0562251806259155e-001 + + + <_> + + 0 -1 945 1.1813377961516380e-002 + + + -4.4218052178621292e-002 3.2657644152641296e-001 + + + <_> + + 0 -1 517 -4.3407902121543884e-003 + + + 2.3012351989746094e-001 -6.2401693314313889e-002 + + + <_> + + 0 -1 835 -5.1777150481939316e-002 + + + -4.2195704579353333e-001 3.3818338066339493e-002 + + + <_> + + 0 -1 573 9.5773371867835522e-004 + + + -1.2982761859893799e-001 1.0589899122714996e-001 + + + <_> + + 0 -1 329 2.6355611626058817e-003 + + + -1.1849098652601242e-001 1.2649086117744446e-001 + + + <_> + + 0 -1 738 -6.9736450910568237e-002 + + + 5.4316484928131104e-001 -2.8468221426010132e-002 + + + <_> + + 0 -1 166 -4.1691556572914124e-002 + + + 1.8529292941093445e-001 -7.9085260629653931e-002 + + + <_> + + 0 -1 72 3.0405964702367783e-002 + + + -6.7499466240406036e-002 2.3227298259735107e-001 + + + <_> + + 0 -1 202 1.6526731848716736e-001 + + + 2.3192871361970901e-002 -6.6413503885269165e-001 + + + <_> + + 0 -1 244 -7.9902745783329010e-003 + + + 1.6699096560478210e-001 -8.0209225416183472e-002 + + + <_> + + 0 -1 435 -8.4093026816844940e-003 + + + 3.8385570049285889e-001 -3.3093310892581940e-002 + + + <_> + + 0 -1 580 -6.2388582155108452e-003 + + + 2.2031579911708832e-001 -5.9756781905889511e-002 + + + <_> + + 0 -1 416 2.2657278925180435e-002 + + + 2.9750887304544449e-002 -4.3571525812149048e-001 + + + <_> + + 0 -1 245 -3.3273398876190186e-002 + + + -7.2214579582214355e-001 1.7277766019105911e-002 + + + <_> + + 0 -1 805 -7.5985761359333992e-003 + + + -4.8032435774803162e-001 2.3796260356903076e-002 + + + <_> + + 0 -1 490 1.4554752968251705e-002 + + + 2.0614990964531898e-002 -5.7951718568801880e-001 + + + <_> + + 0 -1 348 -2.4409522302448750e-003 + + + 1.5682564675807953e-001 -8.2513608038425446e-002 + + + <_> + + 0 -1 216 -2.7174502611160278e-002 + + + -5.4916822910308838e-001 2.3511687293648720e-002 + + + <_> + + 0 -1 599 1.8674493767321110e-003 + + + 3.5896647721529007e-002 -3.5593807697296143e-001 + + + <_> + + 0 -1 599 -1.7106164013966918e-003 + + + -2.9658839106559753e-001 4.5083675533533096e-002 + + + <_> + + 0 -1 698 -1.2188366800546646e-001 + + + -6.8481236696243286e-001 1.6469523310661316e-002 + + + <_> + + 0 -1 206 1.6452776268124580e-002 + + + 1.6632448881864548e-002 -6.3031005859375000e-001 + + + <_> + + 0 -1 913 3.3029774203896523e-003 + + + 5.2817359566688538e-002 -2.3288796842098236e-001 + + + <_> + + 0 -1 678 6.5974113531410694e-003 + + + -5.9827085584402084e-002 2.2615881264209747e-001 + + + <_> + + 0 -1 947 -2.2020633332431316e-003 + + + 2.2270961105823517e-001 -5.8337379246950150e-002 + + + <_> + + 0 -1 582 -8.9172367006540298e-003 + + + 2.3682470619678497e-001 -5.5845208466053009e-002 + + + <_> + + 0 -1 100 -3.8233667612075806e-002 + + + 1.9340702891349792e-001 -7.3905274271965027e-002 + + + <_> + + 0 -1 214 -5.8171510696411133e-002 + + + -3.3873862028121948e-001 3.6934167146682739e-002 + + + <_> + + 0 -1 142 1.3129880651831627e-002 + + + -5.7335916906595230e-002 2.4769510328769684e-001 + + + <_> + + 0 -1 606 -2.3510225117206573e-002 + + + -7.3440921306610107e-001 2.1062126383185387e-002 + + + <_> + + 0 -1 180 -3.2106369733810425e-002 + + + 1.9888436794281006e-001 -6.8882115185260773e-002 + + + <_> + + 0 -1 798 1.0653462260961533e-002 + + + -3.1876940280199051e-002 3.7958627939224243e-001 + + + <_> + + 0 -1 325 2.5438904762268066e-002 + + + -2.5426354259252548e-002 4.6004450321197510e-001 + + + <_> + + 0 -1 239 2.6357024908065796e-002 + + + -4.9807246774435043e-002 2.5959959626197815e-001 + + + <_> + + 0 -1 525 5.6436131708323956e-003 + + + -4.5353759080171585e-002 2.8858882188796997e-001 + + + <_> + + 0 -1 267 -4.3369065970182419e-003 + + + 1.4867325127124786e-001 -8.8411331176757813e-002 + + + <_> + + 0 -1 215 -1.9298204779624939e-001 + + + -5.3079867362976074e-001 2.5263534858822823e-002 + + + <_> + + 0 -1 734 5.7046163827180862e-002 + + + 1.1847544461488724e-002 -8.2090246677398682e-001 + + + <_> + + 0 -1 352 4.9701407551765442e-002 + + + 1.3225952163338661e-002 -6.8998688459396362e-001 + + + <_> + + 0 -1 278 -2.8292792849242687e-003 + + + 1.7430420219898224e-001 -6.6152326762676239e-002 + + + <_> + + 0 -1 476 -1.4506326988339424e-002 + + + -3.1870725750923157e-001 3.8834158331155777e-002 + + + <_> + + 0 -1 859 3.5564824938774109e-002 + + + -5.6947514414787292e-002 2.1859169006347656e-001 + + + <_> + + 0 -1 98 2.0967530086636543e-002 + + + -5.9812918305397034e-002 2.2214832901954651e-001 + + + <_> + + 0 -1 127 7.3756486177444458e-002 + + + 2.5129400193691254e-002 -4.9916529655456543e-001 + + + + + + <_> + 100 + -2.2359671592712402e+000 + + <_> + + 0 -1 285 -9.3501225113868713e-002 + + + -4.6586804091930389e-002 -7.2199982404708862e-001 + + + <_> + + 0 -1 238 4.9442616291344166e-003 + + + -3.9842179417610168e-001 2.1402300894260406e-001 + + + <_> + + 0 -1 799 1.0407378897070885e-002 + + + -1.3988684117794037e-001 3.9579308032989502e-001 + + + <_> + + 0 -1 322 -1.4162844978272915e-002 + + + 6.4931660890579224e-001 -5.7302106171846390e-002 + + + <_> + + 0 -1 449 9.8008674103766680e-004 + + + -1.7719046771526337e-001 2.0141038298606873e-001 + + + <_> + + 0 -1 218 1.4206364750862122e-002 + + + -9.3258224427700043e-002 3.4144768118858337e-001 + + + <_> + + 0 -1 879 2.5848676450550556e-003 + + + -1.4990748465061188e-001 2.2581319510936737e-001 + + + <_> + + 0 -1 22 8.0643901601433754e-003 + + + -8.8275857269763947e-002 2.8663924336433411e-001 + + + <_> + + 0 -1 881 -8.6236204952001572e-003 + + + 3.3490571379661560e-001 -8.2069411873817444e-002 + + + <_> + + 0 -1 723 1.2022950686514378e-002 + + + -6.3569039106369019e-002 3.9191362261772156e-001 + + + <_> + + 0 -1 665 -1.5419950708746910e-002 + + + 4.4637352228164673e-001 -6.6652692854404449e-002 + + + <_> + + 0 -1 735 -6.3524805009365082e-003 + + + 1.8987259268760681e-001 -1.2892219424247742e-001 + + + <_> + + 0 -1 408 6.9541163742542267e-002 + + + 4.3989829719066620e-002 -4.4642734527587891e-001 + + + <_> + + 0 -1 368 7.4983224272727966e-002 + + + -5.2028596401214600e-002 5.7951992750167847e-001 + + + <_> + + 0 -1 486 2.0330501720309258e-003 + + + -1.3492821156978607e-001 2.0830303430557251e-001 + + + <_> + + 0 -1 28 1.8707301467657089e-002 + + + 3.0162446200847626e-002 -7.5620234012603760e-001 + + + <_> + + 0 -1 33 9.1869030147790909e-003 + + + -1.5992332994937897e-001 1.3838322460651398e-001 + + + <_> + + 0 -1 473 -2.0068701356649399e-002 + + + 4.9636912345886230e-001 -3.8212534040212631e-002 + + + <_> + + 0 -1 32 9.3690613284707069e-003 + + + 2.7963882312178612e-002 -7.0575749874114990e-001 + + + <_> + + 0 -1 63 -9.2746205627918243e-003 + + + 1.7214477062225342e-001 -1.1743877083063126e-001 + + + <_> + + 0 -1 671 -3.7561631761491299e-003 + + + 1.9893965125083923e-001 -1.0429763048887253e-001 + + + <_> + + 0 -1 642 -2.8749569319188595e-003 + + + -3.7584275007247925e-001 4.6344734728336334e-002 + + + <_> + + 0 -1 145 -1.1727647855877876e-002 + + + -4.4696572422981262e-001 4.0343362838029861e-002 + + + <_> + + 0 -1 590 1.0945920832455158e-002 + + + 5.6218206882476807e-002 -2.9916441440582275e-001 + + + <_> + + 0 -1 341 -1.2209227308630943e-002 + + + 3.9286783337593079e-001 -4.2874403297901154e-002 + + + <_> + + 0 -1 447 -2.5397611781954765e-002 + + + -3.8478189706802368e-001 4.3343432247638702e-002 + + + <_> + + 0 -1 746 -4.5675365254282951e-003 + + + 2.3299069702625275e-001 -7.3202215135097504e-002 + + + <_> + + 0 -1 935 -6.0586854815483093e-003 + + + 2.2465232014656067e-001 -7.7056594192981720e-002 + + + <_> + + 0 -1 131 1.5789955854415894e-002 + + + -8.7083600461483002e-002 1.9742278754711151e-001 + + + <_> + + 0 -1 759 -1.7314129509031773e-003 + + + 2.0412902534008026e-001 -8.9147895574569702e-002 + + + <_> + + 0 -1 939 7.3486715555191040e-003 + + + -4.5228123664855957e-002 3.5152116417884827e-001 + + + <_> + + 0 -1 246 1.6278622671961784e-002 + + + 5.0431668758392334e-002 -3.4917074441909790e-001 + + + <_> + + 0 -1 151 -4.9730124883353710e-003 + + + 1.8474133312702179e-001 -9.4716101884841919e-002 + + + <_> + + 0 -1 334 1.3617072254419327e-002 + + + -3.4493431448936462e-002 5.1511102914810181e-001 + + + <_> + + 0 -1 516 -3.5471074283123016e-002 + + + -3.9388224482536316e-001 4.3496731668710709e-002 + + + <_> + + 0 -1 103 5.2554365247488022e-003 + + + -1.2609277665615082e-001 1.2129900604486465e-001 + + + <_> + + 0 -1 489 -4.1965182870626450e-002 + + + -6.2069499492645264e-001 2.4282006546854973e-002 + + + <_> + + 0 -1 61 9.6745520830154419e-002 + + + 3.0231734737753868e-002 -4.6271669864654541e-001 + + + <_> + + 0 -1 661 -6.8811019882559776e-003 + + + 2.8159707784652710e-001 -5.7276148349046707e-002 + + + <_> + + 0 -1 616 1.0784192010760307e-002 + + + -4.8847943544387817e-002 3.2464641332626343e-001 + + + <_> + + 0 -1 466 -3.3961618319153786e-003 + + + 4.0418368577957153e-001 -4.2481750249862671e-002 + + + <_> + + 0 -1 420 -6.9079827517271042e-003 + + + 1.1404169350862503e-001 -1.2768752872943878e-001 + + + <_> + + 0 -1 167 1.4355555176734924e-001 + + + -3.9203863590955734e-002 3.9233651757240295e-001 + + + <_> + + 0 -1 210 -3.5771834664046764e-003 + + + 1.4706018567085266e-001 -1.3173283636569977e-001 + + + <_> + + 0 -1 439 3.0234435573220253e-002 + + + 1.8946202471852303e-002 -8.0503576993942261e-001 + + + <_> + + 0 -1 567 7.8391470015048981e-004 + + + 8.7953150272369385e-002 -1.6678945720195770e-001 + + + <_> + + 0 -1 42 -2.2085051983594894e-002 + + + -3.8623884320259094e-001 4.2284723371267319e-002 + + + <_> + + 0 -1 818 -2.6205494999885559e-002 + + + 1.6326524317264557e-001 -1.0225085169076920e-001 + + + <_> + + 0 -1 581 -9.5918308943510056e-003 + + + 2.5218212604522705e-001 -6.0809265822172165e-002 + + + <_> + + 0 -1 242 -2.6144424453377724e-002 + + + -6.9495695829391479e-001 2.2685619071125984e-002 + + + <_> + + 0 -1 424 9.2253191396594048e-003 + + + -8.8936053216457367e-002 1.6087681055068970e-001 + + + <_> + + 0 -1 843 -3.1533516012132168e-003 + + + 2.2563895583152771e-001 -6.3495889306068420e-002 + + + <_> + + 0 -1 56 -6.6996468231081963e-003 + + + -2.4251624941825867e-001 6.1135187745094299e-002 + + + <_> + + 0 -1 282 -1.2584788724780083e-002 + + + 2.9776036739349365e-001 -4.9212120473384857e-002 + + + <_> + + 0 -1 903 -4.2148698121309280e-003 + + + 3.0259734392166138e-001 -4.4676482677459717e-002 + + + <_> + + 0 -1 653 -9.4317561015486717e-003 + + + 1.1043215543031693e-001 -1.2356746196746826e-001 + + + <_> + + 0 -1 654 2.1886886097490788e-003 + + + -6.1201002448797226e-002 2.2712202370166779e-001 + + + <_> + + 0 -1 398 2.4963401257991791e-002 + + + 2.4292556568980217e-002 -5.4634368419647217e-001 + + + <_> + + 0 -1 205 -8.7548848241567612e-003 + + + 2.5255405902862549e-001 -5.4619345813989639e-002 + + + <_> + + 0 -1 487 7.0049557834863663e-003 + + + 3.9875753223896027e-002 -3.8009002804756165e-001 + + + <_> + + 0 -1 258 3.7140229251235723e-003 + + + -9.3989297747612000e-002 1.5871012210845947e-001 + + + <_> + + 0 -1 565 -8.4969010204076767e-003 + + + 2.0674896240234375e-001 -6.4190469682216644e-002 + + + <_> + + 0 -1 147 -5.0333619117736816e-002 + + + 3.0274888873100281e-001 -4.3931342661380768e-002 + + + <_> + + 0 -1 80 7.2737382724881172e-003 + + + -8.7947271764278412e-002 1.5312801301479340e-001 + + + <_> + + 0 -1 58 9.9609624594449997e-003 + + + 4.6528778970241547e-002 -2.9576960206031799e-001 + + + <_> + + 0 -1 909 -1.3673231005668640e-002 + + + 3.2159554958343506e-001 -4.6024739742279053e-002 + + + <_> + + 0 -1 460 2.4796918034553528e-002 + + + 2.3450840264558792e-002 -6.3208627700805664e-001 + + + <_> + + 0 -1 790 -8.9704394340515137e-003 + + + 1.7290446162223816e-001 -8.1694059073925018e-002 + + + <_> + + 0 -1 191 -2.3638601414859295e-003 + + + 1.0641085356473923e-001 -1.2656879425048828e-001 + + + <_> + + 0 -1 45 -3.0800779350101948e-003 + + + 1.4082619547843933e-001 -9.4026930630207062e-002 + + + <_> + + 0 -1 138 -1.0759308934211731e-002 + + + -4.0597277879714966e-001 3.1949173659086227e-002 + + + <_> + + 0 -1 176 7.2143180295825005e-003 + + + 1.2054420076310635e-002 -8.5538458824157715e-001 + + + <_> + + 0 -1 384 1.9637834280729294e-002 + + + -4.5702952891588211e-002 3.0082041025161743e-001 + + + <_> + + 0 -1 181 -2.6587650179862976e-002 + + + -4.8827502131462097e-001 2.5739965960383415e-002 + + + <_> + + 0 -1 429 -2.8913402929902077e-003 + + + 1.5120062232017517e-001 -8.3084680140018463e-002 + + + <_> + + 0 -1 462 -1.7486744036432356e-004 + + + -1.6527174413204193e-001 7.9318381845951080e-002 + + + <_> + + 0 -1 93 5.8025561273097992e-002 + + + -9.3625135719776154e-002 1.3428705930709839e-001 + + + <_> + + 0 -1 895 7.7226985013112426e-004 + + + 6.4624220132827759e-002 -1.9347991049289703e-001 + + + <_> + + 0 -1 506 -6.4398542046546936e-002 + + + -8.3100390434265137e-001 1.3259679079055786e-002 + + + <_> + + 0 -1 794 2.7848746627569199e-002 + + + 1.3673855923116207e-002 -7.1600478887557983e-001 + + + <_> + + 0 -1 308 -1.7273522913455963e-002 + + + -6.1328560113906860e-001 1.7129577696323395e-002 + + + <_> + + 0 -1 117 2.2771380841732025e-002 + + + 1.4634012244641781e-002 -6.9125133752822876e-001 + + + <_> + + 0 -1 155 1.7879681661725044e-002 + + + -6.6493585705757141e-002 1.8808430433273315e-001 + + + <_> + + 0 -1 188 -7.5980871915817261e-003 + + + 2.1208682656288147e-001 -6.9655627012252808e-002 + + + <_> + + 0 -1 468 8.3334632217884064e-003 + + + -4.5091670006513596e-002 2.5533476471900940e-001 + + + <_> + + 0 -1 451 9.5366090536117554e-003 + + + 3.3587828278541565e-002 -3.8594719767570496e-001 + + + <_> + + 0 -1 349 1.9022613763809204e-002 + + + -4.2280010879039764e-002 3.0593034625053406e-001 + + + <_> + + 0 -1 522 3.6582566797733307e-002 + + + -6.8928316235542297e-002 1.8224547803401947e-001 + + + <_> + + 0 -1 159 -2.5450623035430908e-001 + + + -7.9693830013275146e-001 1.6522107645869255e-002 + + + <_> + + 0 -1 905 -5.8933448046445847e-002 + + + 3.6613103747367859e-001 -3.7511564791202545e-002 + + + <_> + + 0 -1 64 8.5881188511848450e-002 + + + 3.5934593528509140e-002 -3.7825050950050354e-001 + + + <_> + + 0 -1 810 -6.8585649132728577e-002 + + + -5.4236054420471191e-001 2.0104518160223961e-002 + + + <_> + + 0 -1 529 4.8160655423998833e-003 + + + -4.3085236102342606e-002 2.8620475530624390e-001 + + + <_> + + 0 -1 498 6.1599753098562360e-004 + + + 5.0022143870592117e-002 -2.7295649051666260e-001 + + + <_> + + 0 -1 710 7.4446541257202625e-003 + + + -6.7837722599506378e-002 1.9111913442611694e-001 + + + <_> + + 0 -1 333 1.3981198891997337e-002 + + + 2.1413592621684074e-002 -6.2269157171249390e-001 + + + <_> + + 0 -1 941 -1.4853913336992264e-002 + + + 4.0018329024314880e-001 -3.4097265452146530e-002 + + + <_> + + 0 -1 3 1.3497969135642052e-002 + + + 3.0796987935900688e-002 -4.2009493708610535e-001 + + + <_> + + 0 -1 887 9.1592809185385704e-003 + + + 3.0317120254039764e-002 -3.5625258088111877e-001 + + + <_> + + 0 -1 11 2.9643373563885689e-002 + + + -1.1319724470376968e-001 1.0797596722841263e-001 + + + + + + <_> + 100 + -2.0808603763580322e+000 + + <_> + + 0 -1 284 -7.5377658009529114e-002 + + + -1.0360029339790344e-001 -7.0443350076675415e-001 + + + <_> + + 0 -1 301 -4.6968553215265274e-003 + + + 2.6461517810821533e-001 -2.6632103323936462e-001 + + + <_> + + 0 -1 851 4.5106429606676102e-003 + + + -1.9236828386783600e-001 2.4530071020126343e-001 + + + <_> + + 0 -1 324 -1.3677397742867470e-002 + + + 4.8842102289199829e-001 -7.8666172921657562e-002 + + + <_> + + 0 -1 621 8.4240939468145370e-003 + + + -1.1324168741703033e-001 2.8638821840286255e-001 + + + <_> + + 0 -1 827 1.0163122788071632e-003 + + + -1.7518180608749390e-001 1.6443368792533875e-001 + + + <_> + + 0 -1 375 3.2988777384161949e-003 + + + -7.6549887657165527e-002 2.8202313184738159e-001 + + + <_> + + 0 -1 85 1.4450255781412125e-002 + + + -1.4695851504802704e-001 1.9833040237426758e-001 + + + <_> + + 0 -1 328 5.9788756072521210e-002 + + + -2.7597570791840553e-002 6.0443407297134399e-001 + + + <_> + + 0 -1 668 -4.0823942981660366e-003 + + + 3.7376108765602112e-001 -6.6522486507892609e-002 + + + <_> + + 0 -1 651 9.4101820141077042e-003 + + + -7.5030580163002014e-002 3.3643370866775513e-001 + + + <_> + + 0 -1 770 1.2895615771412849e-002 + + + -6.6736064851284027e-002 3.4388977289199829e-001 + + + <_> + + 0 -1 0 1.8281452357769012e-003 + + + -7.6577022671699524e-002 3.0855756998062134e-001 + + + <_> + + 0 -1 811 1.2842542491853237e-002 + + + -6.6831089556217194e-002 3.5320571064949036e-001 + + + <_> + + 0 -1 556 2.6731539517641068e-002 + + + 4.3738048523664474e-002 -5.4744714498519897e-001 + + + <_> + + 0 -1 593 -2.1810945123434067e-002 + + + -4.9039456248283386e-001 3.5305779427289963e-002 + + + <_> + + 0 -1 397 1.4120168052613735e-003 + + + -1.7367108166217804e-001 1.1572990566492081e-001 + + + <_> + + 0 -1 494 1.5707452548667789e-003 + + + -1.1095841974020004e-001 1.6702808439731598e-001 + + + <_> + + 0 -1 869 -7.3387438897043467e-004 + + + 1.8617554008960724e-001 -9.1079324483871460e-002 + + + <_> + + 0 -1 495 -6.4388057217001915e-004 + + + -2.6845857501029968e-001 6.1447944492101669e-002 + + + <_> + + 0 -1 427 1.1414934694766998e-001 + + + 2.0975470542907715e-002 -7.1357190608978271e-001 + + + <_> + + 0 -1 931 1.3404923956841230e-003 + + + -9.0797364711761475e-002 1.8696101009845734e-001 + + + <_> + + 0 -1 46 2.3350983858108521e-002 + + + 2.9028130695223808e-002 -5.2345710992813110e-001 + + + <_> + + 0 -1 143 1.5429967083036900e-002 + + + -9.4941243529319763e-002 1.6368669271469116e-001 + + + <_> + + 0 -1 357 1.0943166911602020e-002 + + + -3.1125182285904884e-002 5.9323889017105103e-001 + + + <_> + + 0 -1 705 2.6839743368327618e-003 + + + -7.5778268277645111e-002 2.1814092993736267e-001 + + + <_> + + 0 -1 39 -6.2261838465929031e-003 + + + -2.8783807158470154e-001 5.5791638791561127e-002 + + + <_> + + 0 -1 207 1.0724554955959320e-001 + + + 2.4116434156894684e-002 -5.8035951852798462e-001 + + + <_> + + 0 -1 199 -6.5348353236913681e-003 + + + -2.8312593698501587e-001 5.1936011761426926e-002 + + + <_> + + 0 -1 415 -1.1670710518956184e-003 + + + -1.8463888764381409e-001 8.3705939352512360e-002 + + + <_> + + 0 -1 808 -1.4070876641198993e-003 + + + 1.5036344528198242e-001 -1.0249616205692291e-001 + + + <_> + + 0 -1 122 -3.9912573993206024e-002 + + + -3.8639402389526367e-001 3.9821352809667587e-002 + + + <_> + + 0 -1 413 1.0381672531366348e-002 + + + -1.2079605460166931e-001 1.2945999205112457e-001 + + + <_> + + 0 -1 453 -9.9312573671340942e-002 + + + 6.0750687122344971e-001 -2.8503781184554100e-002 + + + <_> + + 0 -1 816 1.0430534370243549e-002 + + + -6.0343675315380096e-002 2.3242907226085663e-001 + + + <_> + + 0 -1 445 3.5891016013920307e-003 + + + 4.1434522718191147e-002 -3.4602153301239014e-001 + + + <_> + + 0 -1 788 1.0015227831900120e-002 + + + -5.6792665272951126e-002 2.6468506455421448e-001 + + + <_> + + 0 -1 749 -9.2321680858731270e-004 + + + -3.1470552086830139e-001 4.6375431120395660e-002 + + + <_> + + 0 -1 384 2.0065717399120331e-002 + + + -4.7381434589624405e-002 3.2506260275840759e-001 + + + <_> + + 0 -1 782 2.0691626705229282e-003 + + + -8.8068872690200806e-002 1.7662553489208221e-001 + + + <_> + + 0 -1 150 -2.0592920482158661e-002 + + + 2.1614389121532440e-001 -6.7837409675121307e-002 + + + <_> + + 0 -1 729 -2.5132454931735992e-002 + + + 2.9875260591506958e-001 -5.0642240792512894e-002 + + + <_> + + 0 -1 893 1.6763649880886078e-002 + + + -5.6825786828994751e-002 2.6688432693481445e-001 + + + <_> + + 0 -1 5 2.4304956197738647e-002 + + + -7.3691956698894501e-002 1.8922545015811920e-001 + + + <_> + + 0 -1 604 5.2945837378501892e-003 + + + -6.8203508853912354e-002 2.3238344490528107e-001 + + + <_> + + 0 -1 146 1.7194304615259171e-002 + + + -4.1591234505176544e-002 3.3211585879325867e-001 + + + <_> + + 0 -1 119 -1.0534466244280338e-002 + + + 2.0838305354118347e-001 -8.1538312137126923e-002 + + + <_> + + 0 -1 171 3.3360864967107773e-002 + + + -6.7458741366863251e-002 2.5852772593498230e-001 + + + <_> + + 0 -1 183 4.6436764299869537e-002 + + + 1.9892208278179169e-002 -8.1141030788421631e-001 + + + <_> + + 0 -1 8 -4.1056036949157715e-002 + + + -4.9327704310417175e-001 2.3769956082105637e-002 + + + <_> + + 0 -1 514 -1.8552202731370926e-002 + + + -5.7725781202316284e-001 2.1620772778987885e-002 + + + <_> + + 0 -1 310 -1.5498932916671038e-003 + + + 1.3356749713420868e-001 -1.0274448245763779e-001 + + + <_> + + 0 -1 144 -1.2870179489254951e-002 + + + -6.8844175338745117e-001 1.6567943617701530e-002 + + + <_> + + 0 -1 162 1.1060645803809166e-002 + + + -6.5967611968517303e-002 2.0074956119060516e-001 + + + <_> + + 0 -1 737 -1.9628754816949368e-003 + + + 1.7064040899276733e-001 -7.5410693883895874e-002 + + + <_> + + 0 -1 118 3.2771207392215729e-002 + + + 1.7548711970448494e-002 -7.5103056430816650e-001 + + + <_> + + 0 -1 62 -5.6525086984038353e-004 + + + 1.0811340808868408e-001 -1.1322978138923645e-001 + + + <_> + + 0 -1 920 6.6395318135619164e-003 + + + -4.8233803361654282e-002 2.5985202193260193e-001 + + + <_> + + 0 -1 933 5.3288890048861504e-003 + + + -5.8816779404878616e-002 2.0709130167961121e-001 + + + <_> + + 0 -1 30 9.5648169517517090e-002 + + + -2.3178230971097946e-002 5.3592687845230103e-001 + + + <_> + + 0 -1 505 2.3851044476032257e-002 + + + 3.9325568825006485e-002 -3.2090389728546143e-001 + + + <_> + + 0 -1 380 4.9215428531169891e-002 + + + -8.0275781452655792e-002 2.1604713797569275e-001 + + + <_> + + 0 -1 404 5.1129907369613647e-002 + + + 2.0917052403092384e-002 -6.7675739526748657e-001 + + + <_> + + 0 -1 470 -9.5789285842329264e-004 + + + 1.3741976022720337e-001 -9.2351287603378296e-002 + + + <_> + + 0 -1 38 4.3797735124826431e-002 + + + -5.2134189754724503e-002 2.3939897119998932e-001 + + + <_> + + 0 -1 177 -3.7566445767879486e-002 + + + -5.0337618589401245e-001 3.2042562961578369e-002 + + + <_> + + 0 -1 293 -6.6379196941852570e-003 + + + 2.3610880970954895e-001 -5.9629496186971664e-002 + + + <_> + + 0 -1 569 4.4785980135202408e-003 + + + -6.9053784012794495e-002 1.8493640422821045e-001 + + + <_> + + 0 -1 680 -1.9650494214147329e-003 + + + -5.0821167230606079e-001 2.3264253512024879e-002 + + + <_> + + 0 -1 826 -8.4884336683899164e-004 + + + 1.7365188896656036e-001 -7.3235429823398590e-002 + + + <_> + + 0 -1 421 -5.7333573698997498e-002 + + + -3.1190565228462219e-001 4.1780386120080948e-002 + + + <_> + + 0 -1 599 1.8632253631949425e-003 + + + 3.1603202223777771e-002 -3.6946067214012146e-001 + + + <_> + + 0 -1 336 -2.0456001162528992e-002 + + + 3.0203589797019958e-001 -4.1565753519535065e-002 + + + <_> + + 0 -1 938 5.5945245549082756e-003 + + + -3.2002035528421402e-002 3.7638634443283081e-001 + + + <_> + + 0 -1 152 -1.8559835851192474e-002 + + + 2.4045053124427795e-001 -5.1895260810852051e-002 + + + <_> + + 0 -1 706 -1.0816272348165512e-002 + + + -4.1922396421432495e-001 3.0057143419981003e-002 + + + <_> + + 0 -1 717 -1.5897199045866728e-003 + + + -3.8717699050903320e-001 2.7556220069527626e-002 + + + <_> + + 0 -1 337 -1.8832697533071041e-003 + + + 1.8341954052448273e-001 -6.8402133882045746e-002 + + + <_> + + 0 -1 107 -6.8602010607719421e-002 + + + -4.3040940165519714e-001 2.7811320498585701e-002 + + + <_> + + 0 -1 605 3.1656727194786072e-002 + + + 1.4831826090812683e-002 -6.9200241565704346e-001 + + + <_> + + 0 -1 178 -1.1699689552187920e-002 + + + -4.7378033399581909e-001 2.2049939259886742e-002 + + + <_> + + 0 -1 175 -4.9252226948738098e-002 + + + 2.0226360857486725e-001 -5.8283366262912750e-002 + + + <_> + + 0 -1 200 -1.4749905094504356e-002 + + + -6.3420587778091431e-001 1.7177773639559746e-002 + + + <_> + + 0 -1 594 1.3355823233723640e-002 + + + -5.3626276552677155e-002 2.3158134520053864e-001 + + + <_> + + 0 -1 688 2.7912877500057220e-002 + + + -3.2106213271617889e-002 3.9656600356101990e-001 + + + <_> + + 0 -1 433 -1.8341368064284325e-002 + + + 3.0023518204689026e-001 -3.9390310645103455e-002 + + + <_> + + 0 -1 320 3.3382259309291840e-002 + + + -5.0307501107454300e-002 2.3759432137012482e-001 + + + <_> + + 0 -1 414 2.2881597280502319e-002 + + + 2.9198208823800087e-002 -4.3145897984504700e-001 + + + <_> + + 0 -1 271 1.7183616757392883e-001 + + + 1.9492210820317268e-002 -5.7107782363891602e-001 + + + <_> + + 0 -1 889 4.3015915900468826e-002 + + + 1.8091753125190735e-002 -5.8863103389739990e-001 + + + <_> + + 0 -1 545 -1.2893548235297203e-002 + + + 1.4482001960277557e-001 -8.2013383507728577e-002 + + + <_> + + 0 -1 910 5.9737069532275200e-003 + + + -7.2960324585437775e-002 1.6368763148784637e-001 + + + <_> + + 0 -1 664 1.1285657994449139e-002 + + + -4.4454183429479599e-002 2.5658103823661804e-001 + + + <_> + + 0 -1 951 -9.9752098321914673e-004 + + + -2.6904699206352234e-001 4.0726143866777420e-002 + + + <_> + + 0 -1 111 2.1743077784776688e-002 + + + 1.7429182305932045e-002 -6.2877011299133301e-001 + + + <_> + + 0 -1 866 3.7145437672734261e-003 + + + -8.1450186669826508e-002 1.3246190547943115e-001 + + + <_> + + 0 -1 888 -1.5904067084193230e-002 + + + 3.2105255126953125e-001 -3.4731235355138779e-002 + + + <_> + + 0 -1 907 -2.6992281898856163e-002 + + + -6.8835800886154175e-001 1.6344616189599037e-002 + + + <_> + + 0 -1 830 6.8261945853009820e-004 + + + -1.1232791095972061e-001 9.8401591181755066e-002 + + + <_> + + 0 -1 807 -2.5938652455806732e-002 + + + -5.0289982557296753e-001 2.3814825341105461e-002 + + + + + + + <_> + + <_> + 0 0 2 2 -1. + + <_> + 1 0 1 2 2. + + + 0 + + <_> + + <_> + 0 0 1 6 -1. + + <_> + 0 2 1 2 3. + + + 0 + + <_> + + <_> + 0 0 2 4 -1. + + <_> + 1 0 1 4 2. + + + 0 + + <_> + + <_> + 0 0 2 6 -1. + + <_> + 0 2 2 2 3. + + + 0 + + <_> + + <_> + 0 0 8 7 -1. + + <_> + 2 0 4 7 2. + + + 0 + + <_> + + <_> + 0 0 8 8 -1. + + <_> + 2 0 4 8 2. + + + 0 + + <_> + + <_> + 0 0 6 13 -1. + + <_> + 2 0 2 13 3. + + + 0 + + <_> + + <_> + 0 0 12 13 -1. + + <_> + 3 0 6 13 2. + + + 0 + + <_> + + <_> + 0 0 12 4 -1. + + <_> + 4 0 4 4 3. + + + 0 + + <_> + + <_> + 0 0 18 4 -1. + + <_> + 6 0 6 4 3. + + + 0 + + <_> + + <_> + 0 0 36 11 -1. + + <_> + 12 0 12 11 3. + + + 0 + + <_> + + <_> + 0 0 17 12 -1. + + <_> + 0 4 17 4 3. + + + 0 + + <_> + + <_> + 0 0 36 13 -1. + + <_> + 18 0 18 13 2. + + + 0 + + <_> + + <_> + 0 0 22 2 -1. + + <_> + 0 1 22 1 2. + + + 0 + + <_> + + <_> + 0 0 24 9 -1. + + <_> + 0 3 24 3 3. + + + 0 + + <_> + + <_> + 0 0 29 2 -1. + + <_> + 0 1 29 1 2. + + + 0 + + <_> + + <_> + 0 0 34 2 -1. + + <_> + 0 1 34 1 2. + + + 0 + + <_> + + <_> + 0 0 36 8 -1. + + <_> + 0 2 36 4 2. + + + 0 + + <_> + + <_> + 0 0 42 6 -1. + + <_> + 0 3 42 3 2. + + + 0 + + <_> + + <_> + 0 0 44 2 -1. + + <_> + 0 1 44 1 2. + + + 0 + + <_> + + <_> + 0 0 51 8 -1. + + <_> + 0 2 51 4 2. + + + 0 + + <_> + + <_> + 0 1 2 9 -1. + + <_> + 1 1 1 9 2. + + + 0 + + <_> + + <_> + 0 1 2 12 -1. + + <_> + 1 1 1 12 2. + + + 0 + + <_> + + <_> + 0 1 2 12 -1. + + <_> + 0 7 2 6 2. + + + 0 + + <_> + + <_> + 0 1 8 10 -1. + + <_> + 0 1 4 5 2. + + <_> + 4 6 4 5 2. + + + 0 + + <_> + + <_> + 0 1 7 12 -1. + + <_> + 0 4 7 6 2. + + + 0 + + <_> + + <_> + 0 1 12 12 -1. + + <_> + 0 5 12 4 3. + + + 0 + + <_> + + <_> + 0 1 17 12 -1. + + <_> + 0 5 17 4 3. + + + 0 + + <_> + + <_> + 0 2 6 2 -1. + + <_> + 2 2 2 2 3. + + + 0 + + <_> + + <_> + 0 2 4 6 -1. + + <_> + 2 2 2 6 2. + + + 0 + + <_> + + <_> + 0 2 20 7 -1. + + <_> + 5 2 10 7 2. + + + 0 + + <_> + + <_> + 0 3 1 4 -1. + + <_> + 0 5 1 2 2. + + + 0 + + <_> + + <_> + 0 3 4 2 -1. + + <_> + 1 3 2 2 2. + + + 0 + + <_> + + <_> + 0 3 6 9 -1. + + <_> + 2 3 2 9 3. + + + 0 + + <_> + + <_> + 0 3 4 10 -1. + + <_> + 2 3 2 10 2. + + + 0 + + <_> + + <_> + 0 3 6 10 -1. + + <_> + 2 3 2 10 3. + + + 0 + + <_> + + <_> + 0 3 9 3 -1. + + <_> + 3 3 3 3 3. + + + 0 + + <_> + + <_> + 0 3 3 9 -1. + + <_> + 0 6 3 3 3. + + + 0 + + <_> + + <_> + 0 3 9 6 -1. + + <_> + 3 3 3 6 3. + + + 0 + + <_> + + <_> + 0 3 8 4 -1. + + <_> + 0 3 4 2 2. + + <_> + 4 5 4 2 2. + + + 0 + + <_> + + <_> + 0 3 8 6 -1. + + <_> + 0 3 4 3 2. + + <_> + 4 6 4 3 2. + + + 0 + + <_> + + <_> + 0 3 16 10 -1. + + <_> + 4 3 8 10 2. + + + 0 + + <_> + + <_> + 0 3 10 6 -1. + + <_> + 0 5 10 2 3. + + + 0 + + <_> + + <_> + 0 3 16 8 -1. + + <_> + 0 7 16 4 2. + + + 0 + + <_> + + <_> + 0 3 51 8 -1. + + <_> + 0 7 51 4 2. + + + 0 + + <_> + + <_> + 0 4 3 3 -1. + + <_> + 1 5 1 1 9. + + + 0 + + <_> + + <_> + 0 4 3 9 -1. + + <_> + 0 7 3 3 3. + + + 0 + + <_> + + <_> + 0 4 20 7 -1. + + <_> + 10 4 10 7 2. + + + 0 + + <_> + + <_> + 0 4 34 9 -1. + + <_> + 17 4 17 9 2. + + + 0 + + <_> + + <_> + 0 5 1 4 -1. + + <_> + 0 7 1 2 2. + + + 0 + + <_> + + <_> + 0 5 2 8 -1. + + <_> + 1 5 1 8 2. + + + 0 + + <_> + + <_> + 0 5 10 4 -1. + + <_> + 0 7 10 2 2. + + + 0 + + <_> + + <_> + 0 5 22 6 -1. + + <_> + 0 8 22 3 2. + + + 0 + + <_> + + <_> + 0 6 2 7 -1. + + <_> + 1 6 1 7 2. + + + 0 + + <_> + + <_> + 0 6 4 2 -1. + + <_> + 2 6 2 2 2. + + + 0 + + <_> + + <_> + 0 6 6 5 -1. + + <_> + 2 6 2 5 3. + + + 0 + + <_> + + <_> + 0 6 3 6 -1. + + <_> + 0 8 3 2 3. + + + 0 + + <_> + + <_> + 0 6 4 6 -1. + + <_> + 0 9 4 3 2. + + + 0 + + <_> + + <_> + 0 6 13 4 -1. + + <_> + 0 8 13 2 2. + + + 0 + + <_> + + <_> + 0 6 14 4 -1. + + <_> + 0 8 14 2 2. + + + 0 + + <_> + + <_> + 0 6 33 4 -1. + + <_> + 0 8 33 2 2. + + + 0 + + <_> + + <_> + 0 6 44 6 -1. + + <_> + 0 8 44 2 3. + + + 0 + + <_> + + <_> + 0 7 1 6 -1. + + <_> + 0 10 1 3 2. + + + 0 + + <_> + + <_> + 0 7 7 6 -1. + + <_> + 0 10 7 3 2. + + + 0 + + <_> + + <_> + 0 7 25 6 -1. + + <_> + 0 9 25 2 3. + + + 0 + + <_> + + <_> + 0 7 32 3 -1. + + <_> + 0 8 32 1 3. + + + 0 + + <_> + + <_> + 0 8 12 5 -1. + + <_> + 3 8 6 5 2. + + + 0 + + <_> + + <_> + 0 8 12 2 -1. + + <_> + 6 8 6 2 2. + + + 0 + + <_> + + <_> + 0 8 21 4 -1. + + <_> + 7 8 7 4 3. + + + 0 + + <_> + + <_> + 0 8 25 4 -1. + + <_> + 0 9 25 2 2. + + + 0 + + <_> + + <_> + 0 9 15 4 -1. + + <_> + 5 9 5 4 3. + + + 0 + + <_> + + <_> + 0 9 28 4 -1. + + <_> + 7 9 14 4 2. + + + 0 + + <_> + + <_> + 0 9 28 4 -1. + + <_> + 14 9 14 4 2. + + + 0 + + <_> + + <_> + 0 9 46 2 -1. + + <_> + 0 10 46 1 2. + + + 0 + + <_> + + <_> + 0 9 50 2 -1. + + <_> + 0 10 50 1 2. + + + 0 + + <_> + + <_> + 0 10 6 3 -1. + + <_> + 3 10 3 3 2. + + + 0 + + <_> + + <_> + 0 10 12 3 -1. + + <_> + 3 10 6 3 2. + + + 0 + + <_> + + <_> + 0 10 10 3 -1. + + <_> + 5 10 5 3 2. + + + 0 + + <_> + + <_> + 0 10 12 3 -1. + + <_> + 6 10 6 3 2. + + + 0 + + <_> + + <_> + 0 11 5 2 -1. + + <_> + 0 12 5 1 2. + + + 0 + + <_> + + <_> + 0 11 26 2 -1. + + <_> + 13 11 13 2 2. + + + 0 + + <_> + + <_> + 0 11 28 2 -1. + + <_> + 14 11 14 2 2. + + + 0 + + <_> + + <_> + 0 11 42 2 -1. + + <_> + 14 11 14 2 3. + + + 0 + + <_> + + <_> + 0 11 19 2 -1. + + <_> + 0 12 19 1 2. + + + 0 + + <_> + + <_> + 0 11 23 2 -1. + + <_> + 0 12 23 1 2. + + + 0 + + <_> + + <_> + 1 0 5 12 -1. + + <_> + 1 3 5 6 2. + + + 0 + + <_> + + <_> + 1 0 15 4 -1. + + <_> + 6 0 5 4 3. + + + 0 + + <_> + + <_> + 1 0 14 1 -1. + + <_> + 8 0 7 1 2. + + + 0 + + <_> + + <_> + 1 0 8 2 -1. + + <_> + 1 1 8 1 2. + + + 0 + + <_> + + <_> + 1 0 9 2 -1. + + <_> + 1 1 9 1 2. + + + 0 + + <_> + + <_> + 1 0 11 2 -1. + + <_> + 1 1 11 1 2. + + + 0 + + <_> + + <_> + 1 0 17 9 -1. + + <_> + 1 3 17 3 3. + + + 0 + + <_> + + <_> + 1 0 21 2 -1. + + <_> + 1 1 21 1 2. + + + 0 + + <_> + + <_> + 1 0 41 6 -1. + + <_> + 1 3 41 3 2. + + + 0 + + <_> + + <_> + 1 0 47 2 -1. + + <_> + 1 1 47 1 2. + + + 0 + + <_> + + <_> + 1 1 6 8 -1. + + <_> + 3 1 2 8 3. + + + 0 + + <_> + + <_> + 1 1 6 9 -1. + + <_> + 3 1 2 9 3. + + + 0 + + <_> + + <_> + 1 1 6 11 -1. + + <_> + 3 1 2 11 3. + + + 0 + + <_> + + <_> + 1 1 9 5 -1. + + <_> + 4 1 3 5 3. + + + 0 + + <_> + + <_> + 1 1 20 7 -1. + + <_> + 6 1 10 7 2. + + + 0 + + <_> + + <_> + 1 1 20 8 -1. + + <_> + 6 1 10 8 2. + + + 0 + + <_> + + <_> + 1 1 9 9 -1. + + <_> + 1 4 9 3 3. + + + 0 + + <_> + + <_> + 1 1 27 10 -1. + + <_> + 10 1 9 10 3. + + + 0 + + <_> + + <_> + 1 1 10 6 -1. + + <_> + 1 3 10 2 3. + + + 0 + + <_> + + <_> + 1 2 4 6 -1. + + <_> + 1 2 2 3 2. + + <_> + 3 5 2 3 2. + + + 0 + + <_> + + <_> + 1 2 20 8 -1. + + <_> + 6 2 10 8 2. + + + 0 + + <_> + + <_> + 1 2 13 10 -1. + + <_> + 1 7 13 5 2. + + + 0 + + <_> + + <_> + 1 2 34 7 -1. + + <_> + 18 2 17 7 2. + + + 0 + + <_> + + <_> + 1 3 4 3 -1. + + <_> + 2 3 2 3 2. + + + 0 + + <_> + + <_> + 1 3 6 8 -1. + + <_> + 3 3 2 8 3. + + + 0 + + <_> + + <_> + 1 3 6 4 -1. + + <_> + 1 3 3 2 2. + + <_> + 4 5 3 2 2. + + + 0 + + <_> + + <_> + 1 3 6 8 -1. + + <_> + 1 3 3 4 2. + + <_> + 4 7 3 4 2. + + + 0 + + <_> + + <_> + 1 3 6 5 -1. + + <_> + 4 3 3 5 2. + + + 0 + + <_> + + <_> + 1 3 15 3 -1. + + <_> + 6 3 5 3 3. + + + 0 + + <_> + + <_> + 1 3 36 9 -1. + + <_> + 13 3 12 9 3. + + + 0 + + <_> + + <_> + 1 3 36 10 -1. + + <_> + 13 3 12 10 3. + + + 0 + + <_> + + <_> + 1 4 4 2 -1. + + <_> + 2 4 2 2 2. + + + 0 + + <_> + + <_> + 1 4 6 2 -1. + + <_> + 3 4 2 2 3. + + + 0 + + <_> + + <_> + 1 4 6 3 -1. + + <_> + 3 4 2 3 3. + + + 0 + + <_> + + <_> + 1 4 6 4 -1. + + <_> + 4 4 3 4 2. + + + 0 + + <_> + + <_> + 1 4 6 6 -1. + + <_> + 4 4 3 6 2. + + + 0 + + <_> + + <_> + 1 4 9 4 -1. + + <_> + 1 6 9 2 2. + + + 0 + + <_> + + <_> + 1 5 12 3 -1. + + <_> + 5 6 4 1 9. + + + 0 + + <_> + + <_> + 1 7 16 6 -1. + + <_> + 1 7 8 3 2. + + <_> + 9 10 8 3 2. + + + 0 + + <_> + + <_> + 1 11 46 2 -1. + + <_> + 1 12 46 1 2. + + + 0 + + <_> + + <_> + 1 11 50 2 -1. + + <_> + 1 12 50 1 2. + + + 0 + + <_> + + <_> + 1 12 50 1 -1. + + <_> + 26 12 25 1 2. + + + 0 + + <_> + + <_> + 2 0 6 13 -1. + + <_> + 4 0 2 13 3. + + + 0 + + <_> + + <_> + 2 0 24 3 -1. + + <_> + 8 0 12 3 2. + + + 0 + + <_> + + <_> + 2 0 12 10 -1. + + <_> + 8 0 6 10 2. + + + 0 + + <_> + + <_> + 2 0 33 11 -1. + + <_> + 13 0 11 11 3. + + + 0 + + <_> + + <_> + 2 0 20 2 -1. + + <_> + 2 1 20 1 2. + + + 0 + + <_> + + <_> + 2 0 48 12 -1. + + <_> + 26 0 24 12 2. + + + 0 + + <_> + + <_> + 2 1 4 6 -1. + + <_> + 2 1 2 3 2. + + <_> + 4 4 2 3 2. + + + 0 + + <_> + + <_> + 2 1 16 9 -1. + + <_> + 10 1 8 9 2. + + + 0 + + <_> + + <_> + 2 1 11 9 -1. + + <_> + 2 4 11 3 3. + + + 0 + + <_> + + <_> + 2 1 18 10 -1. + + <_> + 2 6 18 5 2. + + + 0 + + <_> + + <_> + 2 2 3 2 -1. + + <_> + 3 3 1 2 3. + + + 1 + + <_> + + <_> + 2 3 16 1 -1. + + <_> + 6 3 8 1 2. + + + 0 + + <_> + + <_> + 2 3 25 6 -1. + + <_> + 2 6 25 3 2. + + + 0 + + <_> + + <_> + 2 4 4 2 -1. + + <_> + 3 4 2 2 2. + + + 0 + + <_> + + <_> + 2 5 2 8 -1. + + <_> + 2 5 1 4 2. + + <_> + 3 9 1 4 2. + + + 0 + + <_> + + <_> + 2 5 6 4 -1. + + <_> + 5 5 3 4 2. + + + 0 + + <_> + + <_> + 2 5 10 8 -1. + + <_> + 2 7 10 4 2. + + + 0 + + <_> + + <_> + 2 7 4 6 -1. + + <_> + 2 7 2 3 2. + + <_> + 4 10 2 3 2. + + + 0 + + <_> + + <_> + 2 7 4 4 -1. + + <_> + 2 9 4 2 2. + + + 0 + + <_> + + <_> + 2 8 14 2 -1. + + <_> + 9 8 7 2 2. + + + 0 + + <_> + + <_> + 2 8 24 5 -1. + + <_> + 14 8 12 5 2. + + + 0 + + <_> + + <_> + 2 9 8 3 -1. + + <_> + 6 9 4 3 2. + + + 0 + + <_> + + <_> + 2 9 12 4 -1. + + <_> + 6 9 4 4 3. + + + 0 + + <_> + + <_> + 2 9 32 4 -1. + + <_> + 2 9 16 2 2. + + <_> + 18 11 16 2 2. + + + 0 + + <_> + + <_> + 2 10 12 2 -1. + + <_> + 2 10 6 1 2. + + <_> + 8 11 6 1 2. + + + 0 + + <_> + + <_> + 2 11 38 1 -1. + + <_> + 21 11 19 1 2. + + + 0 + + <_> + + <_> + 2 12 32 1 -1. + + <_> + 18 12 16 1 2. + + + 0 + + <_> + + <_> + 3 0 1 2 -1. + + <_> + 3 1 1 1 2. + + + 0 + + <_> + + <_> + 3 0 3 9 -1. + + <_> + 4 3 1 3 9. + + + 0 + + <_> + + <_> + 3 0 6 11 -1. + + <_> + 5 0 2 11 3. + + + 0 + + <_> + + <_> + 3 0 6 12 -1. + + <_> + 5 0 2 12 3. + + + 0 + + <_> + + <_> + 3 0 16 10 -1. + + <_> + 11 0 8 10 2. + + + 0 + + <_> + + <_> + 3 0 42 9 -1. + + <_> + 17 3 14 3 9. + + + 0 + + <_> + + <_> + 3 0 15 6 -1. + + <_> + 3 3 15 3 2. + + + 0 + + <_> + + <_> + 3 0 30 13 -1. + + <_> + 18 0 15 13 2. + + + 0 + + <_> + + <_> + 3 1 3 9 -1. + + <_> + 4 1 1 9 3. + + + 0 + + <_> + + <_> + 3 1 6 10 -1. + + <_> + 5 1 2 10 3. + + + 0 + + <_> + + <_> + 3 1 15 12 -1. + + <_> + 8 5 5 4 9. + + + 0 + + <_> + + <_> + 3 1 21 3 -1. + + <_> + 10 1 7 3 3. + + + 0 + + <_> + + <_> + 3 1 32 7 -1. + + <_> + 11 1 16 7 2. + + + 0 + + <_> + + <_> + 3 1 33 11 -1. + + <_> + 14 1 11 11 3. + + + 0 + + <_> + + <_> + 3 1 42 9 -1. + + <_> + 17 4 14 3 9. + + + 0 + + <_> + + <_> + 3 1 29 10 -1. + + <_> + 3 6 29 5 2. + + + 0 + + <_> + + <_> + 3 2 1 2 -1. + + <_> + 3 2 1 1 2. + + + 1 + + <_> + + <_> + 3 2 6 11 -1. + + <_> + 5 2 2 11 3. + + + 0 + + <_> + + <_> + 3 2 16 3 -1. + + <_> + 7 2 8 3 2. + + + 0 + + <_> + + <_> + 3 2 46 6 -1. + + <_> + 3 5 46 3 2. + + + 0 + + <_> + + <_> + 3 3 14 10 -1. + + <_> + 10 3 7 10 2. + + + 0 + + <_> + + <_> + 3 3 40 5 -1. + + <_> + 13 3 20 5 2. + + + 0 + + <_> + + <_> + 3 5 2 2 -1. + + <_> + 4 5 1 2 2. + + + 0 + + <_> + + <_> + 3 5 16 5 -1. + + <_> + 7 5 8 5 2. + + + 0 + + <_> + + <_> + 3 5 16 2 -1. + + <_> + 3 5 8 1 2. + + <_> + 11 6 8 1 2. + + + 0 + + <_> + + <_> + 3 6 8 3 -1. + + <_> + 7 6 4 3 2. + + + 0 + + <_> + + <_> + 3 7 16 6 -1. + + <_> + 11 7 8 6 2. + + + 0 + + <_> + + <_> + 3 7 45 2 -1. + + <_> + 3 8 45 1 2. + + + 0 + + <_> + + <_> + 3 9 9 4 -1. + + <_> + 6 9 3 4 3. + + + 0 + + <_> + + <_> + 3 10 6 3 -1. + + <_> + 5 11 2 1 9. + + + 0 + + <_> + + <_> + 3 11 9 2 -1. + + <_> + 3 12 9 1 2. + + + 0 + + <_> + + <_> + 3 11 48 2 -1. + + <_> + 3 12 48 1 2. + + + 0 + + <_> + + <_> + 4 0 4 1 -1. + + <_> + 4 0 2 1 2. + + + 1 + + <_> + + <_> + 4 0 6 11 -1. + + <_> + 6 0 2 11 3. + + + 0 + + <_> + + <_> + 4 0 4 12 -1. + + <_> + 4 3 4 6 2. + + + 0 + + <_> + + <_> + 4 0 18 4 -1. + + <_> + 10 0 6 4 3. + + + 0 + + <_> + + <_> + 4 1 6 9 -1. + + <_> + 6 1 2 9 3. + + + 0 + + <_> + + <_> + 4 1 14 2 -1. + + <_> + 11 1 7 2 2. + + + 0 + + <_> + + <_> + 4 1 36 4 -1. + + <_> + 22 1 18 4 2. + + + 0 + + <_> + + <_> + 4 2 3 11 -1. + + <_> + 5 2 1 11 3. + + + 0 + + <_> + + <_> + 4 2 6 5 -1. + + <_> + 6 2 2 5 3. + + + 0 + + <_> + + <_> + 4 2 6 10 -1. + + <_> + 6 2 2 10 3. + + + 0 + + <_> + + <_> + 4 2 10 10 -1. + + <_> + 4 2 5 5 2. + + <_> + 9 7 5 5 2. + + + 0 + + <_> + + <_> + 4 2 21 3 -1. + + <_> + 11 2 7 3 3. + + + 0 + + <_> + + <_> + 4 2 27 8 -1. + + <_> + 4 4 27 4 2. + + + 0 + + <_> + + <_> + 4 3 3 2 -1. + + <_> + 5 4 1 2 3. + + + 1 + + <_> + + <_> + 4 3 2 6 -1. + + <_> + 4 5 2 2 3. + + + 0 + + <_> + + <_> + 4 3 6 5 -1. + + <_> + 6 3 2 5 3. + + + 0 + + <_> + + <_> + 4 3 30 6 -1. + + <_> + 14 5 10 2 9. + + + 0 + + <_> + + <_> + 4 3 37 8 -1. + + <_> + 4 5 37 4 2. + + + 0 + + <_> + + <_> + 4 4 4 2 -1. + + <_> + 5 5 2 2 2. + + + 1 + + <_> + + <_> + 4 4 4 2 -1. + + <_> + 4 4 2 2 2. + + + 1 + + <_> + + <_> + 4 4 7 3 -1. + + <_> + 4 5 7 1 3. + + + 0 + + <_> + + <_> + 4 4 23 9 -1. + + <_> + 4 7 23 3 3. + + + 0 + + <_> + + <_> + 4 5 5 4 -1. + + <_> + 4 7 5 2 2. + + + 0 + + <_> + + <_> + 4 7 42 4 -1. + + <_> + 4 8 42 2 2. + + + 0 + + <_> + + <_> + 4 8 16 1 -1. + + <_> + 12 8 8 1 2. + + + 0 + + <_> + + <_> + 4 9 24 4 -1. + + <_> + 10 9 12 4 2. + + + 0 + + <_> + + <_> + 4 10 10 2 -1. + + <_> + 4 10 5 1 2. + + <_> + 9 11 5 1 2. + + + 0 + + <_> + + <_> + 4 10 7 2 -1. + + <_> + 4 11 7 1 2. + + + 0 + + <_> + + <_> + 5 0 16 8 -1. + + <_> + 9 0 8 8 2. + + + 0 + + <_> + + <_> + 5 0 24 13 -1. + + <_> + 13 0 8 13 3. + + + 0 + + <_> + + <_> + 5 1 8 12 -1. + + <_> + 5 1 4 6 2. + + <_> + 9 7 4 6 2. + + + 0 + + <_> + + <_> + 5 1 36 12 -1. + + <_> + 5 7 36 6 2. + + + 0 + + <_> + + <_> + 5 2 3 10 -1. + + <_> + 6 2 1 10 3. + + + 0 + + <_> + + <_> + 5 2 6 6 -1. + + <_> + 7 2 2 6 3. + + + 0 + + <_> + + <_> + 5 2 3 6 -1. + + <_> + 5 5 3 3 2. + + + 0 + + <_> + + <_> + 5 2 12 9 -1. + + <_> + 5 5 12 3 3. + + + 0 + + <_> + + <_> + 5 2 34 8 -1. + + <_> + 5 6 34 4 2. + + + 0 + + <_> + + <_> + 5 3 3 6 -1. + + <_> + 6 3 1 6 3. + + + 0 + + <_> + + <_> + 5 3 6 4 -1. + + <_> + 7 3 2 4 3. + + + 0 + + <_> + + <_> + 5 3 4 5 -1. + + <_> + 7 3 2 5 2. + + + 0 + + <_> + + <_> + 5 3 4 6 -1. + + <_> + 7 3 2 6 2. + + + 0 + + <_> + + <_> + 5 3 4 6 -1. + + <_> + 5 6 4 3 2. + + + 0 + + <_> + + <_> + 5 3 21 8 -1. + + <_> + 12 3 7 8 3. + + + 0 + + <_> + + <_> + 5 4 3 7 -1. + + <_> + 6 4 1 7 3. + + + 0 + + <_> + + <_> + 5 4 3 9 -1. + + <_> + 6 4 1 9 3. + + + 0 + + <_> + + <_> + 5 4 18 6 -1. + + <_> + 11 6 6 2 9. + + + 0 + + <_> + + <_> + 5 4 27 9 -1. + + <_> + 14 7 9 3 9. + + + 0 + + <_> + + <_> + 5 4 24 6 -1. + + <_> + 17 4 12 6 2. + + + 0 + + <_> + + <_> + 5 5 4 2 -1. + + <_> + 6 5 2 2 2. + + + 0 + + <_> + + <_> + 5 5 2 3 -1. + + <_> + 6 5 1 3 2. + + + 0 + + <_> + + <_> + 5 5 3 4 -1. + + <_> + 6 5 1 4 3. + + + 0 + + <_> + + <_> + 5 5 4 7 -1. + + <_> + 6 5 2 7 2. + + + 0 + + <_> + + <_> + 5 5 4 2 -1. + + <_> + 5 5 2 2 2. + + + 1 + + <_> + + <_> + 5 5 6 4 -1. + + <_> + 7 5 2 4 3. + + + 0 + + <_> + + <_> + 5 5 4 4 -1. + + <_> + 5 7 4 2 2. + + + 0 + + <_> + + <_> + 5 6 4 6 -1. + + <_> + 6 6 2 6 2. + + + 0 + + <_> + + <_> + 5 6 12 2 -1. + + <_> + 11 6 6 2 2. + + + 0 + + <_> + + <_> + 5 7 3 6 -1. + + <_> + 5 9 3 2 3. + + + 0 + + <_> + + <_> + 5 7 6 6 -1. + + <_> + 5 7 3 3 2. + + <_> + 8 10 3 3 2. + + + 0 + + <_> + + <_> + 5 7 6 6 -1. + + <_> + 8 7 3 6 2. + + + 0 + + <_> + + <_> + 5 7 12 6 -1. + + <_> + 5 10 12 3 2. + + + 0 + + <_> + + <_> + 5 9 9 4 -1. + + <_> + 8 9 3 4 3. + + + 0 + + <_> + + <_> + 5 10 6 2 -1. + + <_> + 5 10 3 1 2. + + <_> + 8 11 3 1 2. + + + 0 + + <_> + + <_> + 5 10 20 3 -1. + + <_> + 10 10 10 3 2. + + + 0 + + <_> + + <_> + 5 11 16 2 -1. + + <_> + 5 12 16 1 2. + + + 0 + + <_> + + <_> + 6 0 2 6 -1. + + <_> + 4 2 2 2 3. + + + 1 + + <_> + + <_> + 6 0 12 1 -1. + + <_> + 9 3 6 1 2. + + + 1 + + <_> + + <_> + 6 0 3 6 -1. + + <_> + 4 2 3 2 3. + + + 1 + + <_> + + <_> + 6 0 6 5 -1. + + <_> + 6 0 3 5 2. + + + 1 + + <_> + + <_> + 6 0 8 2 -1. + + <_> + 6 0 4 1 2. + + <_> + 10 1 4 1 2. + + + 0 + + <_> + + <_> + 6 0 33 13 -1. + + <_> + 17 0 11 13 3. + + + 0 + + <_> + + <_> + 6 1 4 5 -1. + + <_> + 7 1 2 5 2. + + + 0 + + <_> + + <_> + 6 1 2 11 -1. + + <_> + 7 1 1 11 2. + + + 0 + + <_> + + <_> + 6 1 6 12 -1. + + <_> + 8 1 2 12 3. + + + 0 + + <_> + + <_> + 6 1 12 11 -1. + + <_> + 12 1 6 11 2. + + + 0 + + <_> + + <_> + 6 2 4 4 -1. + + <_> + 7 2 2 4 2. + + + 0 + + <_> + + <_> + 6 2 3 7 -1. + + <_> + 7 2 1 7 3. + + + 0 + + <_> + + <_> + 6 2 12 10 -1. + + <_> + 12 2 6 10 2. + + + 0 + + <_> + + <_> + 6 3 1 6 -1. + + <_> + 6 6 1 3 2. + + + 0 + + <_> + + <_> + 6 3 3 8 -1. + + <_> + 7 3 1 8 3. + + + 0 + + <_> + + <_> + 6 3 37 6 -1. + + <_> + 6 6 37 3 2. + + + 0 + + <_> + + <_> + 6 4 3 4 -1. + + <_> + 7 4 1 4 3. + + + 0 + + <_> + + <_> + 6 4 8 2 -1. + + <_> + 8 4 4 2 2. + + + 0 + + <_> + + <_> + 6 4 3 4 -1. + + <_> + 6 6 3 2 2. + + + 0 + + <_> + + <_> + 6 4 3 6 -1. + + <_> + 6 6 3 2 3. + + + 0 + + <_> + + <_> + 6 4 9 9 -1. + + <_> + 9 7 3 3 9. + + + 0 + + <_> + + <_> + 6 6 4 5 -1. + + <_> + 7 6 2 5 2. + + + 0 + + <_> + + <_> + 6 6 4 6 -1. + + <_> + 7 6 2 6 2. + + + 0 + + <_> + + <_> + 6 9 6 4 -1. + + <_> + 6 9 3 2 2. + + <_> + 9 11 3 2 2. + + + 0 + + <_> + + <_> + 6 10 20 3 -1. + + <_> + 11 10 10 3 2. + + + 0 + + <_> + + <_> + 6 11 7 2 -1. + + <_> + 6 12 7 1 2. + + + 0 + + <_> + + <_> + 6 11 17 2 -1. + + <_> + 6 12 17 1 2. + + + 0 + + <_> + + <_> + 7 0 12 1 -1. + + <_> + 10 0 6 1 2. + + + 0 + + <_> + + <_> + 7 0 4 2 -1. + + <_> + 7 1 4 1 2. + + + 0 + + <_> + + <_> + 7 0 32 9 -1. + + <_> + 23 0 16 9 2. + + + 0 + + <_> + + <_> + 7 0 38 13 -1. + + <_> + 26 0 19 13 2. + + + 0 + + <_> + + <_> + 7 1 4 2 -1. + + <_> + 8 2 2 2 2. + + + 1 + + <_> + + <_> + 7 1 16 10 -1. + + <_> + 11 1 8 10 2. + + + 0 + + <_> + + <_> + 7 1 15 6 -1. + + <_> + 12 1 5 6 3. + + + 0 + + <_> + + <_> + 7 1 15 8 -1. + + <_> + 12 1 5 8 3. + + + 0 + + <_> + + <_> + 7 1 15 11 -1. + + <_> + 12 1 5 11 3. + + + 0 + + <_> + + <_> + 7 1 7 6 -1. + + <_> + 7 4 7 3 2. + + + 0 + + <_> + + <_> + 7 2 1 4 -1. + + <_> + 6 3 1 2 2. + + + 1 + + <_> + + <_> + 7 2 4 2 -1. + + <_> + 8 3 2 2 2. + + + 1 + + <_> + + <_> + 7 2 4 7 -1. + + <_> + 8 3 2 7 2. + + + 1 + + <_> + + <_> + 7 2 2 9 -1. + + <_> + 8 2 1 9 2. + + + 0 + + <_> + + <_> + 7 2 6 3 -1. + + <_> + 9 3 2 1 9. + + + 0 + + <_> + + <_> + 7 3 2 5 -1. + + <_> + 8 3 1 5 2. + + + 0 + + <_> + + <_> + 7 3 2 6 -1. + + <_> + 8 3 1 6 2. + + + 0 + + <_> + + <_> + 7 3 3 7 -1. + + <_> + 8 3 1 7 3. + + + 0 + + <_> + + <_> + 7 4 1 4 -1. + + <_> + 7 5 1 2 2. + + + 0 + + <_> + + <_> + 7 4 3 7 -1. + + <_> + 8 4 1 7 3. + + + 0 + + <_> + + <_> + 7 4 28 9 -1. + + <_> + 21 4 14 9 2. + + + 0 + + <_> + + <_> + 7 5 3 6 -1. + + <_> + 8 5 1 6 3. + + + 0 + + <_> + + <_> + 7 5 4 6 -1. + + <_> + 8 5 2 6 2. + + + 0 + + <_> + + <_> + 7 5 4 4 -1. + + <_> + 7 5 2 2 2. + + <_> + 9 7 2 2 2. + + + 0 + + <_> + + <_> + 7 6 3 3 -1. + + <_> + 8 6 1 3 3. + + + 0 + + <_> + + <_> + 7 6 3 6 -1. + + <_> + 8 6 1 6 3. + + + 0 + + <_> + + <_> + 7 10 4 2 -1. + + <_> + 7 10 2 1 2. + + <_> + 9 11 2 1 2. + + + 0 + + <_> + + <_> + 7 10 6 2 -1. + + <_> + 7 11 6 1 2. + + + 0 + + <_> + + <_> + 7 11 36 2 -1. + + <_> + 7 11 18 1 2. + + <_> + 25 12 18 1 2. + + + 0 + + <_> + + <_> + 8 0 3 2 -1. + + <_> + 9 1 1 2 3. + + + 1 + + <_> + + <_> + 8 0 2 8 -1. + + <_> + 8 0 1 8 2. + + + 1 + + <_> + + <_> + 8 0 6 4 -1. + + <_> + 8 0 3 2 2. + + <_> + 11 2 3 2 2. + + + 0 + + <_> + + <_> + 8 0 8 2 -1. + + <_> + 8 0 4 1 2. + + <_> + 12 1 4 1 2. + + + 0 + + <_> + + <_> + 8 0 10 12 -1. + + <_> + 13 0 5 12 2. + + + 0 + + <_> + + <_> + 8 0 15 12 -1. + + <_> + 13 0 5 12 3. + + + 0 + + <_> + + <_> + 8 0 15 13 -1. + + <_> + 13 0 5 13 3. + + + 0 + + <_> + + <_> + 8 0 8 6 -1. + + <_> + 8 3 8 3 2. + + + 0 + + <_> + + <_> + 8 1 3 2 -1. + + <_> + 9 2 1 2 3. + + + 1 + + <_> + + <_> + 8 1 12 3 -1. + + <_> + 12 1 4 3 3. + + + 0 + + <_> + + <_> + 8 1 8 6 -1. + + <_> + 12 1 4 6 2. + + + 0 + + <_> + + <_> + 8 1 15 4 -1. + + <_> + 13 1 5 4 3. + + + 0 + + <_> + + <_> + 8 1 15 12 -1. + + <_> + 13 1 5 12 3. + + + 0 + + <_> + + <_> + 8 1 8 10 -1. + + <_> + 8 6 8 5 2. + + + 0 + + <_> + + <_> + 8 1 10 8 -1. + + <_> + 8 3 10 4 2. + + + 0 + + <_> + + <_> + 8 2 4 3 -1. + + <_> + 9 2 2 3 2. + + + 0 + + <_> + + <_> + 8 2 3 4 -1. + + <_> + 9 2 1 4 3. + + + 0 + + <_> + + <_> + 8 2 4 4 -1. + + <_> + 9 2 2 4 2. + + + 0 + + <_> + + <_> + 8 2 6 2 -1. + + <_> + 10 2 2 2 3. + + + 0 + + <_> + + <_> + 8 2 7 4 -1. + + <_> + 8 4 7 2 2. + + + 0 + + <_> + + <_> + 8 3 4 3 -1. + + <_> + 9 3 2 3 2. + + + 0 + + <_> + + <_> + 8 4 10 9 -1. + + <_> + 13 4 5 9 2. + + + 0 + + <_> + + <_> + 8 5 23 2 -1. + + <_> + 8 6 23 1 2. + + + 0 + + <_> + + <_> + 8 6 3 1 -1. + + <_> + 9 7 1 1 3. + + + 1 + + <_> + + <_> + 8 6 3 5 -1. + + <_> + 9 6 1 5 3. + + + 0 + + <_> + + <_> + 8 6 3 6 -1. + + <_> + 9 6 1 6 3. + + + 0 + + <_> + + <_> + 8 7 6 2 -1. + + <_> + 11 7 3 2 2. + + + 0 + + <_> + + <_> + 8 9 4 4 -1. + + <_> + 8 11 4 2 2. + + + 0 + + <_> + + <_> + 8 10 8 2 -1. + + <_> + 8 11 8 1 2. + + + 0 + + <_> + + <_> + 9 0 4 10 -1. + + <_> + 10 0 2 10 2. + + + 0 + + <_> + + <_> + 9 0 6 1 -1. + + <_> + 11 0 2 1 3. + + + 0 + + <_> + + <_> + 9 0 6 3 -1. + + <_> + 11 1 2 1 9. + + + 0 + + <_> + + <_> + 9 0 4 4 -1. + + <_> + 9 0 2 2 2. + + <_> + 11 2 2 2 2. + + + 0 + + <_> + + <_> + 9 0 12 12 -1. + + <_> + 13 0 4 12 3. + + + 0 + + <_> + + <_> + 9 1 3 2 -1. + + <_> + 10 2 1 2 3. + + + 1 + + <_> + + <_> + 9 1 12 2 -1. + + <_> + 13 1 4 2 3. + + + 0 + + <_> + + <_> + 9 1 12 4 -1. + + <_> + 13 1 4 4 3. + + + 0 + + <_> + + <_> + 9 1 12 11 -1. + + <_> + 13 1 4 11 3. + + + 0 + + <_> + + <_> + 9 1 8 12 -1. + + <_> + 13 1 4 12 2. + + + 0 + + <_> + + <_> + 9 1 12 12 -1. + + <_> + 13 1 4 12 3. + + + 0 + + <_> + + <_> + 9 2 12 10 -1. + + <_> + 13 2 4 10 3. + + + 0 + + <_> + + <_> + 9 3 4 8 -1. + + <_> + 9 7 4 4 2. + + + 0 + + <_> + + <_> + 9 3 6 8 -1. + + <_> + 9 7 6 4 2. + + + 0 + + <_> + + <_> + 9 4 33 4 -1. + + <_> + 9 5 33 2 2. + + + 0 + + <_> + + <_> + 9 5 4 6 -1. + + <_> + 9 5 2 3 2. + + <_> + 11 8 2 3 2. + + + 0 + + <_> + + <_> + 9 7 8 6 -1. + + <_> + 9 9 8 2 3. + + + 0 + + <_> + + <_> + 9 8 3 3 -1. + + <_> + 10 9 1 1 9. + + + 0 + + <_> + + <_> + 9 8 3 2 -1. + + <_> + 10 9 1 2 3. + + + 1 + + <_> + + <_> + 9 8 8 4 -1. + + <_> + 13 8 4 4 2. + + + 0 + + <_> + + <_> + 9 8 20 1 -1. + + <_> + 19 8 10 1 2. + + + 0 + + <_> + + <_> + 9 9 2 4 -1. + + <_> + 9 11 2 2 2. + + + 0 + + <_> + + <_> + 9 10 6 2 -1. + + <_> + 9 10 3 1 2. + + <_> + 12 11 3 1 2. + + + 0 + + <_> + + <_> + 9 10 16 3 -1. + + <_> + 13 10 8 3 2. + + + 0 + + <_> + + <_> + 9 10 42 3 -1. + + <_> + 30 10 21 3 2. + + + 0 + + <_> + + <_> + 9 12 42 1 -1. + + <_> + 23 12 14 1 3. + + + 0 + + <_> + + <_> + 10 0 12 2 -1. + + <_> + 10 0 6 1 2. + + <_> + 16 1 6 1 2. + + + 0 + + <_> + + <_> + 10 0 8 2 -1. + + <_> + 10 1 8 1 2. + + + 0 + + <_> + + <_> + 10 1 9 11 -1. + + <_> + 13 1 3 11 3. + + + 0 + + <_> + + <_> + 10 1 12 2 -1. + + <_> + 14 1 4 2 3. + + + 0 + + <_> + + <_> + 10 2 3 9 -1. + + <_> + 11 5 1 3 9. + + + 0 + + <_> + + <_> + 10 2 4 5 -1. + + <_> + 11 2 2 5 2. + + + 0 + + <_> + + <_> + 10 2 12 11 -1. + + <_> + 13 2 6 11 2. + + + 0 + + <_> + + <_> + 10 2 4 3 -1. + + <_> + 9 3 4 1 3. + + + 1 + + <_> + + <_> + 10 3 2 4 -1. + + <_> + 10 3 1 2 2. + + <_> + 11 5 1 2 2. + + + 0 + + <_> + + <_> + 10 4 8 1 -1. + + <_> + 10 4 4 1 2. + + + 1 + + <_> + + <_> + 10 6 4 4 -1. + + <_> + 10 6 2 2 2. + + <_> + 12 8 2 2 2. + + + 0 + + <_> + + <_> + 10 6 6 5 -1. + + <_> + 13 6 3 5 2. + + + 0 + + <_> + + <_> + 10 7 2 6 -1. + + <_> + 10 9 2 2 3. + + + 0 + + <_> + + <_> + 10 9 2 3 -1. + + <_> + 10 10 2 1 3. + + + 0 + + <_> + + <_> + 10 10 1 2 -1. + + <_> + 10 11 1 1 2. + + + 0 + + <_> + + <_> + 10 11 3 2 -1. + + <_> + 10 12 3 1 2. + + + 0 + + <_> + + <_> + 10 11 6 2 -1. + + <_> + 10 12 6 1 2. + + + 0 + + <_> + + <_> + 11 0 3 8 -1. + + <_> + 11 4 3 4 2. + + + 0 + + <_> + + <_> + 11 0 12 12 -1. + + <_> + 15 0 4 12 3. + + + 0 + + <_> + + <_> + 11 0 10 4 -1. + + <_> + 11 0 5 2 2. + + <_> + 16 2 5 2 2. + + + 0 + + <_> + + <_> + 11 0 6 6 -1. + + <_> + 11 3 6 3 2. + + + 0 + + <_> + + <_> + 11 0 21 7 -1. + + <_> + 18 0 7 7 3. + + + 0 + + <_> + + <_> + 11 0 10 3 -1. + + <_> + 10 1 10 1 3. + + + 1 + + <_> + + <_> + 11 0 36 9 -1. + + <_> + 29 0 18 9 2. + + + 0 + + <_> + + <_> + 11 1 2 3 -1. + + <_> + 10 2 2 1 3. + + + 1 + + <_> + + <_> + 11 1 9 11 -1. + + <_> + 14 1 3 11 3. + + + 0 + + <_> + + <_> + 11 1 12 11 -1. + + <_> + 15 1 4 11 3. + + + 0 + + <_> + + <_> + 11 2 9 9 -1. + + <_> + 14 5 3 3 9. + + + 0 + + <_> + + <_> + 11 2 12 5 -1. + + <_> + 14 2 6 5 2. + + + 0 + + <_> + + <_> + 11 3 6 9 -1. + + <_> + 13 6 2 3 9. + + + 0 + + <_> + + <_> + 11 3 3 3 -1. + + <_> + 10 4 3 1 3. + + + 1 + + <_> + + <_> + 11 3 27 6 -1. + + <_> + 11 6 27 3 2. + + + 0 + + <_> + + <_> + 11 4 6 9 -1. + + <_> + 13 7 2 3 9. + + + 0 + + <_> + + <_> + 11 4 26 6 -1. + + <_> + 11 7 26 3 2. + + + 0 + + <_> + + <_> + 11 4 27 6 -1. + + <_> + 11 7 27 3 2. + + + 0 + + <_> + + <_> + 11 4 31 2 -1. + + <_> + 11 5 31 1 2. + + + 0 + + <_> + + <_> + 11 4 35 2 -1. + + <_> + 11 5 35 1 2. + + + 0 + + <_> + + <_> + 11 7 30 3 -1. + + <_> + 21 8 10 1 9. + + + 0 + + <_> + + <_> + 11 8 8 4 -1. + + <_> + 13 8 4 4 2. + + + 0 + + <_> + + <_> + 11 8 6 4 -1. + + <_> + 11 10 6 2 2. + + + 0 + + <_> + + <_> + 11 9 8 2 -1. + + <_> + 13 9 4 2 2. + + + 0 + + <_> + + <_> + 12 0 4 1 -1. + + <_> + 14 0 2 1 2. + + + 0 + + <_> + + <_> + 12 0 16 5 -1. + + <_> + 16 0 8 5 2. + + + 0 + + <_> + + <_> + 12 0 16 13 -1. + + <_> + 16 0 8 13 2. + + + 0 + + <_> + + <_> + 12 0 18 5 -1. + + <_> + 18 0 6 5 3. + + + 0 + + <_> + + <_> + 12 0 7 2 -1. + + <_> + 12 1 7 1 2. + + + 0 + + <_> + + <_> + 12 1 6 12 -1. + + <_> + 14 5 2 4 9. + + + 0 + + <_> + + <_> + 12 1 10 2 -1. + + <_> + 17 1 5 2 2. + + + 0 + + <_> + + <_> + 12 2 2 3 -1. + + <_> + 12 2 1 3 2. + + + 1 + + <_> + + <_> + 12 2 9 2 -1. + + <_> + 15 2 3 2 3. + + + 0 + + <_> + + <_> + 12 2 12 4 -1. + + <_> + 16 2 4 4 3. + + + 0 + + <_> + + <_> + 12 2 28 2 -1. + + <_> + 19 2 14 2 2. + + + 0 + + <_> + + <_> + 12 3 6 2 -1. + + <_> + 14 5 2 2 3. + + + 1 + + <_> + + <_> + 12 4 4 5 -1. + + <_> + 13 5 2 5 2. + + + 1 + + <_> + + <_> + 12 4 4 3 -1. + + <_> + 12 4 2 3 2. + + + 1 + + <_> + + <_> + 12 4 6 6 -1. + + <_> + 14 4 2 6 3. + + + 0 + + <_> + + <_> + 12 4 5 2 -1. + + <_> + 12 5 5 1 2. + + + 0 + + <_> + + <_> + 12 4 18 9 -1. + + <_> + 18 7 6 3 9. + + + 0 + + <_> + + <_> + 12 5 6 5 -1. + + <_> + 14 5 2 5 3. + + + 0 + + <_> + + <_> + 12 5 18 6 -1. + + <_> + 18 7 6 2 9. + + + 0 + + <_> + + <_> + 12 7 21 3 -1. + + <_> + 19 8 7 1 9. + + + 0 + + <_> + + <_> + 12 12 6 1 -1. + + <_> + 14 12 2 1 3. + + + 0 + + <_> + + <_> + 12 12 39 1 -1. + + <_> + 25 12 13 1 3. + + + 0 + + <_> + + <_> + 13 0 16 5 -1. + + <_> + 17 0 8 5 2. + + + 0 + + <_> + + <_> + 13 0 5 8 -1. + + <_> + 11 2 5 4 2. + + + 1 + + <_> + + <_> + 13 0 24 10 -1. + + <_> + 19 0 12 10 2. + + + 0 + + <_> + + <_> + 13 0 36 3 -1. + + <_> + 22 0 18 3 2. + + + 0 + + <_> + + <_> + 13 0 28 1 -1. + + <_> + 27 0 14 1 2. + + + 0 + + <_> + + <_> + 13 1 8 3 -1. + + <_> + 17 1 4 3 2. + + + 0 + + <_> + + <_> + 13 1 8 6 -1. + + <_> + 17 1 4 6 2. + + + 0 + + <_> + + <_> + 13 1 20 7 -1. + + <_> + 18 1 10 7 2. + + + 0 + + <_> + + <_> + 13 1 36 1 -1. + + <_> + 31 1 18 1 2. + + + 0 + + <_> + + <_> + 13 1 20 3 -1. + + <_> + 13 2 20 1 3. + + + 0 + + <_> + + <_> + 13 2 14 1 -1. + + <_> + 20 2 7 1 2. + + + 0 + + <_> + + <_> + 13 3 3 8 -1. + + <_> + 13 5 3 4 2. + + + 0 + + <_> + + <_> + 13 3 4 2 -1. + + <_> + 13 4 4 1 2. + + + 0 + + <_> + + <_> + 13 4 5 2 -1. + + <_> + 13 5 5 1 2. + + + 0 + + <_> + + <_> + 13 5 4 3 -1. + + <_> + 13 5 2 3 2. + + + 1 + + <_> + + <_> + 13 5 24 6 -1. + + <_> + 19 5 12 6 2. + + + 0 + + <_> + + <_> + 13 5 32 6 -1. + + <_> + 13 8 32 3 2. + + + 0 + + <_> + + <_> + 13 6 1 3 -1. + + <_> + 12 7 1 1 3. + + + 1 + + <_> + + <_> + 13 6 3 6 -1. + + <_> + 13 8 3 2 3. + + + 0 + + <_> + + <_> + 13 7 3 4 -1. + + <_> + 13 9 3 2 2. + + + 0 + + <_> + + <_> + 13 8 6 2 -1. + + <_> + 13 9 6 1 2. + + + 0 + + <_> + + <_> + 13 9 10 4 -1. + + <_> + 18 9 5 4 2. + + + 0 + + <_> + + <_> + 13 9 18 4 -1. + + <_> + 19 9 6 4 3. + + + 0 + + <_> + + <_> + 14 0 4 1 -1. + + <_> + 15 0 2 1 2. + + + 0 + + <_> + + <_> + 14 0 1 8 -1. + + <_> + 14 4 1 4 2. + + + 0 + + <_> + + <_> + 14 0 1 12 -1. + + <_> + 14 4 1 4 3. + + + 0 + + <_> + + <_> + 14 0 1 12 -1. + + <_> + 14 6 1 6 2. + + + 0 + + <_> + + <_> + 14 0 8 4 -1. + + <_> + 14 0 4 2 2. + + <_> + 18 2 4 2 2. + + + 0 + + <_> + + <_> + 14 0 12 6 -1. + + <_> + 18 2 4 2 9. + + + 0 + + <_> + + <_> + 14 0 16 4 -1. + + <_> + 18 0 8 4 2. + + + 0 + + <_> + + <_> + 14 1 1 4 -1. + + <_> + 14 3 1 2 2. + + + 0 + + <_> + + <_> + 14 1 2 4 -1. + + <_> + 14 2 2 2 2. + + + 0 + + <_> + + <_> + 14 1 2 12 -1. + + <_> + 14 7 2 6 2. + + + 0 + + <_> + + <_> + 14 2 2 8 -1. + + <_> + 14 4 2 4 2. + + + 0 + + <_> + + <_> + 14 2 2 9 -1. + + <_> + 14 5 2 3 3. + + + 0 + + <_> + + <_> + 14 2 18 4 -1. + + <_> + 14 2 9 2 2. + + <_> + 23 4 9 2 2. + + + 0 + + <_> + + <_> + 14 3 12 9 -1. + + <_> + 14 6 12 3 3. + + + 0 + + <_> + + <_> + 14 4 2 1 -1. + + <_> + 15 4 1 1 2. + + + 0 + + <_> + + <_> + 14 4 16 1 -1. + + <_> + 22 4 8 1 2. + + + 0 + + <_> + + <_> + 14 5 2 4 -1. + + <_> + 14 6 2 2 2. + + + 0 + + <_> + + <_> + 14 5 2 6 -1. + + <_> + 14 8 2 3 2. + + + 0 + + <_> + + <_> + 14 5 3 4 -1. + + <_> + 14 6 3 2 2. + + + 0 + + <_> + + <_> + 14 5 3 6 -1. + + <_> + 14 8 3 3 2. + + + 0 + + <_> + + <_> + 14 5 4 3 -1. + + <_> + 13 6 4 1 3. + + + 1 + + <_> + + <_> + 14 6 3 4 -1. + + <_> + 14 8 3 2 2. + + + 0 + + <_> + + <_> + 14 7 3 2 -1. + + <_> + 14 8 3 1 2. + + + 0 + + <_> + + <_> + 14 8 2 3 -1. + + <_> + 15 8 1 3 2. + + + 0 + + <_> + + <_> + 14 8 9 2 -1. + + <_> + 17 8 3 2 3. + + + 0 + + <_> + + <_> + 14 8 6 4 -1. + + <_> + 17 8 3 4 2. + + + 0 + + <_> + + <_> + 14 9 2 2 -1. + + <_> + 14 10 2 1 2. + + + 0 + + <_> + + <_> + 14 9 16 4 -1. + + <_> + 18 9 8 4 2. + + + 0 + + <_> + + <_> + 14 11 15 2 -1. + + <_> + 19 11 5 2 3. + + + 0 + + <_> + + <_> + 14 12 2 1 -1. + + <_> + 15 12 1 1 2. + + + 0 + + <_> + + <_> + 14 12 3 1 -1. + + <_> + 15 12 1 1 3. + + + 0 + + <_> + + <_> + 15 0 4 1 -1. + + <_> + 16 0 2 1 2. + + + 0 + + <_> + + <_> + 15 0 10 2 -1. + + <_> + 20 0 5 2 2. + + + 0 + + <_> + + <_> + 15 0 15 2 -1. + + <_> + 20 0 5 2 3. + + + 0 + + <_> + + <_> + 15 0 33 9 -1. + + <_> + 15 3 33 3 3. + + + 0 + + <_> + + <_> + 15 1 1 12 -1. + + <_> + 15 7 1 6 2. + + + 0 + + <_> + + <_> + 15 1 2 6 -1. + + <_> + 15 3 2 2 3. + + + 0 + + <_> + + <_> + 15 1 36 2 -1. + + <_> + 33 1 18 2 2. + + + 0 + + <_> + + <_> + 15 2 1 9 -1. + + <_> + 15 5 1 3 3. + + + 0 + + <_> + + <_> + 15 2 3 4 -1. + + <_> + 15 4 3 2 2. + + + 0 + + <_> + + <_> + 15 2 9 9 -1. + + <_> + 18 5 3 3 9. + + + 0 + + <_> + + <_> + 15 2 24 6 -1. + + <_> + 15 2 12 3 2. + + <_> + 27 5 12 3 2. + + + 0 + + <_> + + <_> + 15 3 4 3 -1. + + <_> + 16 4 2 3 2. + + + 1 + + <_> + + <_> + 15 3 4 6 -1. + + <_> + 15 6 4 3 2. + + + 0 + + <_> + + <_> + 15 4 3 4 -1. + + <_> + 15 6 3 2 2. + + + 0 + + <_> + + <_> + 15 4 6 3 -1. + + <_> + 14 5 6 1 3. + + + 1 + + <_> + + <_> + 15 6 4 4 -1. + + <_> + 15 6 2 2 2. + + <_> + 17 8 2 2 2. + + + 0 + + <_> + + <_> + 15 8 1 3 -1. + + <_> + 15 9 1 1 3. + + + 0 + + <_> + + <_> + 15 8 15 5 -1. + + <_> + 20 8 5 5 3. + + + 0 + + <_> + + <_> + 15 9 1 2 -1. + + <_> + 15 10 1 1 2. + + + 0 + + <_> + + <_> + 15 9 2 2 -1. + + <_> + 15 9 1 1 2. + + <_> + 16 10 1 1 2. + + + 0 + + <_> + + <_> + 15 10 13 3 -1. + + <_> + 15 11 13 1 3. + + + 0 + + <_> + + <_> + 15 10 34 3 -1. + + <_> + 15 11 34 1 3. + + + 0 + + <_> + + <_> + 15 11 35 2 -1. + + <_> + 15 12 35 1 2. + + + 0 + + <_> + + <_> + 16 0 1 2 -1. + + <_> + 16 0 1 1 2. + + + 1 + + <_> + + <_> + 16 0 4 8 -1. + + <_> + 16 0 2 8 2. + + + 1 + + <_> + + <_> + 16 0 12 1 -1. + + <_> + 19 0 6 1 2. + + + 0 + + <_> + + <_> + 16 0 6 6 -1. + + <_> + 14 2 6 2 3. + + + 1 + + <_> + + <_> + 16 0 26 4 -1. + + <_> + 29 0 13 4 2. + + + 0 + + <_> + + <_> + 16 1 18 12 -1. + + <_> + 22 1 6 12 3. + + + 0 + + <_> + + <_> + 16 1 18 2 -1. + + <_> + 16 2 18 1 2. + + + 0 + + <_> + + <_> + 16 2 4 5 -1. + + <_> + 16 2 2 5 2. + + + 1 + + <_> + + <_> + 16 3 1 2 -1. + + <_> + 16 4 1 1 2. + + + 0 + + <_> + + <_> + 16 5 5 3 -1. + + <_> + 15 6 5 1 3. + + + 1 + + <_> + + <_> + 16 9 15 4 -1. + + <_> + 21 9 5 4 3. + + + 0 + + <_> + + <_> + 16 9 18 4 -1. + + <_> + 22 9 6 4 3. + + + 0 + + <_> + + <_> + 17 0 1 6 -1. + + <_> + 15 2 1 2 3. + + + 1 + + <_> + + <_> + 17 0 6 2 -1. + + <_> + 17 1 6 1 2. + + + 0 + + <_> + + <_> + 17 0 18 5 -1. + + <_> + 23 0 6 5 3. + + + 0 + + <_> + + <_> + 17 0 8 2 -1. + + <_> + 17 1 8 1 2. + + + 0 + + <_> + + <_> + 17 0 11 4 -1. + + <_> + 17 2 11 2 2. + + + 0 + + <_> + + <_> + 17 0 16 3 -1. + + <_> + 17 1 16 1 3. + + + 0 + + <_> + + <_> + 17 0 17 3 -1. + + <_> + 17 1 17 1 3. + + + 0 + + <_> + + <_> + 17 0 19 2 -1. + + <_> + 17 1 19 1 2. + + + 0 + + <_> + + <_> + 17 0 20 4 -1. + + <_> + 17 1 20 2 2. + + + 0 + + <_> + + <_> + 17 0 32 8 -1. + + <_> + 17 4 32 4 2. + + + 0 + + <_> + + <_> + 17 4 1 2 -1. + + <_> + 17 5 1 1 2. + + + 0 + + <_> + + <_> + 17 7 8 1 -1. + + <_> + 21 7 4 1 2. + + + 0 + + <_> + + <_> + 17 7 21 3 -1. + + <_> + 17 8 21 1 3. + + + 0 + + <_> + + <_> + 17 7 28 6 -1. + + <_> + 17 9 28 2 3. + + + 0 + + <_> + + <_> + 18 0 3 1 -1. + + <_> + 19 0 1 1 3. + + + 0 + + <_> + + <_> + 18 0 2 5 -1. + + <_> + 18 0 1 5 2. + + + 1 + + <_> + + <_> + 18 0 3 4 -1. + + <_> + 18 2 3 2 2. + + + 0 + + <_> + + <_> + 18 0 11 2 -1. + + <_> + 18 1 11 1 2. + + + 0 + + <_> + + <_> + 18 0 18 3 -1. + + <_> + 18 1 18 1 3. + + + 0 + + <_> + + <_> + 18 1 17 2 -1. + + <_> + 18 2 17 1 2. + + + 0 + + <_> + + <_> + 18 2 4 4 -1. + + <_> + 19 2 2 4 2. + + + 0 + + <_> + + <_> + 18 2 2 6 -1. + + <_> + 16 4 2 2 3. + + + 1 + + <_> + + <_> + 18 2 6 4 -1. + + <_> + 20 2 2 4 3. + + + 0 + + <_> + + <_> + 18 3 3 2 -1. + + <_> + 19 3 1 2 3. + + + 0 + + <_> + + <_> + 18 7 4 3 -1. + + <_> + 19 7 2 3 2. + + + 0 + + <_> + + <_> + 18 8 4 2 -1. + + <_> + 19 8 2 2 2. + + + 0 + + <_> + + <_> + 18 8 4 3 -1. + + <_> + 19 8 2 3 2. + + + 0 + + <_> + + <_> + 18 10 27 3 -1. + + <_> + 18 11 27 1 3. + + + 0 + + <_> + + <_> + 19 0 2 1 -1. + + <_> + 20 0 1 1 2. + + + 0 + + <_> + + <_> + 19 0 3 1 -1. + + <_> + 20 0 1 1 3. + + + 0 + + <_> + + <_> + 19 0 3 8 -1. + + <_> + 20 1 1 8 3. + + + 1 + + <_> + + <_> + 19 1 3 6 -1. + + <_> + 20 3 1 2 9. + + + 0 + + <_> + + <_> + 19 1 9 12 -1. + + <_> + 22 1 3 12 3. + + + 0 + + <_> + + <_> + 19 1 17 2 -1. + + <_> + 19 2 17 1 2. + + + 0 + + <_> + + <_> + 19 3 6 2 -1. + + <_> + 21 3 2 2 3. + + + 0 + + <_> + + <_> + 19 4 4 4 -1. + + <_> + 19 4 2 2 2. + + <_> + 21 6 2 2 2. + + + 0 + + <_> + + <_> + 19 12 2 1 -1. + + <_> + 20 12 1 1 2. + + + 0 + + <_> + + <_> + 20 0 4 1 -1. + + <_> + 21 0 2 1 2. + + + 0 + + <_> + + <_> + 20 0 4 11 -1. + + <_> + 21 0 2 11 2. + + + 0 + + <_> + + <_> + 20 0 6 1 -1. + + <_> + 22 0 2 1 3. + + + 0 + + <_> + + <_> + 20 0 12 12 -1. + + <_> + 24 0 4 12 3. + + + 0 + + <_> + + <_> + 20 0 12 3 -1. + + <_> + 26 0 6 3 2. + + + 0 + + <_> + + <_> + 20 0 18 3 -1. + + <_> + 26 0 6 3 3. + + + 0 + + <_> + + <_> + 20 0 18 4 -1. + + <_> + 29 0 9 4 2. + + + 0 + + <_> + + <_> + 20 0 26 1 -1. + + <_> + 33 0 13 1 2. + + + 0 + + <_> + + <_> + 20 0 22 4 -1. + + <_> + 20 1 22 2 2. + + + 0 + + <_> + + <_> + 20 2 3 2 -1. + + <_> + 21 3 1 2 3. + + + 1 + + <_> + + <_> + 20 3 4 8 -1. + + <_> + 21 3 2 8 2. + + + 0 + + <_> + + <_> + 20 4 3 9 -1. + + <_> + 21 7 1 3 9. + + + 0 + + <_> + + <_> + 20 5 3 5 -1. + + <_> + 21 5 1 5 3. + + + 0 + + <_> + + <_> + 20 5 4 8 -1. + + <_> + 22 5 2 8 2. + + + 0 + + <_> + + <_> + 20 6 3 2 -1. + + <_> + 21 7 1 2 3. + + + 1 + + <_> + + <_> + 20 6 4 2 -1. + + <_> + 21 7 2 2 2. + + + 1 + + <_> + + <_> + 20 6 24 6 -1. + + <_> + 20 9 24 3 2. + + + 0 + + <_> + + <_> + 20 8 4 2 -1. + + <_> + 21 8 2 2 2. + + + 0 + + <_> + + <_> + 20 9 4 4 -1. + + <_> + 20 9 2 2 2. + + <_> + 22 11 2 2 2. + + + 0 + + <_> + + <_> + 20 9 18 4 -1. + + <_> + 26 9 6 4 3. + + + 0 + + <_> + + <_> + 20 12 4 1 -1. + + <_> + 21 12 2 1 2. + + + 0 + + <_> + + <_> + 21 0 2 6 -1. + + <_> + 21 0 1 3 2. + + <_> + 22 3 1 3 2. + + + 0 + + <_> + + <_> + 21 0 4 2 -1. + + <_> + 21 1 4 1 2. + + + 0 + + <_> + + <_> + 21 0 28 1 -1. + + <_> + 28 0 14 1 2. + + + 0 + + <_> + + <_> + 21 0 21 4 -1. + + <_> + 28 0 7 4 3. + + + 0 + + <_> + + <_> + 21 0 14 5 -1. + + <_> + 28 0 7 5 2. + + + 0 + + <_> + + <_> + 21 1 4 11 -1. + + <_> + 22 1 2 11 2. + + + 0 + + <_> + + <_> + 21 2 25 9 -1. + + <_> + 21 5 25 3 3. + + + 0 + + <_> + + <_> + 21 3 4 9 -1. + + <_> + 22 3 2 9 2. + + + 0 + + <_> + + <_> + 21 3 6 1 -1. + + <_> + 23 3 2 1 3. + + + 0 + + <_> + + <_> + 21 6 4 2 -1. + + <_> + 22 7 2 2 2. + + + 1 + + <_> + + <_> + 21 7 3 2 -1. + + <_> + 22 8 1 2 3. + + + 1 + + <_> + + <_> + 21 7 3 3 -1. + + <_> + 22 8 1 3 3. + + + 1 + + <_> + + <_> + 21 7 6 4 -1. + + <_> + 23 7 2 4 3. + + + 0 + + <_> + + <_> + 21 10 21 3 -1. + + <_> + 28 10 7 3 3. + + + 0 + + <_> + + <_> + 21 10 18 3 -1. + + <_> + 21 11 18 1 3. + + + 0 + + <_> + + <_> + 21 12 30 1 -1. + + <_> + 36 12 15 1 2. + + + 0 + + <_> + + <_> + 22 0 4 1 -1. + + <_> + 23 0 2 1 2. + + + 0 + + <_> + + <_> + 22 0 8 1 -1. + + <_> + 24 0 4 1 2. + + + 0 + + <_> + + <_> + 22 0 12 4 -1. + + <_> + 25 0 6 4 2. + + + 0 + + <_> + + <_> + 22 0 15 2 -1. + + <_> + 27 0 5 2 3. + + + 0 + + <_> + + <_> + 22 0 28 2 -1. + + <_> + 36 0 14 2 2. + + + 0 + + <_> + + <_> + 22 1 15 2 -1. + + <_> + 27 1 5 2 3. + + + 0 + + <_> + + <_> + 22 1 8 3 -1. + + <_> + 21 2 8 1 3. + + + 1 + + <_> + + <_> + 22 2 3 3 -1. + + <_> + 23 2 1 3 3. + + + 0 + + <_> + + <_> + 22 2 3 9 -1. + + <_> + 23 2 1 9 3. + + + 0 + + <_> + + <_> + 22 2 3 10 -1. + + <_> + 23 2 1 10 3. + + + 0 + + <_> + + <_> + 22 5 3 3 -1. + + <_> + 22 6 3 1 3. + + + 0 + + <_> + + <_> + 22 6 2 3 -1. + + <_> + 22 7 2 1 3. + + + 0 + + <_> + + <_> + 22 7 2 3 -1. + + <_> + 22 8 2 1 3. + + + 0 + + <_> + + <_> + 22 8 3 2 -1. + + <_> + 23 8 1 2 3. + + + 0 + + <_> + + <_> + 22 8 3 2 -1. + + <_> + 23 9 1 2 3. + + + 1 + + <_> + + <_> + 22 8 2 2 -1. + + <_> + 22 9 2 1 2. + + + 0 + + <_> + + <_> + 22 9 4 4 -1. + + <_> + 22 9 2 2 2. + + <_> + 24 11 2 2 2. + + + 0 + + <_> + + <_> + 22 9 9 2 -1. + + <_> + 25 9 3 2 3. + + + 0 + + <_> + + <_> + 22 9 6 4 -1. + + <_> + 25 9 3 4 2. + + + 0 + + <_> + + <_> + 22 9 9 4 -1. + + <_> + 25 9 3 4 3. + + + 0 + + <_> + + <_> + 22 10 6 2 -1. + + <_> + 22 10 3 1 2. + + <_> + 25 11 3 1 2. + + + 0 + + <_> + + <_> + 23 0 3 1 -1. + + <_> + 24 0 1 1 3. + + + 0 + + <_> + + <_> + 23 0 6 1 -1. + + <_> + 25 0 2 1 3. + + + 0 + + <_> + + <_> + 23 0 4 4 -1. + + <_> + 23 0 2 2 2. + + <_> + 25 2 2 2 2. + + + 0 + + <_> + + <_> + 23 0 8 12 -1. + + <_> + 25 0 4 12 2. + + + 0 + + <_> + + <_> + 23 0 12 1 -1. + + <_> + 26 0 6 1 2. + + + 0 + + <_> + + <_> + 23 0 21 2 -1. + + <_> + 23 1 21 1 2. + + + 0 + + <_> + + <_> + 23 2 12 10 -1. + + <_> + 29 2 6 10 2. + + + 0 + + <_> + + <_> + 23 3 4 2 -1. + + <_> + 24 3 2 2 2. + + + 0 + + <_> + + <_> + 23 4 2 4 -1. + + <_> + 22 5 2 2 2. + + + 1 + + <_> + + <_> + 23 4 12 9 -1. + + <_> + 27 4 4 9 3. + + + 0 + + <_> + + <_> + 23 5 1 3 -1. + + <_> + 23 6 1 1 3. + + + 0 + + <_> + + <_> + 23 6 9 1 -1. + + <_> + 26 6 3 1 3. + + + 0 + + <_> + + <_> + 23 8 4 3 -1. + + <_> + 24 8 2 3 2. + + + 0 + + <_> + + <_> + 23 9 4 1 -1. + + <_> + 24 9 2 1 2. + + + 0 + + <_> + + <_> + 23 9 8 4 -1. + + <_> + 25 9 4 4 2. + + + 0 + + <_> + + <_> + 23 9 12 4 -1. + + <_> + 26 9 6 4 2. + + + 0 + + <_> + + <_> + 23 11 6 2 -1. + + <_> + 23 11 3 1 2. + + <_> + 26 12 3 1 2. + + + 0 + + <_> + + <_> + 24 0 3 1 -1. + + <_> + 25 0 1 1 3. + + + 0 + + <_> + + <_> + 24 0 4 1 -1. + + <_> + 25 0 2 1 2. + + + 0 + + <_> + + <_> + 24 0 4 6 -1. + + <_> + 24 0 2 3 2. + + <_> + 26 3 2 3 2. + + + 0 + + <_> + + <_> + 24 0 17 2 -1. + + <_> + 24 1 17 1 2. + + + 0 + + <_> + + <_> + 24 0 22 2 -1. + + <_> + 24 1 22 1 2. + + + 0 + + <_> + + <_> + 24 1 4 4 -1. + + <_> + 24 1 2 2 2. + + <_> + 26 3 2 2 2. + + + 0 + + <_> + + <_> + 24 1 13 2 -1. + + <_> + 24 2 13 1 2. + + + 0 + + <_> + + <_> + 24 2 2 2 -1. + + <_> + 24 2 1 1 2. + + <_> + 25 3 1 1 2. + + + 0 + + <_> + + <_> + 24 6 6 1 -1. + + <_> + 26 6 2 1 3. + + + 0 + + <_> + + <_> + 24 7 4 6 -1. + + <_> + 24 7 2 3 2. + + <_> + 26 10 2 3 2. + + + 0 + + <_> + + <_> + 24 8 2 5 -1. + + <_> + 25 8 1 5 2. + + + 0 + + <_> + + <_> + 24 9 15 4 -1. + + <_> + 29 9 5 4 3. + + + 0 + + <_> + + <_> + 24 10 27 3 -1. + + <_> + 24 11 27 1 3. + + + 0 + + <_> + + <_> + 25 0 3 1 -1. + + <_> + 26 0 1 1 3. + + + 0 + + <_> + + <_> + 25 0 3 2 -1. + + <_> + 26 1 1 2 3. + + + 1 + + <_> + + <_> + 25 0 4 1 -1. + + <_> + 27 0 2 1 2. + + + 0 + + <_> + + <_> + 25 0 8 1 -1. + + <_> + 27 0 4 1 2. + + + 0 + + <_> + + <_> + 25 0 26 3 -1. + + <_> + 25 1 26 1 3. + + + 0 + + <_> + + <_> + 25 1 2 4 -1. + + <_> + 25 1 1 2 2. + + <_> + 26 3 1 2 2. + + + 0 + + <_> + + <_> + 25 1 3 2 -1. + + <_> + 26 2 1 2 3. + + + 1 + + <_> + + <_> + 25 2 3 2 -1. + + <_> + 26 3 1 2 3. + + + 1 + + <_> + + <_> + 25 4 4 1 -1. + + <_> + 26 4 2 1 2. + + + 0 + + <_> + + <_> + 25 4 4 6 -1. + + <_> + 25 4 2 3 2. + + <_> + 27 7 2 3 2. + + + 0 + + <_> + + <_> + 25 6 3 6 -1. + + <_> + 26 8 1 2 9. + + + 0 + + <_> + + <_> + 25 7 4 2 -1. + + <_> + 26 7 2 2 2. + + + 0 + + <_> + + <_> + 25 8 4 2 -1. + + <_> + 26 8 2 2 2. + + + 0 + + <_> + + <_> + 25 9 3 3 -1. + + <_> + 26 9 1 3 3. + + + 0 + + <_> + + <_> + 25 9 13 4 -1. + + <_> + 25 11 13 2 2. + + + 0 + + <_> + + <_> + 25 10 2 2 -1. + + <_> + 25 11 2 1 2. + + + 0 + + <_> + + <_> + 26 0 3 1 -1. + + <_> + 27 0 1 1 3. + + + 0 + + <_> + + <_> + 26 0 4 1 -1. + + <_> + 27 0 2 1 2. + + + 0 + + <_> + + <_> + 26 0 1 12 -1. + + <_> + 23 3 1 6 2. + + + 1 + + <_> + + <_> + 26 0 18 13 -1. + + <_> + 32 0 6 13 3. + + + 0 + + <_> + + <_> + 26 0 18 2 -1. + + <_> + 35 0 9 2 2. + + + 0 + + <_> + + <_> + 26 2 1 6 -1. + + <_> + 26 4 1 2 3. + + + 0 + + <_> + + <_> + 26 2 2 2 -1. + + <_> + 26 2 1 2 2. + + + 1 + + <_> + + <_> + 26 2 3 2 -1. + + <_> + 27 3 1 2 3. + + + 1 + + <_> + + <_> + 26 2 5 3 -1. + + <_> + 25 3 5 1 3. + + + 1 + + <_> + + <_> + 26 2 10 4 -1. + + <_> + 26 3 10 2 2. + + + 0 + + <_> + + <_> + 26 3 4 6 -1. + + <_> + 26 3 2 3 2. + + <_> + 28 6 2 3 2. + + + 0 + + <_> + + <_> + 26 3 5 3 -1. + + <_> + 25 4 5 1 3. + + + 1 + + <_> + + <_> + 26 4 4 6 -1. + + <_> + 26 4 2 3 2. + + <_> + 28 7 2 3 2. + + + 0 + + <_> + + <_> + 26 5 4 2 -1. + + <_> + 26 5 2 1 2. + + <_> + 28 6 2 1 2. + + + 0 + + <_> + + <_> + 26 5 4 4 -1. + + <_> + 26 5 2 2 2. + + <_> + 28 7 2 2 2. + + + 0 + + <_> + + <_> + 26 6 1 6 -1. + + <_> + 26 8 1 2 3. + + + 0 + + <_> + + <_> + 26 6 4 1 -1. + + <_> + 28 6 2 1 2. + + + 0 + + <_> + + <_> + 26 7 4 3 -1. + + <_> + 27 7 2 3 2. + + + 0 + + <_> + + <_> + 26 7 4 6 -1. + + <_> + 26 7 2 3 2. + + <_> + 28 10 2 3 2. + + + 0 + + <_> + + <_> + 26 7 18 6 -1. + + <_> + 32 7 6 6 3. + + + 0 + + <_> + + <_> + 26 7 17 6 -1. + + <_> + 26 10 17 3 2. + + + 0 + + <_> + + <_> + 26 8 3 1 -1. + + <_> + 27 8 1 1 3. + + + 0 + + <_> + + <_> + 26 9 12 4 -1. + + <_> + 29 9 6 4 2. + + + 0 + + <_> + + <_> + 26 11 20 1 -1. + + <_> + 36 11 10 1 2. + + + 0 + + <_> + + <_> + 27 0 2 1 -1. + + <_> + 28 0 1 1 2. + + + 0 + + <_> + + <_> + 27 0 3 1 -1. + + <_> + 28 0 1 1 3. + + + 0 + + <_> + + <_> + 27 0 4 1 -1. + + <_> + 29 0 2 1 2. + + + 0 + + <_> + + <_> + 27 0 18 2 -1. + + <_> + 27 0 9 1 2. + + <_> + 36 1 9 1 2. + + + 0 + + <_> + + <_> + 27 1 3 3 -1. + + <_> + 28 2 1 3 3. + + + 1 + + <_> + + <_> + 27 1 6 11 -1. + + <_> + 29 1 2 11 3. + + + 0 + + <_> + + <_> + 27 1 14 10 -1. + + <_> + 34 1 7 10 2. + + + 0 + + <_> + + <_> + 27 2 3 2 -1. + + <_> + 28 3 1 2 3. + + + 1 + + <_> + + <_> + 27 2 3 9 -1. + + <_> + 28 2 1 9 3. + + + 0 + + <_> + + <_> + 27 2 5 4 -1. + + <_> + 26 3 5 2 2. + + + 1 + + <_> + + <_> + 27 3 3 6 -1. + + <_> + 28 3 1 6 3. + + + 0 + + <_> + + <_> + 27 3 3 9 -1. + + <_> + 28 3 1 9 3. + + + 0 + + <_> + + <_> + 27 3 13 4 -1. + + <_> + 27 5 13 2 2. + + + 0 + + <_> + + <_> + 27 6 3 2 -1. + + <_> + 28 7 1 2 3. + + + 1 + + <_> + + <_> + 27 7 3 2 -1. + + <_> + 28 7 1 2 3. + + + 0 + + <_> + + <_> + 27 7 3 2 -1. + + <_> + 28 8 1 2 3. + + + 1 + + <_> + + <_> + 28 0 3 1 -1. + + <_> + 29 0 1 1 3. + + + 0 + + <_> + + <_> + 28 0 4 12 -1. + + <_> + 29 0 2 12 2. + + + 0 + + <_> + + <_> + 28 0 10 3 -1. + + <_> + 28 0 5 3 2. + + + 1 + + <_> + + <_> + 28 0 15 13 -1. + + <_> + 33 0 5 13 3. + + + 0 + + <_> + + <_> + 28 1 2 10 -1. + + <_> + 29 1 1 10 2. + + + 0 + + <_> + + <_> + 28 1 4 11 -1. + + <_> + 29 1 2 11 2. + + + 0 + + <_> + + <_> + 28 2 4 10 -1. + + <_> + 29 2 2 10 2. + + + 0 + + <_> + + <_> + 28 2 7 3 -1. + + <_> + 27 3 7 1 3. + + + 1 + + <_> + + <_> + 28 3 4 9 -1. + + <_> + 29 3 2 9 2. + + + 0 + + <_> + + <_> + 28 3 23 8 -1. + + <_> + 28 5 23 4 2. + + + 0 + + <_> + + <_> + 28 4 1 6 -1. + + <_> + 28 7 1 3 2. + + + 0 + + <_> + + <_> + 28 4 3 6 -1. + + <_> + 28 6 3 2 3. + + + 0 + + <_> + + <_> + 28 5 4 2 -1. + + <_> + 30 5 2 2 2. + + + 0 + + <_> + + <_> + 28 5 20 6 -1. + + <_> + 28 8 20 3 2. + + + 0 + + <_> + + <_> + 28 6 1 4 -1. + + <_> + 27 7 1 2 2. + + + 1 + + <_> + + <_> + 28 6 3 3 -1. + + <_> + 29 7 1 3 3. + + + 1 + + <_> + + <_> + 28 7 3 1 -1. + + <_> + 29 8 1 1 3. + + + 1 + + <_> + + <_> + 28 7 4 3 -1. + + <_> + 28 8 4 1 3. + + + 0 + + <_> + + <_> + 28 7 12 2 -1. + + <_> + 28 8 12 1 2. + + + 0 + + <_> + + <_> + 28 8 2 1 -1. + + <_> + 28 8 1 1 2. + + + 1 + + <_> + + <_> + 28 8 3 1 -1. + + <_> + 29 9 1 1 3. + + + 1 + + <_> + + <_> + 28 11 14 2 -1. + + <_> + 28 11 7 1 2. + + <_> + 35 12 7 1 2. + + + 0 + + <_> + + <_> + 29 0 3 1 -1. + + <_> + 30 0 1 1 3. + + + 0 + + <_> + + <_> + 29 0 4 1 -1. + + <_> + 30 0 2 1 2. + + + 0 + + <_> + + <_> + 29 2 3 8 -1. + + <_> + 30 2 1 8 3. + + + 0 + + <_> + + <_> + 29 3 3 9 -1. + + <_> + 30 3 1 9 3. + + + 0 + + <_> + + <_> + 29 5 2 3 -1. + + <_> + 29 6 2 1 3. + + + 0 + + <_> + + <_> + 29 5 3 4 -1. + + <_> + 29 6 3 2 2. + + + 0 + + <_> + + <_> + 29 7 3 2 -1. + + <_> + 30 8 1 2 3. + + + 1 + + <_> + + <_> + 29 7 3 3 -1. + + <_> + 30 8 1 3 3. + + + 1 + + <_> + + <_> + 29 8 4 2 -1. + + <_> + 30 8 2 2 2. + + + 0 + + <_> + + <_> + 29 8 2 2 -1. + + <_> + 29 8 1 2 2. + + + 1 + + <_> + + <_> + 29 8 3 2 -1. + + <_> + 30 9 1 2 3. + + + 1 + + <_> + + <_> + 29 9 15 4 -1. + + <_> + 34 9 5 4 3. + + + 0 + + <_> + + <_> + 29 11 22 2 -1. + + <_> + 40 11 11 2 2. + + + 0 + + <_> + + <_> + 29 12 2 1 -1. + + <_> + 30 12 1 1 2. + + + 0 + + <_> + + <_> + 29 12 3 1 -1. + + <_> + 30 12 1 1 3. + + + 0 + + <_> + + <_> + 30 0 3 1 -1. + + <_> + 31 0 1 1 3. + + + 0 + + <_> + + <_> + 30 0 4 1 -1. + + <_> + 31 0 2 1 2. + + + 0 + + <_> + + <_> + 30 0 9 2 -1. + + <_> + 33 3 3 2 3. + + + 1 + + <_> + + <_> + 30 0 20 3 -1. + + <_> + 35 0 10 3 2. + + + 0 + + <_> + + <_> + 30 0 16 2 -1. + + <_> + 30 1 16 1 2. + + + 0 + + <_> + + <_> + 30 1 4 2 -1. + + <_> + 30 1 2 1 2. + + <_> + 32 2 2 1 2. + + + 0 + + <_> + + <_> + 30 1 8 12 -1. + + <_> + 32 1 4 12 2. + + + 0 + + <_> + + <_> + 30 2 8 1 -1. + + <_> + 32 2 4 1 2. + + + 0 + + <_> + + <_> + 30 2 6 2 -1. + + <_> + 32 2 2 2 3. + + + 0 + + <_> + + <_> + 30 2 7 3 -1. + + <_> + 29 3 7 1 3. + + + 1 + + <_> + + <_> + 30 4 4 4 -1. + + <_> + 31 4 2 4 2. + + + 0 + + <_> + + <_> + 30 6 3 4 -1. + + <_> + 30 6 3 2 2. + + + 1 + + <_> + + <_> + 30 7 12 6 -1. + + <_> + 33 7 6 6 2. + + + 0 + + <_> + + <_> + 30 8 18 3 -1. + + <_> + 36 9 6 1 9. + + + 0 + + <_> + + <_> + 30 9 4 2 -1. + + <_> + 31 9 2 2 2. + + + 0 + + <_> + + <_> + 30 9 12 4 -1. + + <_> + 33 9 6 4 2. + + + 0 + + <_> + + <_> + 30 12 3 1 -1. + + <_> + 31 12 1 1 3. + + + 0 + + <_> + + <_> + 31 0 3 1 -1. + + <_> + 32 0 1 1 3. + + + 0 + + <_> + + <_> + 31 0 4 1 -1. + + <_> + 32 0 2 1 2. + + + 0 + + <_> + + <_> + 31 0 5 2 -1. + + <_> + 31 1 5 1 2. + + + 0 + + <_> + + <_> + 31 0 12 2 -1. + + <_> + 31 0 6 1 2. + + <_> + 37 1 6 1 2. + + + 0 + + <_> + + <_> + 31 0 12 3 -1. + + <_> + 31 1 12 1 3. + + + 0 + + <_> + + <_> + 31 2 4 4 -1. + + <_> + 31 2 2 2 2. + + <_> + 33 4 2 2 2. + + + 0 + + <_> + + <_> + 31 3 3 9 -1. + + <_> + 31 6 3 3 3. + + + 0 + + <_> + + <_> + 31 3 8 2 -1. + + <_> + 31 3 4 2 2. + + + 1 + + <_> + + <_> + 31 5 3 6 -1. + + <_> + 32 7 1 2 9. + + + 0 + + <_> + + <_> + 31 7 3 3 -1. + + <_> + 32 7 1 3 3. + + + 0 + + <_> + + <_> + 31 9 2 4 -1. + + <_> + 31 9 1 2 2. + + <_> + 32 11 1 2 2. + + + 0 + + <_> + + <_> + 32 0 3 1 -1. + + <_> + 33 0 1 1 3. + + + 0 + + <_> + + <_> + 32 0 3 2 -1. + + <_> + 33 0 1 2 3. + + + 0 + + <_> + + <_> + 32 0 3 3 -1. + + <_> + 33 1 1 3 3. + + + 1 + + <_> + + <_> + 32 0 3 4 -1. + + <_> + 32 1 3 2 2. + + + 0 + + <_> + + <_> + 32 0 8 1 -1. + + <_> + 36 0 4 1 2. + + + 0 + + <_> + + <_> + 32 0 17 3 -1. + + <_> + 32 1 17 1 3. + + + 0 + + <_> + + <_> + 32 0 17 4 -1. + + <_> + 32 1 17 2 2. + + + 0 + + <_> + + <_> + 32 0 18 3 -1. + + <_> + 32 1 18 1 3. + + + 0 + + <_> + + <_> + 32 0 19 3 -1. + + <_> + 32 1 19 1 3. + + + 0 + + <_> + + <_> + 32 1 3 6 -1. + + <_> + 33 3 1 2 9. + + + 0 + + <_> + + <_> + 32 1 3 2 -1. + + <_> + 33 2 1 2 3. + + + 1 + + <_> + + <_> + 32 1 12 1 -1. + + <_> + 36 1 4 1 3. + + + 0 + + <_> + + <_> + 32 1 8 2 -1. + + <_> + 32 1 4 1 2. + + <_> + 36 2 4 1 2. + + + 0 + + <_> + + <_> + 32 1 19 9 -1. + + <_> + 32 4 19 3 3. + + + 0 + + <_> + + <_> + 32 2 2 2 -1. + + <_> + 32 3 2 1 2. + + + 0 + + <_> + + <_> + 32 3 4 3 -1. + + <_> + 33 3 2 3 2. + + + 0 + + <_> + + <_> + 32 7 4 2 -1. + + <_> + 33 7 2 2 2. + + + 0 + + <_> + + <_> + 32 9 3 1 -1. + + <_> + 33 9 1 1 3. + + + 0 + + <_> + + <_> + 32 9 3 3 -1. + + <_> + 33 10 1 1 9. + + + 0 + + <_> + + <_> + 32 11 3 2 -1. + + <_> + 32 12 3 1 2. + + + 0 + + <_> + + <_> + 33 0 3 3 -1. + + <_> + 34 1 1 3 3. + + + 1 + + <_> + + <_> + 33 0 3 4 -1. + + <_> + 34 1 1 4 3. + + + 1 + + <_> + + <_> + 33 0 12 1 -1. + + <_> + 37 0 4 1 3. + + + 0 + + <_> + + <_> + 33 0 16 1 -1. + + <_> + 37 0 8 1 2. + + + 0 + + <_> + + <_> + 33 0 10 1 -1. + + <_> + 38 0 5 1 2. + + + 0 + + <_> + + <_> + 33 0 9 2 -1. + + <_> + 33 1 9 1 2. + + + 0 + + <_> + + <_> + 33 0 17 4 -1. + + <_> + 33 1 17 2 2. + + + 0 + + <_> + + <_> + 33 1 1 2 -1. + + <_> + 33 2 1 1 2. + + + 0 + + <_> + + <_> + 33 1 3 2 -1. + + <_> + 34 2 1 2 3. + + + 1 + + <_> + + <_> + 33 1 4 2 -1. + + <_> + 34 2 2 2 2. + + + 1 + + <_> + + <_> + 33 1 17 2 -1. + + <_> + 33 2 17 1 2. + + + 0 + + <_> + + <_> + 33 2 1 3 -1. + + <_> + 33 3 1 1 3. + + + 0 + + <_> + + <_> + 33 2 3 2 -1. + + <_> + 34 3 1 2 3. + + + 1 + + <_> + + <_> + 33 2 13 9 -1. + + <_> + 33 5 13 3 3. + + + 0 + + <_> + + <_> + 33 5 3 3 -1. + + <_> + 34 6 1 1 9. + + + 0 + + <_> + + <_> + 33 5 1 8 -1. + + <_> + 33 7 1 4 2. + + + 0 + + <_> + + <_> + 33 6 3 1 -1. + + <_> + 34 7 1 1 3. + + + 1 + + <_> + + <_> + 33 7 3 1 -1. + + <_> + 34 8 1 1 3. + + + 1 + + <_> + + <_> + 33 7 4 4 -1. + + <_> + 33 7 2 2 2. + + <_> + 35 9 2 2 2. + + + 0 + + <_> + + <_> + 33 8 2 3 -1. + + <_> + 32 9 2 1 3. + + + 1 + + <_> + + <_> + 33 8 6 3 -1. + + <_> + 35 8 2 3 3. + + + 0 + + <_> + + <_> + 33 8 16 4 -1. + + <_> + 33 10 16 2 2. + + + 0 + + <_> + + <_> + 33 9 2 4 -1. + + <_> + 33 11 2 2 2. + + + 0 + + <_> + + <_> + 33 9 4 4 -1. + + <_> + 33 9 2 2 2. + + <_> + 35 11 2 2 2. + + + 0 + + <_> + + <_> + 33 10 1 2 -1. + + <_> + 33 11 1 1 2. + + + 0 + + <_> + + <_> + 34 0 1 3 -1. + + <_> + 33 1 1 1 3. + + + 1 + + <_> + + <_> + 34 0 3 11 -1. + + <_> + 35 0 1 11 3. + + + 0 + + <_> + + <_> + 34 0 4 4 -1. + + <_> + 34 0 2 4 2. + + + 1 + + <_> + + <_> + 34 0 16 1 -1. + + <_> + 38 0 8 1 2. + + + 0 + + <_> + + <_> + 34 0 14 1 -1. + + <_> + 41 0 7 1 2. + + + 0 + + <_> + + <_> + 34 1 15 6 -1. + + <_> + 39 1 5 6 3. + + + 0 + + <_> + + <_> + 34 2 3 2 -1. + + <_> + 35 3 1 2 3. + + + 1 + + <_> + + <_> + 34 2 3 8 -1. + + <_> + 35 2 1 8 3. + + + 0 + + <_> + + <_> + 34 3 4 4 -1. + + <_> + 35 3 2 4 2. + + + 0 + + <_> + + <_> + 34 3 4 7 -1. + + <_> + 35 3 2 7 2. + + + 0 + + <_> + + <_> + 34 5 3 2 -1. + + <_> + 35 6 1 2 3. + + + 1 + + <_> + + <_> + 34 5 4 2 -1. + + <_> + 35 6 2 2 2. + + + 1 + + <_> + + <_> + 34 5 3 4 -1. + + <_> + 35 5 1 4 3. + + + 0 + + <_> + + <_> + 34 5 6 8 -1. + + <_> + 36 5 2 8 3. + + + 0 + + <_> + + <_> + 34 6 3 1 -1. + + <_> + 35 7 1 1 3. + + + 1 + + <_> + + <_> + 34 6 3 2 -1. + + <_> + 35 7 1 2 3. + + + 1 + + <_> + + <_> + 34 6 6 5 -1. + + <_> + 36 6 2 5 3. + + + 0 + + <_> + + <_> + 34 7 4 2 -1. + + <_> + 35 7 2 2 2. + + + 0 + + <_> + + <_> + 34 7 3 2 -1. + + <_> + 35 8 1 2 3. + + + 1 + + <_> + + <_> + 34 7 4 3 -1. + + <_> + 35 7 2 3 2. + + + 0 + + <_> + + <_> + 35 0 3 12 -1. + + <_> + 36 0 1 12 3. + + + 0 + + <_> + + <_> + 35 0 4 1 -1. + + <_> + 37 0 2 1 2. + + + 0 + + <_> + + <_> + 35 0 12 1 -1. + + <_> + 41 0 6 1 2. + + + 0 + + <_> + + <_> + 35 0 14 4 -1. + + <_> + 35 0 7 2 2. + + <_> + 42 2 7 2 2. + + + 0 + + <_> + + <_> + 35 1 4 12 -1. + + <_> + 36 1 2 12 2. + + + 0 + + <_> + + <_> + 35 2 3 4 -1. + + <_> + 36 3 1 4 3. + + + 1 + + <_> + + <_> + 35 2 4 6 -1. + + <_> + 36 2 2 6 2. + + + 0 + + <_> + + <_> + 35 4 3 3 -1. + + <_> + 35 5 3 1 3. + + + 0 + + <_> + + <_> + 35 5 2 4 -1. + + <_> + 36 5 1 4 2. + + + 0 + + <_> + + <_> + 35 5 4 7 -1. + + <_> + 36 5 2 7 2. + + + 0 + + <_> + + <_> + 35 5 15 5 -1. + + <_> + 40 5 5 5 3. + + + 0 + + <_> + + <_> + 35 7 3 1 -1. + + <_> + 36 8 1 1 3. + + + 1 + + <_> + + <_> + 35 7 3 2 -1. + + <_> + 36 8 1 2 3. + + + 1 + + <_> + + <_> + 35 8 2 2 -1. + + <_> + 35 8 1 2 2. + + + 1 + + <_> + + <_> + 35 10 15 3 -1. + + <_> + 35 11 15 1 3. + + + 0 + + <_> + + <_> + 35 11 5 2 -1. + + <_> + 35 12 5 1 2. + + + 0 + + <_> + + <_> + 35 11 6 2 -1. + + <_> + 35 12 6 1 2. + + + 0 + + <_> + + <_> + 36 0 14 1 -1. + + <_> + 43 0 7 1 2. + + + 0 + + <_> + + <_> + 36 1 4 2 -1. + + <_> + 36 1 2 1 2. + + <_> + 38 2 2 1 2. + + + 0 + + <_> + + <_> + 36 2 4 10 -1. + + <_> + 37 2 2 10 2. + + + 0 + + <_> + + <_> + 36 4 4 6 -1. + + <_> + 37 4 2 6 2. + + + 0 + + <_> + + <_> + 36 4 3 6 -1. + + <_> + 36 4 3 3 2. + + + 1 + + <_> + + <_> + 36 4 6 3 -1. + + <_> + 35 5 6 1 3. + + + 1 + + <_> + + <_> + 36 6 3 3 -1. + + <_> + 37 7 1 3 3. + + + 1 + + <_> + + <_> + 36 9 4 2 -1. + + <_> + 38 9 2 2 2. + + + 0 + + <_> + + <_> + 36 10 4 1 -1. + + <_> + 37 10 2 1 2. + + + 0 + + <_> + + <_> + 36 10 6 3 -1. + + <_> + 39 10 3 3 2. + + + 0 + + <_> + + <_> + 37 0 2 3 -1. + + <_> + 36 1 2 1 3. + + + 1 + + <_> + + <_> + 37 0 4 4 -1. + + <_> + 37 0 2 2 2. + + <_> + 39 2 2 2 2. + + + 0 + + <_> + + <_> + 37 1 4 5 -1. + + <_> + 38 2 2 5 2. + + + 1 + + <_> + + <_> + 37 1 9 9 -1. + + <_> + 37 4 9 3 3. + + + 0 + + <_> + + <_> + 37 3 8 4 -1. + + <_> + 37 5 8 2 2. + + + 0 + + <_> + + <_> + 37 4 4 1 -1. + + <_> + 38 4 2 1 2. + + + 0 + + <_> + + <_> + 37 4 4 4 -1. + + <_> + 38 4 2 4 2. + + + 0 + + <_> + + <_> + 37 5 8 8 -1. + + <_> + 39 5 4 8 2. + + + 0 + + <_> + + <_> + 37 9 6 4 -1. + + <_> + 37 9 3 2 2. + + <_> + 40 11 3 2 2. + + + 0 + + <_> + + <_> + 37 10 4 2 -1. + + <_> + 37 10 2 1 2. + + <_> + 39 11 2 1 2. + + + 0 + + <_> + + <_> + 37 10 8 3 -1. + + <_> + 39 10 4 3 2. + + + 0 + + <_> + + <_> + 37 10 5 3 -1. + + <_> + 37 11 5 1 3. + + + 0 + + <_> + + <_> + 38 0 4 1 -1. + + <_> + 40 0 2 1 2. + + + 0 + + <_> + + <_> + 38 1 12 2 -1. + + <_> + 38 2 12 1 2. + + + 0 + + <_> + + <_> + 38 4 6 1 -1. + + <_> + 40 4 2 1 3. + + + 0 + + <_> + + <_> + 38 6 6 6 -1. + + <_> + 40 8 2 2 9. + + + 0 + + <_> + + <_> + 38 9 6 1 -1. + + <_> + 40 9 2 1 3. + + + 0 + + <_> + + <_> + 38 11 1 2 -1. + + <_> + 38 12 1 1 2. + + + 0 + + <_> + + <_> + 39 0 2 4 -1. + + <_> + 39 1 2 2 2. + + + 0 + + <_> + + <_> + 39 0 10 3 -1. + + <_> + 39 1 10 1 3. + + + 0 + + <_> + + <_> + 39 1 11 2 -1. + + <_> + 39 2 11 1 2. + + + 0 + + <_> + + <_> + 39 4 4 4 -1. + + <_> + 40 4 2 4 2. + + + 0 + + <_> + + <_> + 39 6 3 6 -1. + + <_> + 40 8 1 2 9. + + + 0 + + <_> + + <_> + 39 7 4 3 -1. + + <_> + 40 7 2 3 2. + + + 0 + + <_> + + <_> + 39 8 4 2 -1. + + <_> + 40 8 2 2 2. + + + 0 + + <_> + + <_> + 39 11 12 2 -1. + + <_> + 45 11 6 2 2. + + + 0 + + <_> + + <_> + 40 0 1 3 -1. + + <_> + 40 1 1 1 3. + + + 0 + + <_> + + <_> + 40 0 3 3 -1. + + <_> + 40 1 3 1 3. + + + 0 + + <_> + + <_> + 40 0 5 2 -1. + + <_> + 40 1 5 1 2. + + + 0 + + <_> + + <_> + 40 0 8 3 -1. + + <_> + 40 1 8 1 3. + + + 0 + + <_> + + <_> + 40 5 4 2 -1. + + <_> + 42 5 2 2 2. + + + 0 + + <_> + + <_> + 40 6 4 1 -1. + + <_> + 41 7 2 1 2. + + + 1 + + <_> + + <_> + 40 8 4 2 -1. + + <_> + 41 8 2 2 2. + + + 0 + + <_> + + <_> + 40 10 9 2 -1. + + <_> + 40 11 9 1 2. + + + 0 + + <_> + + <_> + 41 0 6 12 -1. + + <_> + 43 0 2 12 3. + + + 0 + + <_> + + <_> + 41 0 4 2 -1. + + <_> + 41 1 4 1 2. + + + 0 + + <_> + + <_> + 41 1 3 4 -1. + + <_> + 42 2 1 4 3. + + + 1 + + <_> + + <_> + 41 1 6 9 -1. + + <_> + 41 4 6 3 3. + + + 0 + + <_> + + <_> + 41 5 4 5 -1. + + <_> + 42 5 2 5 2. + + + 0 + + <_> + + <_> + 41 5 4 6 -1. + + <_> + 42 5 2 6 2. + + + 0 + + <_> + + <_> + 41 6 3 2 -1. + + <_> + 42 7 1 2 3. + + + 1 + + <_> + + <_> + 41 6 4 5 -1. + + <_> + 42 6 2 5 2. + + + 0 + + <_> + + <_> + 41 7 3 1 -1. + + <_> + 42 8 1 1 3. + + + 1 + + <_> + + <_> + 41 7 2 3 -1. + + <_> + 41 8 2 1 3. + + + 0 + + <_> + + <_> + 41 8 3 1 -1. + + <_> + 42 8 1 1 3. + + + 0 + + <_> + + <_> + 41 8 3 2 -1. + + <_> + 42 9 1 2 3. + + + 1 + + <_> + + <_> + 41 8 4 4 -1. + + <_> + 41 8 2 2 2. + + <_> + 43 10 2 2 2. + + + 0 + + <_> + + <_> + 41 10 1 2 -1. + + <_> + 41 11 1 1 2. + + + 0 + + <_> + + <_> + 42 7 3 2 -1. + + <_> + 43 8 1 2 3. + + + 1 + + <_> + + <_> + 42 7 3 3 -1. + + <_> + 43 8 1 3 3. + + + 1 + + <_> + + <_> + 42 8 2 2 -1. + + <_> + 42 8 1 2 2. + + + 1 + + <_> + + <_> + 42 9 2 4 -1. + + <_> + 42 9 1 2 2. + + <_> + 43 11 1 2 2. + + + 0 + + <_> + + <_> + 42 9 2 2 -1. + + <_> + 42 9 1 2 2. + + + 1 + + <_> + + <_> + 43 4 8 9 -1. + + <_> + 47 4 4 9 2. + + + 0 + + <_> + + <_> + 43 5 2 3 -1. + + <_> + 43 6 2 1 3. + + + 0 + + <_> + + <_> + 43 5 4 4 -1. + + <_> + 43 5 4 2 2. + + + 1 + + <_> + + <_> + 43 5 8 8 -1. + + <_> + 47 5 4 8 2. + + + 0 + + <_> + + <_> + 43 7 3 3 -1. + + <_> + 44 8 1 3 3. + + + 1 + + <_> + + <_> + 43 9 8 2 -1. + + <_> + 45 9 4 2 2. + + + 0 + + <_> + + <_> + 43 10 8 3 -1. + + <_> + 45 10 4 3 2. + + + 0 + + <_> + + <_> + 43 12 3 1 -1. + + <_> + 44 12 1 1 3. + + + 0 + + <_> + + <_> + 44 2 1 10 -1. + + <_> + 44 7 1 5 2. + + + 0 + + <_> + + <_> + 44 2 4 4 -1. + + <_> + 44 2 2 2 2. + + <_> + 46 4 2 2 2. + + + 0 + + <_> + + <_> + 44 2 5 6 -1. + + <_> + 44 5 5 3 2. + + + 0 + + <_> + + <_> + 44 4 6 2 -1. + + <_> + 46 4 2 2 3. + + + 0 + + <_> + + <_> + 44 7 4 2 -1. + + <_> + 45 7 2 2 2. + + + 0 + + <_> + + <_> + 44 7 4 4 -1. + + <_> + 45 7 2 4 2. + + + 0 + + <_> + + <_> + 45 5 4 4 -1. + + <_> + 46 5 2 4 2. + + + 0 + + <_> + + <_> + 45 5 4 4 -1. + + <_> + 45 5 2 2 2. + + <_> + 47 7 2 2 2. + + + 0 + + <_> + + <_> + 45 6 6 3 -1. + + <_> + 47 7 2 1 9. + + + 0 + + <_> + + <_> + 45 8 6 1 -1. + + <_> + 47 8 2 1 3. + + + 0 + + <_> + + <_> + 46 0 1 3 -1. + + <_> + 46 1 1 1 3. + + + 0 + + <_> + + <_> + 46 0 2 2 -1. + + <_> + 46 1 2 1 2. + + + 0 + + <_> + + <_> + 46 0 2 4 -1. + + <_> + 46 2 2 2 2. + + + 0 + + <_> + + <_> + 46 1 3 4 -1. + + <_> + 46 2 3 2 2. + + + 0 + + <_> + + <_> + 46 3 3 3 -1. + + <_> + 47 4 1 1 9. + + + 0 + + <_> + + <_> + 46 5 3 3 -1. + + <_> + 47 6 1 1 9. + + + 0 + + <_> + + <_> + 46 5 2 6 -1. + + <_> + 46 7 2 2 3. + + + 0 + + <_> + + <_> + 46 6 3 6 -1. + + <_> + 47 8 1 2 9. + + + 0 + + <_> + + <_> + 47 0 2 2 -1. + + <_> + 47 1 2 1 2. + + + 0 + + <_> + + <_> + 47 1 1 4 -1. + + <_> + 47 2 1 2 2. + + + 0 + + <_> + + <_> + 47 2 1 6 -1. + + <_> + 47 4 1 2 3. + + + 0 + + <_> + + <_> + 47 4 1 6 -1. + + <_> + 47 6 1 2 3. + + + 0 + + <_> + + <_> + 47 4 4 2 -1. + + <_> + 49 4 2 2 2. + + + 0 + + <_> + + <_> + 47 4 2 6 -1. + + <_> + 47 6 2 2 3. + + + 0 + + <_> + + <_> + 47 8 3 1 -1. + + <_> + 48 9 1 1 3. + + + 1 + + <_> + + <_> + 47 9 1 4 -1. + + <_> + 47 11 1 2 2. + + + 0 + + <_> + + <_> + 47 9 2 4 -1. + + <_> + 47 11 2 2 2. + + + 0 + + <_> + + <_> + 48 0 3 6 -1. + + <_> + 48 3 3 3 2. + + + 0 + + <_> + + <_> + 48 1 3 2 -1. + + <_> + 49 2 1 2 3. + + + 1 + + <_> + + <_> + 48 1 3 12 -1. + + <_> + 49 1 1 12 3. + + + 0 + + <_> + + <_> + 48 5 3 7 -1. + + <_> + 49 5 1 7 3. + + + 0 + + <_> + + <_> + 48 5 3 8 -1. + + <_> + 49 5 1 8 3. + + + 0 + + <_> + + <_> + 48 6 3 2 -1. + + <_> + 49 7 1 2 3. + + + 1 + + <_> + + <_> + 48 8 3 2 -1. + + <_> + 49 9 1 2 3. + + + 1 + + <_> + + <_> + 49 0 2 2 -1. + + <_> + 50 0 1 2 2. + + + 0 + + <_> + + <_> + 49 0 2 8 -1. + + <_> + 50 0 1 8 2. + + + 0 + + <_> + + <_> + 49 11 2 2 -1. + + <_> + 50 11 1 2 2. + + + 0 + + <_> + + <_> + 50 1 1 3 -1. + + <_> + 50 2 1 1 3. + + + 0 + + <_> + + <_> + 50 4 1 3 -1. + + <_> + 50 5 1 1 3. + + + 0 + + + + diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index d8d5c7d..de749ba 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -61,6 +61,15 @@ add_library( # Sets the name of the library. opencv_support.cpp traffic_light.cpp) +add_library( # Sets the name of the library. + opencv_support + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + opencv_support.cpp) + add_library( # Sets the name of the library. qr_code_decode @@ -97,6 +106,16 @@ add_library( # Sets the name of the library. opencv_support.cpp car_license.cpp) +add_library( # Sets the name of the library. + car_license_reco_ocr + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + opencv_support.cpp + car_license_ocr.cpp) + add_library( # Sets the name of the library. traffic_sign_reco @@ -128,6 +147,24 @@ add_library( # Sets the name of the library. # Provides a relative path to your source file(s). main_car_aes.cpp) +add_library( # Sets the name of the library. + lib_hyper_lpr + + # Sets the library as a shared library. + SHARED + + # Provides a relative path to your source file(s). + opencv_support.cpp + lib_hyper_lpr/src/CNNRecognizer.cpp + lib_hyper_lpr/src/FastDeskew.cpp + lib_hyper_lpr/src/FineMapping.cpp + lib_hyper_lpr/src/Pipeline.cpp + lib_hyper_lpr/src/PlateDetection.cpp + lib_hyper_lpr/src/PlateSegmentation.cpp + lib_hyper_lpr/src/Recognizer.cpp + lib_hyper_lpr/src/SegmentationFreeRecognizer.cpp + lib_hyper_lpr/javaWarpper.cpp) + # Searches for a specified prebuilt library and stores the path as a # variable. Because CMake includes system libraries in the search path by # default, you only need to specify the name of the public NDK library @@ -163,6 +200,15 @@ target_link_libraries( # Specifies the target library. ${OpenCV_LIBS} ${log-lib}) +target_link_libraries( # Specifies the target library. + opencv_support + + ${OpenCV_LIBS} + ${jnigraphics-lib} + # Links the target library to the log library + # included in the NDK. + ${log-lib}) + target_link_libraries( # Specifies the target library. traffic_light @@ -199,6 +245,15 @@ target_link_libraries( # Specifies the target library. # included in the NDK. ${log-lib}) +target_link_libraries( # Specifies the target library. + car_license_reco_ocr + + ${OpenCV_LIBS} + ${jnigraphics-lib} + # Links the target library to the log library + # included in the NDK. + ${log-lib}) + target_link_libraries( # Specifies the target library. traffic_sign_reco @@ -223,3 +278,12 @@ target_link_libraries( # Specifies the target library. # Links the target library to the log library # included in the NDK. ${log-lib}) + +target_link_libraries( # Specifies the target library. + lib_hyper_lpr + + # Links the target library to the log library + # included in the NDK. + ${OpenCV_LIBS} + ${jnigraphics-lib} + ${log-lib}) diff --git a/app/src/main/cpp/car_license.cpp b/app/src/main/cpp/car_license.cpp index b42b27a..b32cfa9 100644 --- a/app/src/main/cpp/car_license.cpp +++ b/app/src/main/cpp/car_license.cpp @@ -3,11 +3,14 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//基于模板匹配的车牌识别 + #include "car_license.h" #include "debug_logger.h" namespace uns { + //统计有效像素点个数 int CarLicense::PixCount(cv::Mat image) { int count = 0; @@ -23,6 +26,7 @@ namespace uns return -1; } + //获取车牌区域 bool CarLicense::Get_License_ROI(cv::Mat src, Car::License& License_ROI) { cv::Mat gray; @@ -61,6 +65,7 @@ namespace uns return true; } + //读取存储的模板图片 bool CarLicense::Read_Data(std::string filename, std::vector& dataset) { dataset.clear(); @@ -69,7 +74,6 @@ namespace uns std::string this_file = filename; this_file.push_back(chr_str[i]); this_file += ".jpg"; - LOGW("Reading: %s", this_file.c_str()); cv::Mat image = cv::imread(this_file); if(image.empty()) return false; @@ -79,6 +83,7 @@ namespace uns return true; } + //获取字符区域 bool CarLicense::Get_Character_ROI(Car::License& License_ROI, std::vector& Character_ROI) { cv::Mat gray; @@ -120,6 +125,7 @@ namespace uns return true; } + //进行模板匹配,识别 bool CarLicense::License_Recognition(std::vector& Character_ROI, std::vector& result_index) { std::vector dataset; @@ -132,7 +138,9 @@ namespace uns cv::Mat roi_thresh; int minCount = 1000000; cvtColor(Character_ROI[i].mat, roi_gray, cv::COLOR_BGR2GRAY); - threshold(roi_gray, roi_thresh, 50, 255, cv::THRESH_BINARY); +// cv::imwrite("/sdcard/MainCar/gray_"+std::to_string(i)+".jpg",roi_gray); + threshold(roi_gray, roi_thresh, 100, 255, cv::THRESH_BINARY); +// cv::imwrite("/sdcard/MainCar/thresh_"+std::to_string(i)+".jpg",roi_thresh); for (int j = 0; j < dataset.size(); j++) { cv::Mat dst; @@ -140,7 +148,7 @@ namespace uns cv::Mat temp_thresh; cvtColor(dataset[j], temp_gray, cv::COLOR_BGR2GRAY); threshold(temp_gray, temp_thresh, 50, 255, cv::THRESH_BINARY); - absdiff(roi_thresh, temp_thresh, dst); //计算两张图片的像素差,以此判断两张图片是否相同 + absdiff(roi_thresh, temp_thresh, dst); //计算两张图片的像素差,以此判断两张图片是否相同 int count = PixCount(dst); if (count < minCount) { @@ -153,6 +161,7 @@ namespace uns return true; } + //识别车牌,步骤:识别车牌区域->获取文字区域->模板匹配识别文字 std::string CarLicense::RecognizeCarLicense(cv::Mat img) { std::string result; @@ -165,10 +174,6 @@ namespace uns if (Get_Character_ROI(License_ROI, Character_ROI)) { LOGI("Char_ROI OK, Size: %d", Character_ROI.size()); - for(int i=0;i result_index; if (License_Recognition(Character_ROI, result_index)) { @@ -188,12 +193,14 @@ namespace uns return result; } + //设置外部存储路径 void CarLicense::SetExternalImagePath(std::string path) { external_image_path = path; } }; +//自检函数到导出 extern "C" JNIEXPORT jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_CarLicenseTest(JNIEnv *env, jclass _this) { @@ -201,6 +208,7 @@ jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_CarLicenseTest(JNIEn return env->NewStringUTF(version.c_str()); } +//识别函数导出 extern "C" JNIEXPORT jstring JNICALL Java_com_uns_maincar_cpp_1interface_CarLicense_RecognizeLicense(JNIEnv *env, jclass _this, jobject image, jstring external_path) { diff --git a/app/src/main/cpp/car_license.h b/app/src/main/cpp/car_license.h index d8c5918..ddf3f52 100644 --- a/app/src/main/cpp/car_license.h +++ b/app/src/main/cpp/car_license.h @@ -8,6 +8,8 @@ #define CAR_LICENSE_RECO_VERSION "1.0.0" +//基于模板匹配的车牌识别 + #include #include #include "public_types.h" diff --git a/app/src/main/cpp/car_license_ocr.cpp b/app/src/main/cpp/car_license_ocr.cpp new file mode 100644 index 0000000..e9aaa9b --- /dev/null +++ b/app/src/main/cpp/car_license_ocr.cpp @@ -0,0 +1,135 @@ +// +// Created by UnknownObject on 2022/11/12. +// Copyright (c) 2022 UnknownNetworkService. All rights reserved. +// + +//基于OCR的车牌识别 + +#include "car_license_ocr.h" + +//切除图片上1/3(可能包含日光灯灯高亮度区域) +cv::Mat uns::CarID_OCR::CutImageHead(const cv::Mat &img) +{ + cv::Rect rect(0, 100, img.size().width, img.size().height - 100); + return img(rect); +} + +//切除图片边缘(除去由于轮廓外接矩形造成的额外无效内容) +cv::Rect uns::CarID_OCR::CutRectEdges(const cv::Rect &rect) +{ + if (rect.size().area() <= 100) + return rect; + return cv::Rect(rect.tl().x + 10, rect.tl().y + 10, rect.size().width - 20, + rect.size().height - 10); +} + +//获取图片中面积最大的轮廓的外接矩形 +cv::Rect uns::CarID_OCR::GetMaxRect(const cv::Mat &img) +{ + cv::Rect max_rect; + double max_rect_size = 0; + std::vector hierarchy; + std::vector> contours; + cv::findContours(img, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE); //轮廓查找 + for (auto &contour: contours) //检测所找到的轮廓 + { + double area = cv::contourArea(cv::Mat(contour)); + if (area > (img.size().area() / 2.0)) + continue; + if (area > max_rect_size) + { + max_rect_size = area; + max_rect = CutRectEdges(cv::boundingRect(contour)); + } + } + return max_rect; +} + +//根据亮度获取TFT显示器的显示屏区域 +cv::Mat uns::CarID_OCR::GetScreenArea(const cv::Mat &img) +{ + cv::Mat hsv; + if (img.empty()) + return hsv; + cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV); + cv::Mat chn_v(hsv.size(), CV_8UC1); + for (int r = 0; r < hsv.rows; r++) + { + for (int c = 0; c < hsv.cols; c++) + { + uchar v = hsv.at(r, c)[2]; + chn_v.at(r, c) = (v >= 240 ? 0 : 255); + } + } + cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(11, 11)); + cv::morphologyEx(chn_v, chn_v, cv::MORPH_CLOSE, kernel); + cv::Rect max_validate_rect = GetMaxRect(chn_v); + if (max_validate_rect.size().area() == 0) + return {}; + else + { + try + { + return img(max_validate_rect); + } + catch (...) + { + return {}; + } + } +} + +//色彩处理(灰度 + 二值化) +cv::Mat uns::CarID_OCR::ColorImprove(const cv::Mat &img) +{ + cv::Mat gray; + if (img.empty()) + return gray; + cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); + cv::threshold(gray, gray, 185, 255, cv::THRESH_BINARY); + return gray; + +} + +//整合后的图片处理类 +cv::Mat uns::CarID_OCR::ProcessImage(const cv::Mat &img) +{ + cv::Mat cih, gsa, ci; + cih = CutImageHead(img); + if (!cih.empty()) + cv::imwrite("/sdcard/MainCar/cih.jpg", cih); + LOGI("CIH Validate"); + gsa = GetScreenArea(cih); + if (!gsa.empty()) + cv::imwrite("/sdcard/MainCar/gsa.jpg", gsa); + LOGI("GSA Validate"); + ci = ColorImprove(gsa); + if (!ci.empty()) + cv::imwrite("/sdcard/MainCar/ci.jpg", ci); + LOGI("CI Validate"); + return ci; +} + +//图片处理函数导出 +extern "C" JNIEXPORT +jobject JNICALL +Java_com_uns_maincar_cpp_1interface_CarLicense_RecognizeLicenseOCR(JNIEnv *env, jclass _this, + jobject image) +{ + cv::Mat source; + if (!BitmapToMat(env, image, source)) + return nullptr; + else + { + uns::CarID_OCR car_license; + cv::Mat img = car_license.ProcessImage(source); + if (img.empty()) + { + LOGI("Image Is Empty"); + return nullptr; + } + jobject bmp = GenerateBitmap(env, img.cols, img.rows); + MatToBitmap(env, img, bmp); + return bmp; + } +} \ No newline at end of file diff --git a/app/src/main/cpp/car_license_ocr.h b/app/src/main/cpp/car_license_ocr.h new file mode 100644 index 0000000..ebd53ce --- /dev/null +++ b/app/src/main/cpp/car_license_ocr.h @@ -0,0 +1,38 @@ +// +// Created by UnknownObject on 2022/11/12. +// Copyright (c) 2022 UnknownNetworkService. All rights reserved. +// + +#ifndef MAINCAR_CAR_LICENSE_OCR_H +#define MAINCAR_CAR_LICENSE_OCR_H + +//基于OCR的车牌识别 + +#include +#include "debug_logger.h" +#include "opencv_support.h" +#include +#include +#include + +namespace uns +{ + class CarID_OCR + { + private: + cv::Mat CutImageHead(const cv::Mat &img); + + cv::Rect CutRectEdges(const cv::Rect &rect); + + cv::Rect GetMaxRect(const cv::Mat &img); + + cv::Mat GetScreenArea(const cv::Mat &img); + + cv::Mat ColorImprove(const cv::Mat &img); + + public: + cv::Mat ProcessImage(const cv::Mat &img); + }; +}; + +#endif //MAINCAR_CAR_LICENSE_OCR_H diff --git a/app/src/main/cpp/color_reco.cpp b/app/src/main/cpp/color_reco.cpp index 86e6fad..9376157 100644 --- a/app/src/main/cpp/color_reco.cpp +++ b/app/src/main/cpp/color_reco.cpp @@ -3,15 +3,19 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//颜色识别 + #include "color_reco.h" namespace uns { + //“远大于”函数 bool ColorReco::MuchLarger(int a, int b, double rate) { return (a >= (b * rate)); } + //识别颜色,逐像素便利并统计出现次数最多的颜色作为最终结果 std::string ColorReco::RecoColor(const cv::Mat& img) { int max_count = 0; @@ -44,7 +48,7 @@ namespace uns } for (auto& ele : counter) { - if ((ele.first == std_color_white) || (ele.first == std_color_yellow)) + if ((ele.first == std_color_white)/* || (ele.first == std_color_yellow)*/) continue; if (ele.second > max_count) { diff --git a/app/src/main/cpp/color_reco.h b/app/src/main/cpp/color_reco.h index 2541c9f..86c149e 100644 --- a/app/src/main/cpp/color_reco.h +++ b/app/src/main/cpp/color_reco.h @@ -6,6 +6,8 @@ #ifndef MAINCAR_COLOR_RECO_H #define MAINCAR_COLOR_RECO_H +//颜色识别 + #define COLOR_RECO_VERSION "1.0.0" #include diff --git a/app/src/main/cpp/debug_logger.h b/app/src/main/cpp/debug_logger.h index 12f2505..83cf861 100644 --- a/app/src/main/cpp/debug_logger.h +++ b/app/src/main/cpp/debug_logger.h @@ -3,10 +3,13 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//调试用的日志输出 + #ifndef MAINCAR_DEBUG_LOGGER_H #define MAINCAR_DEBUG_LOGGER_H #include + #define LOG_TAG __FILE__ #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) diff --git a/app/src/main/cpp/env_test.cpp b/app/src/main/cpp/env_test.cpp index 4ff7878..a28d339 100644 --- a/app/src/main/cpp/env_test.cpp +++ b/app/src/main/cpp/env_test.cpp @@ -3,6 +3,8 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//NDK和OpenCV(C++)的自检 + #include #include #include @@ -10,8 +12,8 @@ extern "C" JNIEXPORT jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_NDKTest(JNIEnv *env, jclass _this) { - std::string check = "C++ NDK Check: Success"; - return env->NewStringUTF(check.c_str()); + std::string check = "C++ NDK Check: Success"; + return env->NewStringUTF(check.c_str()); } extern "C" JNIEXPORT diff --git a/app/src/main/cpp/image_processor.cpp b/app/src/main/cpp/image_processor.cpp index a00736b..01573b4 100644 --- a/app/src/main/cpp/image_processor.cpp +++ b/app/src/main/cpp/image_processor.cpp @@ -3,22 +3,26 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//图片预处理,用于形状颜色、交通标志等的图像预处理 + #include "image_processor.h" #include "debug_logger.h" namespace uns { + //“远大于”函数 bool ImageProcessor::MuchLarger(int a, int b, double rate) { return (a >= (b * rate)); } + //使用边缘检测获取包含屏幕的最大矩形 Shapes::Rectangle ImageProcessor::GetScreenRect(const cv::Mat& img) { int thresh = 50, N = 5; cv::Mat dst, gray_one, gray; std::vector hierarchy; - Shapes::Rectangle result{ 0,0 }, temp; + Shapes::Rectangle result{0, 0 }, temp; std::vector> contours; gray_one = cv::Mat(img.size(), CV_8U); cv::medianBlur(img, dst, 9); //滤波增强边缘检测 @@ -56,6 +60,7 @@ namespace uns return result; } + //填充边缘(主要应对外接矩形对轮廓外的无效区域的裁切) cv::Mat ImageProcessor::FillEdges(const cv::Mat& img, int edge_width) { cv::Mat result(img.size(), img.type()); @@ -65,7 +70,7 @@ namespace uns { if ((r <= edge_width) || (c <= edge_width)) { - result.at(r, c)[0] = 0; + result.at(r, c)[0] = 255; result.at(r, c)[1] = 255; result.at(r, c)[2] = 255; } @@ -80,6 +85,7 @@ namespace uns return result; } + //图像裁切 cv::Mat ImageProcessor::CutScreenImage(const cv::Mat& img, const Shapes::Rectangle& rect) { if(rect.area() == 0) @@ -88,6 +94,7 @@ namespace uns return img(sub_image); } + //根据四个顶点计算矩形 Shapes::Rectangle ImageProcessor::CalcRectangle(const std::vector& four_points) { int width = lround(sqrtf(powf((four_points[0].x - four_points[1].x), 2) + powf((four_points[0].y - four_points[1].y), 2))); @@ -95,6 +102,7 @@ namespace uns return uns::Shapes::Rectangle{ height, width, four_points }; } + //三个点确定一个角,计算角度 double ImageProcessor::CalcAngle(const cv::Point& pt1, const cv::Point& pt2, const cv::Point& pt0) { double dx1 = pt1.x - pt0.x; @@ -104,6 +112,7 @@ namespace uns return (dx1 * dx2 + dy1 * dy2) / sqrt((dx1 * dx1 + dy1 * dy1) * (dx2 * dx2 + dy2 * dy2) + 1e-10); } + //交通标志用的图像颜色纯化函数 cv::Mat ImageProcessor::FixImageBUG_TF(cv::Mat img, double rate) { cv::Mat result(img.rows, img.cols, img.type()); @@ -135,6 +144,7 @@ namespace uns return result; } + //形状颜色用的图像纯化函数 Images::TwoImages ImageProcessor::FixImageBUG(cv::Mat img, double rate) { cv::Mat color_result, shape_result; @@ -170,7 +180,7 @@ namespace uns else if (MuchLarger(color.GetR(), color.GetB(), rate) && MuchLarger(color.GetG(), color.GetB(), rate)) { color_result.at(r, c) = sample_colors.at("yellow"); - shape_result.at(r, c) = sample_colors.at("white"); + shape_result.at(r, c) = sample_colors.at("black"); } else if (MuchLarger(color.GetR(), color.GetG(), rate) && MuchLarger(color.GetB(), color.GetG(), rate)) { @@ -185,13 +195,14 @@ namespace uns else { color_result.at(r, c) = sample_colors.at("white"); - shape_result.at(r, c) = sample_colors.at("black"); + shape_result.at(r, c) = sample_colors.at("white"); } } } return { color_result,shape_result }; } + //获取屏幕区域 cv::Mat ImageProcessor::GetScreenFromImage(const cv::Mat& img) { cv::Mat temp; @@ -200,6 +211,7 @@ namespace uns return FillEdges(CutScreenImage(img, GetScreenRect(temp)), 20); //获取形状,裁切,填充边缘 } + //根据矩形裁切图片 cv::Mat ImageProcessor::CutRect(const cv::Mat& img, Shapes::Rectangle rect) { int top = 99999, left = 99999, bottom = 0, right = 0; @@ -227,6 +239,7 @@ namespace uns return result; } + //根据原型裁切图片 cv::Mat ImageProcessor::CutCircle(const cv::Mat& image, Shapes::Circle circle) { cv::Mat result(circle.radius * 2, circle.radius * 2, image.type(), cv::Scalar(0, 255, 255)); @@ -245,6 +258,7 @@ namespace uns return result; } + //根据三角形裁切图片 cv::Mat ImageProcessor::CutTriangle(const cv::Mat& img, Shapes::Triangle triangle) { int top = 99999, left = 99999, bottom = 0, right = 0; @@ -273,6 +287,7 @@ namespace uns } }; +//导出的自检函数 extern "C" JNIEXPORT jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_ImageProcessorTest(JNIEnv *env, jclass _this) { diff --git a/app/src/main/cpp/image_processor.h b/app/src/main/cpp/image_processor.h index 82c2a9b..ff98a95 100644 --- a/app/src/main/cpp/image_processor.h +++ b/app/src/main/cpp/image_processor.h @@ -8,6 +8,8 @@ #define IMAGE_PROCESSOR_VERSION "1.0.0" +//图片预处理,用于形状颜色、交通标志等的图像预处理 + #include #include #include diff --git a/app/src/main/cpp/lib_hyper_lpr/include/CNNRecognizer.h b/app/src/main/cpp/lib_hyper_lpr/include/CNNRecognizer.h new file mode 100644 index 0000000..3c21bef --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/include/CNNRecognizer.h @@ -0,0 +1,29 @@ +// +// Created by 庾金科 on 21/10/2017. +// + +#ifndef SWIFTPR_CNNRECOGNIZER_H +#define SWIFTPR_CNNRECOGNIZER_H + +#include "Recognizer.h" + +namespace pr +{ + class CNNRecognizer : public GeneralRecognizer + { + public: + const int CHAR_INPUT_W = 14; + const int CHAR_INPUT_H = 30; + + CNNRecognizer(std::string prototxt, std::string caffemodel); + + label recognizeCharacter(cv::Mat character); + + private: + cv::dnn::Net net; + + }; + +} + +#endif //SWIFTPR_CNNRECOGNIZER_H diff --git a/app/src/main/cpp/lib_hyper_lpr/include/FastDeskew.h b/app/src/main/cpp/lib_hyper_lpr/include/FastDeskew.h new file mode 100644 index 0000000..1d68162 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/include/FastDeskew.h @@ -0,0 +1,20 @@ +// +// Created by 庾金科 on 22/09/2017. +// + +#ifndef SWIFTPR_FASTDESKEW_H +#define SWIFTPR_FASTDESKEW_H + +#include +#include + +namespace pr +{ + + cv::Mat fastdeskew(cv::Mat skewImage, int blockSize); +// cv::Mat spatialTransformer(cv::Mat skewImage); + +}//namepace pr + + +#endif //SWIFTPR_FASTDESKEW_H diff --git a/app/src/main/cpp/lib_hyper_lpr/include/FineMapping.h b/app/src/main/cpp/lib_hyper_lpr/include/FineMapping.h new file mode 100644 index 0000000..9231a8b --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/include/FineMapping.h @@ -0,0 +1,36 @@ +// +// Created by 庾金科 on 22/09/2017. +// + +#ifndef SWIFTPR_FINEMAPPING_H +#define SWIFTPR_FINEMAPPING_H + +#include +#include + +#include + +namespace pr +{ + class FineMapping + { + public: + FineMapping(); + + + FineMapping(std::string prototxt, std::string caffemodel); + + static cv::Mat FineMappingVertical(cv::Mat InputProposal, int sliceNum = 15, int upper = 0, + int lower = -50, int windows_size = 17); + + cv::Mat FineMappingHorizon(cv::Mat FinedVertical, int leftPadding, int rightPadding); + + + private: + cv::dnn::Net net; + + }; + + +} +#endif //SWIFTPR_FINEMAPPING_H diff --git a/app/src/main/cpp/lib_hyper_lpr/include/Pipeline.h b/app/src/main/cpp/lib_hyper_lpr/include/Pipeline.h new file mode 100644 index 0000000..952748c --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/include/Pipeline.h @@ -0,0 +1,58 @@ +// +// Created by 庾金科 on 22/10/2017. +// + +#ifndef SWIFTPR_PIPLINE_H +#define SWIFTPR_PIPLINE_H + +#include "PlateDetection.h" +#include "PlateSegmentation.h" +#include "CNNRecognizer.h" +#include "PlateInfo.h" +#include "FastDeskew.h" +#include "FineMapping.h" +#include "Recognizer.h" +#include "SegmentationFreeRecognizer.h" + +namespace pr +{ + + const std::vector CH_PLATE_CODE{ + "京", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "皖", "闽", "赣", "鲁", "豫", + "鄂", "湘", "粤", "桂", + "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "0", "1", "2", "3", "4", "5", "6", + "7", "8", "9", "A", + "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", + "U", "V", "W", "X", + "Y", "Z", "港", "学", "使", "警", "澳", "挂", "军", "北", "南", "广", "沈", "兰", "成", "济", "海", + "民", "航", "空" + }; + + const int SEGMENTATION_FREE_METHOD = 0; + const int SEGMENTATION_BASED_METHOD = 1; + + class PipelinePR + { + public: + GeneralRecognizer *generalRecognizer; + PlateDetection *plateDetection; + PlateSegmentation *plateSegmentation; + FineMapping *fineMapping; + SegmentationFreeRecognizer *segmentationFreeRecognizer; + + PipelinePR(std::string detector_filename, + std::string finemapping_prototxt, std::string finemapping_caffemodel, + std::string segmentation_prototxt, std::string segmentation_caffemodel, + std::string charRecognization_proto, std::string charRecognization_caffemodel, + std::string segmentationfree_proto, std::string segmentationfree_caffemodel + ); + + ~PipelinePR(); + + std::vector plateRes; + + std::vector RunPiplineAsImage(cv::Mat plateImage, int method); + + }; +} +#endif //SWIFTPR_PIPLINE_H diff --git a/app/src/main/cpp/lib_hyper_lpr/include/PlateDetection.h b/app/src/main/cpp/lib_hyper_lpr/include/PlateDetection.h new file mode 100644 index 0000000..344e588 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/include/PlateDetection.h @@ -0,0 +1,40 @@ +// +// Created by 庾金科 on 20/09/2017. +// + +#ifndef SWIFTPR_PLATEDETECTION_H +#define SWIFTPR_PLATEDETECTION_H + +#include +#include +#include "PlateInfo.h" + +namespace pr +{ + class PlateDetection + { + public: + PlateDetection(std::string filename_cascade); + + PlateDetection(); + + void LoadModel(std::string filename_cascade); + + void plateDetectionRough(cv::Mat InputImage, std::vector &plateInfos, + int min_w = 36, int max_w = 800); +// std::vector plateDetectionRough(cv::Mat InputImage,int min_w= 60,int max_h = 400); + + +// std::vector plateDetectionRoughByMultiScaleEdge(cv::Mat InputImage); + + + + public: + cv::CascadeClassifier cascade; + + + }; + +}// namespace pr + +#endif //SWIFTPR_PLATEDETECTION_H diff --git a/app/src/main/cpp/lib_hyper_lpr/include/PlateInfo.h b/app/src/main/cpp/lib_hyper_lpr/include/PlateInfo.h new file mode 100644 index 0000000..9584a1c --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/include/PlateInfo.h @@ -0,0 +1,161 @@ +// +// Created by 庾金科 on 20/09/2017. +// + +#ifndef SWIFTPR_PLATEINFO_H +#define SWIFTPR_PLATEINFO_H + +#include + +namespace pr +{ + + typedef std::vector Character; + + enum PlateColor + { + BLUE, YELLOW, WHITE, GREEN, BLACK, UNKNOWN + }; + enum CharType + { + CHINESE, LETTER, LETTER_NUMS, INVALID + }; + + + class PlateInfo + { + public: + std::vector> plateChars; + std::vector> plateCoding; + float confidence = 0; + + PlateInfo(const cv::Mat &plateData, std::string plateName, cv::Rect plateRect, + PlateColor plateType) + { + licensePlate = plateData; + name = plateName; + ROI = plateRect; + Type = plateType; + } + + PlateInfo(const cv::Mat &plateData, cv::Rect plateRect, PlateColor plateType) + { + licensePlate = plateData; + ROI = plateRect; + Type = plateType; + } + + PlateInfo(const cv::Mat &plateData, cv::Rect plateRect) + { + licensePlate = plateData; + ROI = plateRect; + } + + PlateInfo() + { + + } + + cv::Mat getPlateImage() + { + return licensePlate; + } + + void setPlateImage(cv::Mat plateImage) + { + licensePlate = plateImage; + } + + cv::Rect getPlateRect() + { + return ROI; + } + + void setPlateRect(cv::Rect plateRect) + { + ROI = plateRect; + } + + cv::String getPlateName() + { + return name; + + } + + void setPlateName(cv::String plateName) + { + name = plateName; + } + + int getPlateType() + { + return Type; + } + + void appendPlateChar(const std::pair &plateChar) + { + plateChars.push_back(plateChar); + } + + void appendPlateCoding(const std::pair &charProb) + { + plateCoding.push_back(charProb); + } + + // cv::Mat getPlateChars(int id) { + // if(id mappingTable) + { + std::string decode; + for (auto plate: plateCoding) + { + float *prob = (float *) plate.second.data; + if (plate.first == CHINESE) + { + + decode += mappingTable[std::max_element(prob, prob + 31) - prob]; + confidence += *std::max_element(prob, prob + 31); + + +// std::cout<<*std::max_element(prob,prob+31)< &Char_rects); + + void segmentPlateBySlidingWindows(cv::Mat &plateImage, int windowsWidth, int stride, + cv::Mat &respones); + + void templateMatchFinding(const cv::Mat &respones, int windowsWidth, + std::pair> &candidatePts); + + void + refineRegion(cv::Mat &plateImage, const std::vector &candidatePts, const int padding, + std::vector &rects); + + void ExtractRegions(PlateInfo &plateInfo, std::vector &rects); + + cv::Mat classifyResponse(const cv::Mat &cropped); + + private: + cv::dnn::Net net; + + +// RefineRegion() + + }; + +}//namespace pr + +#endif //SWIFTPR_PLATESEGMENTATION_H diff --git a/app/src/main/cpp/lib_hyper_lpr/include/Recognizer.h b/app/src/main/cpp/lib_hyper_lpr/include/Recognizer.h new file mode 100644 index 0000000..65176a5 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/include/Recognizer.h @@ -0,0 +1,29 @@ +// +// Created by 庾金科 on 20/10/2017. +// + + +#ifndef SWIFTPR_RECOGNIZER_H +#define SWIFTPR_RECOGNIZER_H + +#include "PlateInfo.h" +#include "opencv2/dnn.hpp" + +namespace pr +{ + typedef cv::Mat label; + + class GeneralRecognizer + { + public: + virtual label recognizeCharacter(cv::Mat character) = 0; + +// virtual cv::Mat SegmentationFreeForSinglePlate(cv::Mat plate) = 0; + void SegmentBasedSequenceRecognition(PlateInfo &plateinfo); + + void SegmentationFreeSequenceRecognition(PlateInfo &plateInfo); + + }; + +} +#endif //SWIFTPR_RECOGNIZER_H diff --git a/app/src/main/cpp/lib_hyper_lpr/include/SegmentationFreeRecognizer.h b/app/src/main/cpp/lib_hyper_lpr/include/SegmentationFreeRecognizer.h new file mode 100644 index 0000000..251f76b --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/include/SegmentationFreeRecognizer.h @@ -0,0 +1,33 @@ +// +// Created by 庾金科 on 28/11/2017. +// + +#ifndef SWIFTPR_SEGMENTATIONFREERECOGNIZER_H +#define SWIFTPR_SEGMENTATIONFREERECOGNIZER_H + +#include "Recognizer.h" + +namespace pr +{ + + + class SegmentationFreeRecognizer + { + public: + const int CHAR_INPUT_W = 14; + const int CHAR_INPUT_H = 30; + const int CHAR_LEN = 84; + + SegmentationFreeRecognizer(std::string prototxt, std::string caffemodel); + + std::pair + SegmentationFreeForSinglePlate(cv::Mat plate, std::vector mapping_table); + + + private: + cv::dnn::Net net; + + }; + +} +#endif //SWIFTPR_SEGMENTATIONFREERECOGNIZER_H diff --git a/app/src/main/cpp/lib_hyper_lpr/include/niBlackThreshold.h b/app/src/main/cpp/lib_hyper_lpr/include/niBlackThreshold.h new file mode 100644 index 0000000..91dbd3e --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/include/niBlackThreshold.h @@ -0,0 +1,112 @@ +// +// Created by 庾金科 on 26/10/2017. +// + +#ifndef SWIFTPR_NIBLACKTHRESHOLD_H +#define SWIFTPR_NIBLACKTHRESHOLD_H + + +#include +#include + +using namespace cv; + +enum LocalBinarizationMethods +{ + BINARIZATION_NIBLACK = 0, //!< Classic Niblack binarization. See @cite Niblack1985 . + BINARIZATION_SAUVOLA = 1, //!< Sauvola's technique. See @cite Sauvola1997 . + BINARIZATION_WOLF = 2, //!< Wolf's technique. See @cite Wolf2004 . + BINARIZATION_NICK = 3 //!< NICK technique. See @cite Khurshid2009 . +}; + + +void niBlackThreshold(InputArray _src, OutputArray _dst, double maxValue, + int type, int blockSize, double k, int binarizationMethod) +{ + // Input grayscale image + Mat src = _src.getMat(); + CV_Assert(src.channels() == 1); + CV_Assert(blockSize % 2 == 1 && blockSize > 1); + if (binarizationMethod == BINARIZATION_SAUVOLA) + { + CV_Assert(src.depth() == CV_8U); + } + type &= THRESH_MASK; + // Compute local threshold (T = mean + k * stddev) + // using mean and standard deviation in the neighborhood of each pixel + // (intermediate calculations are done with floating-point precision) + Mat test; + Mat thresh; + { + // note that: Var[X] = E[X^2] - E[X]^2 + Mat mean, sqmean, variance, stddev, sqrtVarianceMeanSum; + double srcMin, stddevMax; + boxFilter(src, mean, CV_32F, Size(blockSize, blockSize), + Point(-1, -1), true, BORDER_REPLICATE); + sqrBoxFilter(src, sqmean, CV_32F, Size(blockSize, blockSize), + Point(-1, -1), true, BORDER_REPLICATE); + variance = sqmean - mean.mul(mean); + sqrt(variance, stddev); + switch (binarizationMethod) + { + case BINARIZATION_NIBLACK: + thresh = mean + stddev * static_cast(k); + + break; + case BINARIZATION_SAUVOLA: + thresh = mean.mul(1. + static_cast(k) * (stddev / 128.0 - 1.)); + break; + case BINARIZATION_WOLF: + minMaxIdx(src, &srcMin, NULL); + minMaxIdx(stddev, NULL, &stddevMax); + thresh = mean - static_cast(k) * + (mean - srcMin - stddev.mul(mean - srcMin) / stddevMax); + break; + case BINARIZATION_NICK: + sqrt(variance + sqmean, sqrtVarianceMeanSum); + thresh = mean + static_cast(k) * sqrtVarianceMeanSum; + break; + default: + CV_Error(CV_StsBadArg, "Unknown binarization method"); + break; + } + thresh.convertTo(thresh, src.depth()); + + thresh.convertTo(test, src.depth()); +// +// cv::imshow("imagex",test); +// cv::waitKey(0); + + } + // Prepare output image + _dst.create(src.size(), src.type()); + Mat dst = _dst.getMat(); + CV_Assert(src.data != dst.data); // no inplace processing + // Apply thresholding: ( pixel > threshold ) ? foreground : background + Mat mask; + switch (type) + { + case THRESH_BINARY: // dst = (src > thresh) ? maxval : 0 + case THRESH_BINARY_INV: // dst = (src > thresh) ? 0 : maxval + compare(src, thresh, mask, (type == THRESH_BINARY ? CMP_GT : CMP_LE)); + dst.setTo(0); + dst.setTo(maxValue, mask); + break; + case THRESH_TRUNC: // dst = (src > thresh) ? thresh : src + compare(src, thresh, mask, CMP_GT); + src.copyTo(dst); + thresh.copyTo(dst, mask); + break; + case THRESH_TOZERO: // dst = (src > thresh) ? src : 0 + case THRESH_TOZERO_INV: // dst = (src > thresh) ? 0 : src + compare(src, thresh, mask, (type == THRESH_TOZERO ? CMP_GT : CMP_LE)); + dst.setTo(0); + src.copyTo(dst, mask); + break; + default: + CV_Error(CV_StsBadArg, "Unknown threshold type"); + break; + } +} + +#endif //SWIFTPR_NIBLACKTHRESHOLD_H diff --git a/app/src/main/cpp/lib_hyper_lpr/javaWarpper.cpp b/app/src/main/cpp/lib_hyper_lpr/javaWarpper.cpp new file mode 100644 index 0000000..81eb7a9 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/javaWarpper.cpp @@ -0,0 +1,284 @@ +#include +#include +#include "include/Pipeline.h" + +#include +#include + +#include + +#include "../opencv_support.h" + +using namespace cv; +#define LOG_TAG "System.out" +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) + +jobject mat_to_bitmap(JNIEnv *env, Mat &src, bool needPremultiplyAlpha, jobject bitmap_config) +{ + + jclass java_bitmap_class = (jclass) env->FindClass("android/graphics/Bitmap"); + jmethodID mid = env->GetStaticMethodID(java_bitmap_class, + "createBitmap", + "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"); + + jobject bitmap = env->CallStaticObjectMethod(java_bitmap_class, + mid, src.size().width, src.size().height, + bitmap_config); + AndroidBitmapInfo info; + void *pixels = 0; + + try + { + //validate + CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0); + CV_Assert(src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4); + CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0); + CV_Assert(pixels); + + //type mat + if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) + { + Mat tmp(info.height, info.width, CV_8UC4, pixels); + if (src.type() == CV_8UC1) + { + cvtColor(src, tmp, COLOR_GRAY2RGBA); + } + else if (src.type() == CV_8UC3) + { + cvtColor(src, tmp, COLOR_RGB2RGBA); + } + else if (src.type() == CV_8UC4) + { + if (needPremultiplyAlpha) + { + cvtColor(src, tmp, COLOR_RGBA2mRGBA); + } + else + { + src.copyTo(tmp); + } + } + + } + else + { + Mat tmp(info.height, info.width, CV_8UC2, pixels); + if (src.type() == CV_8UC1) + { + cvtColor(src, tmp, COLOR_GRAY2BGR565); + } + else if (src.type() == CV_8UC3) + { + cvtColor(src, tmp, COLOR_RGB2BGR565); + } + else if (src.type() == CV_8UC4) + { + cvtColor(src, tmp, COLOR_RGBA2BGR565); + } + } + AndroidBitmap_unlockPixels(env, bitmap); + return bitmap; + } + catch (cv::Exception e) + { + AndroidBitmap_unlockPixels(env, bitmap); + jclass je = env->FindClass("org/opencv/core/CvException"); + if (!je) je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, e.what()); + return bitmap; + } + catch (...) + { + AndroidBitmap_unlockPixels(env, bitmap); + jclass je = env->FindClass("java/lang/Exception"); + env->ThrowNew(je, "Unknown exception in JNI code {nMatToBitmap}"); + return bitmap; + } +} + +std::string jstring2str(JNIEnv *env, jstring jstr) +{ + char *rtn = NULL; + jclass clsstring = env->FindClass("java/lang/String"); + jstring strencode = env->NewStringUTF("GB2312"); + jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); + jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode); + jsize alen = env->GetArrayLength(barr); + jbyte *ba = env->GetByteArrayElements(barr, JNI_FALSE); + if (alen > 0) + { + rtn = (char *) malloc(alen + 1); + memcpy(rtn, ba, alen); + rtn[alen] = 0; + } + env->ReleaseByteArrayElements(barr, ba, 0); + std::string stemp(rtn); + free(rtn); + return stemp; +} + + +extern "C" { +JNIEXPORT jlong JNICALL +Java_com_uns_maincar_cpp_1interface_hyperlpr_PlateRecognition_InitPlateRecognizer( + JNIEnv *env, jclass obj, + jstring detector_filename, + jstring finemapping_prototxt, jstring finemapping_caffemodel, + jstring segmentation_prototxt, jstring segmentation_caffemodel, + jstring charRecognization_proto, jstring charRecognization_caffemodel, + jstring segmentationfree_proto, jstring segmentationfree_caffemodel) +{ + + std::string detector_path = jstring2str(env, detector_filename); + std::string finemapping_prototxt_path = jstring2str(env, finemapping_prototxt); + std::string finemapping_caffemodel_path = jstring2str(env, finemapping_caffemodel); + std::string segmentation_prototxt_path = jstring2str(env, segmentation_prototxt); + std::string segmentation_caffemodel_path = jstring2str(env, segmentation_caffemodel); + std::string charRecognization_proto_path = jstring2str(env, charRecognization_proto); + std::string charRecognization_caffemodel_path = jstring2str(env, charRecognization_caffemodel); + std::string segmentationfree_proto_path = jstring2str(env, segmentationfree_proto); + std::string segmentationfree_caffemodel_path = jstring2str(env, segmentationfree_caffemodel); + + + pr::PipelinePR *PR = new pr::PipelinePR(detector_path, + finemapping_prototxt_path, finemapping_caffemodel_path, + segmentation_prototxt_path, + segmentation_caffemodel_path, + charRecognization_proto_path, + charRecognization_caffemodel_path, + segmentationfree_proto_path, + segmentationfree_caffemodel_path); + + return (jlong) PR; +} + + +JNIEXPORT jstring JNICALL +Java_com_uns_maincar_cpp_1interface_hyperlpr_PlateRecognition_SimpleRecognization( + JNIEnv *env, jclass obj, + jlong matPtr, jlong object_pr) +{ + pr::PipelinePR *PR = (pr::PipelinePR *) object_pr; + cv::Mat &mRgb = *(cv::Mat *) matPtr; + cv::Mat rgb; + cv::cvtColor(mRgb, rgb, cv::COLOR_RGBA2BGR); + + + //1表示SEGMENTATION_BASED_METHOD在方法里有说明 + std::vector list_res = PR->RunPiplineAsImage(rgb, pr::SEGMENTATION_FREE_METHOD); +// std::vector list_res= PR->RunPiplineAsImage(rgb,1); + std::string concat_results; + for (auto one: list_res) + { + //可信度 + if (one.confidence > 0.7) + concat_results += one.getPlateName() + ","; + } + + concat_results = concat_results.substr(0, concat_results.size() - 1); + + return env->NewStringUTF(concat_results.c_str()); + +} + +JNIEXPORT jstring JNICALL +Java_com_uns_maincar_cpp_1interface_hyperlpr_PlateRecognition_EasyRecognization( + JNIEnv *env, jclass obj, + jobject image, jlong object_pr) +{ + auto *PR = (pr::PipelinePR *) object_pr; + cv::Mat rgb; + BitmapToMat(env, image, rgb); + + //1表示SEGMENTATION_BASED_METHOD在方法里有说明 + std::vector list_res = PR->RunPiplineAsImage(rgb, pr::SEGMENTATION_FREE_METHOD); +// std::vector list_res= PR->RunPiplineAsImage(rgb,1); + std::string concat_results; + for (auto one: list_res) + { + //可信度 + if (one.confidence > 0.7) + concat_results += one.getPlateName() + ","; + } + + concat_results = concat_results.substr(0, concat_results.size() - 1); + + return env->NewStringUTF(concat_results.c_str()); + +} + +/** + * 车牌号的详细信息 + * @param env + * @param obj + * @param matPtr + * @param object_pr + * @return + */ +JNIEXPORT jobject JNICALL +Java_com_uns_maincar_cpp_1interface_hyperlpr_PlateRecognition_PlateInfoRecognization( + JNIEnv *env, jobject obj, + jlong matPtr, jlong object_pr) +{ + jclass plateInfo_class = env->FindClass("com/uns/maincar/cpp_interface/hyperlpr/PlateInfo"); + jmethodID mid = env->GetMethodID(plateInfo_class, "", "()V"); + jobject plateInfoObj = env->NewObject(plateInfo_class, mid); + + pr::PipelinePR *PR = (pr::PipelinePR *) object_pr; + cv::Mat &mRgb = *(cv::Mat *) matPtr; + cv::Mat rgb; + cv::cvtColor(mRgb, rgb, cv::COLOR_RGBA2BGR); + + //1表示SEGMENTATION_BASED_METHOD在方法里有说明 + std::vector list_res = PR->RunPiplineAsImage(rgb, pr::SEGMENTATION_FREE_METHOD); + std::string concat_results; + pr::PlateInfo plateInfo; + for (auto one: list_res) + { + //可信度 + if (one.confidence > 0.7) + { + plateInfo = one; + //车牌号 + jfieldID fid_plate_name = env->GetFieldID(plateInfo_class, "plateName", + "Ljava/lang/String;"); + env->SetObjectField(plateInfoObj, fid_plate_name, + env->NewStringUTF(plateInfo.getPlateName().c_str())); + + //识别区域 + Mat src = plateInfo.getPlateImage(); + + jclass java_bitmap_class = (jclass) env->FindClass("android/graphics/Bitmap$Config"); + jmethodID bitmap_mid = env->GetStaticMethodID(java_bitmap_class, + "nativeToConfig", + "(I)Landroid/graphics/Bitmap$Config;"); + jobject bitmap_config = env->CallStaticObjectMethod(java_bitmap_class, bitmap_mid, 5); + + jfieldID fid_bitmap = env->GetFieldID(plateInfo_class, "bitmap", + "Landroid/graphics/Bitmap;"); + jobject _bitmap = mat_to_bitmap(env, src, false, bitmap_config); + env->SetObjectField(plateInfoObj, fid_bitmap, _bitmap); + return plateInfoObj; + } + } + return plateInfoObj; + +} + + +JNIEXPORT void JNICALL +Java_com_uns_maincar_cpp_1interface_hyperlpr_PlateRecognition_ReleasePlateRecognizer( + JNIEnv *env, jclass obj, + jlong object_re) +{ +// std::string hello = "Hello from C++"; + pr::PipelinePR *PR = (pr::PipelinePR *) object_re; + delete PR; + +} +} + + + diff --git a/app/src/main/cpp/lib_hyper_lpr/src/CNNRecognizer.cpp b/app/src/main/cpp/lib_hyper_lpr/src/CNNRecognizer.cpp new file mode 100644 index 0000000..d1d88a2 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/src/CNNRecognizer.cpp @@ -0,0 +1,24 @@ +// +// Created by 庾金科 on 21/10/2017. +// + +#include "../include/CNNRecognizer.h" + +namespace pr +{ + CNNRecognizer::CNNRecognizer(std::string prototxt, std::string caffemodel) + { + net = cv::dnn::readNetFromCaffe(prototxt, caffemodel); + } + + label CNNRecognizer::recognizeCharacter(cv::Mat charImage) + { + if (charImage.channels() == 3) + cv::cvtColor(charImage, charImage, cv::COLOR_BGR2GRAY); + cv::Mat inputBlob = cv::dnn::blobFromImage(charImage, 1 / 255.0, + cv::Size(CHAR_INPUT_W, CHAR_INPUT_H), + cv::Scalar(0, 0, 0), false); + net.setInput(inputBlob, "data"); + return net.forward(); + } +} \ No newline at end of file diff --git a/app/src/main/cpp/lib_hyper_lpr/src/FastDeskew.cpp b/app/src/main/cpp/lib_hyper_lpr/src/FastDeskew.cpp new file mode 100644 index 0000000..a486795 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/src/FastDeskew.cpp @@ -0,0 +1,158 @@ +// +// Created by 庾金科 on 02/10/2017. +// + + + +#include "../include/FastDeskew.h" +#include +#include +#include +#include +#include +#include + +namespace pr +{ + + + const int ANGLE_MIN = 30; + const int ANGLE_MAX = 150; + const int PLATE_H = 36; + const int PLATE_W = 136; + + int angle(float x, float y) + { + return atan2(x, y) * 180 / 3.1415; + } + + std::vector avgfilter(std::vector angle_list, int windowsSize) + { + std::vector angle_list_filtered(angle_list.size() - windowsSize + 1); + for (int i = 0; i < angle_list.size() - windowsSize + 1; i++) + { + float avg = 0.00f; + for (int j = 0; j < windowsSize; j++) + { + avg += angle_list[i + j]; + } + avg = avg / windowsSize; + angle_list_filtered[i] = avg; + } + + return angle_list_filtered; + } + + + void drawHist(std::vector seq) + { + cv::Mat image(300, seq.size(), CV_8U); + image.setTo(0); + + for (int i = 0; i < seq.size(); i++) + { + float l = *std::max_element(seq.begin(), seq.end()); + + int p = int(float(seq[i]) / l * 300); + + cv::line(image, cv::Point(i, 300), cv::Point(i, 300 - p), cv::Scalar(255, 255, 255)); + } + cv::imshow("vis", image); + } + + cv::Mat correctPlateImage(cv::Mat skewPlate, float angle, float maxAngle) + { + + cv::Mat dst; + + cv::Size size_o(skewPlate.cols, skewPlate.rows); + + + int extend_padding = 0; +// if(angle<0) + extend_padding = static_cast(skewPlate.rows * tan(cv::abs(angle) / 180 * 3.14)); +// else +// extend_padding = static_cast(skewPlate.rows/tan(cv::abs(angle)/180* 3.14) ); + +// std::cout<<"extend:"< 0) + { + cv::Point2f pts2[4] = { + cv::Point2f(interval, 0), cv::Point2f(0, size_o.height), + cv::Point2f(size_o.width, 0), + cv::Point2f(size_o.width - interval, size_o.height) + }; + cv::Mat M = cv::getPerspectiveTransform(pts1, pts2); + cv::warpPerspective(skewPlate, dst, M, size); + + + } + else + { + cv::Point2f pts2[4] = { + cv::Point2f(0, 0), cv::Point2f(interval, size_o.height), + cv::Point2f(size_o.width - interval, 0), + cv::Point2f(size_o.width, size_o.height) + }; + cv::Mat M = cv::getPerspectiveTransform(pts1, pts2); + cv::warpPerspective(skewPlate, dst, M, size, cv::INTER_CUBIC); + + } + return dst; + } + + cv::Mat fastdeskew(cv::Mat skewImage, int blockSize) + { + + + const int FILTER_WINDOWS_SIZE = 5; + std::vector angle_list(180); + memset(angle_list.data(), 0, angle_list.size() * sizeof(int)); + + cv::Mat bak; + skewImage.copyTo(bak); + if (skewImage.channels() == 3) + cv::cvtColor(skewImage, skewImage, cv::COLOR_RGB2GRAY); + + if (skewImage.channels() == 1) + { + cv::Mat eigen; + + cv::cornerEigenValsAndVecs(skewImage, eigen, blockSize, 5); + for (int j = 0; j < skewImage.rows; j += blockSize) + { + for (int i = 0; i < skewImage.cols; i += blockSize) + { + float x2 = eigen.at(j, i)[4]; + float y2 = eigen.at(j, i)[5]; + int angle_cell = angle(x2, y2); + angle_list[(angle_cell + 180) % 180] += 1.0; + + } + } + } + std::vector filtered = avgfilter(angle_list, 5); + + int maxPos = std::max_element(filtered.begin(), filtered.end()) - filtered.begin() + + FILTER_WINDOWS_SIZE / 2; + if (maxPos > ANGLE_MAX) + maxPos = (-maxPos + 90 + 180) % 180; + if (maxPos < ANGLE_MIN) + maxPos -= 90; + maxPos = 90 - maxPos; + cv::Mat deskewed = correctPlateImage(bak, static_cast(maxPos), 60.0f); + return deskewed; + } + + +}//namespace pr diff --git a/app/src/main/cpp/lib_hyper_lpr/src/FineMapping.cpp b/app/src/main/cpp/lib_hyper_lpr/src/FineMapping.cpp new file mode 100644 index 0000000..fef2637 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/src/FineMapping.cpp @@ -0,0 +1,218 @@ +// +// Created by 庾金科 on 22/09/2017. +// + +#include "../include/FineMapping.h" + +namespace pr +{ + + const int FINEMAPPING_H = 60; + const int FINEMAPPING_W = 140; + const int PADDING_UP_DOWN = 30; + + void drawRect(cv::Mat image, cv::Rect rect) + { + cv::Point p1(rect.x, rect.y); + cv::Point p2(rect.x + rect.width, rect.y + rect.height); + cv::rectangle(image, p1, p2, cv::Scalar(0, 255, 0), 1); + } + + + FineMapping::FineMapping(std::string prototxt, std::string caffemodel) + { + net = cv::dnn::readNetFromCaffe(prototxt, caffemodel); + + } + + cv::Mat + FineMapping::FineMappingHorizon(cv::Mat FinedVertical, int leftPadding, int rightPadding) + { + +// if(FinedVertical.channels()==1) +// cv::cvtColor(FinedVertical,FinedVertical,cv::COLOR_GRAY2BGR); + cv::Mat inputBlob = cv::dnn::blobFromImage(FinedVertical, 1 / 255.0, cv::Size(66, 16), + cv::Scalar(0, 0, 0), false); + + net.setInput(inputBlob, "data"); + cv::Mat prob = net.forward(); + int front = static_cast(prob.at(0, 0) * FinedVertical.cols); + int back = static_cast(prob.at(0, 1) * FinedVertical.cols); + front -= leftPadding; + if (front < 0) front = 0; + back += rightPadding; + if (back > FinedVertical.cols - 1) back = FinedVertical.cols - 1; + cv::Mat cropped = FinedVertical.colRange(front, back).clone(); + return cropped; + + + } + + std::pair FitLineRansac(std::vector pts, int zeroadd = 0) + { + std::pair res; + if (pts.size() > 2) + { + cv::Vec4f line; + cv::fitLine(pts, line, cv::DIST_HUBER, 0, 0.01, 0.01); + float vx = line[0]; + float vy = line[1]; + float x = line[2]; + float y = line[3]; + int lefty = static_cast((-x * vy / vx) + y); + int righty = static_cast(((136 - x) * vy / vx) + y); + res.first = lefty + PADDING_UP_DOWN + zeroadd; + res.second = righty + PADDING_UP_DOWN + zeroadd; + return res; + } + res.first = zeroadd; + res.second = zeroadd; + return res; + } + + cv::Mat + FineMapping::FineMappingVertical(cv::Mat InputProposal, int sliceNum, int upper, int lower, + int windows_size) + { + + + cv::Mat PreInputProposal; + cv::Mat proposal; + + cv::resize(InputProposal, PreInputProposal, cv::Size(FINEMAPPING_W, FINEMAPPING_H)); +// cv::imwrite("res/cache/finemapping.jpg",PreInputProposal); + + if (InputProposal.channels() == 3) + cv::cvtColor(PreInputProposal, proposal, cv::COLOR_BGR2GRAY); + else + PreInputProposal.copyTo(proposal); + +// proposal = PreInputProposal; + + // this will improve some sen + cv::Mat kernal = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(1, 3)); +// cv::erode(proposal,proposal,kernal); + + + float diff = static_cast(upper - lower); + diff /= static_cast(sliceNum - 1); + cv::Mat binary_adaptive; + std::vector line_upper; + std::vector line_lower; + int contours_nums = 0; + + for (int i = 0; i < sliceNum; i++) + { + std::vector > contours; + float k = lower + i * diff; + cv::adaptiveThreshold(proposal, binary_adaptive, 255, cv::ADAPTIVE_THRESH_MEAN_C, + cv::THRESH_BINARY, windows_size, k); + cv::Mat draw; + binary_adaptive.copyTo(draw); + cv::findContours(binary_adaptive, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); + for (auto contour: contours) + { + cv::Rect bdbox = cv::boundingRect(contour); + float lwRatio = bdbox.height / static_cast(bdbox.width); + int bdboxAera = bdbox.width * bdbox.height; + if ((lwRatio > 0.7 && bdbox.width * bdbox.height > 100 && bdboxAera < 300) + || (lwRatio > 3.0 && bdboxAera < 100 && bdboxAera > 10)) + { + cv::Point p1(bdbox.x, bdbox.y); + cv::Point p2(bdbox.x + bdbox.width, bdbox.y + bdbox.height); + line_upper.push_back(p1); + line_lower.push_back(p2); + contours_nums += 1; + } + } + } + + + if (contours_nums < 41) + { + cv::bitwise_not(InputProposal, InputProposal); + cv::Mat kernal = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(1, 5)); + cv::Mat bak; + cv::resize(InputProposal, bak, cv::Size(FINEMAPPING_W, FINEMAPPING_H)); + cv::erode(bak, bak, kernal); + if (InputProposal.channels() == 3) + cv::cvtColor(bak, proposal, cv::COLOR_BGR2GRAY); + else + proposal = bak; + int contours_nums = 0; + + for (int i = 0; i < sliceNum; i++) + { + std::vector > contours; + float k = lower + i * diff; + cv::adaptiveThreshold(proposal, binary_adaptive, 255, cv::ADAPTIVE_THRESH_MEAN_C, + cv::THRESH_BINARY, windows_size, k); +// cv::imshow("image",binary_adaptive); +// cv::waitKey(0); + cv::Mat draw; + binary_adaptive.copyTo(draw); + cv::findContours(binary_adaptive, contours, cv::RETR_EXTERNAL, + cv::CHAIN_APPROX_SIMPLE); + for (auto contour: contours) + { + cv::Rect bdbox = cv::boundingRect(contour); + float lwRatio = bdbox.height / static_cast(bdbox.width); + int bdboxAera = bdbox.width * bdbox.height; + if ((lwRatio > 0.7 && bdbox.width * bdbox.height > 120 && bdboxAera < 300) + || (lwRatio > 3.0 && bdboxAera < 100 && bdboxAera > 10)) + { + + cv::Point p1(bdbox.x, bdbox.y); + cv::Point p2(bdbox.x + bdbox.width, bdbox.y + bdbox.height); + line_upper.push_back(p1); + line_lower.push_back(p2); + contours_nums += 1; + } + } + } +// std:: cout<<"contours_nums "< A; + std::pair B; + A = FitLineRansac(line_upper, -1); + B = FitLineRansac(line_lower, 1); + int leftyB = A.first; + int rightyB = A.second; + int leftyA = B.first; + int rightyA = B.second; + int cols = rgb.cols; + int rows = rgb.rows; +// pts_map1 = np.float32([[cols - 1, rightyA], [0, leftyA],[cols - 1, rightyB], [0, leftyB]]) +// pts_map2 = np.float32([[136,36],[0,36],[136,0],[0,0]]) +// mat = cv2.getPerspectiveTransform(pts_map1,pts_map2) +// image = cv2.warpPerspective(rgb,mat,(136,36),flags=cv2.INTER_CUBIC) + std::vector corners(4); + corners[0] = cv::Point2f(cols - 1, rightyA); + corners[1] = cv::Point2f(0, leftyA); + corners[2] = cv::Point2f(cols - 1, rightyB); + corners[3] = cv::Point2f(0, leftyB); + std::vector corners_trans(4); + corners_trans[0] = cv::Point2f(136, 36); + corners_trans[1] = cv::Point2f(0, 36); + corners_trans[2] = cv::Point2f(136, 0); + corners_trans[3] = cv::Point2f(0, 0); + cv::Mat transform = cv::getPerspectiveTransform(corners, corners_trans); + cv::Mat quad = cv::Mat::zeros(36, 136, CV_8UC3); + cv::warpPerspective(rgb, quad, transform, quad.size()); + return quad; + + } + + +} + + diff --git a/app/src/main/cpp/lib_hyper_lpr/src/Pipeline.cpp b/app/src/main/cpp/lib_hyper_lpr/src/Pipeline.cpp new file mode 100644 index 0000000..16fb16b --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/src/Pipeline.cpp @@ -0,0 +1,109 @@ +// +// Created by 庾金科 on 23/10/2017. +// + +#include "../include/Pipeline.h" + + +namespace pr +{ + + + const int HorizontalPadding = 4; + + PipelinePR::PipelinePR(std::string detector_filename, + std::string finemapping_prototxt, std::string finemapping_caffemodel, + std::string segmentation_prototxt, std::string segmentation_caffemodel, + std::string charRecognization_proto, + std::string charRecognization_caffemodel, + std::string segmentationfree_proto, + std::string segmentationfree_caffemodel) + { + plateDetection = new PlateDetection(detector_filename); + fineMapping = new FineMapping(finemapping_prototxt, finemapping_caffemodel); + plateSegmentation = new PlateSegmentation(segmentation_prototxt, segmentation_caffemodel); + generalRecognizer = new CNNRecognizer(charRecognization_proto, + charRecognization_caffemodel); + segmentationFreeRecognizer = new SegmentationFreeRecognizer(segmentationfree_proto, + segmentationfree_caffemodel); + + } + + PipelinePR::~PipelinePR() + { + + delete plateDetection; + delete fineMapping; + delete plateSegmentation; + delete generalRecognizer; + delete segmentationFreeRecognizer; + + + } + + std::vector PipelinePR::RunPiplineAsImage(cv::Mat plateImage, int method) + { + std::vector results; + std::vector plates; + plateDetection->plateDetectionRough(plateImage, plates, 36, 700); + + for (pr::PlateInfo plateinfo: plates) + { + + cv::Mat image_finemapping = plateinfo.getPlateImage(); + image_finemapping = fineMapping->FineMappingVertical(image_finemapping); + image_finemapping = pr::fastdeskew(image_finemapping, 5); + + + + //Segmentation-based + + if (method == SEGMENTATION_BASED_METHOD) + { + image_finemapping = fineMapping->FineMappingHorizon(image_finemapping, 2, + HorizontalPadding); + cv::resize(image_finemapping, image_finemapping, + cv::Size(136 + HorizontalPadding, 36)); +// cv::imshow("image_finemapping",image_finemapping); +// cv::waitKey(0); + plateinfo.setPlateImage(image_finemapping); + std::vector rects; + + plateSegmentation->segmentPlatePipline(plateinfo, 1, rects); + plateSegmentation->ExtractRegions(plateinfo, rects); + cv::copyMakeBorder(image_finemapping, image_finemapping, 0, 0, 0, 20, + cv::BORDER_REPLICATE); + plateinfo.setPlateImage(image_finemapping); + generalRecognizer->SegmentBasedSequenceRecognition(plateinfo); + plateinfo.decodePlateNormal(pr::CH_PLATE_CODE); + + } + //Segmentation-free + else if (method == SEGMENTATION_FREE_METHOD) + { + + image_finemapping = fineMapping->FineMappingHorizon(image_finemapping, 4, + HorizontalPadding + 3); + cv::resize(image_finemapping, image_finemapping, + cv::Size(136 + HorizontalPadding, 36)); + plateinfo.setPlateImage(image_finemapping); + std::pair res = segmentationFreeRecognizer->SegmentationFreeForSinglePlate( + plateinfo.getPlateImage(), pr::CH_PLATE_CODE); + plateinfo.confidence = res.second; + plateinfo.setPlateName(res.first); + } + + + results.push_back(plateinfo); + } + +// for (auto str:results) { +// std::cout << str << std::endl; +// } + return results; + + }//namespace pr + + + +} \ No newline at end of file diff --git a/app/src/main/cpp/lib_hyper_lpr/src/PlateDetection.cpp b/app/src/main/cpp/lib_hyper_lpr/src/PlateDetection.cpp new file mode 100644 index 0000000..9eebb04 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/src/PlateDetection.cpp @@ -0,0 +1,67 @@ +// +// Created by 庾金科 on 20/09/2017. +// +#include "../include/PlateDetection.h" + +#include "util.h" + +namespace pr +{ + + + PlateDetection::PlateDetection(std::string filename_cascade) + { + cascade.load(filename_cascade); + + }; + + + void + PlateDetection::plateDetectionRough(cv::Mat InputImage, std::vector &plateInfos, + int min_w, int max_w) + { + + cv::Mat processImage(InputImage); +// cv::Mat processImage; + +// cv::cvtColor(InputImage,processImage,cv::COLOR_BGR2GRAY); + + + std::vector platesRegions; +// std::vector plates; + cv::Size minSize(min_w, min_w / 4); + cv::Size maxSize(max_w, max_w / 4); +// cv::imshow("input",InputImage); +// cv::waitKey(0); + cascade.detectMultiScale(processImage, platesRegions, + 1.1, 3, cv::CASCADE_SCALE_IMAGE, minSize, maxSize); + for (auto plate: platesRegions) + { + // extend rects +// x -= w * 0.14 +// w += w * 0.28 +// y -= h * 0.6 +// h += h * 1.1; + int zeroadd_w = static_cast(plate.width * 0.30); + int zeroadd_h = static_cast(plate.height * 2); + int zeroadd_x = static_cast(plate.width * 0.15); + int zeroadd_y = static_cast(plate.height * 1); + plate.x -= zeroadd_x; + plate.y -= zeroadd_y; + plate.height += zeroadd_h; + plate.width += zeroadd_w; + cv::Mat plateImage = util::cropFromImage(InputImage, plate); + PlateInfo plateInfo(plateImage, plate); + plateInfos.push_back(plateInfo); + + } + } +// std::vector PlateDetection::plateDetectionRough(cv::Mat InputImage,cv::Rect roi,int min_w,int max_w){ +// cv::Mat roi_region = util::cropFromImage(InputImage,roi); +// return plateDetectionRough(roi_region,min_w,max_w); +// } + + + + +}//namespace pr diff --git a/app/src/main/cpp/lib_hyper_lpr/src/PlateSegmentation.cpp b/app/src/main/cpp/lib_hyper_lpr/src/PlateSegmentation.cpp new file mode 100644 index 0000000..3c10beb --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/src/PlateSegmentation.cpp @@ -0,0 +1,433 @@ +// +// Created by 庾金科 on 16/10/2017. +// + +#include "../include/PlateSegmentation.h" +#include "../include/niBlackThreshold.h" + + +//#define DEBUG +namespace pr +{ + + PlateSegmentation::PlateSegmentation(std::string prototxt, std::string caffemodel) + { + net = cv::dnn::readNetFromCaffe(prototxt, caffemodel); + } + + cv::Mat PlateSegmentation::classifyResponse(const cv::Mat &cropped) + { + cv::Mat inputBlob = cv::dnn::blobFromImage(cropped, 1 / 255.0, cv::Size(22, 22), + cv::Scalar(0, 0, 0), false); + net.setInput(inputBlob, "data"); + return net.forward(); + } + + void drawHist(float *seq, int size, const char *name) + { + cv::Mat image(300, size, CV_8U); + image.setTo(0); + float *start = seq; + float *end = seq + size; + float l = *std::max_element(start, end); + for (int i = 0; i < size; i++) + { + int p = int(float(seq[i]) / l * 300); + cv::line(image, cv::Point(i, 300), cv::Point(i, 300 - p), cv::Scalar(255, 255, 255)); + } + cv::resize(image, image, cv::Size(600, 100)); + cv::imshow(name, image); + } + + inline void computeSafeMargin(int &val, const int &rows) + { + val = std::min(val, rows); + val = std::max(val, 0); + } + + cv::Rect + boxFromCenter(const cv::Point center, int left, int right, int top, int bottom, cv::Size bdSize) + { + cv::Point p1(center.x - left, center.y - top); + cv::Point p2(center.x + right, center.y + bottom); + p1.x = std::max(0, p1.x); + p1.y = std::max(0, p1.y); + p2.x = std::min(p2.x, bdSize.width - 1); + p2.y = std::min(p2.y, bdSize.height - 1); + cv::Rect rect(p1, p2); + return rect; + } + + cv::Rect boxPadding(cv::Rect rect, int left, int right, int top, int bottom, cv::Size bdSize) + { + + cv::Point center(rect.x + (rect.width >> 1), rect.y + (rect.height >> 1)); + int rebuildLeft = (rect.width >> 1) + left; + int rebuildRight = (rect.width >> 1) + right; + int rebuildTop = (rect.height >> 1) + top; + int rebuildBottom = (rect.height >> 1) + bottom; + return boxFromCenter(center, rebuildLeft, rebuildRight, rebuildTop, rebuildBottom, bdSize); + + } + + + void PlateSegmentation::refineRegion(cv::Mat &plateImage, const std::vector &candidatePts, + const int padding, std::vector &rects) + { + int w = candidatePts[5] - candidatePts[4]; + int cols = plateImage.cols; + int rows = plateImage.rows; + for (int i = 0; i < candidatePts.size(); i++) + { + int left = 0; + int right = 0; + + if (i == 0) + { + left = candidatePts[i]; + right = left + w + padding; + } + else + { + left = candidatePts[i] - padding; + right = left + w + padding * 2; + } + + computeSafeMargin(right, cols); + computeSafeMargin(left, cols); + cv::Mat roiImage; +// plateImage.copyTo(roiImage); + cv::Rect roi(left, 0, right - left, rows - 1); + plateImage(roi).copyTo(roiImage); + + if (i >= 1) + { + + cv::Mat roi_thres; +// cv::threshold(roiImage,roi_thres,0,255,cv::THRESH_OTSU|cv::THRESH_BINARY); + + niBlackThreshold(roiImage, roi_thres, 255, cv::THRESH_BINARY, 15, 0.27, + BINARIZATION_NIBLACK); + + std::vector> contours; + cv::findContours(roi_thres, contours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE); + cv::Point boxCenter(roiImage.cols >> 1, roiImage.rows >> 1); + + cv::Rect final_bdbox; + cv::Point final_center; + int final_dist = INT_MAX; + + + for (auto contour: contours) + { + cv::Rect bdbox = cv::boundingRect(contour); + cv::Point center(bdbox.x + (bdbox.width >> 1), bdbox.y + (bdbox.height >> 1)); + int dist = (center.x - boxCenter.x) * (center.x - boxCenter.x); + if (dist < final_dist and bdbox.height > rows >> 1) + { + final_dist = dist; + final_center = center; + final_bdbox = bdbox; + } + } + + //rebuild box + if (final_bdbox.height / static_cast(final_bdbox.width) > 3.5 && + final_bdbox.width * final_bdbox.height < 10) + final_bdbox = boxFromCenter(final_center, 8, 8, (rows >> 1) - 3, + (rows >> 1) - 2, roiImage.size()); + else + { + if (i == candidatePts.size() - 1) + final_bdbox = boxPadding(final_bdbox, padding / 2, padding, padding / 2, + padding / 2, roiImage.size()); + else + final_bdbox = boxPadding(final_bdbox, padding, padding, padding, padding, + roiImage.size()); + + +// std::cout< 0 && i + j + r < size - 1) + avg += filterd[i + j - r] * kernal[j]; + } +// avg = avg / windowsSize; + angle_list[i] = avg; + + } + + delete[] filterd; +// delete filterd; + } + + void PlateSegmentation::templateMatchFinding(const cv::Mat &respones, int windowsWidth, + std::pair> &candidatePts) + { + int rows = respones.rows; + int cols = respones.cols; + + + float *data = (float *) respones.data; + float *engNum_prob = data; + float *false_prob = data + cols; + float *ch_prob = data + cols * 2; + + avgfilter(engNum_prob, cols, 5); + avgfilter(false_prob, cols, 5); +// avgfilter(ch_prob,cols,5); + std::vector candidate_pts(7); +#ifdef DEBUG + drawHist(engNum_prob,cols,"engNum_prob"); + drawHist(false_prob,cols,"false_prob"); + drawHist(ch_prob,cols,"ch_prob"); + cv::waitKey(0); +#endif + + + int cp_list[7]; + float loss_selected = -10; + + for (int start = 0; start < 20; start += 2) + for (int width = windowsWidth - 5; width < windowsWidth + 5; width++) + { + for (int interval = windowsWidth / 2; interval < windowsWidth; interval++) + { + int cp1_ch = start; + int cp2_p0 = cp1_ch + width; + int cp3_p1 = cp2_p0 + width + interval; + int cp4_p2 = cp3_p1 + width; + int cp5_p3 = cp4_p2 + width + 1; + int cp6_p4 = cp5_p3 + width + 2; + int cp7_p5 = cp6_p4 + width + 2; + + int md1 = (cp1_ch + cp2_p0) >> 1; + int md2 = (cp2_p0 + cp3_p1) >> 1; + int md3 = (cp3_p1 + cp4_p2) >> 1; + int md4 = (cp4_p2 + cp5_p3) >> 1; + int md5 = (cp5_p3 + cp6_p4) >> 1; + int md6 = (cp6_p4 + cp7_p5) >> 1; + + + if (cp7_p5 >= cols) + continue; +// float loss = ch_prob[cp1_ch]+ +// engNum_prob[cp2_p0] +engNum_prob[cp3_p1]+engNum_prob[cp4_p2]+engNum_prob[cp5_p3]+engNum_prob[cp6_p4] +engNum_prob[cp7_p5] +// + (false_prob[md2]+false_prob[md3]+false_prob[md4]+false_prob[md5]+false_prob[md5] + false_prob[md6]); + float loss = ch_prob[cp1_ch] * 3 - + (false_prob[cp3_p1] + false_prob[cp4_p2] + false_prob[cp5_p3] + + false_prob[cp6_p4] + false_prob[cp7_p5]); + + if (loss > loss_selected) + { + loss_selected = loss; + cp_list[0] = cp1_ch; + cp_list[1] = cp2_p0; + cp_list[2] = cp3_p1; + cp_list[3] = cp4_p2; + cp_list[4] = cp5_p3; + cp_list[5] = cp6_p4; + cp_list[6] = cp7_p5; + } + } + } + candidate_pts[0] = cp_list[0]; + candidate_pts[1] = cp_list[1]; + candidate_pts[2] = cp_list[2]; + candidate_pts[3] = cp_list[3]; + candidate_pts[4] = cp_list[4]; + candidate_pts[5] = cp_list[5]; + candidate_pts[6] = cp_list[6]; + + candidatePts.first = loss_selected; + candidatePts.second = candidate_pts; + + }; + + + void PlateSegmentation::segmentPlateBySlidingWindows(cv::Mat &plateImage, int windowsWidth, + int stride, cv::Mat &respones) + { + + +// cv::resize(plateImage,plateImage,cv::Size(136,36)); + + cv::Mat plateImageGray; + cv::cvtColor(plateImage, plateImageGray, cv::COLOR_BGR2GRAY); + int padding = plateImage.cols - 136; +// int padding = 0 ; + int height = plateImage.rows - 1; + int width = plateImage.cols - 1 - padding; + for (int i = 0; i < width - windowsWidth + 1; i += stride) + { + cv::Rect roi(i, 0, windowsWidth, height); + cv::Mat roiImage = plateImageGray(roi); + cv::Mat response = classifyResponse(roiImage); + respones.push_back(response); + } + + + respones = respones.t(); +// std::pair> images ; +// +// +// std::cout< &Char_rects) + { + cv::Mat plateImage = plateInfo.getPlateImage(); // get src image . + cv::Mat plateImageGray; + cv::cvtColor(plateImage, plateImageGray, cv::COLOR_BGR2GRAY); + //do binarzation + // + std::pair> sections; // segment points variables . + + cv::Mat respones; //three response of every sub region from origin image . + segmentPlateBySlidingWindows(plateImage, DEFAULT_WIDTH, 1, respones); + templateMatchFinding(respones, DEFAULT_WIDTH / stride, sections); + for (int i = 0; i < sections.second.size(); i++) + { + sections.second[i] *= stride; + + } + +// std::cout< &rects) + { + cv::Mat plateImage = plateInfo.getPlateImage(); + for (int i = 0; i < rects.size(); i++) + { + cv::Mat charImage; + plateImage(rects[i]).copyTo(charImage); + if (charImage.channels()) + cv::cvtColor(charImage, charImage, cv::COLOR_BGR2GRAY); +// cv::imshow("image",charImage); +// cv::waitKey(0); + cv::equalizeHist(charImage, charImage); +// + +// + + + std::pair char_instance; + if (i == 0) + { + + char_instance.first = CHINESE; + + + } + else if (i == 1) + { + char_instance.first = LETTER; + } + else + { + char_instance.first = LETTER_NUMS; + } + char_instance.second = charImage; + plateInfo.appendPlateChar(char_instance); + + } + + } + +}//namespace pr diff --git a/app/src/main/cpp/lib_hyper_lpr/src/Recognizer.cpp b/app/src/main/cpp/lib_hyper_lpr/src/Recognizer.cpp new file mode 100644 index 0000000..863da70 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/src/Recognizer.cpp @@ -0,0 +1,33 @@ +// +// Created by 庾金科 on 22/10/2017. +// + +#include "../include/Recognizer.h" + +namespace pr +{ + void GeneralRecognizer::SegmentBasedSequenceRecognition(PlateInfo &plateinfo) + { + for (auto char_instance: plateinfo.plateChars) + { + std::pair res; + if (char_instance.second.rows * char_instance.second.cols > 40) + { + label code_table = recognizeCharacter(char_instance.second); + res.first = char_instance.first; + code_table.copyTo(res.second); + plateinfo.appendPlateCoding(res); + } + else + { + res.first = INVALID; + plateinfo.appendPlateCoding(res); + + } + + + } + + + } +} \ No newline at end of file diff --git a/app/src/main/cpp/lib_hyper_lpr/src/SegmentationFreeRecognizer.cpp b/app/src/main/cpp/lib_hyper_lpr/src/SegmentationFreeRecognizer.cpp new file mode 100644 index 0000000..36d6340 --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/src/SegmentationFreeRecognizer.cpp @@ -0,0 +1,129 @@ +// +// Created by 庾金科 on 28/11/2017. +// +#include "../include/SegmentationFreeRecognizer.h" + +namespace pr +{ + SegmentationFreeRecognizer::SegmentationFreeRecognizer(std::string prototxt, + std::string caffemodel) + { + net = cv::dnn::readNetFromCaffe(prototxt, caffemodel); + } + + + inline int judgeCharRange(int id) + { + return id < 31 || id > 63; + } + + + std::pair + decodeResults(cv::Mat code_table, std::vector mapping_table, float thres) + { +// cv::imshow("imagea",code_table); +// cv::waitKey(0); + + cv::MatSize mtsize = code_table.size; + int sequencelength = mtsize[2]; + int labellength = mtsize[1]; + cv::transpose(code_table.reshape(1, 1).reshape(1, labellength), code_table); + std::string name = ""; + + + std::vector seq(sequencelength); + std::vector> seq_decode_res; + + for (int i = 0; i < sequencelength; i++) + { + float *fstart = ((float *) (code_table.data) + i * labellength); + int id = std::max_element(fstart, fstart + labellength) - fstart; + seq[i] = id; + } + + float sum_confidence = 0; + + int plate_lenghth = 0; + + + for (int i = 0; i < sequencelength; i++) + { + if (seq[i] != labellength - 1 && (i == 0 || seq[i] != seq[i - 1])) + { + float *fstart = ((float *) (code_table.data) + i * labellength); + float confidence = *(fstart + seq[i]); + std::pair pair_(seq[i], confidence); + seq_decode_res.push_back(pair_); +// + + } + } + + int i = 0; + + if (seq_decode_res.size() > 1 && judgeCharRange(seq_decode_res[0].first) && + judgeCharRange(seq_decode_res[1].first)) + { + i = 2; + int c = seq_decode_res[0].second < seq_decode_res[1].second; + name += mapping_table[seq_decode_res[c].first]; + sum_confidence += seq_decode_res[c].second; + plate_lenghth++; + } + + for (; i < seq_decode_res.size(); i++) + { + name += mapping_table[seq_decode_res[i].first]; + sum_confidence += seq_decode_res[i].second; + plate_lenghth++; + } + + + std::pair res; + + res.second = sum_confidence / plate_lenghth; + res.first = name; + return res; + + } + + + std::string decodeResults(cv::Mat code_table, std::vector mapping_table) + { + cv::MatSize mtsize = code_table.size; + int sequencelength = mtsize[2]; + int labellength = mtsize[1]; + cv::transpose(code_table.reshape(1, 1).reshape(1, labellength), code_table); + std::string name = ""; + std::vector seq(sequencelength); + for (int i = 0; i < sequencelength; i++) + { + float *fstart = ((float *) (code_table.data) + i * labellength); + int id = std::max_element(fstart, fstart + labellength) - fstart; + seq[i] = id; + } + for (int i = 0; i < sequencelength; i++) + { + if (seq[i] != labellength - 1 && (i == 0 || seq[i] != seq[i - 1])) + name += mapping_table[seq[i]]; + } + + std::cout << name; + return name; + } + + + std::pair + SegmentationFreeRecognizer::SegmentationFreeForSinglePlate(cv::Mat Image, + std::vector mapping_table) + { + cv::transpose(Image, Image); + cv::Mat inputBlob = cv::dnn::blobFromImage(Image, 1 / 255.0, cv::Size(40, 160)); + net.setInput(inputBlob, "data"); + cv::Mat char_prob_mat = net.forward(); + return decodeResults(char_prob_mat, mapping_table, 0.00); + + } + + +} diff --git a/app/src/main/cpp/lib_hyper_lpr/src/util.h b/app/src/main/cpp/lib_hyper_lpr/src/util.h new file mode 100644 index 0000000..9e9f6fd --- /dev/null +++ b/app/src/main/cpp/lib_hyper_lpr/src/util.h @@ -0,0 +1,85 @@ +// +// Created by 庾金科 on 04/04/2017. +// + +#include +#include + +namespace util +{ + + template + void swap(T &a, T &b) + { + T c(a); + a = b; + b = c; + } + + template + T min(T &a, T &b) + { + return a > b ? b : a; + + } + + cv::Mat cropFromImage(const cv::Mat &image, cv::Rect rect) + { + int w = image.cols - 1; + int h = image.rows - 1; + rect.x = std::max(rect.x, 0); + rect.y = std::max(rect.y, 0); + rect.height = std::min(rect.height, h - rect.y); + rect.width = std::min(rect.width, w - rect.x); + cv::Mat temp(rect.size(), image.type()); + cv::Mat cropped; + temp = image(rect); + temp.copyTo(cropped); + return cropped; + + } + + cv::Mat cropBox2dFromImage(const cv::Mat &image, cv::RotatedRect rect) + { + cv::Mat M, rotated, cropped; + float angle = rect.angle; + cv::Size rect_size(rect.size.width, rect.size.height); + if (rect.angle < -45.) + { + angle += 90.0; + swap(rect_size.width, rect_size.height); + } + M = cv::getRotationMatrix2D(rect.center, angle, 1.0); + cv::warpAffine(image, rotated, M, image.size(), cv::INTER_CUBIC); + cv::getRectSubPix(rotated, rect_size, rect.center, cropped); + return cropped; + } + + cv::Mat calcHist(const cv::Mat &image) + { + cv::Mat hsv; + std::vector hsv_planes; + cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV); + cv::split(hsv, hsv_planes); + cv::Mat hist; + int histSize = 256; + float range[] = {0, 255}; + const float *histRange = {range}; + + cv::calcHist(&hsv_planes[0], 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, true, true); + return hist; + + } + + float computeSimilir(const cv::Mat &A, const cv::Mat &B) + { + + cv::Mat histA, histB; + histA = calcHist(A); + histB = calcHist(B); + return cv::compareHist(histA, histB, CV_COMP_CORREL); + + } + + +}//namespace util diff --git a/app/src/main/cpp/lib_serial_port/serial_port.c b/app/src/main/cpp/lib_serial_port/serial_port.c index d0e7e80..f7c2e5a 100644 --- a/app/src/main/cpp/lib_serial_port/serial_port.c +++ b/app/src/main/cpp/lib_serial_port/serial_port.c @@ -19,6 +19,7 @@ * limitations under the License. */ +//Google提供的串口通信库 #include #include #include diff --git a/app/src/main/cpp/main_car_aes.cpp b/app/src/main/cpp/main_car_aes.cpp index 0cef307..edeaa4e 100644 --- a/app/src/main/cpp/main_car_aes.cpp +++ b/app/src/main/cpp/main_car_aes.cpp @@ -3,6 +3,9 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//数据处理算法 +//这个算法不做额外说明,实际比赛中算法会发生变化 + #include "main_car_aes.h" namespace uns diff --git a/app/src/main/cpp/main_car_aes.h b/app/src/main/cpp/main_car_aes.h index b7fefdc..fc95887 100644 --- a/app/src/main/cpp/main_car_aes.h +++ b/app/src/main/cpp/main_car_aes.h @@ -6,6 +6,8 @@ #ifndef MAINCAR_MAIN_CAR_AES_H #define MAINCAR_MAIN_CAR_AES_H +//数据处理算法 + #define MAIN_CAR_AES_VERSION "1.0.0" #include diff --git a/app/src/main/cpp/ocr_text.cpp b/app/src/main/cpp/ocr_text.cpp index f34c14f..19a4d8d 100644 --- a/app/src/main/cpp/ocr_text.cpp +++ b/app/src/main/cpp/ocr_text.cpp @@ -3,33 +3,49 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//OCR的图像预处理算法 + #include "ocr_text.h" -bool OCRSupport::PixelCheck(const cv::Vec3b &pixel) +namespace uns { - if (pixel[0] <= limit) - if (pixel[1] <= limit) - if (pixel[2] <= limit) - return true; - return false; -} - -cv::Mat OCRSupport::ConvertImage(const cv::Mat &img) -{ - cv::Mat result(img.size(), img.type()); - for (int r = 0; r < img.rows; r++) + //像素检查,limit阈值是黑色的浓淡(文字是图片中最黑的部分) + bool OCRSupport::PixelCheck(const cv::Vec3b &pixel) { - for (int c = 0; c < img.cols; c++) - { - if (PixelCheck(img.at(r, c))) - result.at(r, c) = cv::Vec3b(0, 0, 0); - else - result.at(r, c) = cv::Vec3b(255, 255, 255); - } + if (pixel[0] <= limit) + if (pixel[1] <= limit) + if (pixel[2] <= limit) + return true; + return false; } - return result; -} + + //图片裁切 + cv::Mat OCRSupport::CutImageSize(const cv::Mat &img) + { + return img(roi); + } + + //图片预处理,将彩色图片转换为黑白图片,确保文字是黑色的 + cv::Mat OCRSupport::ConvertImage(const cv::Mat &img) + { + cv::imwrite("/sdcard/MainCar/OCR/ocr_old.jpg", img); + cv::Mat result(img.size(), img.type()); + for (int r = 0; r < img.rows; r++) + { + for (int c = 0; c < img.cols; c++) + { + if (PixelCheck(img.at(r, c))) + result.at(r, c) = cv::Vec3b(0, 0, 0); + else + result.at(r, c) = cv::Vec3b(255, 255, 255); + } + } + cv::imwrite("/sdcard/MainCar/OCR/ocr_process.jpg", result); + return result; + } +}; +//导出的自检函数 extern "C" JNIEXPORT jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_OCRTextTest(JNIEnv *env, jclass _this) { @@ -37,13 +53,17 @@ jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_OCRTextTest(JNIEnv * return env->NewStringUTF(version.c_str()); } +//导出的图像预处理函数 extern "C" JNIEXPORT -jobject JNICALL Java_com_uns_maincar_cpp_1interface_OCR_ProcessImage(JNIEnv* env, jclass _this, jobject image) +jobject JNICALL +Java_com_uns_maincar_cpp_1interface_OCR_ProcessImage(JNIEnv *env, jclass _this, jobject image, + jboolean self_test) { cv::Mat source; - OCRSupport ocr_supp; - BitmapToMat(env,image,source); - cv::Mat img = ocr_supp.ConvertImage(source); + uns::OCRSupport ocr_supp; + BitmapToMat(env, image, source); + cv::Mat img = (self_test ? ocr_supp.ConvertImage(source) : ocr_supp.ConvertImage( + ocr_supp.CutImageSize(source))); jobject bmp = GenerateBitmap(env, img.cols, img.rows); MatToBitmap(env, img, bmp); return bmp; diff --git a/app/src/main/cpp/ocr_text.h b/app/src/main/cpp/ocr_text.h index 203b21e..6ce31b4 100644 --- a/app/src/main/cpp/ocr_text.h +++ b/app/src/main/cpp/ocr_text.h @@ -6,19 +6,29 @@ #ifndef MAINCAR_OCR_TEXT_H #define MAINCAR_OCR_TEXT_H +//OCR的图像预处理算法 + #define OCR_TEXT_VERSION "1.0.0" #include #include "opencv_support.h" +#include -class OCRSupport +namespace uns { -private: - const int limit = 65; -private: - bool PixelCheck(const cv::Vec3b& pixel); -public: - cv::Mat ConvertImage(const cv::Mat& img); + class OCRSupport + { + private: + const int limit = 90; + cv::Rect roi = cv::Rect(150, 60, 350, 300); + private: + bool PixelCheck(const cv::Vec3b &pixel); + + public: + cv::Mat CutImageSize(const cv::Mat &img); + + cv::Mat ConvertImage(const cv::Mat &img); + }; }; #endif //MAINCAR_OCR_TEXT_H diff --git a/app/src/main/cpp/opencv_support.cpp b/app/src/main/cpp/opencv_support.cpp index f17fd51..5d5362b 100644 --- a/app/src/main/cpp/opencv_support.cpp +++ b/app/src/main/cpp/opencv_support.cpp @@ -5,13 +5,19 @@ #include "opencv_support.h" +//Java中的Bitmap与OpenCV的Mat互转 + +//Bitmap转Mat bool BitmapToMat(JNIEnv *env, jobject obj_bitmap, cv::Mat &matrix) { void *bitmapPixels; // Save picture pixel data AndroidBitmapInfo bitmapInfo; // Save picture parameters - ASSERT_FALSE(AndroidBitmap_getInfo(env, obj_bitmap, &bitmapInfo) >= 0); // Get picture parameters - ASSERT_FALSE(bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGBA_8888 || bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGB_565); // Only ARGB? 8888 and RGB? 565 are supported - ASSERT_FALSE(AndroidBitmap_lockPixels(env, obj_bitmap, &bitmapPixels) >= 0); // Get picture pixels (lock memory block) + ASSERT_FALSE(AndroidBitmap_getInfo(env, obj_bitmap, &bitmapInfo) >= + 0); // Get picture parameters + ASSERT_FALSE(bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGBA_8888 || bitmapInfo.format == + ANDROID_BITMAP_FORMAT_RGB_565); // Only ARGB? 8888 and RGB? 565 are supported + ASSERT_FALSE(AndroidBitmap_lockPixels(env, obj_bitmap, &bitmapPixels) >= + 0); // Get picture pixels (lock memory block) ASSERT_FALSE(bitmapPixels); if (bitmapInfo.format == ANDROID_BITMAP_FORMAT_RGBA_8888) { @@ -29,7 +35,7 @@ bool BitmapToMat(JNIEnv *env, jobject obj_bitmap, cv::Mat &matrix) return true; } - +//Mat转Bitmap bool MatToBitmap(JNIEnv *env, cv::Mat &matrix, jobject obj_bitmap) { void *bitmapPixels; // Save picture pixel data @@ -82,14 +88,40 @@ bool MatToBitmap(JNIEnv *env, cv::Mat &matrix, jobject obj_bitmap) return true; } +//创建Bitmap图片 jobject GenerateBitmap(JNIEnv *env, jint width, jint height) { jclass bitmapCls = env->FindClass("android/graphics/Bitmap"); - jmethodID createBitmapFunction = env->GetStaticMethodID(bitmapCls, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"); + jmethodID createBitmapFunction = env->GetStaticMethodID(bitmapCls, "createBitmap", + "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"); jstring configName = env->NewStringUTF("ARGB_8888"); jclass bitmapConfigClass = env->FindClass("android/graphics/Bitmap$Config"); - jmethodID valueOfBitmapConfigFunction = env->GetStaticMethodID(bitmapConfigClass, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;"); - jobject bitmapConfig = env->CallStaticObjectMethod(bitmapConfigClass, valueOfBitmapConfigFunction, configName); - jobject newBitmap = env->CallStaticObjectMethod(bitmapCls, createBitmapFunction, width, height, bitmapConfig); + jmethodID valueOfBitmapConfigFunction = env->GetStaticMethodID(bitmapConfigClass, "valueOf", + "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;"); + jobject bitmapConfig = env->CallStaticObjectMethod(bitmapConfigClass, + valueOfBitmapConfigFunction, configName); + jobject newBitmap = env->CallStaticObjectMethod(bitmapCls, createBitmapFunction, width, height, + bitmapConfig); return newBitmap; +} + +//导出的图片保存函数,用于MainActivity中的长按保存函数 +extern "C" JNIEXPORT +jboolean JNICALL +Java_com_uns_maincar_gui_MainActivity_SaveImage(JNIEnv *env, jclass _this, jobject image, + jstring time) +{ + cv::Mat source; + if (!BitmapToMat(env, image, source)) + return false; + std::string time_str = env->GetStringUTFChars(time, 0); + try + { + cv::imwrite("/sdcard/MainCar/saved_" + time_str + ".jpg", source); + return true; + } + catch (...) + { + return false; + } } \ No newline at end of file diff --git a/app/src/main/cpp/opencv_support.h b/app/src/main/cpp/opencv_support.h index 58cdd39..e6dacd2 100644 --- a/app/src/main/cpp/opencv_support.h +++ b/app/src/main/cpp/opencv_support.h @@ -6,10 +6,13 @@ #ifndef MAINCAR_OPENCV_SUPPORT_H #define MAINCAR_OPENCV_SUPPORT_H +//Java中的Bitmap与OpenCV的Mat互转 + #include #include #include #include +#include #define ASSERT(status, ret) if (!(status)) { return ret; } #define ASSERT_FALSE(status) ASSERT(status, false) diff --git a/app/src/main/cpp/public_types.cpp b/app/src/main/cpp/public_types.cpp index a33e033..6c76114 100644 --- a/app/src/main/cpp/public_types.cpp +++ b/app/src/main/cpp/public_types.cpp @@ -3,6 +3,8 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//图片预处理、形状颜色、交通标志、交通灯的类型定义 + #include "public_types.h" namespace uns diff --git a/app/src/main/cpp/public_types.h b/app/src/main/cpp/public_types.h index f217695..884f473 100644 --- a/app/src/main/cpp/public_types.h +++ b/app/src/main/cpp/public_types.h @@ -6,6 +6,8 @@ #ifndef MAINCAR_PUBLIC_TYPES_H #define MAINCAR_PUBLIC_TYPES_H +//图片预处理、形状颜色、交通标志、交通灯的类型定义 + #include #include #include diff --git a/app/src/main/cpp/qr_code_decode.cpp b/app/src/main/cpp/qr_code_decode.cpp index c86e23d..89a918c 100644 --- a/app/src/main/cpp/qr_code_decode.cpp +++ b/app/src/main/cpp/qr_code_decode.cpp @@ -3,11 +3,14 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//二维码解析前图像处理 + #include "qr_code_decode.h" namespace uns { - bool QrDecode::SplitMultipleQR(const cv::Mat& img, std::vector& rects) + //使用导出的OpenCV库切分多个二维码 + bool QrDecode::SplitMultipleQR(const cv::Mat &img, std::vector &rects) { uns_cv_export::QRCodeDetector qrcode; std::vector corners; @@ -25,22 +28,26 @@ namespace uns return false; } + //检查是否有下一个二维码图片 bool QrDecode::HasNextImage() { return (current_index < qr_codes.size()); } + //获取下一个二维码图片 cv::Mat QrDecode::GetNextImage() { return source_image(qr_codes[current_index++]); } + //切分并存储二维码 bool QrDecode::SplitQR(const cv::Mat& img) { img.copyTo(source_image); return SplitMultipleQR(img, qr_codes); } + //清空存储 void QrDecode::Clear() { qr_codes.clear(); @@ -50,6 +57,7 @@ namespace uns uns::QrDecode global_qr_decoder; +//导出的图像处理函数 extern "C" JNIEXPORT jboolean JNICALL Java_com_uns_maincar_cpp_1interface_QRDecoder_ProcessQR(JNIEnv *env, jclass _this, jobject image) { @@ -60,12 +68,14 @@ jboolean JNICALL Java_com_uns_maincar_cpp_1interface_QRDecoder_ProcessQR(JNIEnv return global_qr_decoder.SplitQR(img_input); } +//导出的检查是否有下一个二维码函数 extern "C" JNIEXPORT jboolean JNICALL Java_com_uns_maincar_cpp_1interface_QRDecoder_HasNextQR(JNIEnv *env, jclass _this) { return global_qr_decoder.HasNextImage(); } +//导出的获取下一个二维码图片函数 extern "C" JNIEXPORT jobject JNICALL Java_com_uns_maincar_cpp_1interface_QRDecoder_GetNextQR(JNIEnv* env, jclass _this) { @@ -75,6 +85,7 @@ jobject JNICALL Java_com_uns_maincar_cpp_1interface_QRDecoder_GetNextQR(JNIEnv* return bmp; } +//导出的强制清空函数 extern "C" JNIEXPORT void JNICALL Java_com_uns_maincar_cpp_1interface_QRDecoder_ForceClear(JNIEnv *env, jclass _this) { diff --git a/app/src/main/cpp/qr_code_decode.h b/app/src/main/cpp/qr_code_decode.h index b69dd07..ffd347d 100644 --- a/app/src/main/cpp/qr_code_decode.h +++ b/app/src/main/cpp/qr_code_decode.h @@ -6,6 +6,8 @@ #ifndef MAINCAR_QR_CODE_DECODE_H #define MAINCAR_QR_CODE_DECODE_H +//二维码解析前图像处理 + #include #include #include diff --git a/app/src/main/cpp/shape_color_reco.cpp b/app/src/main/cpp/shape_color_reco.cpp index b550603..d6970f4 100644 --- a/app/src/main/cpp/shape_color_reco.cpp +++ b/app/src/main/cpp/shape_color_reco.cpp @@ -3,11 +3,15 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//形状颜色识别 + #include "shape_color_reco.h" namespace uns { - bool ShapeColorReco::RecoEverything(const cv::Mat& img, double rate) + //识别所有东西 + //预处理,图像切分,使用黑白图像识别形状,使用彩色图像识别颜色 + bool ShapeColorReco::RecoEverything(const cv::Mat &img, double rate) { if (img.empty()) return false; @@ -17,11 +21,13 @@ namespace uns Images::TwoImages temp = image_processor.FixImageBUG(screen, rate); if (temp.img1.empty() || temp.img2.empty()) return false; + cv::imwrite("/sdcard/MainCar/temp_img1.jpg", temp.img1); + cv::imwrite("/sdcard/MainCar/temp_img2.jpg", temp.img2); Shapes::Stars stars = shape_reco.GetStars(temp.img2); Shapes::Rects rects = shape_reco.GetRects(temp.img2); Shapes::Circles circles = shape_reco.GetCircles(temp.img2); Shapes::Triangles triangles = shape_reco.GetTriangles(temp.img2); - for (auto& c : circles) + for (auto &c: circles) { cv::Mat shape = image_processor.CutCircle(temp.img1, c); if (shape.empty()) @@ -55,6 +61,7 @@ namespace uns return true; } + //查询结果 int ShapeColorReco::LookupRecoResult(Images::ShapeType shape, std::string color) { return shape_color_counter[shape][color]; @@ -63,6 +70,7 @@ namespace uns uns::ShapeColorReco global_shape_color_reco; +//导出的自检函数 extern "C" JNIEXPORT jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_ShapeColorRecoTest(JNIEnv *env, jclass _this) { @@ -70,6 +78,7 @@ jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_ShapeColorRecoTest(J return env->NewStringUTF(version.c_str()); } +//导出的识别函数 extern "C" JNIEXPORT jboolean JNICALL Java_com_uns_maincar_cpp_1interface_ShapeColor_RecoEverything(JNIEnv *env, jclass _this, jobject image, jdouble rate) { @@ -80,6 +89,7 @@ jboolean JNICALL Java_com_uns_maincar_cpp_1interface_ShapeColor_RecoEverything(J return global_shape_color_reco.RecoEverything(source, rate); } +//导出的结果查询函数 extern "C" JNIEXPORT jint JNICALL Java_com_uns_maincar_cpp_1interface_ShapeColor_LookupRecoResult(JNIEnv *env, jclass _this, jint shape, jstring color) { diff --git a/app/src/main/cpp/shape_color_reco.h b/app/src/main/cpp/shape_color_reco.h index 5c0768a..c63cc1e 100644 --- a/app/src/main/cpp/shape_color_reco.h +++ b/app/src/main/cpp/shape_color_reco.h @@ -6,6 +6,8 @@ #ifndef MAINCAR_SHAPE_COLOR_RECO_H #define MAINCAR_SHAPE_COLOR_RECO_H +//形状颜色识别 + #include #include "color_reco.h" #include "shape_reco.h" diff --git a/app/src/main/cpp/shape_reco.cpp b/app/src/main/cpp/shape_reco.cpp index c569f65..008fcff 100644 --- a/app/src/main/cpp/shape_reco.cpp +++ b/app/src/main/cpp/shape_reco.cpp @@ -3,10 +3,13 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//形状识别 + #include "shape_reco.h" namespace uns { + //取三个数中最大的数 int ShapeReco::tri_max(int a, int b, int c) { if ((a > b) && (a > c)) @@ -17,6 +20,7 @@ namespace uns return c; } + //取三个数中最小的数 int ShapeReco::tri_min(int a, int b, int c) { if ((a < b) && (a < c)) @@ -27,6 +31,7 @@ namespace uns return c; } + //旋转三角形 Shapes::Triangle ShapeReco::Rotate(const Shapes::Triangle& tri, int r) { Shapes::Triangle result; @@ -51,6 +56,7 @@ namespace uns return result; } + //根据四个点计算矩形 Shapes::Rectangle ShapeReco::CalcRectangle(const std::vector& four_points) { int width = lround(sqrtf(powf((four_points[0].x - four_points[1].x), 2) + powf((four_points[0].y - four_points[1].y), 2))); @@ -58,6 +64,7 @@ namespace uns return uns::Shapes::Rectangle{ height, width, four_points }; } + //检查两个三角形是否重合/过于靠近 bool ShapeReco::TriangleTooClose(const Shapes::Triangle& tri1, const Shapes::Triangle& tri2) { int max_off_1 = CalcTriangleMaxOff(tri1, tri2); @@ -67,6 +74,7 @@ namespace uns return (tri_min(max_off_1, max_off_2, std::min(max_off_3, max_off_4)) <= 20); } + //检查两个矩形是否重合/过于靠近 bool ShapeReco::RectTooClose(const Shapes::Rectangle& rect1, const Shapes::Rectangle& rect2) { int top_x_off = abs(rect1.four_points[0].x - rect2.four_points[0].x); @@ -77,6 +85,7 @@ namespace uns return (max_off <= 20); } + //计算两个三角形的最大距离 int ShapeReco::CalcTriangleMaxOff(const Shapes::Triangle& tri1, const Shapes::Triangle& tri2) { int a_x_off = abs(tri1.three_points[0].x - tri2.three_points[0].x); @@ -88,6 +97,7 @@ namespace uns return std::max(tri_max(a_x_off, b_x_off, c_x_off), tri_max(a_y_off, b_y_off, c_y_off)); } + //计算三个点组成的角度 double ShapeReco::CalcAngle(const cv::Point& pt1, const cv::Point& pt2, const cv::Point& pt0) { double dx1 = pt1.x - pt0.x; @@ -97,6 +107,7 @@ namespace uns return (dx1 * dx2 + dy1 * dy2) / sqrt((dx1 * dx1 + dy1 * dy1) * (dx2 * dx2 + dy2 * dy2) + 1e-10); } + //识别五角星 Shapes::Stars ShapeReco::GetStars(const cv::Mat& img) { int thresh = 50, N = 5; @@ -145,6 +156,7 @@ namespace uns return result; } + //识别矩形 Shapes::Rects ShapeReco::GetRects(const cv::Mat& img) { int thresh = 50, N = 5; @@ -198,6 +210,7 @@ namespace uns return result; } + //检查矩形是否是正方形 bool ShapeReco::IsSquare(const Shapes::Rectangle& rect) { if (rect.width == rect.height) @@ -208,6 +221,7 @@ namespace uns return false; } + //识别圆形 Shapes::Circles ShapeReco::GetCircles(const cv::Mat& img) { cv::Mat gray; @@ -231,6 +245,7 @@ namespace uns return result; } + //识别三角形 Shapes::Triangles ShapeReco::GetTriangles(const cv::Mat& img) { Shapes::Triangles result, temp; @@ -279,6 +294,7 @@ namespace uns } }; +//导出的自检函数 extern "C" JNIEXPORT jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_ShapeRecoTest(JNIEnv *env, jclass _this) { diff --git a/app/src/main/cpp/shape_reco.h b/app/src/main/cpp/shape_reco.h index c466f32..0cc1797 100644 --- a/app/src/main/cpp/shape_reco.h +++ b/app/src/main/cpp/shape_reco.h @@ -6,6 +6,8 @@ #ifndef MAINCAR_SHAPE_RECO_H #define MAINCAR_SHAPE_RECO_H +//形状识别 + #define SHAPE_RECO_VERSION "1.0.0" #include diff --git a/app/src/main/cpp/traffic_light.cpp b/app/src/main/cpp/traffic_light.cpp index 5b34f9b..6781fdb 100644 --- a/app/src/main/cpp/traffic_light.cpp +++ b/app/src/main/cpp/traffic_light.cpp @@ -3,238 +3,125 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//交通灯识别 + #include "traffic_light.h" namespace uns { - int TrafficLight::GetCircle(cv::Mat& img) - { - cv::Mat gray; - cvtColor(img, gray, cv::COLOR_BGR2GRAY); - GaussianBlur(gray, gray, cv::Size(9, 9), 2, 2); //平滑滤波 - //检测圆形 - std::vector circles; - double dp = 2.5; // - double minDist = 10; //两个圆心之间的最小距离 - double param1 = 100; //Canny边缘检测的较大阈值 - double param2 = 100; //累加器阈值 - int min_radius = 20; //圆形半径的最小值 - int max_radius = 200; //圆形半径的最大值 - HoughCircles(gray, circles, cv::HOUGH_GRADIENT, dp, minDist, param1, param2,min_radius, max_radius); - int circle_r_max = 0; - cv::Point max_circle_center = cv::Point(0, 0); - for (size_t i = 0; i < circles.size(); i++) - { - int radius = cvRound(circles[i][2]); - //circle(img, Point(cvRound(circles[i][0]), cvRound(circles[i][1])), radius, Scalar(0, 0, 0), 4, 8, 0); - if (radius > circle_r_max) - { - circle_r_max = radius; - max_circle_center = cv::Point(cvRound(circles[i][0]), cvRound(circles[i][1])); - } - } - CutImage(img, circle_r_max, cv::Point(max_circle_center.y, max_circle_center.x)); - return 0; - } - - bool TrafficLight::CheckRGB(cv::Vec3b point) - { - if (point[0] < 240) - if (point[1] < 240) - if (point[2] < 240) - return true; - return false; - } - + //取三个数中的最大值 int TrafficLight::tri_max(int a, int b, int c) { return std::max(std::max(a, b), c); } - void TrafficLight::ImageProcess(cv::Mat& image) + //根据亮度获取亮起的灯的位置 + cv::Mat TrafficLight::GetLight(const cv::Mat &img) { - for (int i = 0; i < image.rows; i++) + cv::Mat hsv; + cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV); + cv::Mat chn_v(hsv.size(), CV_8UC1); + for (int r = 0; r < hsv.rows; r++) { - for (int j = 0; j < image.cols; j++) + for (int c = 0; c < hsv.cols; c++) { - if (CheckRGB(image.at(i, j))) - { - image.at(i, j)[0] = 255; - image.at(i, j)[1] = 255; - image.at(i, j)[2] = 255; - } + uchar v = hsv.at(r, c)[2]; + chn_v.at(r, c) = (v >= 250 ? 0 : 255); } } - return; + cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(11, 11)); + cv::morphologyEx(chn_v, chn_v, cv::MORPH_CLOSE, kernel); + cv::Rect max_validate_rect = GetMaxRect(chn_v); + if (max_validate_rect.size().area() == 0) + return cv::Mat(); + return img(max_validate_rect); } - bool TrafficLight::ApproximatelyEqual(int a, int b, int offset) + //获取图片中面积最大的轮廓的外接矩形 + cv::Rect TrafficLight::GetMaxRect(const cv::Mat &img) { - if (a == b) - return true; - if (((a + offset) >= b) && ((a - offset) <= b)) - return true; - else - return false; - } - - void TrafficLight::CutImage(cv::Mat& image,int radius,cv::Point center) - { - cv::Mat result(radius * 2, radius * 2, image.type(), cv::Scalar(0, 0, 0)); - cv::Point start(center.x - radius, center.y - radius); - int x_end = center.x + radius; - int y_end = center.y + radius; - for (int i = start.x; i < x_end; i++) + cv::Rect max_rect; + double max_rect_size = 0; + std::vector hierarchy; + std::vector> contours; + cv::findContours(img, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE); //轮廓查找 + for (auto &contour: contours) //检测所找到的轮廓 { - for (int j = start.y; j < y_end; j++) + double area = cv::contourArea(cv::Mat(contour)); + if (area > (img.size().area() / 2.0)) + continue; + if (area > max_rect_size) { - result.at(i - start.x, j - start.y)[0] = image.at(i, j)[0]; - result.at(i - start.x, j - start.y)[1] = image.at(i, j)[1]; - result.at(i - start.x, j - start.y)[2] = image.at(i, j)[2]; + max_rect_size = area; + max_rect = cv::boundingRect(contour); } } - result.copyTo(image); - return; - } - - void TrafficLight::CountMax(cv::Vec3b data, int& rmax, int& gmax, int& bmax) - { - if ((data[0] == data[1]) && (data[1] == data[2])) - return; - uchar _max = tri_max(data[0], data[1], data[2]); - if (_max == data[0]) - bmax++; - if (_max == data[1]) - gmax++; - if (_max == data[2]) - rmax++; - return; - } - - Light::TL_COLOR TrafficLight::GetColor(cv::Mat &image, int offset) - { - ImageProcess(image); - GetCircle(image); - int rmax_count = 0, gmax_count = 0, bmax_count = 0; - for (int i = 0; i < image.rows; i++) - for (int j = 0; j < image.cols; j++) - CountMax(image.at(i, j), rmax_count, gmax_count, bmax_count); - if (ApproximatelyEqual(rmax_count, gmax_count, offset)) - return Light::TL_COLOR::Yellow; - int max_max = tri_max(rmax_count, gmax_count, bmax_count); - if (max_max == rmax_count) - return Light::TL_COLOR::Red; - else if ((max_max == gmax_count) || (max_max == bmax_count)) - return Light::TL_COLOR::Green; - return Light::TL_COLOR::Yellow; + return max_rect; } + //“远大于”函数 bool TrafficLight::MuchLarger(int a, int b, double rate) { return (a >= (b * rate)); } - void TrafficLight::CountColor(const cv::Mat &img, double rate, int &r_cnt, int &g_cnt, int &y_cnt) - { - r_cnt = 0; - g_cnt = 0; - y_cnt = 0; - for (int i = 0; i < img.rows; i++) - { - for (int j = 0; j < img.cols; j++) - { - cv::Vec3b color = img.at(i, j); - if (MuchLarger(color[2], color[1], rate) && MuchLarger(color[2], color[1], rate)) - r_cnt++; - else if (MuchLarger(color[1], color[0], rate) && MuchLarger(color[1], color[2], rate)) - g_cnt++; - else if (ApproximatelyEqual(color[1], color[2], rate)) - y_cnt++; - } - } - } - - Light::TL_COLOR TrafficLight::Reco(cv::Mat &img) - { - /*int r = 0, g = 0, y = 0; - GetCircle(img); - CountColor(img, 2.5, r, g, y); - int max = tri_max(r, g, y); - if (max == r) - return Light::TL_COLOR::Red; - else if (max == g) - return Light::TL_COLOR::Green; - else - return Light::TL_COLOR::Yellow;*/ - ImageProcess(img); - if(img.empty()) - return Light::TL_COLOR::Null; - img = SplitImage(img); - if(img.empty()) - return Light::TL_COLOR::Null; - return GetImageColor(img, 1.3); - } - - cv::Mat TrafficLight::SplitImage(const cv::Mat &img) - { - int max_image_area = 0; - cv::Rect max_image_rect; - uns::Images::Contour approx; - uns::Images::Contours contours; - cv::Mat shape_image(img.size(), CV_8UC1); - for (int r = 0; r < img.rows; r++) - { - for (int c = 0; c < img.cols; c++) - { - cv::Vec3b color = img.at(r, c); - if ((color[0] > 240) && (color[1] > 240) && (color[2] > 240)) - shape_image.at(r, c) = 255; - else - shape_image.at(r, c) = 0; - } - } - cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(11, 11)); - cv::morphologyEx(shape_image, shape_image, cv::MORPH_CLOSE, kernel); - findContours(shape_image, contours, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE); //轮廓查找 - for (const auto& contour : contours) - { - if (cv::contourArea(contour) >= (img.total() / 2.0)) - continue; - cv::Rect target_rect = boundingRect(contour); - if (target_rect.area() > max_image_area) - max_image_rect = target_rect; - } - return img(max_image_rect); - } - + //识别灯的颜色 Light::TL_COLOR TrafficLight::GetImageColor(const cv::Mat &img, double rate) { int cnt_r = 0, cnt_g = 0, cnt_y = 0; + int cnt_g_less = 0, cnt_b_less = 0; for (int r = 0; r < img.rows; r++) { for (int c = 0; c < img.cols; c++) { uns::Colors::CVColor color(img.at(r, c)); - if (MuchLarger(color.GetR(), color.GetG(), rate) && MuchLarger(color.GetR(), color.GetB(), rate)) + if (MuchLarger(color.GetR(), color.GetG(), rate) && + MuchLarger(color.GetR(), color.GetB(), rate)) cnt_r++; - else if (MuchLarger(color.GetG(), color.GetR(), rate) && MuchLarger(color.GetG(), color.GetB(), rate)) + else if (MuchLarger(color.GetG(), color.GetR(), rate) && + MuchLarger(color.GetG(), color.GetB(), rate)) cnt_g++; - else if (MuchLarger(color.GetB(), color.GetR(), rate) && MuchLarger(color.GetB(), color.GetG(), rate)) + else if (MuchLarger(color.GetB(), color.GetR(), rate) && + MuchLarger(color.GetB(), color.GetG(), rate)) cnt_g++; - else if (MuchLarger(color.GetR(), color.GetB(), rate) && MuchLarger(color.GetG(), color.GetB(), rate)) + else if (MuchLarger(color.GetR(), color.GetB(), rate) && + MuchLarger(color.GetG(), color.GetB(), rate)) cnt_y++; + if (color.GetG() < 110) + cnt_g_less++; + if (color.GetB() < 110) + cnt_b_less++; } } + LOGI("GLess: %d, BLess: %d", cnt_g_less, cnt_b_less); int cnt_max = tri_max(cnt_r, cnt_g, cnt_y); - if (cnt_max == cnt_r) - return Light::TL_COLOR::Red; + if ((cnt_max == cnt_r) || (cnt_max == cnt_y)) + { + if ((cnt_g_less < 50) /*&& (cnt_b_less < 5)*/) + return Light::TL_COLOR::Yellow; + else + return Light::TL_COLOR::Red; + } else if (cnt_max == cnt_g) return Light::TL_COLOR::Green; else - return Light::TL_COLOR::Yellow; + return Light::TL_COLOR::Null; + } + + //整合的识别函数 + Light::TL_COLOR TrafficLight::Reco(cv::Mat &img) + { + LOGI("Begin Traffic Light"); + img = GetLight(img); + if (img.empty()) + return Light::TL_COLOR::Null; + LOGI("Traffic Light Finished"); + cv::imwrite("/sdcard/MainCar/tlr_finished.jpg", img); + return GetImageColor(img, 1.3); } }; +//导出的识别函数 extern "C" JNIEXPORT jint JNICALL Java_com_uns_maincar_cpp_1interface_TrafficLight_Recognize(JNIEnv *env, jclass _this, jobject image) @@ -242,6 +129,7 @@ Java_com_uns_maincar_cpp_1interface_TrafficLight_Recognize(JNIEnv *env, jclass _ cv::Mat img; if(!BitmapToMat(env,image,img)) return 4; + cv::imwrite("/sdcard/MainCar/red.jpg", img); uns::TrafficLight traffic_light; switch(traffic_light.Reco(img)) { @@ -257,6 +145,7 @@ Java_com_uns_maincar_cpp_1interface_TrafficLight_Recognize(JNIEnv *env, jclass _ return 5; } +//导出的自检函数 extern "C" JNIEXPORT jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_TrafficLightTest(JNIEnv *env, jclass _this) diff --git a/app/src/main/cpp/traffic_light.h b/app/src/main/cpp/traffic_light.h index 8ae37e1..91ba06d 100644 --- a/app/src/main/cpp/traffic_light.h +++ b/app/src/main/cpp/traffic_light.h @@ -6,12 +6,15 @@ #ifndef MAINCAR_TRAFFIC_LIGHT_H #define MAINCAR_TRAFFIC_LIGHT_H +//交通灯识别 + #include #include #include #include #include "public_types.h" #include "opencv_support.h" +#include "debug_logger.h" #include #define TRAFFIC_LIGHT_RECO_VERSION "1.0.0" @@ -21,20 +24,16 @@ namespace uns class TrafficLight { private: - int GetCircle(cv::Mat& img); - bool CheckRGB(cv::Vec3b point); int tri_max(int a, int b, int c); - void ImageProcess(cv::Mat& image); - bool ApproximatelyEqual(int a, int b, int offset); - void CutImage(cv::Mat& image,int radius,cv::Point center); - void CountMax(cv::Vec3b data, int& rmax, int& gmax, int& bmax); - private: + + cv::Mat GetLight(const cv::Mat &img); + + cv::Rect GetMaxRect(const cv::Mat &img); + bool MuchLarger(int a, int b, double rate); - void CountColor(const cv::Mat& img, double rate, int& r_cnt, int& g_cnt, int& y_cnt); - cv::Mat SplitImage(const cv::Mat& img); - Light::TL_COLOR GetImageColor(const cv::Mat& img, double rate); - public: - Light::TL_COLOR GetColor(cv::Mat &image, int offset); + + Light::TL_COLOR GetImageColor(const cv::Mat &img, double rate); + public: Light::TL_COLOR Reco(cv::Mat &img); }; diff --git a/app/src/main/cpp/traffic_sign.cpp b/app/src/main/cpp/traffic_sign.cpp index 413c4f9..4fba3a5 100644 --- a/app/src/main/cpp/traffic_sign.cpp +++ b/app/src/main/cpp/traffic_sign.cpp @@ -3,11 +3,14 @@ // Copyright (c) 2022 UnknownNetworkService. All rights reserved. // +//交通标志识别 + #include "traffic_sign.h" #include "debug_logger.h" namespace uns { + //统计有效的像素数 int TrafficSign::PixCount(cv::Mat image) { int count = 0; @@ -25,6 +28,7 @@ namespace uns return -1; } + //获取图片的ROI区域 bool TrafficSign::GetImageROI(const cv::Mat& src, cv::Mat& roi_image) { cv::Mat gray; @@ -61,6 +65,7 @@ namespace uns return true; } + //读取存储的模板图片 bool TrafficSign::Read_Data(std::string filename, std::vector& dataset) { dataset.clear(); @@ -78,6 +83,7 @@ namespace uns return (dataset.size() == 6); } + //读取模板图片,匹配识别 int TrafficSign::SignRecognition(const cv::Mat& roi_image, const std::vector& dataset) { int index = 6; @@ -108,6 +114,7 @@ namespace uns return index; } + //整合的交通标志 int TrafficSign::RecognitionSign(const cv::Mat& source) { std::vector dataset; @@ -134,6 +141,7 @@ namespace uns return SignRecognition(src, dataset); } + //设置外部存储的路径 void TrafficSign::SetExternalImagePath(std::string path) { external_image_storage = path; @@ -141,6 +149,7 @@ namespace uns }; +//导出的自检函数 extern "C" JNIEXPORT jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_TrafficSignTest(JNIEnv *env, jclass _this) { @@ -148,6 +157,7 @@ jstring JNICALL Java_com_uns_maincar_cpp_1interface_EnvTest_TrafficSignTest(JNIE return env->NewStringUTF(version.c_str()); } +//导出的识别函数 extern "C" JNIEXPORT jint JNICALL Java_com_uns_maincar_cpp_1interface_TrafficSign_RecognizeSign(JNIEnv *env, jclass _this, jobject image, jstring external_path) { diff --git a/app/src/main/cpp/traffic_sign.h b/app/src/main/cpp/traffic_sign.h index 45c444b..67f0c04 100644 --- a/app/src/main/cpp/traffic_sign.h +++ b/app/src/main/cpp/traffic_sign.h @@ -6,6 +6,8 @@ #ifndef MAINCAR_TRAFFIC_SIGN_H #define MAINCAR_TRAFFIC_SIGN_H +//交通标志识别 + #define TRAFFIC_SIGN_RECO_VERSION "1.0.0" #include diff --git a/app/src/main/java/com/uns/maincar/communication/CommandDecoder.java b/app/src/main/java/com/uns/maincar/communication/CommandDecoder.java index 9aa117c..5504d0e 100644 --- a/app/src/main/java/com/uns/maincar/communication/CommandDecoder.java +++ b/app/src/main/java/com/uns/maincar/communication/CommandDecoder.java @@ -7,6 +7,7 @@ package com.uns.maincar.communication; import com.uns.maincar.constants.Commands; +//指令解析类,解析接收到的指令并验证校验码和帧头帧尾 public class CommandDecoder { private byte main_command; diff --git a/app/src/main/java/com/uns/maincar/communication/CommandEncoder.java b/app/src/main/java/com/uns/maincar/communication/CommandEncoder.java index a174dc6..dd40b16 100644 --- a/app/src/main/java/com/uns/maincar/communication/CommandEncoder.java +++ b/app/src/main/java/com/uns/maincar/communication/CommandEncoder.java @@ -7,6 +7,7 @@ package com.uns.maincar.communication; import com.uns.maincar.constants.Commands; +//指令编码类,生成带有标准帧头帧尾和校验码的指令 public class CommandEncoder { private final byte[] cmd = new byte[8]; diff --git a/app/src/main/java/com/uns/maincar/communication/DataTransferCore.java b/app/src/main/java/com/uns/maincar/communication/DataTransferCore.java index 4965369..46b3cf0 100644 --- a/app/src/main/java/com/uns/maincar/communication/DataTransferCore.java +++ b/app/src/main/java/com/uns/maincar/communication/DataTransferCore.java @@ -9,7 +9,6 @@ package com.uns.maincar.communication; * @apiNote 此接口为通用数据传输类接口,请慎重更改 * @implSpec 此接口应仅具有两个实现类,分别为Wifi及串口通信 */ - public interface DataTransferCore extends Runnable { @Override @@ -23,8 +22,13 @@ public interface DataTransferCore extends Runnable //接收数据的线程函数 void ThreadReceive(); + //发送指定数据 boolean Send(byte[] data); + + //发送指定数据,接收不到wait指令(位于数据接收第三位)就再次发送,超时退出 + boolean SendEx(byte[] data, byte wait, int timeout); + //在新线程中发送数据 void ThreadSend(byte[] data); @@ -33,6 +37,7 @@ public interface DataTransferCore extends Runnable //开启自动重连功能 void EnableAutoReconnect(); + //关闭自动重连功能 void DisableAutoReconnect(); diff --git a/app/src/main/java/com/uns/maincar/communication/SerialPortTransferCore.java b/app/src/main/java/com/uns/maincar/communication/SerialPortTransferCore.java index 41d26c2..80bba3e 100644 --- a/app/src/main/java/com/uns/maincar/communication/SerialPortTransferCore.java +++ b/app/src/main/java/com/uns/maincar/communication/SerialPortTransferCore.java @@ -151,6 +151,12 @@ public class SerialPortTransferCore implements DataTransferCore } } + @Override + public boolean SendEx(byte[] data, byte wait, int timeout) + { + return false; + } + @Override public void ThreadSend(byte[] data) { diff --git a/app/src/main/java/com/uns/maincar/communication/WifiTransferCore.java b/app/src/main/java/com/uns/maincar/communication/WifiTransferCore.java index c554026..c102a82 100644 --- a/app/src/main/java/com/uns/maincar/communication/WifiTransferCore.java +++ b/app/src/main/java/com/uns/maincar/communication/WifiTransferCore.java @@ -38,6 +38,10 @@ public class WifiTransferCore implements DataTransferCore private boolean AutoReconnectFlag = false; //数据接收线程运行标志位 private boolean DataReceivingFlag = false; + //SendEx() 使用的数据回传 + private boolean SendExDataBack = false; + //SendEx() 使用的回传数据接收 + private byte[] cb_data; public WifiTransferCore(String IP, int port, Handler data_handler) { @@ -46,13 +50,24 @@ public class WifiTransferCore implements DataTransferCore this.handler = data_handler; } + private void WifiSleep(int ms) + { + try + { + Thread.sleep(ms); + } + catch (InterruptedException ignored) + { + } + } + @Override public boolean Connect() { try { socket = new Socket(IP, port); - if(!socket.isClosed()) + if (!socket.isClosed()) { dis = new DataInputStream(socket.getInputStream()); dos = new DataOutputStream(socket.getOutputStream()); @@ -83,7 +98,10 @@ public class WifiTransferCore implements DataTransferCore if (dis.read(data, 0, data.length) != 0) { Log.i(Flags.CLIENT_TAG, "Wifi Socket Received."); - Message.obtain(handler, Flags.RECEIVED_CAR_DATA, data).sendToTarget(); + if (!SendExDataBack) + Message.obtain(handler, Flags.RECEIVED_CAR_DATA, data).sendToTarget(); + else + cb_data = data; } } catch (IOException ignored) @@ -110,6 +128,70 @@ public class WifiTransferCore implements DataTransferCore } catch (IOException | NullPointerException e) { + try + { + socket.close(); + } + catch (IOException ignored) + { + } + return false; + } + } + + @Override + public boolean SendEx(byte[] data, byte wait, int timeout) + { + try + { + if ((socket != null) && (!socket.isClosed())) + { + dos.write(data, 0, data.length); + dos.flush(); + Message.obtain(handler, Flags.PRINT_DATA_ARRAY, data).sendToTarget(); + SendExDataBack = true; + cb_data = null; + int current_wait_time = 0; + while (SendExDataBack) + { + WifiSleep(10); + current_wait_time += 10; + if (current_wait_time >= timeout) + { + SendExDataBack = false; + return false; + } + if (cb_data != null) + { + CommandDecoder decoder = new CommandDecoder(cb_data); + if (decoder.GetMainCommand() != wait) + { + cb_data = null; + //重发 + dos.write(data, 0, data.length); + dos.flush(); + Message.obtain(handler, Flags.PRINT_DATA_ARRAY, data).sendToTarget(); + } + else + { + SendExDataBack = false; + return true; + } + } + } + } + SendExDataBack = false; + return false; + } + catch (IOException | NullPointerException e) + { + try + { + socket.close(); + } + catch (IOException ignored) + { + } return false; } } diff --git a/app/src/main/java/com/uns/maincar/constants/Commands.java b/app/src/main/java/com/uns/maincar/constants/Commands.java index 4cbb319..631502a 100644 --- a/app/src/main/java/com/uns/maincar/constants/Commands.java +++ b/app/src/main/java/com/uns/maincar/constants/Commands.java @@ -5,32 +5,43 @@ package com.uns.maincar.constants; +//关于指令的常量值 public class Commands { + //帧头/帧尾 public static byte FRAME_HEAD_0 = (byte) 0x55; public static byte FRAME_HEAD_1 = (byte) 0xAA; public static byte FRAME_END = (byte) 0xBB; + //指令校验失败 + public static byte CMD_NOT_MATCH = (byte) 0xEE; + + //系统自检状态 public static byte STATUS_SUCCESS = (byte) 0xA1; public static byte STATUS_FAILED = (byte) 0xB1; + //二维码 public static byte QR_SUCCESS_1 = (byte) 0xA2; public static byte QR_SUCCESS_2 = (byte) 0xC2; public static byte QR_FAILED = (byte) 0xB2; + //交通灯 public static byte TRAFFIC_LIGHT_SUCCESS = (byte) 0xA3; public static byte TRAFFIC_LIGHT_FAILED = (byte) 0xB3; public static byte TRAFFIC_LIGHT_RED = (byte) 0x01; public static byte TRAFFIC_LIGHT_GREEN = (byte) 0x02; public static byte TRAFFIC_LIGHT_YELLOW = (byte) 0x03; + //车牌 public static byte CAR_ID_SUCCESS_FIRST = (byte) 0xA4; public static byte CAR_ID_SUCCESS_SECOND = (byte) 0xA5; public static byte CAR_ID_FAILED = (byte) 0xB4; + //形状颜色 public static byte COLOR_SHAPE_SUCCESS = (byte) 0xA6; public static byte COLOR_SHAPE_FAILED = (byte) 0xB6; + //交通标志 public static byte TRAFFIC_SIGN_SUCCESS = (byte) 0xA7; public static byte TRAFFIC_SIGN_FAILED = (byte) 0xB7; public static byte TRAFFIC_SIGN_TYPE_NO_ENTRY = (byte) 0x06; @@ -40,26 +51,32 @@ public class Commands public static byte TRAFFIC_SIGN_TYPE_TURN_RIGHT = (byte) 0x03; public static byte TRAFFIC_SIGN_TYPE_U_TURN = (byte) 0x04; + //TFT显示器下翻一页 public static byte TFT_PAGE_DOWN = (byte) 0xA8; + //OCR(文本识别) public static byte OCR_TEXT_SUCCESS = (byte) 0xA9; public static byte OCR_TEXT_FAILED = (byte) 0xB9; public static byte OCR_TEXT_LENGTH = (byte) 0xC9; public static byte OCR_TEXT_DATA = (byte) 0xD9; public static byte OCR_TEXT_FINISH = (byte) 0xE9; + //全自动模式 public static final byte RECEIVE_FULL_AUTO = (byte) 0xA0; + //摄像头预设位置 public static final byte RECEIVE_CAMERA_POS = (byte) 0xA1; public static final byte RECEIVE_CAMERA_POS1 = 0x01; public static final byte RECEIVE_CAMERA_POS2 = 0x02; public static final byte RECEIVE_CAMERA_POS3 = 0x03; public static final byte RECEIVE_CAMERA_POS4 = 0x04; + //全自动模式使用的接收指令 public static final byte RECEIVE_QR = (byte) 0xA2; public static final byte RECEIVE_TRAFFIC_LIGHT = (byte) 0xA3; public static final byte RECEIVE_CAR_ID = (byte) 0xA4; public static final byte RECEIVE_SHAPE_COLOR = (byte) 0xA5; public static final byte RECEIVE_TRAFFIC_SIGN = (byte) 0xA6; public static final byte RECEIVE_TEXT_OCR = (byte) 0xA7; + public static final byte RECEIVE_OCR_DATA_OK = (byte) 0xB7; } diff --git a/app/src/main/java/com/uns/maincar/constants/Flags.java b/app/src/main/java/com/uns/maincar/constants/Flags.java index fa4b9de..8101f64 100644 --- a/app/src/main/java/com/uns/maincar/constants/Flags.java +++ b/app/src/main/java/com/uns/maincar/constants/Flags.java @@ -5,6 +5,7 @@ package com.uns.maincar.constants; * Modified by UnknownObject at 2022-09-18 */ +//一些其他的常量值 public class Flags { diff --git a/app/src/main/java/com/uns/maincar/constants/GlobalColor.java b/app/src/main/java/com/uns/maincar/constants/GlobalColor.java index 2abe610..e267dff 100644 --- a/app/src/main/java/com/uns/maincar/constants/GlobalColor.java +++ b/app/src/main/java/com/uns/maincar/constants/GlobalColor.java @@ -5,6 +5,7 @@ package com.uns.maincar.constants; +//颜色的枚举类型 public enum GlobalColor { RED, diff --git a/app/src/main/java/com/uns/maincar/constants/GlobalShape.java b/app/src/main/java/com/uns/maincar/constants/GlobalShape.java index 5961ce6..b7732c4 100644 --- a/app/src/main/java/com/uns/maincar/constants/GlobalShape.java +++ b/app/src/main/java/com/uns/maincar/constants/GlobalShape.java @@ -5,6 +5,7 @@ package com.uns.maincar.constants; +//形状的枚举类型 public enum GlobalShape { STAR, diff --git a/app/src/main/java/com/uns/maincar/constants/GlobalSignType.java b/app/src/main/java/com/uns/maincar/constants/GlobalSignType.java index 6bd6a82..95538f1 100644 --- a/app/src/main/java/com/uns/maincar/constants/GlobalSignType.java +++ b/app/src/main/java/com/uns/maincar/constants/GlobalSignType.java @@ -5,6 +5,7 @@ package com.uns.maincar.constants; +//交通标志的枚举类型 public enum GlobalSignType { NoEntry, diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/CarLicense.java b/app/src/main/java/com/uns/maincar/cpp_interface/CarLicense.java index 07c923e..8e2d116 100644 --- a/app/src/main/java/com/uns/maincar/cpp_interface/CarLicense.java +++ b/app/src/main/java/com/uns/maincar/cpp_interface/CarLicense.java @@ -5,26 +5,41 @@ package com.uns.maincar.cpp_interface; +import android.content.Context; import android.graphics.Bitmap; import android.os.Environment; +import com.uns.maincar.cpp_interface.hyperlpr.DeepAssetUtil; +import com.uns.maincar.cpp_interface.hyperlpr.PlateRecognition; +import com.uns.maincar.tools.TextFilter; + import java.io.File; +//车牌识别类,提供三种不同的识别方式 public class CarLicense { static { System.loadLibrary("car_license_reco"); + System.loadLibrary("car_license_reco_ocr"); } + private static long DAU_Resource_Address = 0; + public static class Result { + boolean empty; boolean success; byte[] chars = new byte[6]; public Result(String cpp_result) { - if(cpp_result.length() < 6) + if ((cpp_result == null) || cpp_result.equals("")) + { + empty = true; + success = false; + } + else if (cpp_result.length() < 6) { chars[0] = 0; chars[1] = 0; @@ -32,6 +47,7 @@ public class CarLicense chars[3] = 0; chars[4] = 0; chars[5] = 0; + empty = false; success = false; } else if(cpp_result.length() == 6) @@ -42,6 +58,7 @@ public class CarLicense chars[3] = (byte) cpp_result.charAt(3); chars[4] = (byte) cpp_result.charAt(4); chars[5] = (byte) cpp_result.charAt(5); + empty = false; success = true; } else @@ -53,6 +70,7 @@ public class CarLicense chars[3] = (byte) sub_str.charAt(3); chars[4] = (byte) sub_str.charAt(4); chars[5] = (byte) sub_str.charAt(5); + empty = false; success = true; } } @@ -62,6 +80,11 @@ public class CarLicense return success; } + public boolean isEmpty() + { + return empty; + } + public byte[] GetFirstThreeBits() { return new byte[]{chars[0], chars[1], chars[2]}; @@ -75,9 +98,37 @@ public class CarLicense private static native String RecognizeLicense(Bitmap image, String external_path); + private static native Bitmap RecognizeLicenseOCR(Bitmap image); + + //使用模板匹配识别车牌 public static Result Recognize(Bitmap image) { String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "MainCar" + File.separator + "Standard_Car_License_Image" + File.separator; return new Result(RecognizeLicense(image, path)); } + + //使用OCR识别车牌 + public static Result RecognizeByOCR(Bitmap image) + { + Bitmap bmp = RecognizeLicenseOCR(image); + String str_result; + if (bmp == null) + str_result = ""; + else + { + TextFilter filter = new TextFilter(); + str_result = filter.LetterAndNumber(OCR.SimpleOCR(bmp)); + } + return new Result(str_result); + } + + //使用HyperLPR库识别车牌 + public static Result RecognizeByAI(Bitmap image, Context context) + { + if (DAU_Resource_Address == 0) + DAU_Resource_Address = DeepAssetUtil.initRecognizer(context); + String result = PlateRecognition.EasyRecognization(image, DAU_Resource_Address); + TextFilter filter = new TextFilter(); + return new Result(filter.LetterAndNumber(result)); + } } diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/EnvTest.java b/app/src/main/java/com/uns/maincar/cpp_interface/EnvTest.java index b5efdb8..88bc2f9 100644 --- a/app/src/main/java/com/uns/maincar/cpp_interface/EnvTest.java +++ b/app/src/main/java/com/uns/maincar/cpp_interface/EnvTest.java @@ -5,6 +5,7 @@ package com.uns.maincar.cpp_interface; +//原生库环境检测类 public class EnvTest { static @@ -19,15 +20,25 @@ public class EnvTest } private static native String NDKTest(); + private static native String OpenCVTest(); + private static native String TrafficLightTest(); + private static native String ColorRecoTest(); + private static native String ShapeRecoTest(); + private static native String ImageProcessorTest(); + private static native String ShapeColorRecoTest(); + private static native String CarLicenseTest(); + private static native String TrafficSignTest(); + private static native String MainCarAESTest(); + private static native String OCRTextTest(); public static String TestNDK() diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/MainCarAES.java b/app/src/main/java/com/uns/maincar/cpp_interface/MainCarAES.java index 9d1dd5f..51e9298 100644 --- a/app/src/main/java/com/uns/maincar/cpp_interface/MainCarAES.java +++ b/app/src/main/java/com/uns/maincar/cpp_interface/MainCarAES.java @@ -7,6 +7,7 @@ package com.uns.maincar.cpp_interface; import org.jetbrains.annotations.NotNull; +//数据处理算法类,算法实现在原生库中。 public class MainCarAES { static diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/OCR.java b/app/src/main/java/com/uns/maincar/cpp_interface/OCR.java index 3ef606a..9bb29c4 100644 --- a/app/src/main/java/com/uns/maincar/cpp_interface/OCR.java +++ b/app/src/main/java/com/uns/maincar/cpp_interface/OCR.java @@ -15,6 +15,7 @@ import com.uns.maincar.R; import java.io.File; +//静态文本识别 public class OCR { static @@ -22,19 +23,39 @@ public class OCR System.loadLibrary("ocr_text"); } - private static native Bitmap ProcessImage(Bitmap image); + private static native Bitmap ProcessImage(Bitmap image, boolean self_test); + //自检 public static String SelfTest(Context context) { - return DecodeImage(BitmapFactory.decodeResource(context.getResources(), R.drawable.ocr_self_test)); + TessBaseAPI tessBaseApi = new TessBaseAPI(); + String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "MainCar" + File.separator + "OCR" + File.separator; + tessBaseApi.init(path, "chi_sim"); + tessBaseApi.setImage(ProcessImage(BitmapFactory.decodeResource(context.getResources(), R.drawable.ocr_self_test), true)); + String extractedText = tessBaseApi.getUTF8Text(); + tessBaseApi.end(); + return extractedText; } + //静态标志物OCR识别 public static String DecodeImage(Bitmap bitmap) { TessBaseAPI tessBaseApi = new TessBaseAPI(); String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "MainCar" + File.separator + "OCR" + File.separator; tessBaseApi.init(path, "chi_sim"); - tessBaseApi.setImage(ProcessImage(bitmap)); + tessBaseApi.setImage(ProcessImage(bitmap, false)); + String extractedText = tessBaseApi.getUTF8Text(); + tessBaseApi.end(); + return extractedText; + } + + //用于车牌OCR的接口 + public static String SimpleOCR(Bitmap bitmap) + { + TessBaseAPI tessBaseApi = new TessBaseAPI(); + String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "MainCar" + File.separator + "OCR" + File.separator; + tessBaseApi.init(path, "chi_sim"); + tessBaseApi.setImage(bitmap); String extractedText = tessBaseApi.getUTF8Text(); tessBaseApi.end(); return extractedText; diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/QRDecoder.java b/app/src/main/java/com/uns/maincar/cpp_interface/QRDecoder.java index 7528378..733ba17 100644 --- a/app/src/main/java/com/uns/maincar/cpp_interface/QRDecoder.java +++ b/app/src/main/java/com/uns/maincar/cpp_interface/QRDecoder.java @@ -10,7 +10,7 @@ import android.graphics.Rect; import com.zxingcpp.BarcodeReader; - +//二维码识别 public class QRDecoder { static diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/ShapeColor.java b/app/src/main/java/com/uns/maincar/cpp_interface/ShapeColor.java index b4d65c4..4dadf93 100644 --- a/app/src/main/java/com/uns/maincar/cpp_interface/ShapeColor.java +++ b/app/src/main/java/com/uns/maincar/cpp_interface/ShapeColor.java @@ -10,6 +10,7 @@ import android.graphics.Bitmap; import com.uns.maincar.constants.GlobalColor; import com.uns.maincar.constants.GlobalShape; +//形状颜色识别 public class ShapeColor { static @@ -18,6 +19,7 @@ public class ShapeColor } private static native boolean RecoEverything(Bitmap image, double rate); + private static native int LookupRecoResult(int shape, String color); private static int TranslateShape(GlobalShape shape) diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/TrafficLight.java b/app/src/main/java/com/uns/maincar/cpp_interface/TrafficLight.java index e70603f..d6ae43c 100644 --- a/app/src/main/java/com/uns/maincar/cpp_interface/TrafficLight.java +++ b/app/src/main/java/com/uns/maincar/cpp_interface/TrafficLight.java @@ -9,6 +9,7 @@ import android.graphics.Bitmap; import com.uns.maincar.constants.Flags.TrafficLightColors; +//交通灯识别 public class TrafficLight { static diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/TrafficSign.java b/app/src/main/java/com/uns/maincar/cpp_interface/TrafficSign.java index bc996f7..1066230 100644 --- a/app/src/main/java/com/uns/maincar/cpp_interface/TrafficSign.java +++ b/app/src/main/java/com/uns/maincar/cpp_interface/TrafficSign.java @@ -13,6 +13,7 @@ import com.uns.maincar.constants.GlobalSignType; import java.io.File; +//交通标志识别 public class TrafficSign { static diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/hyperlpr/DeepAssetUtil.java b/app/src/main/java/com/uns/maincar/cpp_interface/hyperlpr/DeepAssetUtil.java new file mode 100644 index 0000000..bfa1d83 --- /dev/null +++ b/app/src/main/java/com/uns/maincar/cpp_interface/hyperlpr/DeepAssetUtil.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2022. UnknownNetworkService Group + * This file is created by UnknownObject at 2022 - 11 - 13 + */ + +package com.uns.maincar.cpp_interface.hyperlpr; + +import android.content.Context; +import android.os.Environment; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +//HyperLPR——识别资源类——第三方开源库请勿改动 +public class DeepAssetUtil +{ + + + public static final String ApplicationDir = "lpr"; + public static final String CASCADE_FILENAME = "cascade.xml"; + public static final String FINEMAPPING_PROTOTXT = "HorizonalFinemapping.prototxt"; + public static final String FINEMAPPING_CAFFEMODEL = "HorizonalFinemapping.caffemodel"; + public static final String SEGMENTATION_PROTOTXT = "Segmentation.prototxt"; + public static final String SEGMENTATION_CAFFEMODEL = "Segmentation.caffemodel"; + public static final String RECOGNIZATION_PROTOTXT = "CharacterRecognization.prototxt"; + public static final String RECOGNIZATION_CAFFEMODEL = "CharacterRecognization.caffemodel"; + public static final String FREE_INCEPTION_PROTOTXT = "SegmenationFree-Inception.prototxt"; + public static final String FREE_INCEPTION_CAFFEMODEL = "SegmenationFree-Inception.caffemodel"; + + public static final String SDCARD_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + ApplicationDir; //解压文件存放位置 + + + private static void CopyAssets(Context context, String assetDir, String dir) + { + String[] files; + try + { + // 获得Assets一共有几多文件 + files = context.getAssets().list(assetDir); + } + catch (IOException e1) + { + return; + } + File mWorkingPath = new File(dir); + // 如果文件路径不存在 + if (!mWorkingPath.exists()) + { + // 创建文件夹 + if (!mWorkingPath.mkdirs()) + { + // 文件夹创建不成功时调用 + } + } + + for (String file : files) + { + try + { + // 根据路径判断是文件夹还是文件 + if (!file.contains(".")) + { + if (0 == assetDir.length()) + { + CopyAssets(context, file, dir + file + "/"); + } + else + { + CopyAssets(context, assetDir + "/" + file, dir + "/" + file + "/"); + } + continue; + } + File outFile = new File(mWorkingPath, file); + if (outFile.exists()) + continue; + InputStream in; + if (0 != assetDir.length()) + { + in = context.getAssets().open(assetDir + "/" + file); + } + else + { + in = context.getAssets().open(file); + } + + OutputStream out = new FileOutputStream(outFile); + // Transfer bytes from in to out + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) + { + out.write(buf, 0, len); + } + + in.close(); + out.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + } + + private static void copyFilesFromAssets(Context context) + { + DeepAssetUtil.CopyAssets(context, ApplicationDir, SDCARD_DIR); + } + + //初始化识别资源 + public static long initRecognizer(Context context) + { + String cascade_filename = SDCARD_DIR + File.separator + CASCADE_FILENAME; + String finemapping_prototxt = SDCARD_DIR + File.separator + FINEMAPPING_PROTOTXT; + String finemapping_caffemodel = SDCARD_DIR + File.separator + FINEMAPPING_CAFFEMODEL; + String segmentation_prototxt = SDCARD_DIR + File.separator + SEGMENTATION_PROTOTXT; + String segmentation_caffemodel = SDCARD_DIR + File.separator + SEGMENTATION_CAFFEMODEL; + String character_prototxt = SDCARD_DIR + File.separator + RECOGNIZATION_PROTOTXT; + String character_caffemodel = SDCARD_DIR + File.separator + RECOGNIZATION_CAFFEMODEL; + String segmentation_free_prototxt = SDCARD_DIR + File.separator + FREE_INCEPTION_PROTOTXT; + String segmentation_free_caffemodel = SDCARD_DIR + File.separator + FREE_INCEPTION_CAFFEMODEL; + copyFilesFromAssets(context); + //调用JNI 加载资源函数 + return PlateRecognition.InitPlateRecognizer( + cascade_filename, + finemapping_prototxt, finemapping_caffemodel, + segmentation_prototxt, segmentation_caffemodel, + character_prototxt, character_caffemodel, + segmentation_free_prototxt, segmentation_free_caffemodel); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/uns/maincar/cpp_interface/hyperlpr/PlateRecognition.java b/app/src/main/java/com/uns/maincar/cpp_interface/hyperlpr/PlateRecognition.java new file mode 100644 index 0000000..d8a544a --- /dev/null +++ b/app/src/main/java/com/uns/maincar/cpp_interface/hyperlpr/PlateRecognition.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022. UnknownNetworkService Group + * This file is created by UnknownObject at 2022 - 11 - 13 + */ + +package com.uns.maincar.cpp_interface.hyperlpr; + +import android.graphics.Bitmap; + +//HyperLPR——原生库(C++)文件封装 +public class PlateRecognition +{ + static + { + System.loadLibrary("lib_hyper_lpr"); + } + + static native long InitPlateRecognizer(String casacde_detection, + String finemapping_prototxt, String finemapping_caffemodel, + String segmentation_prototxt, String segmentation_caffemodel, + String charRecognization_proto, String charRecognization_caffemodel, + String segmentation_free_prototxt, String segmentation_free_caffemodel); + + static native void ReleasePlateRecognizer(long object); + + public static native String SimpleRecognization(long inputMat, long object); + + public static native String EasyRecognization(Bitmap image, long object); +} diff --git a/app/src/main/java/com/uns/maincar/gui/MainActivity.java b/app/src/main/java/com/uns/maincar/gui/MainActivity.java index 26d2b8e..f76b1a7 100644 --- a/app/src/main/java/com/uns/maincar/gui/MainActivity.java +++ b/app/src/main/java/com/uns/maincar/gui/MainActivity.java @@ -48,6 +48,7 @@ import com.uns.maincar.cpp_interface.TrafficLight; import com.uns.maincar.cpp_interface.TrafficSign; import com.uns.maincar.tools.ImageReleaser; import com.uns.maincar.tools.OCRDataReleaser; +import com.uns.maincar.tools.TextFilter; import java.io.UnsupportedEncodingException; import java.util.ArrayList; @@ -106,105 +107,144 @@ public class MainActivity extends AppCompatActivity "0xE0", "0xE1", "0xE2", "0xE3", "0xE4", "0xE5", "0xE6", "0xE7", "0xE8", "0xE9", "0xEA", "0xEB", "0xEC", "0xED", "0xEE", "0xEF", "0xF0", "0xF1", "0xF2", "0xF3", "0xF4", "0xF5", "0xF6", "0xF7", "0xF8", "0xF9", "0xFA", "0xFB", "0xFC", "0xFD", "0xFE", "0xFF"}; + static + { + System.loadLibrary("opencv_support"); + } + + //原生函数导入,用于长按保存的功能 + private static native boolean SaveImage(Bitmap img, String time); + @SuppressLint("HandlerLeak") public MainActivity() { + //接收内部消息的处理器,用于处理内部消息 recvHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); - //处理接收到的图片 + //内部消息:收到图片;执行操作:更新GUI上的图片 if (msg.what == Flags.RECEIVED_IMAGE) pic_received.setImageBitmap(currImage); - //处理接收到的指令 + //内部消息:收到主车数据;执行操作:解析指令并执行 if (msg.what == Flags.RECEIVED_CAR_DATA) { byte[] recv = (byte[]) msg.obj; if (recv != null) { + //打印接收到的指令 ToastLog("RECV: [" + ByteArray2String(recv) + "]", true, false); + //解析指令 CommandDecoder decoder = new CommandDecoder(recv); if (decoder.CommandReady()) { ToastLog("Command Decode Ready.", false, false); - Thread th_run_command = new Thread(() -> { + Thread th_run_command = new Thread(() -> + { switch (decoder.GetMainCommand()) { + //收到全自动指令,返回程序自检状态 case Commands.RECEIVE_FULL_AUTO: dtc_client.Send(SystemStatusCommand()); break; + //收到QR指令,开始识别二维码,回传识别成功的数据 case Commands.RECEIVE_QR: byte[] cmd = RecognizeQrCode(); - CommandEncoder encoder = new CommandEncoder(); - dtc_client.Send(encoder.GenerateCommand(Commands.QR_SUCCESS_1, cmd[0], cmd[1], cmd[2])); - Sleep(500); - dtc_client.Send(encoder.GenerateCommand(Commands.QR_SUCCESS_2, cmd[3], cmd[4], cmd[5])); + if (cmd[2] == Commands.QR_FAILED) + dtc_client.Send(cmd); + else + { + CommandEncoder encoder = new CommandEncoder(); + dtc_client.Send(encoder.GenerateCommand(Commands.QR_SUCCESS_1, cmd[0], cmd[1], cmd[2])); + Sleep(500); + dtc_client.Send(encoder.GenerateCommand(Commands.QR_SUCCESS_2, cmd[3], cmd[4], cmd[5])); + } break; + //收到TRAFFIC_LIGHT指令,开始识别交通灯,回传识别成功的数据 case Commands.RECEIVE_TRAFFIC_LIGHT: dtc_client.Send(RecognizeTrafficLight()); break; + //收到SHAPE_COLOR指令,开始识别形状颜色,回传识别成功的数据 case Commands.RECEIVE_SHAPE_COLOR: dtc_client.Send(RecognizeShapeColor()); break; + //收到CAR_ID指令,开始识别车牌号,回传识别成功的数据 case Commands.RECEIVE_CAR_ID: RecognizeCarID(); break; + //收到TRAFFIC_SIGN指令,开始识别交通标志,回传识别成功的数据 case Commands.RECEIVE_TRAFFIC_SIGN: dtc_client.Send(RecognizeTrafficSign()); break; + //收到OCR指令,开始识别文本,回传识别成功的数据 case Commands.RECEIVE_TEXT_OCR: OCRRecognizeText(); break; + //收到未知指令,回传异常指令,表示无法解析当前指令 + default: + CommandEncoder error = new CommandEncoder(); + dtc_client.Send(error.GenerateCommand(Commands.CMD_NOT_MATCH, (byte) 0x00, (byte) 0x00, (byte) 0x00)); + break; } }); th_run_command.start(); } + //指令解析失败,回传异常指令,表示无法解析当前指令 + else + { + CommandEncoder error = new CommandEncoder(); + dtc_client.ThreadSend(error.GenerateCommand(Commands.CMD_NOT_MATCH, (byte) 0x00, (byte) 0x00, (byte) 0x00)); + } } + //收到NULL,输出日志,不做操作 else ToastLog("NULL Received", true, false); } - //接收到打印数组的指令,打印数组 + //内部消息:打印数组;操作:打印收到的数组 if (msg.what == Flags.PRINT_DATA_ARRAY) { byte[] data = (byte[]) msg.obj; if (data != null) ToastLog("SEND: [" + ByteArray2String(data) + "]", false, false); } - //接收到打印日志的指令,打印日志 - if(msg.what == Flags.PRINT_SYSTEM_LOG) + //内部消息:打印日志;操作:打印收到的日志 + if (msg.what == Flags.PRINT_SYSTEM_LOG) { - String str = (String)msg.obj; - if(str != null) + String str = (String) msg.obj; + if (str != null) ToastLog(str, false, false); } } }; } + //处理二维码数据,使用从C++代码中导出的算法 private byte[] ProcessQRData(ArrayList qr_data) { return MainCarAES.CalcAES(qr_data.get(0)); } + //获取程序自检指令,根据自检状态返回成功或失败 private byte[] SystemStatusCommand() { CommandEncoder encoder = new CommandEncoder(); - if(SystemStatus && FileStatus) + if (SystemStatus && FileStatus) return encoder.GenerateCommand(Commands.STATUS_SUCCESS, (byte) 0, (byte) 0, (byte) 0); else return encoder.GenerateCommand(Commands.STATUS_FAILED, (byte) 0, (byte) 0, (byte) 0); } + //识别二维码 private byte[] RecognizeQrCode() { CommandEncoder encoder = new CommandEncoder(); ArrayList qr_result = new ArrayList<>(); - if(!QRDecoder.BeginQRDecode(currImage)) + if (!QRDecoder.BeginQRDecode(currImage)) return encoder.GenerateCommand(Commands.QR_FAILED, (byte) 0, (byte) 0, (byte) 0); - while(QRDecoder.HasNextCode()) + while (QRDecoder.HasNextCode()) qr_result.add(QRDecoder.DecodeNextQR()); if (qr_result.size() <= 0) return encoder.GenerateCommand(Commands.QR_FAILED, (byte) 0, (byte) 0, (byte) 0); @@ -215,6 +255,7 @@ public class MainActivity extends AppCompatActivity } } + //识别交通灯 private byte[] RecognizeTrafficLight() { TrafficLightColors color = TrafficLight.RecognizeTrafficLight(currImage); @@ -233,6 +274,7 @@ public class MainActivity extends AppCompatActivity return encoder.GenerateCommand(Commands.TRAFFIC_LIGHT_FAILED, (byte) -1, (byte) -1, (byte) -1); } + //识别形状颜色 private byte[] RecognizeShapeColor() { CommandEncoder encoder = new CommandEncoder(); @@ -241,19 +283,87 @@ public class MainActivity extends AppCompatActivity else { byte a = 0, b = 0, c = 0; - //Add Value to Lookup + //测试用输出 + /*ToastLog("C-R-"+ShapeColor.LookupResult(GlobalShape.CIRCLE, GlobalColor.RED), false, false); + ToastLog("C-BL-"+ShapeColor.LookupResult(GlobalShape.CIRCLE, GlobalColor.BLACK), false, false); + ToastLog("C-G-"+ShapeColor.LookupResult(GlobalShape.CIRCLE, GlobalColor.GREEN), false, false); + ToastLog("C-BU-"+ShapeColor.LookupResult(GlobalShape.CIRCLE, GlobalColor.BLUE), false, false); + ToastLog("C-C-"+ShapeColor.LookupResult(GlobalShape.CIRCLE, GlobalColor.CYAN), false, false); + ToastLog("C-P-"+ShapeColor.LookupResult(GlobalShape.CIRCLE, GlobalColor.PURPLE), false, false); + ToastLog("C-W-"+ShapeColor.LookupResult(GlobalShape.CIRCLE, GlobalColor.WHITE), false, false); + ToastLog("C-Y-"+ShapeColor.LookupResult(GlobalShape.CIRCLE, GlobalColor.YELLOW), false, false); + ToastLog("S-R-"+ShapeColor.LookupResult(GlobalShape.STAR, GlobalColor.RED), false, false); + ToastLog("S-BL-"+ShapeColor.LookupResult(GlobalShape.STAR, GlobalColor.BLACK), false, false); + ToastLog("S-G-"+ShapeColor.LookupResult(GlobalShape.STAR, GlobalColor.GREEN), false, false); + ToastLog("S-BU-"+ShapeColor.LookupResult(GlobalShape.STAR, GlobalColor.BLUE), false, false); + ToastLog("S-C-"+ShapeColor.LookupResult(GlobalShape.STAR, GlobalColor.CYAN), false, false); + ToastLog("S-P-"+ShapeColor.LookupResult(GlobalShape.STAR, GlobalColor.PURPLE), false, false); + ToastLog("S-W-"+ShapeColor.LookupResult(GlobalShape.STAR, GlobalColor.WHITE), false, false); + ToastLog("S-Y-"+ShapeColor.LookupResult(GlobalShape.STAR, GlobalColor.YELLOW), false, false); + ToastLog("s-R-"+ShapeColor.LookupResult(GlobalShape.SQUARE, GlobalColor.RED), false, false); + ToastLog("s-BL-"+ShapeColor.LookupResult(GlobalShape.SQUARE, GlobalColor.BLACK), false, false); + ToastLog("s-G-"+ShapeColor.LookupResult(GlobalShape.SQUARE, GlobalColor.GREEN), false, false); + ToastLog("s-BU-"+ShapeColor.LookupResult(GlobalShape.SQUARE, GlobalColor.BLUE), false, false); + ToastLog("s-C-"+ShapeColor.LookupResult(GlobalShape.SQUARE, GlobalColor.CYAN), false, false); + ToastLog("s-P-"+ShapeColor.LookupResult(GlobalShape.SQUARE, GlobalColor.PURPLE), false, false); + ToastLog("s-W-"+ShapeColor.LookupResult(GlobalShape.SQUARE, GlobalColor.WHITE), false, false); + ToastLog("s-Y-"+ShapeColor.LookupResult(GlobalShape.SQUARE, GlobalColor.YELLOW), false, false); + ToastLog("R-R-"+ShapeColor.LookupResult(GlobalShape.RECTANGLE, GlobalColor.RED), false, false); + ToastLog("R-BL-"+ShapeColor.LookupResult(GlobalShape.RECTANGLE, GlobalColor.BLACK), false, false); + ToastLog("R-G-"+ShapeColor.LookupResult(GlobalShape.RECTANGLE, GlobalColor.GREEN), false, false); + ToastLog("R-BU-"+ShapeColor.LookupResult(GlobalShape.RECTANGLE, GlobalColor.BLUE), false, false); + ToastLog("R-C-"+ShapeColor.LookupResult(GlobalShape.RECTANGLE, GlobalColor.CYAN), false, false); + ToastLog("R-P-"+ShapeColor.LookupResult(GlobalShape.RECTANGLE, GlobalColor.PURPLE), false, false); + ToastLog("R-W-"+ShapeColor.LookupResult(GlobalShape.RECTANGLE, GlobalColor.WHITE), false, false); + ToastLog("R-Y-"+ShapeColor.LookupResult(GlobalShape.RECTANGLE, GlobalColor.YELLOW), false, false); + ToastLog("T-R-"+ShapeColor.LookupResult(GlobalShape.TRIANGLE, GlobalColor.RED), false, false); + ToastLog("T-BL-"+ShapeColor.LookupResult(GlobalShape.TRIANGLE, GlobalColor.BLACK), false, false); + ToastLog("T-G-"+ShapeColor.LookupResult(GlobalShape.TRIANGLE, GlobalColor.GREEN), false, false); + ToastLog("T-BU-"+ShapeColor.LookupResult(GlobalShape.TRIANGLE, GlobalColor.BLUE), false, false); + ToastLog("T-C-"+ShapeColor.LookupResult(GlobalShape.TRIANGLE, GlobalColor.CYAN), false, false); + ToastLog("T-P-"+ShapeColor.LookupResult(GlobalShape.TRIANGLE, GlobalColor.PURPLE), false, false); + ToastLog("T-W-"+ShapeColor.LookupResult(GlobalShape.TRIANGLE, GlobalColor.WHITE), false, false); + ToastLog("T-Y-"+ShapeColor.LookupResult(GlobalShape.TRIANGLE, GlobalColor.YELLOW), false, false);*/ return encoder.GenerateCommand(Commands.COLOR_SHAPE_SUCCESS, a, b, c); } } + //识别车牌 private void RecognizeCarID() { CommandEncoder encoder = new CommandEncoder(); - CarLicense.Result result = CarLicense.Recognize(currImage); - if(!result.Success()) +// CarLicense.Result result = CarLicense.Recognize(currImage); //通过模板匹配识别车牌 +// CarLicense.Result result = CarLicense.RecognizeByOCR(currImage); //通过OCR识别车牌 + CarLicense.Result result = CarLicense.RecognizeByAI(currImage, this); //通过AI模型识别车牌 + if (!result.Success()) + { + //OCR识别的自动重试功能 + /*final int OCR_MAX_RETRY = 5; + int retry_time = 0; + do + { + result = CarLicense.RecognizeByOCR(currImage); + Sleep(100); + retry_time++; + }while (result.isEmpty() && (retry_time <= OCR_MAX_RETRY)); + if(retry_time > OCR_MAX_RETRY) + dtc_client.Send(encoder.GenerateCommand(Commands.CAR_ID_FAILED, (byte) 0, (byte) 0, (byte) 0)); + else + { + encoder.AddMainCommand(Commands.CAR_ID_SUCCESS_FIRST); + encoder.AddData(result.GetFirstThreeBits()); + dtc_client.Send(encoder.GenerateCommand()); + Sleep(500); + encoder.Clear(); + encoder.AddMainCommand(Commands.CAR_ID_SUCCESS_SECOND); + encoder.AddData(result.GetLastThreeBits()); + dtc_client.Send(encoder.GenerateCommand()); + }*/ dtc_client.Send(encoder.GenerateCommand(Commands.CAR_ID_FAILED, (byte) 0, (byte) 0, (byte) 0)); + } else { + //车牌信息分两次发送 encoder.AddMainCommand(Commands.CAR_ID_SUCCESS_FIRST); encoder.AddData(result.GetFirstThreeBits()); dtc_client.Send(encoder.GenerateCommand()); @@ -265,11 +375,12 @@ public class MainActivity extends AppCompatActivity } } + //识别交通标志 private byte[] RecognizeTrafficSign() { CommandEncoder encoder = new CommandEncoder(); GlobalSignType type = TrafficSign.SignRecognize(currImage); - if(type == GlobalSignType.Failure) + if (type == GlobalSignType.Failure) return encoder.GenerateCommand(Commands.TRAFFIC_SIGN_FAILED, (byte) 0, (byte) 0, (byte) 0); else { @@ -299,10 +410,12 @@ public class MainActivity extends AppCompatActivity } } + //识别静态文本 private void OCRRecognizeText() { -// String str = OCR.DecodeImage(currImage); - String str = OCR.SelfTest(this); + TextFilter filter = new TextFilter(); + String str = filter.RemoveEmptyCharacter(OCR.DecodeImage(currImage)); + ToastLog("OCR Result: [" + str + "]", false, true); byte[] b_str; try { @@ -317,18 +430,23 @@ public class MainActivity extends AppCompatActivity } CommandEncoder encoder = new CommandEncoder(); dtc_client.Send(encoder.GenerateCommand(Commands.OCR_TEXT_SUCCESS, (byte) 0x00, (byte) 0x00, (byte) 0x00)); - Sleep(500); + Sleep(900); dtc_client.Send(encoder.GenerateCommand(Commands.OCR_TEXT_LENGTH, (byte) b_str.length, (byte) 0x00, (byte) b_str.length)); for (int i = 0; i < b_str.length; i += 2) { Sleep(500); byte data_2 = ((i + 1) >= b_str.length ? 0x00 : b_str[i + 1]); byte checksum = (byte) ((b_str[i] + data_2) % 0xFF); - byte main = ((i + 1) < b_str.length ? Commands.OCR_TEXT_DATA : Commands.OCR_TEXT_FINISH); - dtc_client.Send(encoder.GenerateCommand(main, b_str[i], data_2, checksum)); + byte main = ((i + 2) < b_str.length ? Commands.OCR_TEXT_DATA : Commands.OCR_TEXT_FINISH); + if (!dtc_client.SendEx(encoder.GenerateCommand(main, b_str[i], data_2, checksum), Commands.RECEIVE_OCR_DATA_OK, 2000)) + { + dtc_client.Send(encoder.GenerateCommand(Commands.OCR_TEXT_FAILED, (byte) 0x00, (byte) 0x00, (byte) 0x00)); + break; + } } } + //数组转字符串,仅用于调试输出 private String ByteArray2String(byte[] arr) { StringBuilder msg_str = new StringBuilder(); @@ -337,6 +455,7 @@ public class MainActivity extends AppCompatActivity return msg_str.toString(); } + //初始化图形界面 private void InitGUI() { pic_received = findViewById(R.id.camera_image); @@ -376,7 +495,7 @@ public class MainActivity extends AppCompatActivity findViewById(R.id.btn_send).setOnClickListener(view -> { - Thread th_send = new Thread(() -> + try { byte cmd0 = (byte) Integer.parseInt(((EditText) findViewById(R.id.edit_cmd0)).getText().toString(), 16); byte cmd1 = (byte) Integer.parseInt(((EditText) findViewById(R.id.edit_cmd1)).getText().toString(), 16); @@ -384,64 +503,95 @@ public class MainActivity extends AppCompatActivity byte cmd3 = (byte) Integer.parseInt(((EditText) findViewById(R.id.edit_cmd3)).getText().toString(), 16); CommandEncoder encoder = new CommandEncoder(); byte[] cmd = encoder.GenerateCommand(cmd0, cmd1, cmd2, cmd3); - dtc_client.Send(cmd); + dtc_client.ThreadSend(cmd); //print debug information Message.obtain(recvHandler, Flags.PRINT_DATA_ARRAY, cmd).sendToTarget(); - }); - th_send.start(); + } + catch (Exception e) + { + ToastLog("Input Data Invalidate", true, false); + } }); - findViewById(R.id.btn_start_qr).setOnClickListener(view -> { + findViewById(R.id.btn_start_qr).setOnClickListener(view -> + { ToastLog("QR Code Started", false, false); ToastLog("QR Result: " + ByteArray2String(RecognizeQrCode()), false, false); }); - findViewById(R.id.btn_start_light).setOnClickListener(view -> { + findViewById(R.id.btn_start_light).setOnClickListener(view -> + { ToastLog("Traffic Light Started", false, false); ToastLog("TL Result: " + ByteArray2String(RecognizeTrafficLight()), false, false); }); - findViewById(R.id.btn_start_color_shape).setOnClickListener(view -> { + findViewById(R.id.btn_start_color_shape).setOnClickListener(view -> + { ToastLog("Color Shape Started", false, false); ToastLog("CS Result: " + ByteArray2String(RecognizeShapeColor()), false, false); }); - findViewById(R.id.btn_start_car_id).setOnClickListener(view -> { + findViewById(R.id.btn_start_car_id).setOnClickListener(view -> + { ToastLog("Car ID Started", false, false); Thread th_debug = new Thread(this::RecognizeCarID); th_debug.start(); ToastLog("CID Finished", false, false); }); - findViewById(R.id.btn_start_sign).setOnClickListener(view -> { + findViewById(R.id.btn_start_sign).setOnClickListener(view -> + { ToastLog("Traffic Sign Started", false, false); ToastLog("TS Result: " + ByteArray2String(RecognizeTrafficSign()), false, false); }); - findViewById(R.id.btn_start_ocr).setOnClickListener(view -> { + findViewById(R.id.btn_start_ocr).setOnClickListener(view -> + { ToastLog("OCR Started", false, false); /*ToastLog("OCR Result: " + OCR.DecodeImage(currImage), false, false);*/ Thread th_debug = new Thread(this::OCRRecognizeText); th_debug.start(); }); - findViewById(R.id.btn_tft_page_down).setOnClickListener(view -> { + findViewById(R.id.btn_tft_page_down).setOnClickListener(view -> + { CommandEncoder encoder = new CommandEncoder(); dtc_client.ThreadSend(encoder.GenerateCommand(Commands.TFT_PAGE_DOWN, (byte) 0, (byte) 0, (byte) 0)); ToastLog("TFT Page Down Command Send.", false, true); }); - findViewById(R.id.btn_movement_control).setOnClickListener(view -> { + findViewById(R.id.btn_movement_control).setOnClickListener(view -> + { startActivity(new Intent(this, MovementController.class)); }); - findViewById(R.id.btn_crash).setOnClickListener(view -> { + findViewById(R.id.btn_crash).setOnClickListener(view -> + { //崩溃按钮的作用:频繁调试时省去手动退出程序,清理后台的操作,节省时间。 - dtc_client.CloseConnection(); //关闭通信 - throw new NullPointerException(); //通过异常来崩溃。 + dtc_client.DisableAutoReconnect(); + dtc_client.CloseConnection(); //关闭通信 + throw new NullPointerException(); //通过异常来崩溃。 + }); + + findViewById(R.id.text_toast).setOnLongClickListener(view -> + { + ToastLog("Log Cleared", true, false); + ((TextView) view).setText(""); + return true; + }); + + findViewById(R.id.camera_image).setOnLongClickListener(view -> + { + String time = String.valueOf(System.currentTimeMillis()); + if (SaveImage(currImage, time)) + ToastLog("Image Saved", true, false); + else + ToastLog("Image Save Failure", true, false); + return true; }); } + //打印日志 @SuppressLint("SetTextI18n") private void ToastLog(String text, boolean real_toast, boolean on_thread) { @@ -450,12 +600,13 @@ public class MainActivity extends AppCompatActivity if (real_toast) Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); Log.i("ToastBackup", text); - if(on_thread) + if (on_thread) Message.obtain(recvHandler, Flags.PRINT_SYSTEM_LOG, text); else text_toast.setText(text_toast.getText().toString() + "\n" + text); } + //等待一段时间 private void Sleep(long ms) { try @@ -467,6 +618,7 @@ public class MainActivity extends AppCompatActivity } } + //启动寻找摄像头的线程 private void StartCameraImageUpdate(int duration) { Thread th_image = new Thread(() -> @@ -508,10 +660,10 @@ public class MainActivity extends AppCompatActivity ToastLog(EnvTest.TestMainCarAES(), false, false); byte[] demo = MainCarAES.CalcAES("ABCDEFGHabcdefgh"); - if(demo == null) - ToastLog("AES Status: Error",false,false); + if (demo == null) + ToastLog("AES Status: Error", false, false); else - ToastLog("AES Status: " + ByteArray2String(demo),false,false); + ToastLog("AES Status: " + ByteArray2String(demo), false, false); //二维码扫描自检 ToastLog(QRDecoder.SelfTest(BitmapFactory.decodeResource(getResources(), R.drawable.qr_decode_test)), false, false); @@ -523,20 +675,21 @@ public class MainActivity extends AppCompatActivity ToastLog("DHCP Server Address: " + IPCar, false, false); //建立连接 - if(CommunicationUsingWifi) - dtc_client = new WifiTransferCore(IPCar,60000, recvHandler); + if (CommunicationUsingWifi) + dtc_client = new WifiTransferCore(IPCar, 60000, recvHandler); else dtc_client = new SerialPortTransferCore(SerialPortPath, 115200, recvHandler); - Thread th_connect = new Thread(() -> { - if(dtc_client.Connect()) + Thread th_connect = new Thread(() -> + { + if (dtc_client.Connect()) ToastLog("Client Connected", false, true); else ToastLog("Client Connect Failed", false, true); }); th_connect.start(); - while(th_connect.isAlive()) + while (th_connect.isAlive()) Sleep(10); //Wait for Connection Thread - dtc_client.EnableAutoReconnect(); //启动自动重连 + dtc_client.EnableAutoReconnect(); //启动自动重连 //初始化摄像头控制 cameraCommandUtil = new CameraCommandUtil(); @@ -577,17 +730,17 @@ public class MainActivity extends AppCompatActivity protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); - if(requestCode == permission_request_code) + if (requestCode == permission_request_code) { - if(resultCode == RESULT_OK) + if (resultCode == RESULT_OK) { ImageReleaser releaser = new ImageReleaser(this); OCRDataReleaser releaser_ocr = new OCRDataReleaser(this); FileStatus = (releaser.ReleaseAllImage() && releaser_ocr.ReleaseAllFiles()); ToastLog(releaser.toString(), false, false); ToastLog(releaser_ocr.toString(), false, false); - if(FileStatus) - ToastLog(OCR.SelfTest(this), false, false); //OCR光学字符识别自检 + if (FileStatus) + ToastLog(OCR.SelfTest(this), false, false); //OCR光学字符识别自检 } else FileStatus = false; @@ -598,6 +751,7 @@ public class MainActivity extends AppCompatActivity protected void onDestroy() { super.onDestroy(); + //Activity销毁时关闭通信 dtc_client.DisableAutoReconnect(); dtc_client.CloseConnection(); } diff --git a/app/src/main/java/com/uns/maincar/gui/MovementController.java b/app/src/main/java/com/uns/maincar/gui/MovementController.java index d73d22d..a85242d 100644 --- a/app/src/main/java/com/uns/maincar/gui/MovementController.java +++ b/app/src/main/java/com/uns/maincar/gui/MovementController.java @@ -24,6 +24,8 @@ import com.uns.maincar.communication.WifiTransferCore; import com.uns.maincar.constants.Commands; import com.uns.maincar.constants.Flags; +//主车和从车的移动控制 +//实现简单,不太稳定,仅供娱乐和调试用途 public class MovementController extends AppCompatActivity { @@ -126,9 +128,10 @@ public class MovementController extends AppCompatActivity findViewById(R.id.rb_main_car).setOnClickListener(view -> cmd_data[1] = Flags.CMD_PACKET_MAIN_CAR); - findViewById(R.id.rb_main_car).setOnClickListener(view -> cmd_data[1] = Flags.CMD_PACKET_SUB_CAR); + findViewById(R.id.rb_sub_car).setOnClickListener(view -> cmd_data[1] = Flags.CMD_PACKET_SUB_CAR); - findViewById(R.id.btn_run_to_line).setOnClickListener(view -> { + findViewById(R.id.btn_front).setOnClickListener(view -> + { cmd_data[2] = Flags.CMD_PACKET_MOVE_FORWARD; cmd_data[3] = (byte) (GetRunSpeed() & 0xFF); cmd_data[4] = (byte) (GetDistance() & 0xFF); diff --git a/app/src/main/java/com/uns/maincar/gui/PermissionGetter.java b/app/src/main/java/com/uns/maincar/gui/PermissionGetter.java index 93c4508..e81f475 100644 --- a/app/src/main/java/com/uns/maincar/gui/PermissionGetter.java +++ b/app/src/main/java/com/uns/maincar/gui/PermissionGetter.java @@ -5,12 +5,6 @@ package com.uns.maincar.gui; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; - import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; @@ -20,8 +14,15 @@ import android.os.Bundle; import android.os.Environment; import android.provider.Settings; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + import com.uns.maincar.R; +//Android的存储权限的获取 public class PermissionGetter extends AppCompatActivity { diff --git a/app/src/main/java/com/uns/maincar/tools/ImageReleaser.java b/app/src/main/java/com/uns/maincar/tools/ImageReleaser.java index 8233ff4..217ea1f 100644 --- a/app/src/main/java/com/uns/maincar/tools/ImageReleaser.java +++ b/app/src/main/java/com/uns/maincar/tools/ImageReleaser.java @@ -18,6 +18,7 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; +//车牌和交通标志的模板图片释放 public class ImageReleaser { private final Context context; diff --git a/app/src/main/java/com/uns/maincar/tools/OCRDataReleaser.java b/app/src/main/java/com/uns/maincar/tools/OCRDataReleaser.java index a4bb0ac..3b5fb0b 100644 --- a/app/src/main/java/com/uns/maincar/tools/OCRDataReleaser.java +++ b/app/src/main/java/com/uns/maincar/tools/OCRDataReleaser.java @@ -18,6 +18,7 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; +//OCR人工智能模型文件的释放 public class OCRDataReleaser { private final Context context; diff --git a/app/src/main/java/com/uns/maincar/tools/TextFilter.java b/app/src/main/java/com/uns/maincar/tools/TextFilter.java new file mode 100644 index 0000000..eb85be7 --- /dev/null +++ b/app/src/main/java/com/uns/maincar/tools/TextFilter.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022. UnknownNetworkService Group + * This file is created by UnknownObject at 2022 - 11 - 11 + */ + +package com.uns.maincar.tools; + +import java.util.HashSet; + +//文本过滤器,用于过滤OCR和车牌识别等结果中多余的字符 +public class TextFilter +{ + private final HashSet empty_char = new HashSet<>(); + + public TextFilter() + { + empty_char.add('\t'); + empty_char.add('\r'); + empty_char.add('\n'); + empty_char.add(' '); + } + + public String RemoveEmptyCharacter(String src) + { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < src.length(); i++) + { + if (!empty_char.contains(src.charAt(i))) + result.append(src.charAt(i)); + } + return result.toString(); + } + + public String LetterAndNumber(String src) + { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < src.length(); i++) + { + char ch = src.charAt(i); + if (((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z')) || ((ch >= '0') && (ch <= '9'))) + result.append(ch); + } + return result.toString(); + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index cc8261d..1e8b50f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -267,7 +267,7 @@ diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_1561_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_1561_timing.txt index 9708df4..ad5cad1 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_1561_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_1561_timing.txt @@ -1,2 +1,4 @@ # C/C++ build system timings +# C/C++ build system timings + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_2434_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_2434_timing.txt index 9708df4..ad5cad1 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_2434_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_2434_timing.txt @@ -1,2 +1,4 @@ # C/C++ build system timings +# C/C++ build system timings + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_524_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_524_timing.txt index 9708df4..ad5cad1 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_524_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_524_timing.txt @@ -1,2 +1,4 @@ # C/C++ build system timings +# C/C++ build system timings + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_9187_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_9187_timing.txt index 9708df4..ad5cad1 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_9187_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_9187_timing.txt @@ -1,2 +1,4 @@ # C/C++ build system timings +# C/C++ build system timings + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_9671_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_9671_timing.txt index 9708df4..ad5cad1 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_9671_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/generate_cxx_metadata_9671_timing.txt @@ -1,2 +1,4 @@ # C/C++ build system timings +# C/C++ build system timings + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/metadata_generation_record.json b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/metadata_generation_record.json index 475adcb..3e571ea 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/metadata_generation_record.json +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/arm64-v8a/metadata_generation_record.json @@ -11,7 +11,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1562541493 + "memoizedHashCode": 1891803970 }, { "level_": 0, @@ -25,7 +25,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -488127682 + "memoizedHashCode": -1328749515 }, { "level_": 0, @@ -39,6 +39,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1605415251 + "memoizedHashCode": 764793418 } ] \ No newline at end of file diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_296_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_296_timing.txt index c8b9caf..581e979 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_296_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_296_timing.txt @@ -10,3 +10,12 @@ # C/C++ build system timings +# C/C++ build system timings +generate_cxx_metadata + execute-generate-process + execute-process 602ms + [gap of 21ms] + execute-generate-process completed in 625ms + [gap of 12ms] +generate_cxx_metadata completed in 643ms + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt index f97762f..32a2e40 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_31_timing.txt @@ -139,3 +139,20 @@ generate_cxx_metadata completed in 18ms # C/C++ build system timings +# C/C++ build system timings +generate_cxx_metadata + create-invalidation-state 13ms +generate_cxx_metadata completed in 19ms + +# C/C++ build system timings + +# C/C++ build system timings +generate_cxx_metadata + write-metadata-json-to-file 13ms +generate_cxx_metadata completed in 22ms + +# C/C++ build system timings +generate_cxx_metadata + create-invalidation-state 10ms +generate_cxx_metadata completed in 14ms + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_534_timing.txt b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_534_timing.txt index 9708df4..ebebeca 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_534_timing.txt +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/generate_cxx_metadata_534_timing.txt @@ -1,2 +1,10 @@ # C/C++ build system timings +# C/C++ build system timings +generate_cxx_metadata + execute-generate-process + execute-process 591ms + [gap of 22ms] + execute-generate-process completed in 615ms +generate_cxx_metadata completed in 636ms + diff --git a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json index ad41d7e..107fcb5 100644 --- a/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json +++ b/opencv/build/intermediates/cxx/Debug/6x33t2q6/meta/x86/metadata_generation_record.json @@ -11,11 +11,11 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -318448305 + "memoizedHashCode": -1159070138 }, { "level_": 0, - "message_": "JSON \u0027F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\\android_gradle_build.json\u0027 was up-to-date", + "message_": "rebuilding JSON F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\\android_gradle_build.json due to:", "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", "tag_": "debug|x86", "diagnosticCode_": 0, @@ -25,7 +25,119 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1614241410 + "memoizedHashCode": -1355196926 + }, + { + "level_": 0, + "message_": "- force flag, will remove stale json folder", + "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", + "tag_": "debug|x86", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {}, + "fieldsDescending": {} + }, + "memoizedSize": -1, + "memoizedHashCode": -1958375788 + }, + { + "level_": 0, + "message_": "removing stale contents from \u0027F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\u0027", + "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", + "tag_": "debug|x86", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {}, + "fieldsDescending": {} + }, + "memoizedSize": -1, + "memoizedHashCode": -757246036 + }, + { + "level_": 0, + "message_": "created folder \u0027F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\u0027", + "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", + "tag_": "debug|x86", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {}, + "fieldsDescending": {} + }, + "memoizedSize": -1, + "memoizedHashCode": -1074877000 + }, + { + "level_": 0, + "message_": "executing cmake Executable : D:\\Android_SDK\\cmake\\3.18.1\\bin\\cmake.exe\narguments : \n-HF:\\Android-APK\\MainCar\\opencv\\libcxx_helper\n-DCMAKE_SYSTEM_NAME\u003dAndroid\n-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON\n-DCMAKE_SYSTEM_VERSION\u003d26\n-DANDROID_PLATFORM\u003dandroid-26\n-DANDROID_ABI\u003dx86\n-DCMAKE_ANDROID_ARCH_ABI\u003dx86\n-DANDROID_NDK\u003dD:\\Android_SDK\\ndk\\21.4.7075529\n-DCMAKE_ANDROID_NDK\u003dD:\\Android_SDK\\ndk\\21.4.7075529\n-DCMAKE_TOOLCHAIN_FILE\u003dD:\\Android_SDK\\ndk\\21.4.7075529\\build\\cmake\\android.toolchain.cmake\n-DCMAKE_MAKE_PROGRAM\u003dD:\\Android_SDK\\cmake\\3.18.1\\bin\\ninja.exe\n-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003dF:\\Android-APK\\MainCar\\opencv\\build\\intermediates\\cxx\\Debug\\6x33t2q6\\obj\\x86\n-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003dF:\\Android-APK\\MainCar\\opencv\\build\\intermediates\\cxx\\Debug\\6x33t2q6\\obj\\x86\n-DCMAKE_BUILD_TYPE\u003dDebug\n-BF:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\n-GNinja\n-DANDROID_STL\u003dc++_shared\njvmArgs : \n\n", + "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", + "tag_": "debug|x86", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {}, + "fieldsDescending": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 155087040 + }, + { + "level_": 0, + "message_": "Executable : D:\\Android_SDK\\cmake\\3.18.1\\bin\\cmake.exe\narguments : \n-HF:\\Android-APK\\MainCar\\opencv\\libcxx_helper\n-DCMAKE_SYSTEM_NAME\u003dAndroid\n-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON\n-DCMAKE_SYSTEM_VERSION\u003d26\n-DANDROID_PLATFORM\u003dandroid-26\n-DANDROID_ABI\u003dx86\n-DCMAKE_ANDROID_ARCH_ABI\u003dx86\n-DANDROID_NDK\u003dD:\\Android_SDK\\ndk\\21.4.7075529\n-DCMAKE_ANDROID_NDK\u003dD:\\Android_SDK\\ndk\\21.4.7075529\n-DCMAKE_TOOLCHAIN_FILE\u003dD:\\Android_SDK\\ndk\\21.4.7075529\\build\\cmake\\android.toolchain.cmake\n-DCMAKE_MAKE_PROGRAM\u003dD:\\Android_SDK\\cmake\\3.18.1\\bin\\ninja.exe\n-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003dF:\\Android-APK\\MainCar\\opencv\\build\\intermediates\\cxx\\Debug\\6x33t2q6\\obj\\x86\n-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003dF:\\Android-APK\\MainCar\\opencv\\build\\intermediates\\cxx\\Debug\\6x33t2q6\\obj\\x86\n-DCMAKE_BUILD_TYPE\u003dDebug\n-BF:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\n-GNinja\n-DANDROID_STL\u003dc++_shared\njvmArgs : \n\n", + "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", + "tag_": "debug|x86", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {}, + "fieldsDescending": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 700052607 + }, + { + "level_": 0, + "message_": "Exiting generation of F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\\compile_commands.json.bin normally", + "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", + "tag_": "debug|x86", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {}, + "fieldsDescending": {} + }, + "memoizedSize": -1, + "memoizedHashCode": -452835122 + }, + { + "level_": 0, + "message_": "done executing cmake", + "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", + "tag_": "debug|x86", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {}, + "fieldsDescending": {} + }, + "memoizedSize": -1, + "memoizedHashCode": -365654144 + }, + { + "level_": 0, + "message_": "write command file F:\\Android-APK\\MainCar\\opencv\\.cxx\\Debug\\6x33t2q6\\x86\\metadata_generation_command.txt", + "file_": "F:\\Android-APK\\MainCar\\opencv\\libcxx_helper\\CMakeLists.txt", + "tag_": "debug|x86", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {}, + "fieldsDescending": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 1138716982 }, { "level_": 0, @@ -39,6 +151,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1881926523 + "memoizedHashCode": 1572418940 } ] \ No newline at end of file diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/arm64-v8a/metadata_generation_record.json b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/arm64-v8a/metadata_generation_record.json index a854183..50d1c48 100644 --- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/arm64-v8a/metadata_generation_record.json +++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/arm64-v8a/metadata_generation_record.json @@ -11,7 +11,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1273672783 + "memoizedHashCode": -1232277264 }, { "level_": 0, @@ -25,7 +25,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -899195125 + "memoizedHashCode": 889822124 }, { "level_": 0, @@ -39,6 +39,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 146662231 + "memoizedHashCode": 1935679480 } ] \ No newline at end of file diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/armeabi-v7a/metadata_generation_record.json b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/armeabi-v7a/metadata_generation_record.json index 04762c2..c731a47 100644 --- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/armeabi-v7a/metadata_generation_record.json +++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/armeabi-v7a/metadata_generation_record.json @@ -11,7 +11,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 89115115 + "memoizedHashCode": 1878132364 }, { "level_": 0, @@ -25,7 +25,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1160100185 + "memoizedHashCode": 628917064 }, { "level_": 0, @@ -39,6 +39,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1015721461 + "memoizedHashCode": -1490228586 } ] \ No newline at end of file diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt index 6e01edb..5be3558 100644 --- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt +++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/generate_cxx_metadata_31_timing.txt @@ -78,3 +78,11 @@ generate_cxx_metadata completed in 15ms # C/C++ build system timings +# C/C++ build system timings +generate_cxx_metadata + create-invalidation-state 13ms +generate_cxx_metadata completed in 23ms + +# C/C++ build system timings +generate_cxx_metadata 10ms + diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json index c515b4a..794bda9 100644 --- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json +++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86/metadata_generation_record.json @@ -11,7 +11,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -330243501 + "memoizedHashCode": -762021707 }, { "level_": 0, @@ -25,7 +25,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -682158065 + "memoizedHashCode": -1113936271 }, { "level_": 0, @@ -39,6 +39,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1893721719 + "memoizedHashCode": 1969467371 } ] \ No newline at end of file diff --git a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86_64/metadata_generation_record.json b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86_64/metadata_generation_record.json index 608a71a..41b868f 100644 --- a/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86_64/metadata_generation_record.json +++ b/opencv/build/intermediates/cxx/RelWithDebInfo/4h3t2zj4/meta/x86_64/metadata_generation_record.json @@ -11,7 +11,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 400023261 + "memoizedHashCode": -2105926786 }, { "level_": 0, @@ -25,7 +25,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1346036181 + "memoizedHashCode": -1159913866 }, { "level_": 0, @@ -39,6 +39,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 63082896 + "memoizedHashCode": 1852100145 } ] \ No newline at end of file diff --git a/opencv/build/intermediates/cxx/abi_configuration_311k5o12.log b/opencv/build/intermediates/cxx/abi_configuration_311k5o12.log index a45133d..320c741 100644 --- a/opencv/build/intermediates/cxx/abi_configuration_311k5o12.log +++ b/opencv/build/intermediates/cxx/abi_configuration_311k5o12.log @@ -11,6 +11,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -586898968 + "memoizedHashCode": -1427520801 } ] \ No newline at end of file diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_11589_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_11589_timing.txt index 82324ec..7316f81 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_11589_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_11589_timing.txt @@ -10,3 +10,15 @@ create_cxx_tasks create-initial-cxx-model completed in 79ms create_cxx_tasks completed in 80ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 34ms + create-module-model completed in 36ms + create-module-model + create-cmake-model 34ms + create-module-model completed in 37ms + create-initial-cxx-model completed in 82ms +create_cxx_tasks completed in 83ms + diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_1466_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_1466_timing.txt index 30fec4c..71e34be 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_1466_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_1466_timing.txt @@ -10,3 +10,15 @@ create_cxx_tasks create-initial-cxx-model completed in 103ms create_cxx_tasks completed in 104ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 35ms + create-module-model completed in 36ms + create-module-model + create-cmake-model 32ms + create-module-model completed in 34ms + create-initial-cxx-model completed in 83ms +create_cxx_tasks completed in 83ms + diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_2434_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_2434_timing.txt index b931c42..b5953f0 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_2434_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_2434_timing.txt @@ -10,3 +10,51 @@ create_cxx_tasks create-initial-cxx-model completed in 77ms create_cxx_tasks completed in 78ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 36ms + create-module-model completed in 37ms + create-module-model + create-cmake-model 34ms + create-module-model completed in 36ms + create-initial-cxx-model completed in 84ms +create_cxx_tasks completed in 85ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 31ms + create-module-model completed in 33ms + create-module-model + create-cmake-model 31ms + create-module-model completed in 31ms + create-initial-cxx-model completed in 75ms +create_cxx_tasks completed in 76ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 32ms + create-module-model completed in 34ms + create-module-model + create-cmake-model 34ms + create-module-model completed in 36ms + create-initial-cxx-model completed in 81ms +create_cxx_tasks completed in 81ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 31ms + create-module-model completed in 33ms + create-module-model + create-cmake-model 32ms + create-module-model completed in 33ms + create-initial-cxx-model completed in 77ms +create_cxx_tasks completed in 77ms + diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_296_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_296_timing.txt index 283d037..cba6ec3 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_296_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_296_timing.txt @@ -154,3 +154,15 @@ create_cxx_tasks create-initial-cxx-model completed in 83ms create_cxx_tasks completed in 84ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 33ms + create-module-model completed in 35ms + create-module-model + create-cmake-model 33ms + create-module-model completed in 35ms + create-initial-cxx-model completed in 85ms +create_cxx_tasks completed in 86ms + diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_298_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_298_timing.txt index 270a262..28b3d0d 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_298_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_298_timing.txt @@ -23,3 +23,15 @@ create_cxx_tasks create-initial-cxx-model completed in 88ms create_cxx_tasks completed in 90ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 34ms + create-module-model completed in 35ms + create-module-model + create-cmake-model 34ms + create-module-model completed in 36ms + create-initial-cxx-model completed in 89ms +create_cxx_tasks completed in 90ms + diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt index 77830cd..036f56f 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_31_timing.txt @@ -750,3 +750,117 @@ create_cxx_tasks create-initial-cxx-model completed in 108ms create_cxx_tasks completed in 109ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 32ms + create-module-model completed in 34ms + create-module-model + create-cmake-model 32ms + create-module-model completed in 34ms + [gap of 11ms] + create-initial-cxx-model completed in 88ms +create_cxx_tasks completed in 89ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 34ms + create-module-model completed in 37ms + create-module-model + create-cmake-model 34ms + create-module-model completed in 38ms + [gap of 10ms] + create-initial-cxx-model completed in 96ms +create_cxx_tasks completed in 97ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 37ms + create-module-model completed in 38ms + create-module-model + create-cmake-model 34ms + create-module-model completed in 37ms + create-initial-cxx-model completed in 94ms +create_cxx_tasks completed in 96ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 43ms + create-module-model completed in 47ms + create-module-model + create-cmake-model 40ms + create-module-model completed in 43ms + [gap of 11ms] + create-initial-cxx-model completed in 114ms +create_cxx_tasks completed in 116ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 47ms + create-module-model completed in 50ms + create-module-model + create-cmake-model 54ms + create-module-model completed in 56ms + [gap of 15ms] + create-initial-cxx-model completed in 137ms +create_cxx_tasks completed in 140ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 41ms + create-module-model completed in 44ms + create-module-model + create-cmake-model 35ms + create-module-model completed in 37ms + create-initial-cxx-model completed in 96ms +create_cxx_tasks completed in 97ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 34ms + create-module-model completed in 35ms + create-module-model + create-cmake-model 35ms + create-module-model completed in 36ms + [gap of 10ms] + create-initial-cxx-model completed in 92ms +create_cxx_tasks completed in 93ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 35ms + create-module-model completed in 37ms + create-module-model + create-cmake-model 36ms + create-module-model completed in 39ms + [gap of 12ms] + create-initial-cxx-model completed in 98ms +create_cxx_tasks completed in 99ms + +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 32ms + create-module-model completed in 36ms + create-module-model + create-cmake-model 32ms + create-module-model completed in 35ms + create-initial-cxx-model completed in 87ms +create_cxx_tasks completed in 89ms + diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_364_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_364_timing.txt index ed09f1b..3f44154 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_364_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_364_timing.txt @@ -22,3 +22,16 @@ create_cxx_tasks create-initial-cxx-model completed in 90ms create_cxx_tasks completed in 91ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 33ms + create-module-model completed in 35ms + create-module-model + create-cmake-model 34ms + create-module-model completed in 37ms + [gap of 10ms] + create-initial-cxx-model completed in 90ms +create_cxx_tasks completed in 90ms + diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_534_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_534_timing.txt index 9f8e9af..db0eb2e 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_534_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_534_timing.txt @@ -10,3 +10,15 @@ create_cxx_tasks create-initial-cxx-model completed in 88ms create_cxx_tasks completed in 89ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 36ms + create-module-model completed in 37ms + create-module-model + create-cmake-model 31ms + create-module-model completed in 33ms + create-initial-cxx-model completed in 85ms +create_cxx_tasks completed in 86ms + diff --git a/opencv/build/intermediates/cxx/create_cxx_tasks_648_timing.txt b/opencv/build/intermediates/cxx/create_cxx_tasks_648_timing.txt index 491812a..d502c22 100644 --- a/opencv/build/intermediates/cxx/create_cxx_tasks_648_timing.txt +++ b/opencv/build/intermediates/cxx/create_cxx_tasks_648_timing.txt @@ -34,3 +34,15 @@ create_cxx_tasks create-initial-cxx-model completed in 84ms create_cxx_tasks completed in 84ms +# C/C++ build system timings +create_cxx_tasks + create-initial-cxx-model + create-module-model + create-cmake-model 42ms + create-module-model completed in 45ms + create-module-model + create-cmake-model 44ms + create-module-model completed in 45ms + create-initial-cxx-model completed in 105ms +create_cxx_tasks completed in 105ms + diff --git a/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log b/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log index c752051..de322f2 100644 --- a/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log +++ b/opencv/build/intermediates/cxx/ndk_locator_record_50t213g5.log @@ -11,7 +11,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 255135650 + "memoizedHashCode": -585486183 }, { "level_": 0, @@ -25,7 +25,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1047323753 + "memoizedHashCode": 206701920 }, { "level_": 0, @@ -39,7 +39,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": 1751784946 + "memoizedHashCode": 911163113 }, { "level_": 0, @@ -53,7 +53,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -680368280 + "memoizedHashCode": -1520990113 }, { "level_": 0, @@ -67,7 +67,7 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1573057862 + "memoizedHashCode": 1881287601 }, { "level_": 0, @@ -81,6 +81,6 @@ "fieldsDescending": {} }, "memoizedSize": -1, - "memoizedHashCode": -1237077643 + "memoizedHashCode": -2077699476 } ] \ No newline at end of file